From 80202198a2d019466158d5ee5e20aafb1de35b87 Mon Sep 17 00:00:00 2001 From: montellese Date: Sun, 16 Nov 2014 14:16:10 +0100 Subject: video library: add the possibility to clean the database in the background --- xbmc/Application.cpp | 8 +++++++- xbmc/settings/MediaSettings.cpp | 2 +- xbmc/video/VideoInfoScanner.cpp | 36 ++++++++++++++++++++++++++++++++---- xbmc/video/VideoInfoScanner.h | 1 + 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp index 415e4c267d..33b144db08 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -5624,7 +5624,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 */) diff --git a/xbmc/settings/MediaSettings.cpp b/xbmc/settings/MediaSettings.cpp index 57d6ab44cc..6b29fe7594 100644 --- a/xbmc/settings/MediaSettings.cpp +++ b/xbmc/settings/MediaSettings.cpp @@ -336,7 +336,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* paths=NULL, bool showProgress=true); void Stop(); -- cgit v1.2.3 From 973dcdd8a8a7376434cd87819d3d3c38096dda0c Mon Sep 17 00:00:00 2001 From: montellese Date: Sun, 16 Nov 2014 15:58:00 +0100 Subject: music library: add the possibility to clean the database in the background --- xbmc/Application.cpp | 14 +++++++++++ xbmc/Application.h | 6 +++++ xbmc/interfaces/Builtins.cpp | 8 +----- xbmc/music/infoscanner/MusicInfoScanner.cpp | 38 ++++++++++++++++++++++++++++- xbmc/music/infoscanner/MusicInfoScanner.h | 3 +++ xbmc/settings/MediaSettings.cpp | 5 ++-- 6 files changed, 63 insertions(+), 11 deletions(-) diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp index 33b144db08..1392c7fd6f 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -5643,6 +5643,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 @@ -259,6 +259,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. 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 6b29fe7594..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)"); -- cgit v1.2.3