2 * Copyright (C) 2012-2013 Team XBMC
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)
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.
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/>.
21 #include "MusicThumbLoader.h"
23 #include "TextureDatabase.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"
31 using namespace MUSIC_INFO;
33 CMusicThumbLoader::CMusicThumbLoader() : CThumbLoader()
35 m_musicDatabase = new CMusicDatabase;
38 CMusicThumbLoader::~CMusicThumbLoader()
40 delete m_musicDatabase;
43 void CMusicThumbLoader::OnLoaderStart()
45 m_musicDatabase->Open();
47 CThumbLoader::OnLoaderStart();
50 void CMusicThumbLoader::OnLoaderFinish()
52 m_musicDatabase->Close();
54 CThumbLoader::OnLoaderFinish();
57 bool CMusicThumbLoader::LoadItem(CFileItem* pItem)
59 bool result = LoadItemCached(pItem);
60 result |= LoadItemLookup(pItem);
65 bool CMusicThumbLoader::LoadItemCached(CFileItem* pItem)
67 if (pItem->m_bIsShareOrDrive)
70 if (pItem->HasMusicInfoTag() && pItem->GetArt().empty())
72 if (FillLibraryArt(*pItem))
75 if (pItem->GetMusicInfoTag()->GetType() == "artist")
76 return false; // No fallback
79 if (pItem->HasVideoInfoTag() && pItem->GetArt().empty())
81 CVideoThumbLoader loader;
82 if (loader.LoadItemCached(pItem))
86 if (!pItem->HasArt("thumb"))
88 std::string art = GetCachedImage(*pItem, "thumb");
90 pItem->SetArt("thumb", art);
93 if (!pItem->HasArt("fanart"))
95 std::string art = GetCachedImage(*pItem, "fanart");
98 pItem->SetArt("fanart", art);
100 else if (pItem->HasMusicInfoTag() && !pItem->GetMusicInfoTag()->GetArtist().empty())
102 std::string artist = pItem->GetMusicInfoTag()->GetArtist()[0];
103 m_musicDatabase->Open();
104 int idArtist = m_musicDatabase->GetArtistByName(artist);
107 string fanart = m_musicDatabase->GetArtForItem(idArtist, "artist", "fanart");
110 pItem->SetArt("artist.fanart", fanart);
111 pItem->SetArtFallback("fanart", "artist.fanart");
113 else if (!pItem->GetMusicInfoTag()->GetAlbumArtist().empty() &&
114 pItem->GetMusicInfoTag()->GetAlbumArtist()[0] != artist)
116 // If no artist fanart and the album artist is different to the artist,
117 // try to get fanart from the album artist
118 artist = pItem->GetMusicInfoTag()->GetAlbumArtist()[0];
119 idArtist = m_musicDatabase->GetArtistByName(artist);
122 fanart = m_musicDatabase->GetArtForItem(idArtist, "artist", "fanart");
125 pItem->SetArt("albumartist.fanart", fanart);
126 pItem->SetArtFallback("fanart", "albumartist.fanart");
131 m_musicDatabase->Close();
138 bool CMusicThumbLoader::LoadItemLookup(CFileItem* pItem)
140 if (pItem->m_bIsShareOrDrive)
143 if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->GetType() == "artist") // No fallback for artist
146 if (pItem->HasVideoInfoTag())
148 CVideoThumbLoader loader;
149 if (loader.LoadItemLookup(pItem))
153 if (!pItem->HasArt("thumb"))
155 // Look for embedded art
156 if (pItem->HasMusicInfoTag() && !pItem->GetMusicInfoTag()->GetCoverArtInfo().empty())
158 // The item has got embedded art but user thumbs overrule, so check for those first
159 if (!FillThumb(*pItem, false)) // Check for user thumbs but ignore folder thumbs
161 // No user thumb, use embedded art
162 CStdString thumb = CTextureUtils::GetWrappedImageURL(pItem->GetPath(), "music");
163 pItem->SetArt("thumb", thumb);
168 // Check for user thumbs
169 FillThumb(*pItem, true);
176 bool CMusicThumbLoader::FillThumb(CFileItem &item, bool folderThumbs /* = true */)
178 if (item.HasArt("thumb"))
180 CStdString thumb = GetCachedImage(item, "thumb");
183 thumb = item.GetUserMusicThumb(false, folderThumbs);
185 SetCachedImage(item, "thumb", thumb);
188 item.SetArt("thumb", thumb);
189 return !thumb.empty();
192 bool CMusicThumbLoader::FillLibraryArt(CFileItem &item)
194 CMusicInfoTag &tag = *item.GetMusicInfoTag();
195 if (tag.GetDatabaseId() > -1 && !tag.GetType().empty())
197 m_musicDatabase->Open();
198 map<string, string> artwork;
199 if (m_musicDatabase->GetArtForItem(tag.GetDatabaseId(), tag.GetType(), artwork))
200 item.SetArt(artwork);
201 else if (tag.GetType() == "song")
202 { // no art for the song, try the album
203 ArtCache::const_iterator i = m_albumArt.find(tag.GetAlbumId());
204 if (i == m_albumArt.end())
206 m_musicDatabase->GetArtForItem(tag.GetAlbumId(), "album", artwork);
207 i = m_albumArt.insert(make_pair(tag.GetAlbumId(), artwork)).first;
209 if (i != m_albumArt.end())
211 item.AppendArt(i->second, "album");
212 for (map<string, string>::const_iterator j = i->second.begin(); j != i->second.end(); ++j)
213 item.SetArtFallback(j->first, "album." + j->first);
216 if (tag.GetType() == "song" || tag.GetType() == "album")
217 { // fanart from the artist
218 string fanart = m_musicDatabase->GetArtistArtForItem(tag.GetDatabaseId(), tag.GetType(), "fanart");
221 item.SetArt("artist.fanart", fanart);
222 item.SetArtFallback("fanart", "artist.fanart");
224 else if (tag.GetType() == "song")
226 // If no artist fanart, try for album artist fanart
227 fanart = m_musicDatabase->GetArtistArtForItem(tag.GetAlbumId(), "album", "fanart");
230 item.SetArt("albumartist.fanart", fanart);
231 item.SetArtFallback("fanart", "albumartist.fanart");
235 m_musicDatabase->Close();
237 return !item.GetArt().empty();
240 bool CMusicThumbLoader::GetEmbeddedThumb(const std::string &path, EmbeddedArt &art)
242 auto_ptr<IMusicInfoTagLoader> pLoader (CMusicInfoTagLoaderFactory::CreateLoader(path));
244 if (NULL != pLoader.get())
245 pLoader->Load(path, tag, &art);