[pvr] adds a background job to search for missing channel icons
authorxhaggi <sascha.woo@gmail.com>
Tue, 6 May 2014 17:25:51 +0000 (19:25 +0200)
committerxhaggi <sascha.woo@gmail.com>
Thu, 8 May 2014 15:02:20 +0000 (17:02 +0200)
This adds a background job to search for missing channel icons, which is exectued on every PVR manager start.

language/English/strings.po
xbmc/pvr/PVRManager.cpp
xbmc/pvr/PVRManager.h
xbmc/pvr/channels/PVRChannelGroup.cpp
xbmc/pvr/channels/PVRChannelGroupsContainer.cpp

index 58e811b..45eaba3 100755 (executable)
@@ -8502,7 +8502,13 @@ msgctxt "#19285"
 msgid "Browse for icon"
 msgstr ""
 
-#empty strings from id 19286 to 19498
+#. Notification message if process starts searching for missing channel icons
+#: xbmc/pvr/PVRManager.cpp
+msgctxt "#19286"
+msgid "Searching for channel icons"
+msgstr ""
+
+#empty strings from id 19287 to 19498
 
 #: xbmc/epg/Epg.cpp
 msgctxt "#19499"
index 9e23a18..c580622 100644 (file)
@@ -144,7 +144,7 @@ void CPVRManager::OnSettingAction(const CSetting *setting)
   if (settingId == "pvrmenu.searchicons")
   {
     if (IsStarted())
-      SearchMissingChannelIcons();
+      TriggerSearchMissingChannelIcons();
   }
   else if (settingId == "pvrmanager.resetdb")
   {
@@ -449,13 +449,18 @@ void CPVRManager::Process(void)
   bool bRestart(false);
   while (IsStarted() && m_addons && m_addons->HasConnectedClients() && !bRestart)
   {
-    /* continue last watched channel after first startup */
+    /* first startup */
     if (m_bFirstStart)
     {
       {
         CSingleLock lock(m_critSection);
         m_bFirstStart = false;
       }
+      
+      /* start job to search for missing channel icons */
+      TriggerSearchMissingChannelIcons();
+      
+      /* continue last watched channel */
       ContinueLastChannel();
     }
     /* execute the next pending jobs if there are any */
@@ -1455,6 +1460,11 @@ void CPVRManager::TriggerSaveChannelSettings(void)
   QueueJob(new CPVRChannelSettingsSaveJob());
 }
 
+void CPVRManager::TriggerSearchMissingChannelIcons(void)
+{
+  CJobManager::GetInstance().AddJob(new CPVRSearchMissingChannelIconsJob(), NULL);
+}
+
 void CPVRManager::ExecutePendingJobs(void)
 {
   CSingleLock lock(m_critSectionTriggers);
@@ -1539,6 +1549,12 @@ bool CPVRChannelSwitchJob::DoWork(void)
   return true;
 }
 
+bool CPVRSearchMissingChannelIconsJob::DoWork(void)
+{
+  g_PVRManager.SearchMissingChannelIcons();
+  return true;
+}
+
 bool CPVRManager::CreateChannelEpgs(void)
 {
   if (EpgsCreated())
index 12866a3..c8461ac 100644 (file)
@@ -397,6 +397,11 @@ namespace PVR
     void TriggerSaveChannelSettings(void);
 
     /*!
+     * @brief Let the background thread search for missing channel icons.
+     */
+    void TriggerSearchMissingChannelIcons(void);
+
+    /*!
      * @brief Update the channel that is currently active.
      * @param item The new channel.
      * @return True if it was updated correctly, false otherwise.
@@ -745,4 +750,14 @@ namespace PVR
     CFileItem* m_previous;
     CFileItem* m_next;
   };
+
+  class CPVRSearchMissingChannelIconsJob : public CJob
+  {
+  public:
+    CPVRSearchMissingChannelIconsJob(void) {}
+    virtual ~CPVRSearchMissingChannelIconsJob() {}
+    virtual const char *GetType() const { return "pvr-search-missing-channel-icons"; }
+
+    bool DoWork();
+  };
 }
index a4c3c7f..a74a763 100644 (file)
@@ -29,6 +29,7 @@
 #include "guilib/GUIWindowManager.h"
 #include "dialogs/GUIDialogYesNo.h"
 #include "dialogs/GUIDialogOK.h"
+#include "dialogs/GUIDialogExtendedProgressBar.h"
 #include "music/tags/MusicInfoTag.h"
 #include "utils/log.h"
 #include "Util.h"
@@ -246,7 +247,10 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */)
 
   if (fileItemList.IsEmpty())
     return;
-  
+
+  CGUIDialogExtendedProgressBar* dlgProgress = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS);
+  CGUIDialogProgressBarHandle* dlgProgressHandle = dlgProgress ? dlgProgress->GetHandle(g_localizeStrings.Get(19286)) : NULL;
+
   CSingleLock lock(m_critSection);
 
   /* create a map for fast lookup of normalized file base name */
@@ -260,10 +264,18 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */)
     fileItemMap.insert(std::make_pair(baseName, (*it)->GetPath()));
   }
 
+  int channelIndex = 0;
   for(std::vector<PVRChannelGroupMember>::const_iterator it = m_members.begin(); it != m_members.end(); ++it)
   {
     CPVRChannelPtr channel = (*it).channel;
 
+    /* update progress dialog */
+    if (dlgProgressHandle)
+    {
+      dlgProgressHandle->SetProgress(channelIndex++, m_members.size());
+      dlgProgressHandle->SetText(channel->ChannelName());
+    }
+
     /* skip if an icon is already set and exists */
     if (channel->IsIconExists())
       continue;
@@ -290,6 +302,9 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */)
 
     /* TODO: start channel icon scraper here if nothing was found */
   }
+
+  if (dlgProgressHandle)
+    dlgProgressHandle->MarkFinished();
 }
 
 /********** sort methods **********/
index 3c76d1e..da774ac 100644 (file)
@@ -254,7 +254,6 @@ void CPVRChannelGroupsContainer::SearchMissingChannelIcons(void)
 {
   CLog::Log(LOGINFO, "PVRChannelGroupsContainer - %s - starting channel icon search", __FUNCTION__);
 
-  // TODO: Add Process dialog here
   CPVRChannelGroupPtr channelgrouptv  = GetGroupAllTV();
   CPVRChannelGroupPtr channelgroupradio = GetGroupAllRadio();
 
@@ -262,8 +261,6 @@ void CPVRChannelGroupsContainer::SearchMissingChannelIcons(void)
     channelgrouptv->SearchAndSetChannelIcons(true);
   if (channelgroupradio)
     channelgroupradio->SearchAndSetChannelIcons(true);
-
-  CGUIDialogOK::ShowAndGetInput(19167,0,20177,0);
 }
 
 CFileItemPtr CPVRChannelGroupsContainer::GetLastPlayedChannel(void) const