removed: BackGroundInfo Loader multithreading (no longer needed)
[vuplus_xbmc] / xbmc / music / MusicThumbLoader.cpp
1 /*
2  *      Copyright (C) 2012-2013 Team XBMC
3  *      http://www.xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, see
17  *  <http://www.gnu.org/licenses/>.
18  *
19  */
20
21 #include "MusicThumbLoader.h"
22 #include "FileItem.h"
23 #include "TextureCache.h"
24 #include "music/tags/MusicInfoTag.h"
25 #include "music/tags/MusicInfoTagLoaderFactory.h"
26 #include "music/infoscanner/MusicInfoScanner.h"
27 #include "music/Artist.h"
28 #include "video/VideoThumbLoader.h"
29
30 using namespace std;
31 using namespace MUSIC_INFO;
32
33 CMusicThumbLoader::CMusicThumbLoader() : CThumbLoader()
34 {
35   m_database = new CMusicDatabase;
36 }
37
38 CMusicThumbLoader::~CMusicThumbLoader()
39 {
40   delete m_database;
41 }
42
43 void CMusicThumbLoader::Initialize()
44 {
45   m_database->Open();
46   m_albumArt.clear();
47 }
48
49 void CMusicThumbLoader::Deinitialize()
50 {
51   m_database->Close();
52   m_albumArt.clear();
53 }
54
55 void CMusicThumbLoader::OnLoaderStart()
56 {
57   Initialize();
58 }
59
60 void CMusicThumbLoader::OnLoaderFinish()
61 {
62   Deinitialize();
63 }
64
65 bool CMusicThumbLoader::LoadItem(CFileItem* pItem)
66 {
67   if (pItem->m_bIsShareOrDrive)
68     return true;
69
70   if (pItem->HasMusicInfoTag() && pItem->GetArt().empty())
71   {
72     if (FillLibraryArt(*pItem))
73       return true;
74     if (pItem->GetMusicInfoTag()->GetType() == "artist")
75       return true; // no fallback
76   }
77
78   if (pItem->HasVideoInfoTag() && pItem->GetArt().empty())
79   { // music video
80     CVideoThumbLoader loader;
81     if (loader.LoadItem(pItem))
82       return true;
83   }
84
85   if (!pItem->HasArt("fanart"))
86   {
87     if (pItem->HasMusicInfoTag() && !pItem->GetMusicInfoTag()->GetArtist().empty())
88     {
89       std::string artist = pItem->GetMusicInfoTag()->GetArtist()[0];
90       m_database->Open();
91       int idArtist = m_database->GetArtistByName(artist);
92       if (idArtist >= 0)
93       {
94         string fanart = m_database->GetArtForItem(idArtist, "artist", "fanart");
95         if (!fanart.empty())
96         {
97           pItem->SetArt("artist.fanart", fanart);
98           pItem->SetArtFallback("fanart", "artist.fanart");
99         }
100       }
101       m_database->Close();
102     }
103   }
104
105   if (!pItem->HasArt("thumb"))
106   {
107     // Look for embedded art
108     if (pItem->HasMusicInfoTag() && !pItem->GetMusicInfoTag()->GetCoverArtInfo().empty())
109     {
110       // The item has got embedded art but user thumbs overrule, so check for those first
111       if (!FillThumb(*pItem, false)) // Check for user thumbs but ignore folder thumbs
112       {
113         // No user thumb, use embedded art
114         CStdString thumb = CTextureCache::GetWrappedImageURL(pItem->GetPath(), "music");
115         pItem->SetArt("thumb", thumb);
116       }
117     }
118     else
119     {
120       // Check for user thumbs
121       FillThumb(*pItem, true);
122     }
123   }
124
125   return true;
126 }
127
128 bool CMusicThumbLoader::FillThumb(CFileItem &item, bool folderThumbs /* = true */)
129 {
130   if (item.HasArt("thumb"))
131     return true;
132   CStdString thumb = GetCachedImage(item, "thumb");
133   if (thumb.IsEmpty())
134   {
135     thumb = item.GetUserMusicThumb(false, folderThumbs);
136     if (!thumb.IsEmpty())
137       SetCachedImage(item, "thumb", thumb);
138   }
139   item.SetArt("thumb", thumb);
140   return !thumb.IsEmpty();
141 }
142
143 bool CMusicThumbLoader::FillLibraryArt(CFileItem &item)
144 {
145   CMusicInfoTag &tag = *item.GetMusicInfoTag();
146   if (tag.GetDatabaseId() > -1 && !tag.GetType().empty())
147   {
148     m_database->Open();
149     map<string, string> artwork;
150     if (m_database->GetArtForItem(tag.GetDatabaseId(), tag.GetType(), artwork))
151       item.SetArt(artwork);
152     else if (tag.GetType() == "song")
153     { // no art for the song, try the album
154       ArtCache::const_iterator i = m_albumArt.find(tag.GetAlbumId());
155       if (i == m_albumArt.end())
156       {
157         m_database->GetArtForItem(tag.GetAlbumId(), "album", artwork);
158         i = m_albumArt.insert(make_pair(tag.GetAlbumId(), artwork)).first;
159       }
160       if (i != m_albumArt.end())
161       {
162         item.AppendArt(i->second, "album");
163         for (map<string, string>::const_iterator j = i->second.begin(); j != i->second.end(); ++j)
164           item.SetArtFallback(j->first, "album." + j->first);
165       }
166     }
167     if (tag.GetType() == "song" || tag.GetType() == "album")
168     { // fanart from the artist
169       string fanart = m_database->GetArtistArtForItem(tag.GetDatabaseId(), tag.GetType(), "fanart");
170       if (!fanart.empty())
171       {
172         item.SetArt("artist.fanart", fanart);
173         item.SetArtFallback("fanart", "artist.fanart");
174       }
175     }
176     m_database->Close();
177   }
178   return !item.GetArt().empty();
179 }
180
181 bool CMusicThumbLoader::GetEmbeddedThumb(const std::string &path, EmbeddedArt &art)
182 {
183   auto_ptr<IMusicInfoTagLoader> pLoader (CMusicInfoTagLoaderFactory::CreateLoader(path));
184   CMusicInfoTag tag;
185   if (NULL != pLoader.get())
186     pLoader->Load(path, tag, &art);
187
188   return !art.empty();
189 }