mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-16 19:14:06 +02:00
Watching for changes works at a folder granularity now
This commit is contained in:
@@ -39,7 +39,11 @@ DatabaseCommand_DirMtimes::execSelect( DatabaseImpl* dbi )
|
||||
QMap<QString,unsigned int> mtimes;
|
||||
TomahawkSqlQuery query = dbi->newquery();
|
||||
if( m_prefix.isEmpty() && m_prefixes.isEmpty() )
|
||||
{
|
||||
query.exec( "SELECT name, mtime FROM dirs_scanned" );
|
||||
while( query.next() )
|
||||
mtimes.insert( query.value( 0 ).toString(), query.value( 1 ).toUInt() );
|
||||
}
|
||||
else if( m_prefixes.isEmpty() )
|
||||
execSelectPath( dbi, m_prefix, mtimes );
|
||||
else
|
||||
@@ -64,9 +68,7 @@ DatabaseCommand_DirMtimes::execSelectPath( DatabaseImpl *dbi, const QDir& path,
|
||||
query.exec();
|
||||
|
||||
while( query.next() )
|
||||
{
|
||||
mtimes.insert( query.value( 0 ).toString(), query.value( 1 ).toUInt() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@@ -38,7 +38,7 @@ public:
|
||||
: DatabaseCommand( parent ), m_prefix( prefix ), m_update( false )
|
||||
{}
|
||||
|
||||
explicit DatabaseCommand_DirMtimes( const QStringList& prefixes = QStringList(), QObject* parent = 0 )
|
||||
explicit DatabaseCommand_DirMtimes( const QStringList& prefixes, QObject* parent = 0 )
|
||||
: DatabaseCommand( parent ), m_prefixes( prefixes ), m_update( false )
|
||||
{}
|
||||
|
||||
|
@@ -89,7 +89,7 @@ InfoSystem::~InfoSystem()
|
||||
QMetaObject::invokeMethod( m_worker.data(), "deleteLater", Qt::QueuedConnection );
|
||||
while( !m_worker.isNull() )
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO << " worker not deleted, processing events";
|
||||
qDebug() << Q_FUNC_INFO << " worker not deleted";
|
||||
TomahawkUtils::Sleep::msleep( 50 );
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ InfoSystem::~InfoSystem()
|
||||
{
|
||||
while( !m_infoSystemWorkerThreadController->isFinished() )
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO << " worker thread controller not finished, processing events";
|
||||
qDebug() << Q_FUNC_INFO << " worker thread controller not finished";
|
||||
TomahawkUtils::Sleep::msleep( 50 );
|
||||
}
|
||||
|
||||
|
@@ -139,9 +139,8 @@ MusicScanner::~MusicScanner()
|
||||
QMetaObject::invokeMethod( m_dirLister.data(), "deleteLater", Qt::QueuedConnection );
|
||||
while( !m_dirLister.isNull() )
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO << " scanner not deleted, processing events";
|
||||
QCoreApplication::processEvents( QEventLoop::AllEvents, 200 );
|
||||
TomahawkUtils::Sleep::msleep( 100 );
|
||||
qDebug() << Q_FUNC_INFO << " scanner not deleted";
|
||||
TomahawkUtils::Sleep::msleep( 50 );
|
||||
}
|
||||
|
||||
if ( m_dirListerThreadController )
|
||||
@@ -151,9 +150,8 @@ MusicScanner::~MusicScanner()
|
||||
{
|
||||
while( !m_dirListerThreadController->isFinished() )
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO << " scanner thread controller not finished, processing events";
|
||||
QCoreApplication::processEvents( QEventLoop::AllEvents, 200 );
|
||||
TomahawkUtils::Sleep::msleep( 100 );
|
||||
qDebug() << Q_FUNC_INFO << " scanner thread controller not finished";
|
||||
TomahawkUtils::Sleep::msleep( 50 );
|
||||
}
|
||||
|
||||
delete m_dirListerThreadController;
|
||||
@@ -171,7 +169,10 @@ MusicScanner::startScan()
|
||||
m_skippedFiles.clear();
|
||||
|
||||
// trigger the scan once we've loaded old mtimes for dirs below our path
|
||||
DatabaseCommand_DirMtimes* cmd = new DatabaseCommand_DirMtimes( TomahawkSettings::instance()->scannerPaths() );
|
||||
//FIXME: For multiple collection support make sure the right prefix gets passed in...or not...
|
||||
//bear in mind that simply passing in the top-level of a defined collection means it will not return items that need
|
||||
//to be removed that aren't in that root any longer -- might have to do the filtering in setMTimes based on strings
|
||||
DatabaseCommand_DirMtimes* cmd = new DatabaseCommand_DirMtimes();
|
||||
connect( cmd, SIGNAL( done( QMap<QString, unsigned int> ) ),
|
||||
SLOT( setMtimes( QMap<QString, unsigned int> ) ) );
|
||||
|
||||
@@ -232,12 +233,9 @@ MusicScanner::listerFinished( const QMap<QString, unsigned int>& newmtimes )
|
||||
{
|
||||
qDebug() << "Removing stale dir:" << path;
|
||||
Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( new DatabaseCommand_DeleteFiles( path, SourceList::instance()->getLocal() ) ) );
|
||||
emit removeWatchedDir( path );
|
||||
}
|
||||
}
|
||||
|
||||
emit addWatchedDirs( newmtimes.keys() );
|
||||
|
||||
// save mtimes, then quit thread
|
||||
DatabaseCommand_DirMtimes* cmd = new DatabaseCommand_DirMtimes( newmtimes );
|
||||
connect( cmd, SIGNAL( finished() ), SLOT( deleteLister() ) );
|
||||
|
@@ -86,8 +86,6 @@ signals:
|
||||
//void fileScanned( QVariantMap );
|
||||
void finished();
|
||||
void batchReady( const QVariantList& );
|
||||
void addWatchedDirs( const QStringList & );
|
||||
void removeWatchedDir( const QString & );
|
||||
|
||||
private:
|
||||
QVariant readFile( const QFileInfo& fi );
|
||||
|
@@ -45,37 +45,26 @@ ScanManager::ScanManager( QObject* parent )
|
||||
: QObject( parent )
|
||||
, m_musicScannerThreadController( 0 )
|
||||
, m_currScannerPaths()
|
||||
, m_dirWatcher( 0 )
|
||||
, m_queuedScanTimer( 0 )
|
||||
, m_deferredScanTimer( 0 )
|
||||
, m_queuedChangedDirs()
|
||||
, m_deferredDirs()
|
||||
{
|
||||
s_instance = this;
|
||||
|
||||
m_queuedScanTimer = new QTimer( this );
|
||||
m_queuedScanTimer->setSingleShot( true );
|
||||
m_deferredScanTimer = new QTimer( this );
|
||||
m_deferredScanTimer->setSingleShot( false );
|
||||
m_deferredScanTimer->setInterval( 1000 );
|
||||
m_dirWatcher = new QFileSystemWatcher( this );
|
||||
m_scanTimer = new QTimer( this );
|
||||
m_scanTimer->setSingleShot( false );
|
||||
m_scanTimer->setInterval( 10000 );
|
||||
|
||||
connect( TomahawkSettings::instance(), SIGNAL( changed() ), SLOT( onSettingsChanged() ) );
|
||||
connect( m_queuedScanTimer, SIGNAL( timeout() ), SLOT( queuedScanTimeout() ) );
|
||||
connect( m_deferredScanTimer, SIGNAL( timeout() ), SLOT( deferredScanTimeout() ) );
|
||||
connect( m_dirWatcher, SIGNAL( directoryChanged( const QString & ) ), SLOT( handleChangedDir( const QString & ) ) );
|
||||
connect( m_scanTimer, SIGNAL( timeout() ), SLOT( scanTimerTimeout() ) );
|
||||
|
||||
// FIXME: Disable this until we find something nondeprecated and working (e.g. not QFileSystemWatcher)
|
||||
TomahawkSettings::instance()->setWatchForChanges( false );
|
||||
//TomahawkSettings::instance()->setWatchForChanges( true );
|
||||
|
||||
if ( TomahawkSettings::instance()->hasScannerPaths() )
|
||||
{
|
||||
m_currScannerPaths = TomahawkSettings::instance()->scannerPaths();
|
||||
m_scanTimer->start();
|
||||
if ( TomahawkSettings::instance()->watchForChanges() )
|
||||
QTimer::singleShot( 1000, this, SLOT( runStartupScan() ) );
|
||||
}
|
||||
|
||||
m_deferredScanTimer->start();
|
||||
}
|
||||
|
||||
|
||||
@@ -88,9 +77,8 @@ ScanManager::~ScanManager()
|
||||
QMetaObject::invokeMethod( m_scanner.data(), "deleteLater", Qt::QueuedConnection );
|
||||
while( !m_scanner.isNull() )
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO << " scanner not deleted, processing events";
|
||||
QCoreApplication::processEvents( QEventLoop::AllEvents, 200 );
|
||||
TomahawkUtils::Sleep::msleep( 100 );
|
||||
qDebug() << Q_FUNC_INFO << " scanner not delete";
|
||||
TomahawkUtils::Sleep::msleep( 50 );
|
||||
}
|
||||
|
||||
if ( m_musicScannerThreadController )
|
||||
@@ -100,9 +88,8 @@ ScanManager::~ScanManager()
|
||||
{
|
||||
while( !m_musicScannerThreadController->isFinished() )
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO << " scanner thread controller not finished, processing events";
|
||||
QCoreApplication::processEvents( QEventLoop::AllEvents, 200 );
|
||||
TomahawkUtils::Sleep::msleep( 100 );
|
||||
qDebug() << Q_FUNC_INFO << " scanner thread controller not finished";
|
||||
TomahawkUtils::Sleep::msleep( 50 );
|
||||
}
|
||||
|
||||
delete m_musicScannerThreadController;
|
||||
@@ -115,21 +102,23 @@ ScanManager::~ScanManager()
|
||||
void
|
||||
ScanManager::onSettingsChanged()
|
||||
{
|
||||
if ( !TomahawkSettings::instance()->watchForChanges() && m_scanTimer->isActive() )
|
||||
m_scanTimer->stop();
|
||||
|
||||
if ( TomahawkSettings::instance()->hasScannerPaths() &&
|
||||
m_currScannerPaths != TomahawkSettings::instance()->scannerPaths() )
|
||||
{
|
||||
m_currScannerPaths = TomahawkSettings::instance()->scannerPaths();
|
||||
m_dirWatcher->removePaths( m_dirWatcher->directories() );
|
||||
runManualScan( m_currScannerPaths );
|
||||
}
|
||||
|
||||
if( TomahawkSettings::instance()->watchForChanges() &&
|
||||
!m_queuedChangedDirs.isEmpty() )
|
||||
runManualScan( m_queuedChangedDirs, false );
|
||||
if ( TomahawkSettings::instance()->watchForChanges() && !m_scanTimer->isActive() )
|
||||
m_scanTimer->start();
|
||||
}
|
||||
|
||||
|
||||
void ScanManager::runStartupScan()
|
||||
void
|
||||
ScanManager::runStartupScan()
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO;
|
||||
if( !Database::instance() || ( Database::instance() && !Database::instance()->isReady() ) )
|
||||
@@ -140,7 +129,18 @@ void ScanManager::runStartupScan()
|
||||
|
||||
|
||||
void
|
||||
ScanManager::runManualScan( const QStringList& paths, bool recursive )
|
||||
ScanManager::scanTimerTimeout()
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO;
|
||||
if( !Database::instance() || ( Database::instance() && !Database::instance()->isReady() ) )
|
||||
return;
|
||||
else
|
||||
runManualScan( m_currScannerPaths );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ScanManager::runManualScan( const QStringList& paths )
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO;
|
||||
|
||||
@@ -150,97 +150,16 @@ ScanManager::runManualScan( const QStringList& paths, bool recursive )
|
||||
if ( !m_musicScannerThreadController && m_scanner.isNull() ) //still running if these are not zero
|
||||
{
|
||||
m_musicScannerThreadController = new QThread( this );
|
||||
QStringList allPaths = paths;
|
||||
foreach( QString path, m_deferredDirs[recursive] )
|
||||
{
|
||||
if( !allPaths.contains( path ) )
|
||||
allPaths << path;
|
||||
}
|
||||
m_scanner = QWeakPointer< MusicScanner>( new MusicScanner( paths, recursive ) );
|
||||
m_scanner = QWeakPointer< MusicScanner>( new MusicScanner( paths ) );
|
||||
m_scanner.data()->moveToThread( m_musicScannerThreadController );
|
||||
connect( m_scanner.data(), SIGNAL( finished() ), SLOT( scannerFinished() ) );
|
||||
connect( m_scanner.data(), SIGNAL( addWatchedDirs( const QStringList & ) ), SLOT( addWatchedDirs( const QStringList & ) ) );
|
||||
connect( m_scanner.data(), SIGNAL( removeWatchedDir( const QString & ) ), SLOT( removeWatchedDir( const QString & ) ) );
|
||||
m_musicScannerThreadController->start( QThread::IdlePriority );
|
||||
QMetaObject::invokeMethod( m_scanner.data(), "startScan" );
|
||||
m_deferredDirs[recursive].clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "Could not run manual scan, old scan still running; deferring paths";
|
||||
foreach( QString path, paths )
|
||||
{
|
||||
if( !m_deferredDirs[recursive].contains( path ) )
|
||||
{
|
||||
qDebug() << "Deferring path " << path;
|
||||
m_deferredDirs[recursive] << path;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ScanManager::addWatchedDirs( const QStringList& paths )
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO;
|
||||
if ( !TomahawkSettings::instance()->watchForChanges() )
|
||||
qDebug() << "Could not run manual scan, old scan still running";
|
||||
return;
|
||||
|
||||
QStringList currentWatchedPaths = m_dirWatcher->directories();
|
||||
foreach ( QString path, paths )
|
||||
{
|
||||
if ( !currentWatchedPaths.contains( path ) )
|
||||
{
|
||||
qDebug() << "adding " << path << " to watched dirs";
|
||||
m_dirWatcher->addPath( path );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ScanManager::removeWatchedDir( const QString& path )
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO;
|
||||
qDebug() << "removing " << path << " from watched dirs";
|
||||
m_dirWatcher->removePath( path );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ScanManager::handleChangedDir( const QString& path )
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO;
|
||||
qDebug() << "Dir changed: " << path;
|
||||
if( !m_queuedChangedDirs.contains( path ) )
|
||||
m_queuedChangedDirs << path;
|
||||
if( TomahawkSettings::instance()->watchForChanges() )
|
||||
m_queuedScanTimer->start( 10000 );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ScanManager::queuedScanTimeout()
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO;
|
||||
runManualScan( m_queuedChangedDirs, false );
|
||||
m_queuedChangedDirs.clear();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ScanManager::deferredScanTimeout()
|
||||
{
|
||||
if( !m_deferredDirs[true].isEmpty() )
|
||||
{
|
||||
qDebug() << "Running scan for deferred recursive paths";
|
||||
runManualScan( m_deferredDirs[true], true );
|
||||
}
|
||||
else if( !m_deferredDirs[false].isEmpty() )
|
||||
{
|
||||
qDebug() << "Running scan for deferred non-recursive paths";
|
||||
runManualScan( m_deferredDirs[false], false );
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include <QWeakPointer>
|
||||
|
||||
#include "dllmacro.h"
|
||||
#include <QSet>
|
||||
|
||||
class MusicScanner;
|
||||
class QThread;
|
||||
@@ -46,17 +47,13 @@ signals:
|
||||
void finished();
|
||||
|
||||
public slots:
|
||||
void runManualScan( const QStringList& paths, bool recursive = true );
|
||||
void handleChangedDir( const QString& path );
|
||||
void addWatchedDirs( const QStringList& paths );
|
||||
void removeWatchedDir( const QString& path );
|
||||
void runManualScan( const QStringList& paths );
|
||||
|
||||
private slots:
|
||||
void scannerFinished();
|
||||
|
||||
void runStartupScan();
|
||||
void queuedScanTimeout();
|
||||
void deferredScanTimeout();
|
||||
void scanTimerTimeout();
|
||||
|
||||
void onSettingsChanged();
|
||||
|
||||
@@ -66,12 +63,8 @@ private:
|
||||
QWeakPointer< MusicScanner > m_scanner;
|
||||
QThread* m_musicScannerThreadController;
|
||||
QStringList m_currScannerPaths;
|
||||
QFileSystemWatcher* m_dirWatcher;
|
||||
|
||||
QTimer* m_queuedScanTimer;
|
||||
QTimer* m_deferredScanTimer;
|
||||
QStringList m_queuedChangedDirs;
|
||||
QHash< bool, QStringList > m_deferredDirs;
|
||||
QTimer* m_scanTimer;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user