diff --git a/src/musicscanner.cpp b/src/musicscanner.cpp index 6a4be8898..23e78a378 100644 --- a/src/musicscanner.cpp +++ b/src/musicscanner.cpp @@ -37,6 +37,7 @@ DirLister::go() { qDebug() << Q_FUNC_INFO; qDebug() << "Recursive? : " << (m_recursive ? "true" : "false"); + qDebug() << "Manual full? : " << (m_manualFull ? "true" : "false"); if( !m_recursive ) { foreach( QString dir, m_dirs ) @@ -68,7 +69,7 @@ DirLister::go() void DirLister::scanDir( QDir dir, int depth, DirLister::Mode mode ) { - qDebug() << "DirLister::scanDir scanning: " << dir.canonicalPath() << " with mode " << mode; + //qDebug() << "DirLister::scanDir scanning: " << dir.canonicalPath() << " with mode " << mode; if( !dir.exists() ) { @@ -80,15 +81,16 @@ DirLister::scanDir( QDir dir, int depth, DirLister::Mode mode ) const uint mtime = QFileInfo( dir.canonicalPath() ).lastModified().toUTC().toTime_t(); m_newdirmtimes.insert( dir.canonicalPath(), mtime ); - if ( m_mode == TomahawkSettings::Dirs && m_dirmtimes.contains( dir.canonicalPath() ) && mtime == m_dirmtimes.value( dir.canonicalPath() ) ) + if ( !m_manualFull && m_mode == TomahawkSettings::Dirs && m_dirmtimes.contains( dir.canonicalPath() ) && mtime == m_dirmtimes.value( dir.canonicalPath() ) ) { // dont scan this dir, unchanged since last time. } else { - if( m_mode == TomahawkSettings::Dirs - && ( m_dirmtimes.contains( dir.canonicalPath() ) || !m_recursive ) - && mtime == m_dirmtimes.value( dir.canonicalPath() ) ) + if( m_manualFull || + ( m_mode == TomahawkSettings::Dirs + && ( m_dirmtimes.contains( dir.canonicalPath() ) || !m_recursive ) + && mtime == m_dirmtimes.value( dir.canonicalPath() ) ) ) Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( new DatabaseCommand_DeleteFiles( dir, SourceList::instance()->getLocal() ) ) ); dir.setFilter( QDir::Files | QDir::Readable | QDir::NoDotAndDotDot ); @@ -105,9 +107,9 @@ DirLister::scanDir( QDir dir, int depth, DirLister::Mode mode ) foreach( const QFileInfo& di, dirs ) { const QString canonical = di.canonicalFilePath(); - qDebug() << "Considering dir " << canonical; + //qDebug() << "Considering dir " << canonical; const bool haveDi = m_dirmtimes.contains( canonical ); - qDebug() << "m_dirmtimes contains it?" << haveDi; + //qDebug() << "m_dirmtimes contains it?" << haveDi; if( !m_newdirmtimes.contains( canonical ) && ( mode == DirLister::Recursive || !haveDi ) ) { scanDir( di.canonicalFilePath(), depth + 1, DirLister::Recursive ); } @@ -115,10 +117,11 @@ DirLister::scanDir( QDir dir, int depth, DirLister::Mode mode ) } -MusicScanner::MusicScanner( const QStringList& dirs, TomahawkSettings::ScannerMode mode, bool recursive, quint32 bs ) +MusicScanner::MusicScanner( const QStringList& dirs, TomahawkSettings::ScannerMode mode, bool manualFull, bool recursive, quint32 bs ) : QObject() , m_dirs( dirs ) - , m_mode( mode ) + , m_mode( manualFull ? TomahawkSettings::Dirs : mode ) + , m_manualFull( manualFull ) , m_recursive( recursive ) , m_batchsize( bs ) , m_dirListerThreadController( 0 ) @@ -218,12 +221,12 @@ MusicScanner::scan() if ( m_mode == TomahawkSettings::Files ) qDebug() << "Num saved file mtimes from last scan:" << m_filemtimes.size(); - connect( this, SIGNAL( batchReady( QVariantList ) ), - SLOT( commitBatch( QVariantList ) ), Qt::DirectConnection ); + connect( this, SIGNAL( batchReady( QVariantList, QVariantList ) ), + SLOT( commitBatch( QVariantList, QVariantList ) ), Qt::DirectConnection ); m_dirListerThreadController = new QThread( this ); - m_dirLister = QWeakPointer< DirLister >( new DirLister( m_dirs, m_dirmtimes, m_mode, m_recursive ) ); + m_dirLister = QWeakPointer< DirLister >( new DirLister( m_dirs, m_dirmtimes, m_mode, m_manualFull, m_recursive ) ); m_dirLister.data()->moveToThread( m_dirListerThreadController ); connect( m_dirLister.data(), SIGNAL( fileToScan( QFileInfo ) ), @@ -247,7 +250,7 @@ MusicScanner::listerFinished( const QMap<QString, unsigned int>& newmtimes ) if( m_scannedfiles.length() ) { SourceList::instance()->getLocal()->scanningFinished( m_scanned ); - commitBatch( m_scannedfiles ); + commitBatch( m_scannedfiles, m_filesToDelete ); } // remove obsolete / stale files @@ -308,11 +311,19 @@ MusicScanner::deleteLister() void -MusicScanner::commitBatch( const QVariantList& tracks ) +MusicScanner::commitBatch( const QVariantList& tracks, const QVariantList& deletethese ) { + if ( deletethese.length() ) + { + qDebug() << Q_FUNC_INFO << " deleting " << deletethese.length() << " tracks "; + source_ptr localsrc = SourceList::instance()->getLocal(); + Database::instance()->enqueue( + QSharedPointer<DatabaseCommand>( new DatabaseCommand_DeleteFiles( deletethese, SourceList::instance()->getLocal() ) ) + ); + } if ( tracks.length() ) { - qDebug() << Q_FUNC_INFO << tracks.length(); + qDebug() << Q_FUNC_INFO << " adding " << tracks.length() << " tracks "; source_ptr localsrc = SourceList::instance()->getLocal(); Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( new DatabaseCommand_AddFiles( tracks, localsrc ) ) @@ -331,15 +342,9 @@ MusicScanner::scanFile( const QFileInfo& fi ) //qDebug() << "All keys: " << m_filemtimes.keys(); //qDebug() << "Checking " << fi.canonicalFilePath() << " with last modified time " << fi.lastModified().toUTC().toTime_t() << " << against value in m_filemtimes " << m_filemtimes.value( "file://" + fi.canonicalFilePath() ).values().first(); if ( fi.lastModified().toUTC().toTime_t() == m_filemtimes.value( "file://" + fi.canonicalFilePath() ).values().first() ) - { - qDebug() << "Same mtime"; return; - } - else - { - qDebug() << "Different mtime"; - return; - } + + m_filesToDelete << m_filemtimes.value( "file://" + fi.canonicalFilePath() ).keys().first(); } QVariant m = readFile( fi ); @@ -350,8 +355,9 @@ MusicScanner::scanFile( const QFileInfo& fi ) if ( m_batchsize != 0 && (quint32)m_scannedfiles.length() >= m_batchsize ) { qDebug() << "batchReady, size:" << m_scannedfiles.length(); - emit batchReady( m_scannedfiles ); + emit batchReady( m_scannedfiles, m_filesToDelete ); m_scannedfiles.clear(); + m_filesToDelete.clear(); } } diff --git a/src/musicscanner.h b/src/musicscanner.h index dfc168cb3..e1f816398 100644 --- a/src/musicscanner.h +++ b/src/musicscanner.h @@ -49,8 +49,8 @@ public: MTimeOnly }; - DirLister( const QStringList& dirs, const QMap<QString, unsigned int>& dirmtimes, TomahawkSettings::ScannerMode mode, bool recursive ) - : QObject(), m_dirs( dirs ), m_dirmtimes( dirmtimes ), m_mode( mode ), m_recursive( recursive ) + DirLister( const QStringList& dirs, const QMap<QString, unsigned int>& dirmtimes, TomahawkSettings::ScannerMode mode, bool manualFull, bool recursive ) + : QObject(), m_dirs( dirs ), m_dirmtimes( dirmtimes ), m_mode( mode ), m_manualFull( manualFull ), m_recursive( recursive ) { qDebug() << Q_FUNC_INFO; } @@ -72,6 +72,7 @@ private: QStringList m_dirs; QMap<QString, unsigned int> m_dirmtimes; TomahawkSettings::ScannerMode m_mode; + bool m_manualFull; bool m_recursive; QMap<QString, unsigned int> m_newdirmtimes; @@ -83,13 +84,13 @@ class MusicScanner : public QObject Q_OBJECT public: - MusicScanner( const QStringList& dirs, TomahawkSettings::ScannerMode mode, bool recursive = true, quint32 bs = 0 ); + MusicScanner( const QStringList& dirs, TomahawkSettings::ScannerMode mode, bool manualFull, bool recursive = true, quint32 bs = 0 ); ~MusicScanner(); signals: //void fileScanned( QVariantMap ); void finished(); - void batchReady( const QVariantList& ); + void batchReady( const QVariantList&, const QVariantList& ); private: QVariant readFile( const QFileInfo& fi ); @@ -102,7 +103,7 @@ private slots: void scan(); void setDirMtimes( const QMap< QString, unsigned int >& m ); void setFileMtimes( const QMap< QString, QMap< unsigned int, unsigned int > >& m ); - void commitBatch( const QVariantList& ); + void commitBatch( const QVariantList& tracks, const QVariantList& deletethese ); private: QStringList m_dirs; @@ -117,7 +118,9 @@ private: QMap<QString, QMap< unsigned int, unsigned int > > m_filemtimes; QMap<QString, unsigned int> m_newdirmtimes; - QList<QVariant> m_scannedfiles; + QVariantList m_scannedfiles; + QVariantList m_filesToDelete; + bool m_manualFull; bool m_recursive; quint32 m_batchsize; diff --git a/src/scanmanager.cpp b/src/scanmanager.cpp index 1d276d731..4d2670861 100644 --- a/src/scanmanager.cpp +++ b/src/scanmanager.cpp @@ -50,7 +50,7 @@ ScanManager::ScanManager( QObject* parent ) m_scanTimer = new QTimer( this ); m_scanTimer->setSingleShot( false ); - m_scanTimer->setInterval( 10000 ); + m_scanTimer->setInterval( 120000 ); connect( TomahawkSettings::instance(), SIGNAL( changed() ), SLOT( onSettingsChanged() ) ); connect( m_scanTimer, SIGNAL( timeout() ), SLOT( scanTimerTimeout() ) ); @@ -141,18 +141,18 @@ ScanManager::scanTimerTimeout() void -ScanManager::runScan() +ScanManager::runScan( bool manualFull ) { qDebug() << Q_FUNC_INFO; if ( !Database::instance() || ( Database::instance() && !Database::instance()->isReady() ) ) return; - runDirScan( TomahawkSettings::instance()->scannerPaths() ); + runDirScan( TomahawkSettings::instance()->scannerPaths(), manualFull ); } void -ScanManager::runDirScan( const QStringList& paths ) +ScanManager::runDirScan( const QStringList& paths, bool manualFull ) { qDebug() << Q_FUNC_INFO; @@ -162,7 +162,7 @@ ScanManager::runDirScan( const QStringList& paths ) if ( !m_musicScannerThreadController && m_scanner.isNull() ) //still running if these are not zero { m_musicScannerThreadController = new QThread( this ); - m_scanner = QWeakPointer< MusicScanner>( new MusicScanner( paths, TomahawkSettings::instance()->scannerMode() ) ); + m_scanner = QWeakPointer< MusicScanner>( new MusicScanner( paths, TomahawkSettings::instance()->scannerMode(), manualFull ) ); m_scanner.data()->moveToThread( m_musicScannerThreadController ); connect( m_scanner.data(), SIGNAL( finished() ), SLOT( scannerFinished() ) ); m_musicScannerThreadController->start( QThread::IdlePriority ); diff --git a/src/scanmanager.h b/src/scanmanager.h index 87da4c238..5e6f01baf 100644 --- a/src/scanmanager.h +++ b/src/scanmanager.h @@ -47,8 +47,8 @@ signals: void finished(); public slots: - void runScan(); - void runDirScan( const QStringList& paths ); + void runScan( bool manualFull = false ); + void runDirScan( const QStringList& paths, bool manualFull ); private slots: void scannerFinished(); diff --git a/src/tomahawkwindow.cpp b/src/tomahawkwindow.cpp index 0bad7b41e..445ae6c26 100644 --- a/src/tomahawkwindow.cpp +++ b/src/tomahawkwindow.cpp @@ -271,7 +271,8 @@ TomahawkWindow::setupSignals() connect( ui->actionDiagnostics, SIGNAL( triggered() ), SLOT( showDiagnosticsDialog() ) ); connect( ui->actionToggleConnect, SIGNAL( triggered() ), SipHandler::instance(), SLOT( toggleConnect() ) ); // connect( ui->actionAddPeerManually, SIGNAL( triggered() ), SLOT( addPeerManually() ) ); - connect( ui->actionRescanCollection, SIGNAL( triggered() ), SLOT( updateCollectionManually() ) ); + connect( ui->actionUpdateCollection, SIGNAL( triggered() ), SLOT( updateCollectionManually() ) ); + connect( ui->actionRescanCollection, SIGNAL( triggered() ), SLOT( rescanCollectionManually() ) ); connect( ui->actionLoadXSPF, SIGNAL( triggered() ), SLOT( loadSpiff() )); connect( ui->actionCreatePlaylist, SIGNAL( triggered() ), SLOT( createPlaylist() )); connect( ui->actionCreateAutomaticPlaylist, SIGNAL( triggered() ), SLOT( createAutomaticPlaylist() )); @@ -378,6 +379,14 @@ TomahawkWindow::updateCollectionManually() } +void +TomahawkWindow::rescanCollectionManually() +{ + if ( TomahawkSettings::instance()->hasScannerPaths() ) + ScanManager::instance()->runScan( true ); +} + + void TomahawkWindow::addPeerManually() { diff --git a/src/tomahawkwindow.h b/src/tomahawkwindow.h index 730ba47ce..b79acfbc9 100644 --- a/src/tomahawkwindow.h +++ b/src/tomahawkwindow.h @@ -68,6 +68,7 @@ public slots: void showSettingsDialog(); void showDiagnosticsDialog(); void updateCollectionManually(); + void rescanCollectionManually(); void pluginMenuAdded(QMenu*); void pluginMenuRemoved(QMenu*); diff --git a/src/tomahawkwindow.ui b/src/tomahawkwindow.ui index 092aea983..a1a4f3985 100644 --- a/src/tomahawkwindow.ui +++ b/src/tomahawkwindow.ui @@ -35,7 +35,7 @@ <x>0</x> <y>0</y> <width>1000</width> - <height>22</height> + <height>20</height> </rect> </property> <widget class="QMenu" name="menuSettings"> @@ -48,6 +48,7 @@ <property name="title"> <string>&Music Player</string> </property> + <addaction name="actionUpdateCollection"/> <addaction name="actionRescanCollection"/> <addaction name="separator"/> <addaction name="actionShowOfflineSources"/> @@ -115,9 +116,12 @@ <string>Add &Friend...</string> </property> </action> - <action name="actionRescanCollection"> + <action name="actionUpdateCollection"> <property name="text"> - <string>Re&scan Collection...</string> + <string>U&pdate Collection</string> + </property> + <property name="toolTip"> + <string>Update Collection</string> </property> </action> <action name="actionPreferences"> @@ -190,6 +194,14 @@ <enum>QAction::ApplicationSpecificRole</enum> </property> </action> + <action name="actionRescanCollection"> + <property name="text"> + <string>Fully &Rescan Collection</string> + </property> + <property name="toolTip"> + <string>Fully Rescan Collection</string> + </property> + </action> </widget> <layoutdefault spacing="6" margin="11"/> <resources/>