aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xbmc/Application.cpp22
-rw-r--r--xbmc/Application.h6
-rw-r--r--xbmc/interfaces/Builtins.cpp8
-rw-r--r--xbmc/music/infoscanner/MusicInfoScanner.cpp38
-rw-r--r--xbmc/music/infoscanner/MusicInfoScanner.h3
-rw-r--r--xbmc/settings/MediaSettings.cpp7
-rw-r--r--xbmc/video/VideoInfoScanner.cpp36
-rw-r--r--xbmc/video/VideoInfoScanner.h1
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();