/*
* 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
#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"
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
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);
}
}
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)
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())
}
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();
}