diff options
-rw-r--r-- | xbmc/Application.cpp | 22 | ||||
-rw-r--r-- | xbmc/Application.h | 6 | ||||
-rw-r--r-- | xbmc/interfaces/Builtins.cpp | 8 | ||||
-rw-r--r-- | xbmc/music/infoscanner/MusicInfoScanner.cpp | 38 | ||||
-rw-r--r-- | xbmc/music/infoscanner/MusicInfoScanner.h | 3 | ||||
-rw-r--r-- | xbmc/settings/MediaSettings.cpp | 7 | ||||
-rw-r--r-- | xbmc/video/VideoInfoScanner.cpp | 36 | ||||
-rw-r--r-- | xbmc/video/VideoInfoScanner.h | 1 |
8 files changed, 104 insertions, 17 deletions
diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp index ec53704ca7..e0d40c9911 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -5628,7 +5628,13 @@ void CApplication::StartVideoCleanup(bool userInitiated /* = true */) if (m_videoInfoScanner->IsScanning()) return; - m_videoInfoScanner->CleanDatabase(NULL, NULL, userInitiated); + if (userInitiated) + m_videoInfoScanner->CleanDatabase(NULL, NULL, true); + else + { + m_videoInfoScanner->ShowDialog(false); + m_videoInfoScanner->StartCleanDatabase(); + } } void CApplication::StartVideoScan(const CStdString &strDirectory, bool userInitiated /* = true */, bool scanAll /* = false */) @@ -5641,6 +5647,20 @@ void CApplication::StartVideoScan(const CStdString &strDirectory, bool userIniti m_videoInfoScanner->Start(strDirectory,scanAll); } +void CApplication::StartMusicCleanup(bool userInitiated /* = true */) +{ + if (m_musicInfoScanner->IsScanning()) + return; + + if (userInitiated) + m_musicInfoScanner->CleanDatabase(true); + else + { + m_musicInfoScanner->ShowDialog(false); + m_musicInfoScanner->StartCleanDatabase(); + } +} + void CApplication::StartMusicScan(const CStdString &strDirectory, bool userInitiated /* = true */, int flags /* = 0 */) { if (m_musicInfoScanner->IsScanning()) diff --git a/xbmc/Application.h b/xbmc/Application.h index 23fd4cfe17..0a332ff988 100644 --- a/xbmc/Application.h +++ b/xbmc/Application.h @@ -260,6 +260,12 @@ public: void StartVideoScan(const CStdString &path, bool userInitiated = true, bool scanAll = false); /*! + \brief Starts a music library cleanup. + \param userInitiated Whether the action was initiated by the user (either via GUI or any other method) or not. It is meant to hide or show dialogs. + */ + void StartMusicCleanup(bool userInitiated = true); + + /*! \brief Starts a music library update. \param path The path to scan or "" (empty string) for a global scan. \param userInitiated Whether the action was initiated by the user (either via GUI or any other method) or not. It is meant to hide or show dialogs. diff --git a/xbmc/interfaces/Builtins.cpp b/xbmc/interfaces/Builtins.cpp index ba3052cc80..d99f047b2c 100644 --- a/xbmc/interfaces/Builtins.cpp +++ b/xbmc/interfaces/Builtins.cpp @@ -1470,13 +1470,7 @@ int CBuiltins::Execute(const std::string& execString) else if (StringUtils::EqualsNoCase(params[0], "music")) { if (!g_application.IsMusicScanning()) - { - CMusicDatabase musicdatabase; - - musicdatabase.Open(); - musicdatabase.Cleanup(userInitiated); - musicdatabase.Close(); - } + g_application.StartMusicCleanup(userInitiated); else CLog::Log(LOGERROR, "CleanLibrary is not possible while scanning for media info"); } diff --git a/xbmc/music/infoscanner/MusicInfoScanner.cpp b/xbmc/music/infoscanner/MusicInfoScanner.cpp index 5e39b73294..38fe5653d8 100644 --- a/xbmc/music/infoscanner/MusicInfoScanner.cpp +++ b/xbmc/music/infoscanner/MusicInfoScanner.cpp @@ -82,6 +82,14 @@ void CMusicInfoScanner::Process() ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnScanStarted"); try { + if (m_bClean) + { + CleanDatabase(false); + m_bRunning = false; + + return; + } + unsigned int tick = XbmcThreads::SystemClockMillis(); m_musicDatabase.Open(); @@ -94,6 +102,8 @@ void CMusicInfoScanner::Process() m_handle = dialog->GetHandle(g_localizeStrings.Get(314)); } + m_bClean = g_advancedSettings.m_bMusicLibraryCleanOnUpdate; + m_bCanInterrupt = true; if (m_scanType == 0) // load info from files @@ -267,7 +277,21 @@ void CMusicInfoScanner::Start(const CStdString& strDirectory, int flags) } else m_pathsToScan.insert(strDirectory); - m_bClean = g_advancedSettings.m_bMusicLibraryCleanOnUpdate; + m_bClean = false; + + m_scanType = 0; + Create(); + m_bRunning = true; +} + +void CMusicInfoScanner::StartCleanDatabase() +{ + m_fileCountReader.StopThread(); + StopThread(); + m_pathsToScan.clear(); + m_seenPaths.clear(); + m_flags = SCAN_BACKGROUND; + m_bClean = true; m_scanType = 0; Create(); @@ -375,6 +399,18 @@ void CMusicInfoScanner::Stop() StopThread(false); } +void CMusicInfoScanner::CleanDatabase(bool showProgress /* = true */) +{ + CMusicDatabase musicdatabase; + if (!musicdatabase.Open()) + return; + + musicdatabase.Cleanup(showProgress); + musicdatabase.Close(); + + CUtil::DeleteMusicDatabaseDirectoryCache(); +} + static void OnDirectoryScanned(const CStdString& strDirectory) { CGUIMessage msg(GUI_MSG_DIRECTORY_SCANNED, 0, 0, 0); diff --git a/xbmc/music/infoscanner/MusicInfoScanner.h b/xbmc/music/infoscanner/MusicInfoScanner.h index b7bfd1fb73..658d01cd42 100644 --- a/xbmc/music/infoscanner/MusicInfoScanner.h +++ b/xbmc/music/infoscanner/MusicInfoScanner.h @@ -55,11 +55,14 @@ public: virtual ~CMusicInfoScanner(); void Start(const CStdString& strDirectory, int flags); + void StartCleanDatabase(); void FetchAlbumInfo(const CStdString& strDirectory, bool refresh=false); void FetchArtistInfo(const CStdString& strDirectory, bool refresh=false); bool IsScanning(); void Stop(); + void CleanDatabase(bool showProgress = true); + //! \brief Set whether or not to show a progress dialog void ShowDialog(bool show) { m_showDialog = show; } diff --git a/xbmc/settings/MediaSettings.cpp b/xbmc/settings/MediaSettings.cpp index 57d6ab44cc..973edba610 100644 --- a/xbmc/settings/MediaSettings.cpp +++ b/xbmc/settings/MediaSettings.cpp @@ -314,9 +314,8 @@ void CMediaSettings::OnSettingAction(const CSetting *setting) } else if (settingId == "musiclibrary.cleanup") { - CMusicDatabase musicdatabase; - musicdatabase.Clean(); - CUtil::DeleteMusicDatabaseDirectoryCache(); + if (CGUIDialogYesNo::ShowAndGetInput(313, 333, 0, 0)) + g_application.StartMusicCleanup(true); } else if (settingId == "musiclibrary.export") CBuiltins::Execute("exportlibrary(music)"); @@ -336,7 +335,7 @@ void CMediaSettings::OnSettingAction(const CSetting *setting) else if (settingId == "videolibrary.cleanup") { if (CGUIDialogYesNo::ShowAndGetInput(313, 333, 0, 0)) - g_application.StartVideoCleanup(); + g_application.StartVideoCleanup(true); } else if (settingId == "videolibrary.export") CBuiltins::Execute("exportlibrary(video)"); diff --git a/xbmc/video/VideoInfoScanner.cpp b/xbmc/video/VideoInfoScanner.cpp index b4a2672a79..8f74b9339f 100644 --- a/xbmc/video/VideoInfoScanner.cpp +++ b/xbmc/video/VideoInfoScanner.cpp @@ -78,10 +78,6 @@ namespace VIDEO { try { - unsigned int tick = XbmcThreads::SystemClockMillis(); - - m_database.Open(); - if (m_showDialog && !CSettings::Get().GetBool("videolibrary.backgroundupdate")) { CGUIDialogExtendedProgressBar* dialog = @@ -90,6 +86,24 @@ namespace VIDEO m_handle = dialog->GetHandle(g_localizeStrings.Get(314)); } + // check if we only need to perform a cleaning + if (m_bClean && m_pathsToScan.empty()) + { + CleanDatabase(m_handle, NULL, false); + + if (m_handle) + m_handle->MarkFinished(); + m_handle = NULL; + + m_bRunning = false; + + return; + } + + unsigned int tick = XbmcThreads::SystemClockMillis(); + + m_database.Open(); + m_bCanInterrupt = true; CLog::Log(LOGNOTICE, "VideoInfoScanner: Starting scan .."); @@ -193,6 +207,20 @@ namespace VIDEO m_bRunning = true; } + void CVideoInfoScanner::StartCleanDatabase() + { + m_strStartDir.clear(); + m_scanAll = false; + m_pathsToScan.clear(); + m_pathsToClean.clear(); + + m_bClean = true; + + StopThread(); + Create(); + m_bRunning = true; + } + bool CVideoInfoScanner::IsScanning() { return m_bRunning; diff --git a/xbmc/video/VideoInfoScanner.h b/xbmc/video/VideoInfoScanner.h index 92883e757b..28bd2bff6f 100644 --- a/xbmc/video/VideoInfoScanner.h +++ b/xbmc/video/VideoInfoScanner.h @@ -59,6 +59,7 @@ namespace VIDEO \param scanAll whether to scan everything not already scanned (regardless of whether the user normally doesn't want a folder scanned.) Defaults to false. */ void Start(const CStdString& strDirectory, bool scanAll = false); + void StartCleanDatabase(); bool IsScanning(); void CleanDatabase(CGUIDialogProgressBarHandle* handle=NULL, const std::set<int>* paths=NULL, bool showProgress=true); void Stop(); |