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 "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"
31 using namespace MUSIC_INFO;
33 CMusicThumbLoader::CMusicThumbLoader() : CThumbLoader()
35 m_database = new CMusicDatabase;
38 CMusicThumbLoader::~CMusicThumbLoader()
43 void CMusicThumbLoader::Initialize()
49 void CMusicThumbLoader::Deinitialize()
55 void CMusicThumbLoader::OnLoaderStart()
60 void CMusicThumbLoader::OnLoaderFinish()
65 bool CMusicThumbLoader::LoadItem(CFileItem* pItem)
67 bool result = LoadItemCached(pItem);
68 result |= LoadItemLookup(pItem);
73 bool CMusicThumbLoader::LoadItemCached(CFileItem* pItem)
75 if (pItem->m_bIsShareOrDrive)
78 if (pItem->HasMusicInfoTag() && pItem->GetArt().empty())
80 if (FillLibraryArt(*pItem))
83 if (pItem->GetMusicInfoTag()->GetType() == "artist")
84 return false; // No fallback
87 if (pItem->HasVideoInfoTag() && pItem->GetArt().empty())
89 CVideoThumbLoader loader;
90 if (loader.LoadItemCached(pItem))
94 if (!pItem->HasArt("fanart"))
96 if (pItem->HasMusicInfoTag() && !pItem->GetMusicInfoTag()->GetArtist().empty())
98 std::string artist = pItem->GetMusicInfoTag()->GetArtist()[0];
100 int idArtist = m_database->GetArtistByName(artist);
103 string fanart = m_database->GetArtForItem(idArtist, "artist", "fanart");
106 pItem->SetArt("artist.fanart", fanart);
107 pItem->SetArtFallback("fanart", "artist.fanart");
117 bool CMusicThumbLoader::LoadItemLookup(CFileItem* pItem)
119 if (pItem->m_bIsShareOrDrive)
122 if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->GetType() == "artist") // No fallback for artist
125 if (pItem->HasVideoInfoTag())
127 CVideoThumbLoader loader;
128 if (loader.LoadItemLookup(pItem))
132 if (!pItem->HasArt("thumb"))
134 // Look for embedded art
135 if (pItem->HasMusicInfoTag() && !pItem->GetMusicInfoTag()->GetCoverArtInfo().empty())
137 // The item has got embedded art but user thumbs overrule, so check for those first
138 if (!FillThumb(*pItem, false)) // Check for user thumbs but ignore folder thumbs
140 // No user thumb, use embedded art
141 CStdString thumb = CTextureCache::GetWrappedImageURL(pItem->GetPath(), "music");
142 pItem->SetArt("thumb", thumb);
147 // Check for user thumbs
148 FillThumb(*pItem, true);
155 bool CMusicThumbLoader::FillThumb(CFileItem &item, bool folderThumbs /* = true */)
157 if (item.HasArt("thumb"))
159 CStdString thumb = GetCachedImage(item, "thumb");
162 thumb = item.GetUserMusicThumb(false, folderThumbs);
163 if (!thumb.IsEmpty())
164 SetCachedImage(item, "thumb", thumb);
166 item.SetArt("thumb", thumb);
167 return !thumb.IsEmpty();
170 bool CMusicThumbLoader::FillLibraryArt(CFileItem &item)
172 CMusicInfoTag &tag = *item.GetMusicInfoTag();
173 if (tag.GetDatabaseId() > -1 && !tag.GetType().empty())
176 map<string, string> artwork;
177 if (m_database->GetArtForItem(tag.GetDatabaseId(), tag.GetType(), artwork))
178 item.SetArt(artwork);
179 else if (tag.GetType() == "song")
180 { // no art for the song, try the album
181 ArtCache::const_iterator i = m_albumArt.find(tag.GetAlbumId());
182 if (i == m_albumArt.end())
184 m_database->GetArtForItem(tag.GetAlbumId(), "album", artwork);
185 i = m_albumArt.insert(make_pair(tag.GetAlbumId(), artwork)).first;
187 if (i != m_albumArt.end())
189 item.AppendArt(i->second, "album");
190 for (map<string, string>::const_iterator j = i->second.begin(); j != i->second.end(); ++j)
191 item.SetArtFallback(j->first, "album." + j->first);
194 if (tag.GetType() == "song" || tag.GetType() == "album")
195 { // fanart from the artist
196 string fanart = m_database->GetArtistArtForItem(tag.GetDatabaseId(), tag.GetType(), "fanart");
199 item.SetArt("artist.fanart", fanart);
200 item.SetArtFallback("fanart", "artist.fanart");
205 return !item.GetArt().empty();
208 bool CMusicThumbLoader::GetEmbeddedThumb(const std::string &path, EmbeddedArt &art)
210 auto_ptr<IMusicInfoTagLoader> pLoader (CMusicInfoTagLoaderFactory::CreateLoader(path));
212 if (NULL != pLoader.get())
213 pLoader->Load(path, tag, &art);