diff options
author | Pär Björklund <per.bjorklund@gmail.com> | 2016-10-02 15:45:26 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-02 15:45:26 +0200 |
commit | cefa3222ad13cbf7b80bd9dc665c33eb51596ae2 (patch) | |
tree | 60b529cc75ff607fb301c91545e95bc5a3ae7632 | |
parent | c6e07b7e2a3467f99f6ecf493b9609caefbd14e5 (diff) | |
parent | 7febb52e6114c006115b14e2fc7e3da59092066a (diff) |
Merge pull request #10569 from DaveTBlake/CompilationsFix
Compilation albums - all songs marked means album is compilation (fixes Trac tickets)
-rw-r--r-- | xbmc/music/infoscanner/MusicInfoScanner.cpp | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/xbmc/music/infoscanner/MusicInfoScanner.cpp b/xbmc/music/infoscanner/MusicInfoScanner.cpp index e639de2d72..311cdc62ae 100644 --- a/xbmc/music/infoscanner/MusicInfoScanner.cpp +++ b/xbmc/music/infoscanner/MusicInfoScanner.cpp @@ -674,29 +674,32 @@ void CMusicInfoScanner::FileItemsToAlbums(CFileItemList& items, VECALBUMS& album } /* - We have a compilation if - 1. album name is non-empty AND - 2a. no tracks overlap OR - 2b. all tracks are marked as part of compilation AND - 3a. a unique primary artist is specified as "various" or "various artists" OR - 3b. we have at least two primary artists and no album artist specified. - */ + We have a Various Artists compilation if + 1. album name is non-empty AND + 2a. no tracks overlap OR + 2b. all tracks are marked as part of compilation AND + 3a. a unique primary artist is specified as "various", "various artists" or the localized value + OR + 3b. we have at least two primary artists and no album artist specified. + */ + std::string various = g_localizeStrings.Get(340); // Various Artists bool compilation = !songsByAlbumName->first.empty() && (isCompilation || !tracksOverlap); // 1+2b+2a if (artists.size() == 1) { std::string artist = artists.begin()->first; StringUtils::ToLower(artist); if (!StringUtils::EqualsNoCase(artist, "various") && - !StringUtils::EqualsNoCase(artist, "various artists")) // 3a + !StringUtils::EqualsNoCase(artist, "various artists") && + !StringUtils::EqualsNoCase(artist, various)) // 3a compilation = false; } else if (hasAlbumArtist) // 3b compilation = false; + //Such a compilation album is stored with the localized value for "various artists" as the album artist if (compilation) { CLog::Log(LOGDEBUG, "Album '%s' is a compilation as there's no overlapping tracks and %s", songsByAlbumName->first.c_str(), hasAlbumArtist ? "the album artist is 'Various'" : "there is more than one unique artist"); artists.clear(); - std::string various = g_localizeStrings.Get(340); // Various Artists std::vector<std::string> va; va.push_back(various); for (VECSONGS::iterator song = songs.begin(); song != songs.end(); ++song) { @@ -706,6 +709,21 @@ void CMusicInfoScanner::FileItemsToAlbums(CFileItemList& items, VECALBUMS& album } /* + We also have a compilation album when album name is non-empty and ALL tracks are marked as part of + a compilation even if an album artist is given, or all songs have the same primary artist. For + example an anthology - a collection of recordings from various old sources + combined together such as a "best of", retrospective or rarities type release. + + Such an anthology compilation will not have been caught by the previous tests as it fails 3a and 3b. + The album artist can be determined just like any normal album. + */ + if (!compilation && !songsByAlbumName->first.empty() && isCompilation) + { + compilation = true; + CLog::Log(LOGDEBUG, "Album '%s' is a compilation as all songs are marked aspart of a compilation", songsByAlbumName->first.c_str()); + } + + /* Step 3: Find the common albumartist for each song and assign albumartist to those tracks that don't have it set. */ |