1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-03-28 03:32:27 +01:00

Some refactoring, and allow running scans on specific files only.

This commit is contained in:
Jeff Mitchell 2012-06-25 18:59:42 -04:00
parent 2fd970d24d
commit 18be2f5f7e
6 changed files with 126 additions and 52 deletions

View File

@ -72,19 +72,19 @@ DirLister::scanDir( QDir dir, int depth )
return;
}
QFileInfoList dirs;
QFileInfoList filteredEntries;
dir.setFilter( QDir::Files | QDir::Readable | QDir::NoDotAndDotDot );
dir.setSorting( QDir::Name );
dirs = dir.entryInfoList();
filteredEntries = dir.entryInfoList();
foreach ( const QFileInfo& di, dirs )
foreach ( const QFileInfo& di, filteredEntries )
emit fileToScan( di );
dir.setFilter( QDir::Dirs | QDir::Readable | QDir::NoDotAndDotDot );
dirs = dir.entryInfoList();
filteredEntries = dir.entryInfoList();
foreach ( const QFileInfo& di, dirs )
foreach ( const QFileInfo& di, filteredEntries )
{
const QString canonical = di.canonicalFilePath();
m_opcount++;
@ -100,9 +100,10 @@ DirLister::scanDir( QDir dir, int depth )
}
MusicScanner::MusicScanner( const QStringList& dirs, quint32 bs )
MusicScanner::MusicScanner( ScanManager::ScanMode scanMode, const QStringList& paths, quint32 bs )
: QObject()
, m_dirs( dirs )
, m_scanMode( scanMode )
, m_paths( paths )
, m_batchsize( bs )
, m_dirListerThreadController( 0 )
{
@ -175,9 +176,15 @@ MusicScanner::scan()
connect( this, SIGNAL( batchReady( QVariantList, QVariantList ) ),
SLOT( commitBatch( QVariantList, QVariantList ) ), Qt::DirectConnection );
if ( m_scanMode == ScanManager::FileScan )
{
scanFilePaths();
return;
}
m_dirListerThreadController = new QThread( this );
m_dirLister = QWeakPointer< DirLister >( new DirLister( m_dirs ) );
m_dirLister = QWeakPointer< DirLister >( new DirLister( m_paths ) );
m_dirLister.data()->moveToThread( m_dirListerThreadController );
connect( m_dirLister.data(), SIGNAL( fileToScan( QFileInfo ) ),
@ -185,7 +192,7 @@ MusicScanner::scan()
// queued, so will only fire after all dirs have been scanned:
connect( m_dirLister.data(), SIGNAL( finished() ),
SLOT( listerFinished() ), Qt::QueuedConnection );
SLOT( postOps() ), Qt::QueuedConnection );
m_dirListerThreadController->start( QThread::IdlePriority );
QMetaObject::invokeMethod( m_dirLister.data(), "go" );
@ -193,13 +200,30 @@ MusicScanner::scan()
void
MusicScanner::listerFinished()
MusicScanner::scanFilePaths()
{
tDebug( LOGVERBOSE ) << Q_FUNC_INFO;
foreach( QString path, m_paths )
{
QFileInfo fi( path );
if ( fi.exists() && fi.isReadable() )
scanFile( fi );
}
}
void
MusicScanner::postOps()
{
tDebug( LOGVERBOSE ) << Q_FUNC_INFO;
// any remaining stuff that wasnt emitted as a batch:
foreach( const QString& key, m_filemtimes.keys() )
m_filesToDelete << m_filemtimes[ key ].keys().first();
if ( m_scanMode == ScanManager::DirScan )
{
// any remaining stuff that wasnt emitted as a batch:
foreach( const QString& key, m_filemtimes.keys() )
m_filesToDelete << m_filemtimes[ key ].keys().first();
}
tDebug( LOGINFO ) << "Scanning complete, saving to database. ( deleted" << m_filesToDelete.count() << "- scanned" << m_scanned << "- skipped" << m_skipped << ")";
tDebug( LOGEXTRA ) << "Skipped the following files (no tags / no valid audio):";

View File

@ -23,6 +23,8 @@
#include "TomahawkSettings.h"
#include "database/DatabaseCommand.h"
#include "ScanManager.h"
/* taglib */
#include <taglib/fileref.h>
#include <taglib/tag.h>
@ -83,7 +85,7 @@ class MusicScanner : public QObject
Q_OBJECT
public:
MusicScanner( const QStringList& dirs, quint32 bs = 0 );
MusicScanner( ScanManager::ScanMode scanMode, const QStringList& paths, quint32 bs = 0 );
~MusicScanner();
signals:
@ -96,7 +98,7 @@ private:
void executeCommand( QSharedPointer< DatabaseCommand > cmd );
private slots:
void listerFinished();
void postOps();
void scanFile( const QFileInfo& fi );
void setFileMtimes( const QMap< QString, QMap< unsigned int, unsigned int > >& m );
void startScan();
@ -106,7 +108,10 @@ private slots:
void commandFinished();
private:
QStringList m_dirs;
void scanFilePaths();
ScanManager::ScanMode m_scanMode;
QStringList m_paths;
QMap<QString, QString> m_ext2mime; // eg: mp3 -> audio/mpeg
unsigned int m_scanned;
unsigned int m_skipped;

View File

@ -48,6 +48,7 @@ ScanManager::ScanManager( QObject* parent )
: QObject( parent )
, m_musicScannerThreadController( 0 )
, m_currScannerPaths()
, m_cachedScannerDirs()
{
s_instance = this;
@ -60,7 +61,7 @@ ScanManager::ScanManager( QObject* parent )
if ( TomahawkSettings::instance()->hasScannerPaths() )
{
m_currScannerPaths = TomahawkSettings::instance()->scannerPaths();
m_cachedScannerDirs = TomahawkSettings::instance()->scannerPaths();
m_scanTimer->start();
if ( TomahawkSettings::instance()->watchForChanges() )
QTimer::singleShot( 1000, this, SLOT( runStartupScan() ) );
@ -94,10 +95,10 @@ ScanManager::onSettingsChanged()
m_scanTimer->setInterval( TomahawkSettings::instance()->scannerTime() * 1000 );
if ( TomahawkSettings::instance()->hasScannerPaths() &&
m_currScannerPaths != TomahawkSettings::instance()->scannerPaths() )
m_cachedScannerDirs != TomahawkSettings::instance()->scannerPaths() )
{
m_currScannerPaths = TomahawkSettings::instance()->scannerPaths();
runScan();
m_cachedScannerDirs = TomahawkSettings::instance()->scannerPaths();
runNormalScan();
}
if ( TomahawkSettings::instance()->watchForChanges() && !m_scanTimer->isActive() )
@ -112,7 +113,7 @@ ScanManager::runStartupScan()
if ( !Database::instance() || ( Database::instance() && !Database::instance()->isReady() ) )
QTimer::singleShot( 1000, this, SLOT( runStartupScan() ) );
else
runScan();
runNormalScan();
}
@ -125,25 +126,42 @@ ScanManager::scanTimerTimeout()
( Database::instance() && !Database::instance()->isReady() ) )
return;
else
runScan();
runNormalScan();
}
void
ScanManager::runFullRescan()
{
runNormalScan( true );
}
void
ScanManager::runScan( bool manualFull )
{
qDebug() << Q_FUNC_INFO;
if ( !Database::instance() || ( Database::instance() && !Database::instance()->isReady() ) )
return;
if ( !m_musicScannerThreadController && m_scanner.isNull() ) //still running if these are not zero
bool
ScanManager::runNormalScan( bool manualFull )
{
tDebug( LOGVERBOSE ) << Q_FUNC_INFO;
if ( !Database::instance() || ( Database::instance() && !Database::instance()->isReady() ) )
return false;
if ( m_musicScannerThreadController || !m_scanner.isNull() ) //still running if these are not zero
{
tDebug( LOGVERBOSE ) << "Could not run dir scan, old scan still running";
return false;
}
else
{
m_scanTimer->stop();
m_musicScannerThreadController = new QThread( this );
m_currScanMode = DirScan;
if ( manualFull )
{
DatabaseCommand_DeleteFiles *cmd = new DatabaseCommand_DeleteFiles( SourceList::instance()->getLocal() );
connect( cmd, SIGNAL( finished() ), SLOT( filesDeleted() ) );
Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) );
return;
return true;
}
DatabaseCommand_FileMtimes *cmd = new DatabaseCommand_FileMtimes( true );
@ -152,18 +170,41 @@ ScanManager::runScan( bool manualFull )
Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) );
}
else
{
qDebug() << "Could not run dir scan, old scan still running";
return;
}
return true;
}
bool
ScanManager::runFileScan( const QStringList &paths )
{
tDebug( LOGVERBOSE ) << Q_FUNC_INFO;
if ( !Database::instance() || ( Database::instance() && !Database::instance()->isReady() ) )
return false;
if ( m_musicScannerThreadController || !m_scanner.isNull() ) //still running if these are not zero
{
tDebug( LOGVERBOSE ) << "Could not run file scan, old scan still running";
return false;
}
m_scanTimer->stop();
m_musicScannerThreadController = new QThread( this );
m_currScannerPaths = paths;
m_currScanMode = FileScan;
QMetaObject::invokeMethod( this, "runScan", Qt::QueuedConnection );
return true;
}
void
ScanManager::fileMtimesCheck( const QMap< QString, QMap< unsigned int, unsigned int > >& mtimes )
{
if ( !mtimes.isEmpty() && TomahawkSettings::instance()->scannerPaths().isEmpty() )
if ( !mtimes.isEmpty() && m_currScanMode == DirScan && TomahawkSettings::instance()->scannerPaths().isEmpty() )
{
DatabaseCommand_DeleteFiles *cmd = new DatabaseCommand_DeleteFiles( SourceList::instance()->getLocal() );
connect( cmd, SIGNAL( finished() ), SLOT( filesDeleted() ) );
@ -171,7 +212,7 @@ ScanManager::fileMtimesCheck( const QMap< QString, QMap< unsigned int, unsigned
return;
}
runDirScan();
QMetaObject::invokeMethod( this, "runScan", Qt::QueuedConnection );
}
@ -179,24 +220,22 @@ void
ScanManager::filesDeleted()
{
if ( !TomahawkSettings::instance()->scannerPaths().isEmpty() )
runDirScan();
QMetaObject::invokeMethod( this, "runScan", Qt::QueuedConnection );
else
scannerFinished();
}
void
ScanManager::runDirScan()
ScanManager::runScan()
{
qDebug() << Q_FUNC_INFO;
QStringList paths = TomahawkSettings::instance()->scannerPaths();
QStringList paths = m_currScannerPaths.empty() ? TomahawkSettings::instance()->scannerPaths() : m_currScannerPaths;
if ( !m_musicScannerThreadController && m_scanner.isNull() ) //still running if these are not zero
{
m_scanTimer->stop();
m_musicScannerThreadController = new QThread( this );
m_scanner = QWeakPointer< MusicScanner >( new MusicScanner( paths ) );
m_scanner = QWeakPointer< MusicScanner >( new MusicScanner( m_currScanMode, paths ) );
m_scanner.data()->moveToThread( m_musicScannerThreadController );
connect( m_scanner.data(), SIGNAL( finished() ), SLOT( scannerFinished() ) );
m_musicScannerThreadController->start( QThread::IdlePriority );
@ -204,8 +243,7 @@ ScanManager::runDirScan()
}
else
{
qDebug() << "Could not run dir scan, old scan still running";
return;
QTimer::singleShot( 200, this, SLOT( runScan() ) );
}
}
@ -225,6 +263,7 @@ ScanManager::scannerFinished()
}
m_scanTimer->start();
m_currScannerPaths = QStringList();
SourceList::instance()->getLocal()->scanningFinished( 0 );
emit finished();
}

View File

@ -39,6 +39,8 @@ class ScanManager : public QObject
Q_OBJECT
public:
enum ScanMode { DirScan, FileScan };
static ScanManager* instance();
explicit ScanManager( QObject* parent = 0 );
@ -48,13 +50,15 @@ signals:
void finished();
public slots:
void runScan( bool manualFull = false );
void runDirScan();
bool runFileScan( const QStringList &paths );
void runFullRescan();
bool runNormalScan( bool manualFull = false );
private slots:
void scannerFinished();
void runStartupScan();
void runScan();
void scannerFinished();
void scanTimerTimeout();
void onSettingsChanged();
@ -65,9 +69,11 @@ private slots:
private:
static ScanManager* s_instance;
ScanMode m_currScanMode;
QWeakPointer< MusicScanner > m_scanner;
QThread* m_musicScannerThreadController;
QStringList m_currScannerPaths;
QStringList m_cachedScannerDirs;
QTimer* m_scanTimer;
};

View File

@ -319,7 +319,7 @@ TomahawkApp::init()
if ( arguments().contains( "--filescan" ) )
{
m_scanManager.data()->runScan( true );
m_scanManager.data()->runFullRescan();
}
// Set up echonest catalog synchronizer

View File

@ -533,7 +533,7 @@ void
TomahawkWindow::updateCollectionManually()
{
if ( TomahawkSettings::instance()->hasScannerPaths() )
ScanManager::instance()->runScan();
ScanManager::instance()->runNormalScan();
}
@ -541,7 +541,7 @@ void
TomahawkWindow::rescanCollectionManually()
{
if ( TomahawkSettings::instance()->hasScannerPaths() )
ScanManager::instance()->runScan( true );
ScanManager::instance()->runFullRescan();
}