Merge pull request #4406 from jmarshallnz/thumb_fixes
[vuplus_xbmc] / xbmc / music / MusicThumbLoader.cpp
index dc21ccc..cb4039c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *      Copyright (C) 2012-2013 Team XBMC
- *      http://www.xbmc.org
+ *      http://xbmc.org
  *
  *  This Program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@
 
 #include "MusicThumbLoader.h"
 #include "FileItem.h"
-#include "TextureCache.h"
+#include "TextureDatabase.h"
 #include "music/tags/MusicInfoTag.h"
 #include "music/tags/MusicInfoTagLoaderFactory.h"
 #include "music/infoscanner/MusicInfoScanner.h"
@@ -32,76 +32,124 @@ using namespace MUSIC_INFO;
 
 CMusicThumbLoader::CMusicThumbLoader() : CThumbLoader()
 {
-  m_database = new CMusicDatabase;
+  m_musicDatabase = new CMusicDatabase;
 }
 
 CMusicThumbLoader::~CMusicThumbLoader()
 {
-  delete m_database;
+  delete m_musicDatabase;
 }
 
-void CMusicThumbLoader::Initialize()
+void CMusicThumbLoader::OnLoaderStart()
 {
-  m_database->Open();
+  m_musicDatabase->Open();
   m_albumArt.clear();
+  CThumbLoader::OnLoaderStart();
 }
 
-void CMusicThumbLoader::Deinitialize()
+void CMusicThumbLoader::OnLoaderFinish()
 {
-  m_database->Close();
+  m_musicDatabase->Close();
   m_albumArt.clear();
+  CThumbLoader::OnLoaderFinish();
 }
 
-void CMusicThumbLoader::OnLoaderStart()
+bool CMusicThumbLoader::LoadItem(CFileItem* pItem)
 {
-  Initialize();
-}
+  bool result  = LoadItemCached(pItem);
+       result |= LoadItemLookup(pItem);
 
-void CMusicThumbLoader::OnLoaderFinish()
-{
-  Deinitialize();
+  return result;
 }
 
-bool CMusicThumbLoader::LoadItem(CFileItem* pItem)
+bool CMusicThumbLoader::LoadItemCached(CFileItem* pItem)
 {
   if (pItem->m_bIsShareOrDrive)
-    return true;
+    return false;
 
   if (pItem->HasMusicInfoTag() && pItem->GetArt().empty())
   {
     if (FillLibraryArt(*pItem))
       return true;
+      
     if (pItem->GetMusicInfoTag()->GetType() == "artist")
-      return true; // no fallback
+      return false; // No fallback
   }
 
   if (pItem->HasVideoInfoTag() && pItem->GetArt().empty())
   { // music video
     CVideoThumbLoader loader;
-    if (loader.LoadItem(pItem))
+    if (loader.LoadItemCached(pItem))
       return true;
   }
 
+  if (!pItem->HasArt("thumb"))
+  {
+    std::string art = GetCachedImage(*pItem, "thumb");
+    if (!art.empty())
+      pItem->SetArt("thumb", art);
+  }
+
   if (!pItem->HasArt("fanart"))
   {
-    if (pItem->HasMusicInfoTag() && !pItem->GetMusicInfoTag()->GetArtist().empty())
+    std::string art = GetCachedImage(*pItem, "fanart");
+    if (!art.empty())
+    {
+      pItem->SetArt("fanart", art);
+    }
+    else if (pItem->HasMusicInfoTag() && !pItem->GetMusicInfoTag()->GetArtist().empty())
     {
       std::string artist = pItem->GetMusicInfoTag()->GetArtist()[0];
-      m_database->Open();
-      int idArtist = m_database->GetArtistByName(artist);
+      m_musicDatabase->Open();
+      int idArtist = m_musicDatabase->GetArtistByName(artist);
       if (idArtist >= 0)
       {
-        string fanart = m_database->GetArtForItem(idArtist, "artist", "fanart");
+        string fanart = m_musicDatabase->GetArtForItem(idArtist, "artist", "fanart");
         if (!fanart.empty())
         {
           pItem->SetArt("artist.fanart", fanart);
           pItem->SetArtFallback("fanart", "artist.fanart");
         }
+        else if (!pItem->GetMusicInfoTag()->GetAlbumArtist().empty() &&
+                 pItem->GetMusicInfoTag()->GetAlbumArtist()[0] != artist)
+        {
+          // If no artist fanart and the album artist is different to the artist,
+          // try to get fanart from the album artist
+          artist = pItem->GetMusicInfoTag()->GetAlbumArtist()[0];
+          idArtist = m_musicDatabase->GetArtistByName(artist);
+          if (idArtist >= 0)
+          {
+            fanart = m_musicDatabase->GetArtForItem(idArtist, "artist", "fanart");
+            if (!fanart.empty())
+            {
+              pItem->SetArt("albumartist.fanart", fanart);
+              pItem->SetArtFallback("fanart", "albumartist.fanart");
+            }
+          }
+        }
       }
-      m_database->Close();
+      m_musicDatabase->Close();
     }
   }
 
+  return false;
+}
+
+bool CMusicThumbLoader::LoadItemLookup(CFileItem* pItem)
+{
+  if (pItem->m_bIsShareOrDrive)
+    return false;
+
+  if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->GetType() == "artist") // No fallback for artist
+    return false;
+
+  if (pItem->HasVideoInfoTag())
+  { // music video
+    CVideoThumbLoader loader;
+    if (loader.LoadItemLookup(pItem))
+      return true;
+  }
+
   if (!pItem->HasArt("thumb"))
   {
     // Look for embedded art
@@ -111,7 +159,7 @@ bool CMusicThumbLoader::LoadItem(CFileItem* pItem)
       if (!FillThumb(*pItem, false)) // Check for user thumbs but ignore folder thumbs
       {
         // No user thumb, use embedded art
-        CStdString thumb = CTextureCache::GetWrappedImageURL(pItem->GetPath(), "music");
+        CStdString thumb = CTextureUtils::GetWrappedImageURL(pItem->GetPath(), "music");
         pItem->SetArt("thumb", thumb);
       }
     }
@@ -130,14 +178,15 @@ bool CMusicThumbLoader::FillThumb(CFileItem &item, bool folderThumbs /* = true *
   if (item.HasArt("thumb"))
     return true;
   CStdString thumb = GetCachedImage(item, "thumb");
-  if (thumb.IsEmpty())
+  if (thumb.empty())
   {
     thumb = item.GetUserMusicThumb(false, folderThumbs);
-    if (!thumb.IsEmpty())
+    if (!thumb.empty())
       SetCachedImage(item, "thumb", thumb);
   }
-  item.SetArt("thumb", thumb);
-  return !thumb.IsEmpty();
+  if (!thumb.empty())
+    item.SetArt("thumb", thumb);
+  return !thumb.empty();
 }
 
 bool CMusicThumbLoader::FillLibraryArt(CFileItem &item)
@@ -145,16 +194,16 @@ bool CMusicThumbLoader::FillLibraryArt(CFileItem &item)
   CMusicInfoTag &tag = *item.GetMusicInfoTag();
   if (tag.GetDatabaseId() > -1 && !tag.GetType().empty())
   {
-    m_database->Open();
+    m_musicDatabase->Open();
     map<string, string> artwork;
-    if (m_database->GetArtForItem(tag.GetDatabaseId(), tag.GetType(), artwork))
+    if (m_musicDatabase->GetArtForItem(tag.GetDatabaseId(), tag.GetType(), artwork))
       item.SetArt(artwork);
     else if (tag.GetType() == "song")
     { // no art for the song, try the album
       ArtCache::const_iterator i = m_albumArt.find(tag.GetAlbumId());
       if (i == m_albumArt.end())
       {
-        m_database->GetArtForItem(tag.GetAlbumId(), "album", artwork);
+        m_musicDatabase->GetArtForItem(tag.GetAlbumId(), "album", artwork);
         i = m_albumArt.insert(make_pair(tag.GetAlbumId(), artwork)).first;
       }
       if (i != m_albumArt.end())
@@ -166,14 +215,24 @@ bool CMusicThumbLoader::FillLibraryArt(CFileItem &item)
     }
     if (tag.GetType() == "song" || tag.GetType() == "album")
     { // fanart from the artist
-      string fanart = m_database->GetArtistArtForItem(tag.GetDatabaseId(), tag.GetType(), "fanart");
+      string fanart = m_musicDatabase->GetArtistArtForItem(tag.GetDatabaseId(), tag.GetType(), "fanart");
       if (!fanart.empty())
       {
         item.SetArt("artist.fanart", fanart);
         item.SetArtFallback("fanart", "artist.fanart");
       }
+      else if (tag.GetType() == "song")
+      {
+        // If no artist fanart, try for album artist fanart
+        fanart = m_musicDatabase->GetArtistArtForItem(tag.GetAlbumId(), "album", "fanart");
+        if (!fanart.empty())
+        {
+          item.SetArt("albumartist.fanart", fanart);
+          item.SetArtFallback("fanart", "albumartist.fanart");
+        }
+      }
     }
-    m_database->Close();
+    m_musicDatabase->Close();
   }
   return !item.GetArt().empty();
 }