From 0789b3d689947b57743abc022998aa00dee319d4 Mon Sep 17 00:00:00 2001 From: arnova Date: Fri, 16 Nov 2012 14:58:06 +0100 Subject: [PATCH 1/6] fixed: Thumbs didn't show in the playlist (fixes #13531, #13529) --- xbmc/music/MusicInfoLoader.cpp | 14 ++++++++++++++ xbmc/music/MusicInfoLoader.h | 2 ++ xbmc/music/MusicThumbLoader.cpp | 9 +++++++-- xbmc/music/MusicThumbLoader.h | 4 +++- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/xbmc/music/MusicInfoLoader.cpp b/xbmc/music/MusicInfoLoader.cpp index 0c8c776764bf5..b8a68db82dd7a 100644 --- a/xbmc/music/MusicInfoLoader.cpp +++ b/xbmc/music/MusicInfoLoader.cpp @@ -34,6 +34,7 @@ #include "utils/log.h" #include "Artist.h" #include "Album.h" +#include "MusicThumbLoader.h" using namespace std; using namespace XFILE; @@ -43,12 +44,15 @@ using namespace MUSIC_INFO; CMusicInfoLoader::CMusicInfoLoader() : CBackgroundInfoLoader(1) { m_mapFileItems = new CFileItemList; + + m_thumbLoader = new CMusicThumbLoader(); } CMusicInfoLoader::~CMusicInfoLoader() { StopThread(); delete m_mapFileItems; + delete m_thumbLoader; } void CMusicInfoLoader::OnLoaderStart() @@ -71,6 +75,9 @@ void CMusicInfoLoader::OnLoaderStart() m_pProgressCallback->SetProgressMax(m_pVecItems->GetFileCount()); m_musicDatabase.Open(); + + if (m_thumbLoader) + m_thumbLoader->Initialize(); } bool CMusicInfoLoader::LoadAdditionalTagInfo(CFileItem* pItem) @@ -124,6 +131,10 @@ bool CMusicInfoLoader::LoadItem(CFileItem* pItem) if (pItem->m_bIsFolder || pItem->IsPlayList() || pItem->IsNFO() || pItem->IsInternetStream()) return false; + // Get thumb for item + if (m_thumbLoader) + m_thumbLoader->LoadItem(pItem); + if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->Loaded()) return true; @@ -228,6 +239,9 @@ void CMusicInfoLoader::OnLoaderFinish() m_pVecItems->Save(); m_musicDatabase.Close(); + + if (m_thumbLoader) + m_thumbLoader->Deinitialize(); } void CMusicInfoLoader::UseCacheOnHD(const CStdString& strFileName) diff --git a/xbmc/music/MusicInfoLoader.h b/xbmc/music/MusicInfoLoader.h index 7a5f707e612c3..0d2ba43e2f73e 100644 --- a/xbmc/music/MusicInfoLoader.h +++ b/xbmc/music/MusicInfoLoader.h @@ -22,6 +22,7 @@ #include "MusicDatabase.h" class CFileItemList; +class CMusicThumbLoader; namespace MUSIC_INFO { @@ -48,5 +49,6 @@ class CMusicInfoLoader : public CBackgroundInfoLoader CMusicDatabase m_musicDatabase; unsigned int m_databaseHits; unsigned int m_tagReads; + CMusicThumbLoader *m_thumbLoader; }; } diff --git a/xbmc/music/MusicThumbLoader.cpp b/xbmc/music/MusicThumbLoader.cpp index a59eb2c77adcd..d371bb9dcf888 100644 --- a/xbmc/music/MusicThumbLoader.cpp +++ b/xbmc/music/MusicThumbLoader.cpp @@ -45,6 +45,12 @@ void CMusicThumbLoader::Initialize() m_albumArt.clear(); } +void CMusicThumbLoader::Deinitialize() +{ + m_database->Close(); + m_albumArt.clear(); +} + void CMusicThumbLoader::OnLoaderStart() { Initialize(); @@ -52,8 +58,7 @@ void CMusicThumbLoader::OnLoaderStart() void CMusicThumbLoader::OnLoaderFinish() { - m_database->Close(); - m_albumArt.clear(); + Deinitialize(); } bool CMusicThumbLoader::LoadItem(CFileItem* pItem) diff --git a/xbmc/music/MusicThumbLoader.h b/xbmc/music/MusicThumbLoader.h index e85e33cbe01c3..e3978da3b7b61 100644 --- a/xbmc/music/MusicThumbLoader.h +++ b/xbmc/music/MusicThumbLoader.h @@ -37,6 +37,8 @@ class CMusicThumbLoader : public CThumbLoader virtual ~CMusicThumbLoader(); virtual void Initialize(); + virtual void Deinitialize(); + virtual bool LoadItem(CFileItem* pItem); /*! \brief helper function to fill the art for a video library item @@ -54,7 +56,7 @@ class CMusicThumbLoader : public CThumbLoader static bool FillThumb(CFileItem &item); static bool GetEmbeddedThumb(const std::string &path, MUSIC_INFO::EmbeddedArt &art); - + protected: virtual void OnLoaderStart(); virtual void OnLoaderFinish(); From c1db323f53d5f20ac370b31808828c698a88627e Mon Sep 17 00:00:00 2001 From: arnova Date: Fri, 16 Nov 2012 18:40:40 +0100 Subject: [PATCH 2/6] fixed: Folder thumbs would not show in the playlist for music files (thanks Jonathan) --- xbmc/FileItem.cpp | 9 ++++++++- xbmc/FileItem.h | 2 +- xbmc/music/MusicInfoLoader.cpp | 19 ++++++++++--------- xbmc/music/MusicThumbLoader.cpp | 2 +- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/xbmc/FileItem.cpp b/xbmc/FileItem.cpp index 1931cf08279f3..2a2a2975d082a 100644 --- a/xbmc/FileItem.cpp +++ b/xbmc/FileItem.cpp @@ -2619,7 +2619,7 @@ bool CFileItemList::AlwaysCache() const return false; } -CStdString CFileItem::GetUserMusicThumb(bool alwaysCheckRemote /* = false */) const +CStdString CFileItem::GetUserMusicThumb(bool alwaysCheckRemote /* = false */, bool fallbackToFolder /* = false */) const { if (m_strPath.IsEmpty() || m_bIsShareOrDrive @@ -2637,6 +2637,13 @@ CStdString CFileItem::GetUserMusicThumb(bool alwaysCheckRemote /* = false */) co if (CFile::Exists(fileThumb)) return fileThumb; + // Fall back to folder thumb, if requested + if (!m_bIsFolder && fallbackToFolder) + { + CFileItem item(URIUtils::GetDirectory(m_strPath), true); + return item.GetUserMusicThumb(alwaysCheckRemote); + } + // if a folder, check for folder.jpg if (m_bIsFolder && !IsFileFolder() && (!IsRemote() || alwaysCheckRemote || g_guiSettings.GetBool("musicfiles.findremotethumbs"))) { diff --git a/xbmc/FileItem.h b/xbmc/FileItem.h index 31f68f540db3c..c51a73f9a970d 100644 --- a/xbmc/FileItem.h +++ b/xbmc/FileItem.h @@ -307,7 +307,7 @@ class CFileItem : CStdString GetBaseMoviePath(bool useFolderNames) const; // Gets the user thumb, if it exists - CStdString GetUserMusicThumb(bool alwaysCheckRemote = false) const; + CStdString GetUserMusicThumb(bool alwaysCheckRemote = false, bool fallbackToFolder = false) const; /*! \brief Get the path where we expect local metadata to reside. For a folder, this is just the existing path (eg tvshow folder) diff --git a/xbmc/music/MusicInfoLoader.cpp b/xbmc/music/MusicInfoLoader.cpp index b8a68db82dd7a..8eb05c4adad9c 100644 --- a/xbmc/music/MusicInfoLoader.cpp +++ b/xbmc/music/MusicInfoLoader.cpp @@ -131,22 +131,17 @@ bool CMusicInfoLoader::LoadItem(CFileItem* pItem) if (pItem->m_bIsFolder || pItem->IsPlayList() || pItem->IsNFO() || pItem->IsInternetStream()) return false; - // Get thumb for item - if (m_thumbLoader) - m_thumbLoader->LoadItem(pItem); - - if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->Loaded()) - return true; - + if (!pItem->HasMusicInfoTag() || !pItem->GetMusicInfoTag()->Loaded()) + { // first check the cached item CFileItemPtr mapItem = (*m_mapFileItems)[pItem->GetPath()]; if (mapItem && mapItem->m_dateTime==pItem->m_dateTime && mapItem->HasMusicInfoTag() && mapItem->GetMusicInfoTag()->Loaded()) { // Query map if we previously cached the file on HD *pItem->GetMusicInfoTag() = *mapItem->GetMusicInfoTag(); pItem->SetArt("thumb", mapItem->GetArt("thumb")); - return true; } - + else + { CStdString strPath; URIUtils::GetDirectory(pItem->GetPath(), strPath); URIUtils::AddSlashAtEnd(strPath); @@ -188,6 +183,12 @@ bool CMusicInfoLoader::LoadItem(CFileItem* pItem) } m_strPrevPath = strPath; + } + } + + // Get thumb for item + m_thumbLoader->LoadItem(pItem); + return true; } diff --git a/xbmc/music/MusicThumbLoader.cpp b/xbmc/music/MusicThumbLoader.cpp index d371bb9dcf888..29cbba3253257 100644 --- a/xbmc/music/MusicThumbLoader.cpp +++ b/xbmc/music/MusicThumbLoader.cpp @@ -107,7 +107,7 @@ bool CMusicThumbLoader::FillThumb(CFileItem &item) CStdString thumb = GetCachedImage(item, "thumb"); if (thumb.IsEmpty()) { - thumb = item.GetUserMusicThumb(); + thumb = item.GetUserMusicThumb(false, true); if (!thumb.IsEmpty()) SetCachedImage(item, "thumb", thumb); } From c1215a35035633072cced145500786cd7a67dda2 Mon Sep 17 00:00:00 2001 From: arnova Date: Sun, 18 Nov 2012 12:07:29 +0100 Subject: [PATCH 3/6] fixed: Formatting --- xbmc/music/MusicInfoLoader.cpp | 90 +++++++++++++++++----------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/xbmc/music/MusicInfoLoader.cpp b/xbmc/music/MusicInfoLoader.cpp index 8eb05c4adad9c..b03c7acdd6c7a 100644 --- a/xbmc/music/MusicInfoLoader.cpp +++ b/xbmc/music/MusicInfoLoader.cpp @@ -133,56 +133,56 @@ bool CMusicInfoLoader::LoadItem(CFileItem* pItem) if (!pItem->HasMusicInfoTag() || !pItem->GetMusicInfoTag()->Loaded()) { - // first check the cached item - CFileItemPtr mapItem = (*m_mapFileItems)[pItem->GetPath()]; - if (mapItem && mapItem->m_dateTime==pItem->m_dateTime && mapItem->HasMusicInfoTag() && mapItem->GetMusicInfoTag()->Loaded()) - { // Query map if we previously cached the file on HD - *pItem->GetMusicInfoTag() = *mapItem->GetMusicInfoTag(); - pItem->SetArt("thumb", mapItem->GetArt("thumb")); - } + // first check the cached item + CFileItemPtr mapItem = (*m_mapFileItems)[pItem->GetPath()]; + if (mapItem && mapItem->m_dateTime==pItem->m_dateTime && mapItem->HasMusicInfoTag() && mapItem->GetMusicInfoTag()->Loaded()) + { // Query map if we previously cached the file on HD + *pItem->GetMusicInfoTag() = *mapItem->GetMusicInfoTag(); + pItem->SetArt("thumb", mapItem->GetArt("thumb")); + } else { - CStdString strPath; - URIUtils::GetDirectory(pItem->GetPath(), strPath); - URIUtils::AddSlashAtEnd(strPath); - if (strPath!=m_strPrevPath) - { - // The item is from another directory as the last one, - // query the database for the new directory... - m_musicDatabase.GetSongsByPath(strPath, m_songsMap); - m_databaseHits++; - } + CStdString strPath; + URIUtils::GetDirectory(pItem->GetPath(), strPath); + URIUtils::AddSlashAtEnd(strPath); + if (strPath!=m_strPrevPath) + { + // The item is from another directory as the last one, + // query the database for the new directory... + m_musicDatabase.GetSongsByPath(strPath, m_songsMap); + m_databaseHits++; + } - CSong *song=NULL; + CSong *song=NULL; - if ((song=m_songsMap.Find(pItem->GetPath()))!=NULL) - { // Have we loaded this item from database before - pItem->GetMusicInfoTag()->SetSong(*song); - pItem->SetArt("thumb", song->strThumb); - } - else if (pItem->IsMusicDb()) - { // a music db item that doesn't have tag loaded - grab details from the database - XFILE::MUSICDATABASEDIRECTORY::CQueryParams param; - XFILE::MUSICDATABASEDIRECTORY::CDirectoryNode::GetDatabaseInfo(pItem->GetPath(),param); - CSong song; - if (m_musicDatabase.GetSongById(param.GetSongId(), song)) - { - pItem->GetMusicInfoTag()->SetSong(song); - pItem->SetArt("thumb", song.strThumb); - } - } - else if (g_guiSettings.GetBool("musicfiles.usetags") || pItem->IsCDDA()) - { // Nothing found, load tag from file, - // always try to load cddb info - // get correct tag parser - auto_ptr pLoader (CMusicInfoTagLoaderFactory::CreateLoader(pItem->GetPath())); - if (NULL != pLoader.get()) - // get tag - pLoader->Load(pItem->GetPath(), *pItem->GetMusicInfoTag()); - m_tagReads++; - } + if ((song=m_songsMap.Find(pItem->GetPath()))!=NULL) + { // Have we loaded this item from database before + pItem->GetMusicInfoTag()->SetSong(*song); + pItem->SetArt("thumb", song->strThumb); + } + else if (pItem->IsMusicDb()) + { // a music db item that doesn't have tag loaded - grab details from the database + XFILE::MUSICDATABASEDIRECTORY::CQueryParams param; + XFILE::MUSICDATABASEDIRECTORY::CDirectoryNode::GetDatabaseInfo(pItem->GetPath(),param); + CSong song; + if (m_musicDatabase.GetSongById(param.GetSongId(), song)) + { + pItem->GetMusicInfoTag()->SetSong(song); + pItem->SetArt("thumb", song.strThumb); + } + } + else if (g_guiSettings.GetBool("musicfiles.usetags") || pItem->IsCDDA()) + { // Nothing found, load tag from file, + // always try to load cddb info + // get correct tag parser + auto_ptr pLoader (CMusicInfoTagLoaderFactory::CreateLoader(pItem->GetPath())); + if (NULL != pLoader.get()) + // get tag + pLoader->Load(pItem->GetPath(), *pItem->GetMusicInfoTag()); + m_tagReads++; + } - m_strPrevPath = strPath; + m_strPrevPath = strPath; } } From 27729c3cf93904227aec20776bc89bf50943105b Mon Sep 17 00:00:00 2001 From: arnova Date: Mon, 19 Nov 2012 13:42:38 +0100 Subject: [PATCH 4/6] changed: Cleanup obsolete code in CMusicInfoLoader::OnLoaderFinish() --- xbmc/music/MusicInfoLoader.cpp | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/xbmc/music/MusicInfoLoader.cpp b/xbmc/music/MusicInfoLoader.cpp index b03c7acdd6c7a..d7a01424f6cd2 100644 --- a/xbmc/music/MusicInfoLoader.cpp +++ b/xbmc/music/MusicInfoLoader.cpp @@ -200,39 +200,6 @@ void CMusicInfoLoader::OnLoaderFinish() // cleanup cache loaded from HD m_mapFileItems->Clear(); - if (!m_bStop) - { // check for art - VECSONGS songs; - songs.reserve(m_pVecItems->Size()); - for (int i = 0; i < m_pVecItems->Size(); ++i) - { - CFileItemPtr pItem = m_pVecItems->Get(i); - if (pItem->m_bIsFolder || pItem->IsPlayList() || pItem->IsNFO() || pItem->IsInternetStream()) - continue; - if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->Loaded()) - { - CSong song(*pItem->GetMusicInfoTag()); - song.strThumb = pItem->GetArt("thumb"); - song.idSong = i; // for the lookup below - songs.push_back(song); - } - } - VECALBUMS albums; - CMusicInfoScanner::CategoriseAlbums(songs, albums); - CMusicInfoScanner::FindArtForAlbums(albums, m_pVecItems->GetPath()); - for (VECALBUMS::iterator i = albums.begin(); i != albums.end(); ++i) - { - string albumArt = i->art["thumb"]; - for (VECSONGS::iterator j = i->songs.begin(); j != i->songs.end(); ++j) - { - if (!j->strThumb.empty()) - m_pVecItems->Get(j->idSong)->SetArt("thumb", j->strThumb); - else - m_pVecItems->Get(j->idSong)->SetArt("thumb", albumArt); - } - } - } - // Save loaded items to HD if (!m_strCacheFileName.IsEmpty()) SaveCache(m_strCacheFileName, *m_pVecItems); From ab00c02124294b94033ed90c44b0b51fa733e80a Mon Sep 17 00:00:00 2001 From: arnova Date: Mon, 19 Nov 2012 21:33:39 +0100 Subject: [PATCH 5/6] added: Embedded art support for non-musicdb items/files --- xbmc/music/MusicThumbLoader.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/xbmc/music/MusicThumbLoader.cpp b/xbmc/music/MusicThumbLoader.cpp index 29cbba3253257..c7ffdef16a6aa 100644 --- a/xbmc/music/MusicThumbLoader.cpp +++ b/xbmc/music/MusicThumbLoader.cpp @@ -95,7 +95,18 @@ bool CMusicThumbLoader::LoadItem(CFileItem* pItem) } if (!pItem->HasArt("thumb")) - FillThumb(*pItem); + { + // Look for embedded art + if (pItem->HasMusicInfoTag() && !pItem->GetMusicInfoTag()->GetCoverArtInfo().empty()) + { + CStdString thumb = CTextureCache::GetWrappedImageURL(pItem->GetPath(), "music"); + pItem->SetArt("thumb", thumb); + } + else + { + FillThumb(*pItem); + } + } return true; } From 97fd66ca63622950a639a2f5fd08de8ae69cc125 Mon Sep 17 00:00:00 2001 From: arnova Date: Tue, 20 Nov 2012 12:41:03 +0100 Subject: [PATCH 6/6] changed: Make user file thumbs overrule embedded art in music files --- xbmc/music/MusicThumbLoader.cpp | 16 +++++++++++----- xbmc/music/MusicThumbLoader.h | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/xbmc/music/MusicThumbLoader.cpp b/xbmc/music/MusicThumbLoader.cpp index c7ffdef16a6aa..8eb741b6593c5 100644 --- a/xbmc/music/MusicThumbLoader.cpp +++ b/xbmc/music/MusicThumbLoader.cpp @@ -99,26 +99,32 @@ bool CMusicThumbLoader::LoadItem(CFileItem* pItem) // Look for embedded art if (pItem->HasMusicInfoTag() && !pItem->GetMusicInfoTag()->GetCoverArtInfo().empty()) { - CStdString thumb = CTextureCache::GetWrappedImageURL(pItem->GetPath(), "music"); - pItem->SetArt("thumb", thumb); + // The item has got embedded art but user thumbs overrule, so check for those first + 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"); + pItem->SetArt("thumb", thumb); + } } else { - FillThumb(*pItem); + // Check for user thumbs + FillThumb(*pItem, true); } } return true; } -bool CMusicThumbLoader::FillThumb(CFileItem &item) +bool CMusicThumbLoader::FillThumb(CFileItem &item, bool folderThumbs /* = true */) { if (item.HasArt("thumb")) return true; CStdString thumb = GetCachedImage(item, "thumb"); if (thumb.IsEmpty()) { - thumb = item.GetUserMusicThumb(false, true); + thumb = item.GetUserMusicThumb(false, folderThumbs); if (!thumb.IsEmpty()) SetCachedImage(item, "thumb", thumb); } diff --git a/xbmc/music/MusicThumbLoader.h b/xbmc/music/MusicThumbLoader.h index e3978da3b7b61..ecf77c6bf6d87 100644 --- a/xbmc/music/MusicThumbLoader.h +++ b/xbmc/music/MusicThumbLoader.h @@ -53,7 +53,7 @@ class CMusicThumbLoader : public CThumbLoader \param item the CFileItem object to fill \return true if we fill the thumb, false otherwise */ - static bool FillThumb(CFileItem &item); + static bool FillThumb(CFileItem &item, bool folderThumbs = true); static bool GetEmbeddedThumb(const std::string &path, MUSIC_INFO::EmbeddedArt &art);