本文整理汇总了C++中VECALBUMS类的典型用法代码示例。如果您正苦于以下问题:C++ VECALBUMS类的具体用法?C++ VECALBUMS怎么用?C++ VECALBUMS使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了VECALBUMS类的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: GetRecentlyPlayedAlbums
JSONRPC_STATUS CAudioLibrary::GetRecentlyPlayedAlbums(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
{
CMusicDatabase musicdatabase;
if (!musicdatabase.Open())
return InternalError;
VECALBUMS albums;
if (!musicdatabase.GetRecentlyPlayedAlbums(albums))
return InternalError;
CFileItemList items;
for (unsigned int index = 0; index < albums.size(); index++)
{
CStdString path;
path.Format("musicdb://7/%i/", albums[index].idAlbum);
CFileItemPtr item;
FillAlbumItem(albums[index], path, item);
items.Add(item);
}
JSONRPC_STATUS ret = GetAdditionalAlbumDetails(parameterObject, items, musicdatabase);
if (ret != OK)
return ret;
HandleFileItemList("albumid", false, "albums", items, parameterObject, result);
return OK;
}
开发者ID:AFFLUENTSOCIETY,项目名称:SPMC,代码行数:28,代码来源:AudioLibrary.cpp
示例2: GetContent
bool CDirectoryNodeAlbumRecentlyPlayed::GetContent(CFileItemList& items)
{
CMusicDatabase musicdatabase;
if (!musicdatabase.Open())
return false;
VECALBUMS albums;
if (!musicdatabase.GetRecentlyPlayedAlbums(albums))
{
musicdatabase.Close();
return false;
}
for (int i=0; i<(int)albums.size(); ++i)
{
CAlbum& album=albums[i];
CStdString strDir;
strDir.Format("%s%ld/", BuildPath().c_str(), album.idAlbum);
CFileItemPtr pItem(new CFileItem(strDir, album));
items.Add(pItem);
}
musicdatabase.Close();
return true;
}
开发者ID:Bobbin007,项目名称:xbmc,代码行数:27,代码来源:DirectoryNodeAlbumRecentlyPlayed.cpp
示例3: UpdateMusic
bool CHomeShelfJob::UpdateMusic()
{
CLog::Log(LOGDEBUG, "CHomeShelfJob::UpdateMusic() - Running HomeShelf screen update");
CMusicDatabase musicdatabase;
musicdatabase.Open();
if (musicdatabase.HasContent())
{
VECALBUMS albums;
musicdatabase.GetRecentlyAddedAlbums(albums, NUM_ITEMS);
for (size_t i = 0; i < albums.size(); ++i)
{
CAlbum &album = albums[i];
std::string strDir = StringUtils::Format("musicdb://albums/%li/", album.idAlbum);
CFileItemPtr pItem(new CFileItem(strDir, album));
std::string strThumb = musicdatabase.GetArtForItem(album.idAlbum, MediaTypeAlbum, "thumb");
std::string strFanart = musicdatabase.GetArtistArtForItem(album.idAlbum, MediaTypeAlbum, "fanart");
pItem->SetProperty("thumb", strThumb);
pItem->SetProperty("fanart", strFanart);
pItem->SetProperty("artist", album.GetAlbumArtistString());
pItem->SetProperty("ItemType", g_localizeStrings.Get(359));
m_HomeShelfMusicAlbums->Add(pItem);
}
musicdatabase.Close();
}
// get recently added ALBUMS from any enabled service
CServicesManager::GetInstance().GetPlexRecentlyAddedAlbums(*m_HomeShelfMusicAlbums, NUM_ITEMS);
return true;
}
开发者ID:MrMC,项目名称:mrmc,代码行数:31,代码来源:HomeShelfJob.cpp
示例4: song
void CMusicInfoLoader::OnLoaderFinish()
{
// cleanup last loaded songs from database
m_songsMap.Clear();
// 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);
else if (!m_bStop && (m_databaseHits > 1 || m_tagReads > 0))
m_pVecItems->Save();
m_musicDatabase.Close();
}
开发者ID:madhatterpa,项目名称:xbmc,代码行数:49,代码来源:MusicInfoLoader.cpp
示例5: album
void CMusicInfoScanner::FindArtForAlbums(VECALBUMS &albums, const CStdString &path)
{
/*
If there's a single album in the folder, then art can be taken from
the folder art.
*/
std::string albumArt;
if (albums.size() == 1)
{
CFileItem album(path, true);
albumArt = album.GetUserMusicThumb(true);
if (!albumArt.empty())
albums[0].art["thumb"] = albumArt;
}
for (VECALBUMS::iterator i = albums.begin(); i != albums.end(); ++i)
{
CAlbum &album = *i;
if (albums.size() != 1)
albumArt = "";
/*
Find art that is common across these items
If we find a single art image we treat it as the album art
and discard song art else we use first as album art and
keep everything as song art.
*/
bool singleArt = true;
CSong *art = NULL;
for (VECSONGS::iterator k = album.songs.begin(); k != album.songs.end(); ++k)
{
CSong &song = *k;
if (song.HasArt())
{
if (art && !art->ArtMatches(song))
{
singleArt = false;
break;
}
if (!art)
art = &song;
}
}
/*
assign the first art found to the album - better than no art at all
*/
if (art && albumArt.empty())
{
if (!art->strThumb.empty())
albumArt = art->strThumb;
else
albumArt = CTextureCache::GetWrappedImageURL(art->strFileName, "music");
}
if (!albumArt.empty())
album.art["thumb"] = albumArt;
if (singleArt)
{ //if singleArt then we can clear the artwork for all songs
for (VECSONGS::iterator k = album.songs.begin(); k != album.songs.end(); ++k)
k->strThumb.clear();
}
else
{ // more than one piece of art was found for these songs, so cache per song
for (VECSONGS::iterator k = album.songs.begin(); k != album.songs.end(); ++k)
{
if (k->strThumb.empty() && !k->embeddedArt.empty())
k->strThumb = CTextureCache::GetWrappedImageURL(k->strFileName, "music");
}
}
}
if (albums.size() == 1 && !albumArt.empty())
{ // assign to folder thumb as well
CMusicThumbLoader::SetCachedImage(path, "thumb", albumArt);
}
}
开发者ID:AdolphHuan,项目名称:xbmc,代码行数:78,代码来源:MusicInfoScanner.cpp
示例6: CategoriseAlbums
void CMusicInfoScanner::CategoriseAlbums(VECSONGS &songsToCheck, VECALBUMS &albums)
{
/* Step 1: categorise on the album name */
map<string, vector<CSong *> > albumNames;
for (VECSONGS::iterator i = songsToCheck.begin(); i != songsToCheck.end(); ++i)
albumNames[i->strAlbum].push_back(&(*i));
/*
Step 2: Split into unique albums based on album name and album artist
In the case where the album artist is unknown, we use the primary artist
(i.e. first artist from each song).
*/
albums.clear();
for (map<string, vector<CSong *> >::iterator i = albumNames.begin(); i != albumNames.end(); ++i)
{
// sort the songs by tracknumber to identify duplicate track numbers
vector<CSong *> &songs = i->second;
sort(songs.begin(), songs.end(), SortSongsByTrack);
// map the songs to their primary artists
bool tracksOverlap = false;
bool hasAlbumArtist = false;
map<string, vector<CSong *> > artists;
for (vector<CSong *>::iterator j = songs.begin(); j != songs.end(); ++j)
{
CSong *song = *j;
// test for song overlap
if (j != songs.begin() && song->iTrack == (*(j-1))->iTrack)
tracksOverlap = true;
// get primary artist
string primary;
if (!song->albumArtist.empty())
{
primary = song->albumArtist[0];
hasAlbumArtist = true;
}
else if (!song->artist.empty())
primary = song->artist[0];
// add to the artist map
artists[primary].push_back(song);
}
/*
We have a compilation if
1. album name is non-empty AND
2. no tracks overlap 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.
*/
bool compilation = !i->first.empty() && !tracksOverlap; // 1+2
if (artists.size() == 1)
{
string artist = artists.begin()->first; StringUtils::ToLower(artist);
if (!StringUtils::EqualsNoCase(artist, "various") &&
!StringUtils::EqualsNoCase(artist, "various artists")) // 3a
compilation = false;
}
else if (hasAlbumArtist) // 3b
compilation = false;
if (compilation)
{
CLog::Log(LOGDEBUG, "Album '%s' is a compilation as there's no overlapping tracks and %s", i->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
vector<string> va; va.push_back(various);
for (vector<CSong *>::iterator j = songs.begin(); j != songs.end(); ++j)
(*j)->albumArtist = va;
artists.insert(make_pair(various, songs));
}
/*
Step 3: Find the common albumartist for each song and assign
albumartist to those tracks that don't have it set.
*/
for (map<string, vector<CSong *> >::iterator j = artists.begin(); j != artists.end(); ++j)
{
// find the common artist for these songs
vector<CSong *> &artistSongs = j->second;
vector<string> common = artistSongs.front()->albumArtist.empty() ? artistSongs.front()->artist : artistSongs.front()->albumArtist;
for (vector<CSong *>::iterator k = artistSongs.begin() + 1; k != artistSongs.end(); ++k)
{
unsigned int match = 0;
vector<string> &compare = (*k)->albumArtist.empty() ? (*k)->artist : (*k)->albumArtist;
for (; match < common.size() && match < compare.size(); match++)
{
if (compare[match] != common[match])
break;
}
common.erase(common.begin() + match, common.end());
}
/*
Step 4: Assign the album artist for each song that doesn't have it set
and add to the album vector
*/
CAlbum album;
//.........这里部分代码省略.........
开发者ID:AdolphHuan,项目名称:xbmc,代码行数:101,代码来源:MusicInfoScanner.cpp
示例7: pLoader
int CMusicInfoScanner::RetrieveMusicInfo(CFileItemList& items, const CStdString& strDirectory)
{
CSongMap songsMap;
// get all information for all files in current directory from database, and remove them
if (m_musicDatabase.RemoveSongsFromPath(strDirectory, songsMap))
m_needsCleanup = true;
VECSONGS songsToAdd;
CStdStringArray regexps = g_advancedSettings.m_audioExcludeFromScanRegExps;
// for every file found, but skip folder
for (int i = 0; i < items.Size(); ++i)
{
CFileItemPtr pItem = items[i];
CStdString strExtension;
URIUtils::GetExtension(pItem->GetPath(), strExtension);
if (m_bStop)
return 0;
// Discard all excluded files defined by m_musicExcludeRegExps
if (CUtil::ExcludeFileOrFolder(pItem->GetPath(), regexps))
continue;
// dont try reading id3tags for folders, playlists or shoutcast streams
if (!pItem->m_bIsFolder && !pItem->IsPlayList() && !pItem->IsPicture() && !pItem->IsLyrics() )
{
m_currentItem++;
// CLog::Log(LOGDEBUG, "%s - Reading tag for: %s", __FUNCTION__, pItem->GetPath().c_str());
// grab info from the song
CSong *dbSong = songsMap.Find(pItem->GetPath());
CMusicInfoTag& tag = *pItem->GetMusicInfoTag();
if (!tag.Loaded() )
{ // read the tag from a file
auto_ptr<IMusicInfoTagLoader> pLoader (CMusicInfoTagLoaderFactory::CreateLoader(pItem->GetPath()));
if (NULL != pLoader.get())
pLoader->Load(pItem->GetPath(), tag);
}
// if we have the itemcount, update our
// dialog with the progress we made
if (m_handle && m_itemCount>0)
m_handle->SetPercentage(m_currentItem/(float)m_itemCount*100);
if (tag.Loaded())
{
CSong song(tag);
// ensure our song has a valid filename or else it will assert in AddSong()
if (song.strFileName.IsEmpty())
{
// copy filename from path in case UPnP or other tag loaders didn't specify one (FIXME?)
song.strFileName = pItem->GetPath();
// if we still don't have a valid filename, skip the song
if (song.strFileName.IsEmpty())
{
// this shouldn't ideally happen!
CLog::Log(LOGERROR, "Skipping song since it doesn't seem to have a filename");
continue;
}
}
song.iStartOffset = pItem->m_lStartOffset;
song.iEndOffset = pItem->m_lEndOffset;
song.strThumb = pItem->GetUserMusicThumb(true);
if (dbSong)
{ // keep the db-only fields intact on rescan...
song.iTimesPlayed = dbSong->iTimesPlayed;
song.lastPlayed = dbSong->lastPlayed;
song.iKaraokeNumber = dbSong->iKaraokeNumber;
if (song.rating == '0') song.rating = dbSong->rating;
if (song.strThumb.empty())
song.strThumb = dbSong->strThumb;
}
songsToAdd.push_back(song);
// CLog::Log(LOGDEBUG, "%s - Tag loaded for: %s", __FUNCTION__, pItem->GetPath().c_str());
}
else
CLog::Log(LOGDEBUG, "%s - No tag found for: %s", __FUNCTION__, pItem->GetPath().c_str());
}
}
VECALBUMS albums;
CategoriseAlbums(songsToAdd, albums);
FindArtForAlbums(albums, items.GetPath());
// finally, add these to the database
m_musicDatabase.BeginTransaction();
int numAdded = 0;
set<int> albumsToScan;
set<int> artistsToScan;
for (VECALBUMS::iterator i = albums.begin(); i != albums.end(); ++i)
{
vector<int> songIDs;
//.........这里部分代码省略.........
开发者ID:AdolphHuan,项目名称:xbmc,代码行数:101,代码来源:MusicInfoScanner.cpp
示例8: UpdateMusic
bool CRecentlyAddedJob::UpdateMusic()
{
CGUIWindow* home = g_windowManager.GetWindow(WINDOW_HOME);
if ( home == NULL )
return false;
CLog::Log(LOGDEBUG, "CRecentlyAddedJob::UpdateMusic() - Running RecentlyAdded home screen update");
int i = 0;
CFileItemList musicItems;
CMusicDatabase musicdatabase;
CMusicThumbLoader loader;
loader.Initialize();
musicdatabase.Open();
if (musicdatabase.GetRecentlyAddedAlbumSongs("musicdb://4/", musicItems, NUM_ITEMS))
{
long idAlbum = -1;
CStdString strAlbumThumb;
CStdString strAlbumFanart;
for (; i < musicItems.Size(); ++i)
{
CFileItemPtr item = musicItems.Get(i);
CStdString value;
value.Format("%i", i + 1);
CStdString strRating;
CStdString strAlbum = item->GetMusicInfoTag()->GetAlbum();
CStdString strArtist = StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator);
if (idAlbum != item->GetMusicInfoTag()->GetAlbumId())
{
strAlbumThumb.clear();
strAlbumFanart.clear();
idAlbum = item->GetMusicInfoTag()->GetAlbumId();
if (loader.LoadItem(item.get()))
{
strAlbumThumb = item->GetArt("thumb");
strAlbumFanart = item->GetArt("fanart");
}
}
strRating.Format("%c", item->GetMusicInfoTag()->GetRating());
home->SetProperty("LatestSong." + value + ".Title" , item->GetMusicInfoTag()->GetTitle());
home->SetProperty("LatestSong." + value + ".Year" , item->GetMusicInfoTag()->GetYear());
home->SetProperty("LatestSong." + value + ".Artist" , strArtist);
home->SetProperty("LatestSong." + value + ".Album" , strAlbum);
home->SetProperty("LatestSong." + value + ".Rating" , strRating);
home->SetProperty("LatestSong." + value + ".Path" , item->GetMusicInfoTag()->GetURL());
home->SetProperty("LatestSong." + value + ".Thumb" , strAlbumThumb);
home->SetProperty("LatestSong." + value + ".Fanart" , strAlbumFanart);
}
}
for (; i < NUM_ITEMS; ++i)
{
CStdString value;
value.Format("%i", i + 1);
home->SetProperty("LatestSong." + value + ".Title" , "");
home->SetProperty("LatestSong." + value + ".Year" , "");
home->SetProperty("LatestSong." + value + ".Artist" , "");
home->SetProperty("LatestSong." + value + ".Album" , "");
home->SetProperty("LatestSong." + value + ".Rating" , "");
home->SetProperty("LatestSong." + value + ".Path" , "");
home->SetProperty("LatestSong." + value + ".Thumb" , "");
home->SetProperty("LatestSong." + value + ".Fanart" , "");
}
i = 0;
VECALBUMS albums;
if (musicdatabase.GetRecentlyAddedAlbums(albums, NUM_ITEMS))
{
for (; i < (int)albums.size(); ++i)
{
CStdString value;
CStdString strPath;
CStdString strThumb;
CStdString strFanart;
CStdString strDBpath;
CStdString strSQLAlbum;
CAlbum& album=albums[i];
value.Format("%i", i + 1);
strThumb = musicdatabase.GetArtForItem(album.idAlbum, "album", "thumb");
strFanart = musicdatabase.GetArtistArtForItem(album.idAlbum, "album", "fanart");
strDBpath.Format("musicdb://3/%i/", album.idAlbum);
strSQLAlbum.Format("idAlbum=%i", album.idAlbum);
CStdString strArtist = musicdatabase.GetSingleValue("albumview", "strArtists", strSQLAlbum);
home->SetProperty("LatestAlbum." + value + ".Title" , album.strAlbum);
home->SetProperty("LatestAlbum." + value + ".Year" , album.iYear);
home->SetProperty("LatestAlbum." + value + ".Artist" , strArtist);
home->SetProperty("LatestAlbum." + value + ".Rating" , album.iRating);
home->SetProperty("LatestAlbum." + value + ".Path" , strDBpath);
home->SetProperty("LatestAlbum." + value + ".Thumb" , strThumb);
//.........这里部分代码省略.........
开发者ID:AdolphHuan,项目名称:xbmc,代码行数:101,代码来源:RecentlyAddedJob.cpp
示例9: FileItemsToAlbums
int CMusicInfoScanner::RetrieveMusicInfo(const std::string& strDirectory, CFileItemList& items)
{
MAPSONGS songsMap;
// get all information for all files in current directory from database, and remove them
if (m_musicDatabase.RemoveSongsFromPath(strDirectory, songsMap))
m_needsCleanup = true;
CFileItemList scannedItems;
if (ScanTags(items, scannedItems) == INFO_CANCELLED || scannedItems.Size() == 0)
return 0;
VECALBUMS albums;
FileItemsToAlbums(scannedItems, albums, &songsMap);
FindArtForAlbums(albums, items.GetPath());
int numAdded = 0;
ADDON::AddonPtr addon;
ADDON::ScraperPtr albumScraper;
ADDON::ScraperPtr artistScraper;
if(ADDON::CAddonMgr::Get().GetDefault(ADDON::ADDON_SCRAPER_ALBUMS, addon))
albumScraper = boost::dynamic_pointer_cast<ADDON::CScraper>(addon);
if(ADDON::CAddonMgr::Get().GetDefault(ADDON::ADDON_SCRAPER_ARTISTS, addon))
artistScraper = boost::dynamic_pointer_cast<ADDON::CScraper>(addon);
// Add each album
for (VECALBUMS::iterator album = albums.begin(); album != albums.end(); ++album)
{
if (m_bStop)
break;
album->strPath = strDirectory;
m_musicDatabase.AddAlbum(*album);
// Yuk - this is a kludgy way to do what we want to do, but it will work to sort
// out artist fanart until we can restructure the artist fanart to work more
// like the album fanart. This has to be done after we've added the album so
// we have the artist IDs to update, but before we call UpdateDatabaseArtistInfo.
if (albums.size() == 1 &&
album->artistCredits.size() > 0 &&
!StringUtils::EqualsNoCase(album->artistCredits[0].GetArtist(), "various artists") &&
!StringUtils::EqualsNoCase(album->artistCredits[0].GetArtist(), "various"))
{
CArtist artist;
if (m_musicDatabase.GetArtist(album->artistCredits[0].GetArtistId(), artist))
{
artist.strPath = URIUtils::GetParentPath(strDirectory);
m_musicDatabase.SetArtForItem(artist.idArtist, MediaTypeArtist, GetArtistArtwork(artist));
}
}
if ((m_flags & SCAN_ONLINE))
{
if (!albumScraper || !artistScraper)
continue;
INFO_RET albumScrapeStatus = INFO_NOT_FOUND;
if (!m_musicDatabase.HasAlbumBeenScraped(album->idAlbum))
albumScrapeStatus = UpdateDatabaseAlbumInfo(*album, albumScraper, false);
if (albumScrapeStatus == INFO_ADDED)
{
for (VECARTISTCREDITS::const_iterator artistCredit = album->artistCredits.begin();
artistCredit != album->artistCredits.end();
++artistCredit)
{
if (m_bStop)
break;
if (!m_musicDatabase.HasArtistBeenScraped(artistCredit->GetArtistId()))
{
CArtist artist;
m_musicDatabase.GetArtist(artistCredit->GetArtistId(), artist);
UpdateDatabaseArtistInfo(artist, artistScraper, false);
}
}
for (VECSONGS::iterator song = album->songs.begin();
song != album->songs.end();
song++)
{
if (m_bStop)
break;
for (VECARTISTCREDITS::const_iterator artistCredit = song->artistCredits.begin();
artistCredit != song->artistCredits.end();
++artistCredit)
{
if (m_bStop)
break;
CMusicArtistInfo musicArtistInfo;
if (!m_musicDatabase.HasArtistBeenScraped(artistCredit->GetArtistId()))
{
CArtist artist;
m_musicDatabase.GetArtist(artistCredit->GetArtistId(), artist);
UpdateDatabaseArtistInfo(artist, artistScraper, false);
}
}
//.........这里部分代码省略.........
开发者ID:Sithisackt,项目名称:kodi,代码行数:101,代码来源:MusicInfoScanner.cpp
示例10: song
void CMusicInfoScanner::FileItemsToAlbums(CFileItemList& items, VECALBUMS& albums, MAPSONGS* songsMap /* = NULL */)
{
/*
* Step 1: Convert the FileItems into Songs.
* If they're MB tagged, create albums directly from the FileItems.
* If they're non-MB tagged, index them by album name ready for step 2.
*/
map<string, VECSONGS> songsByAlbumNames;
for (int i = 0; i < items.Size(); ++i)
{
CMusicInfoTag& tag = *items[i]->GetMusicInfoTag();
CSong song(*items[i]);
// keep the db-only fields intact on rescan...
if (songsMap != NULL)
{
MAPSONGS::iterator it = songsMap->find(items[i]->GetPath());
if (it != songsMap->end())
{
song.iTimesPlayed = it->second.iTimesPlayed;
song.lastPlayed = it->second.lastPlayed;
song.iKaraokeNumber = it->second.iKaraokeNumber;
if (song.rating == '0') song.rating = it->second.rating;
if (song.strThumb.empty()) song.strThumb = it->second.strThumb;
}
}
if (!tag.GetMusicBrainzAlbumID().empty())
{
VECALBUMS::iterator it;
for (it = albums.begin(); it != albums.end(); ++it)
if (it->strMusicBrainzAlbumID == tag.GetMusicBrainzAlbumID())
break;
if (it == albums.end())
{
CAlbum album(*items[i]);
album.songs.push_back(song);
albums.push_back(album);
}
else
it->songs.push_back(song);
}
else
songsByAlbumNames[tag.GetAlbum()].push_back(song);
}
/*
Step 2: Split into unique albums based on album name and album artist
In the case where the album artist is unknown, we use the primary artist
(i.e. first artist from each song).
*/
for (map<string, VECSONGS>::iterator songsByAlbumName = songsByAlbumNames.begin(); songsByAlbumName != songsByAlbumNames.end(); ++songsByAlbumName)
{
VECSONGS &songs = songsByAlbumName->second;
// sort the songs by tracknumber to identify duplicate track numbers
sort(songs.begin(), songs.end(), SortSongsByTrack);
// map the songs to their primary artists
bool tracksOverlap = false;
bool hasAlbumArtist = false;
bool isCompilation = true;
map<string, vector<CSong *> > artists;
for (VECSONGS::iterator song = songs.begin(); song != songs.end(); ++song)
{
// test for song overlap
if (song != songs.begin() && song->iTrack == (song - 1)->iTrack)
tracksOverlap = true;
if (!song->bCompilation)
isCompilation = false;
// get primary artist
string primary;
if (!song->albumArtist.empty())
{
primary = song->albumArtist[0];
hasAlbumArtist = true;
}
else if (!song->artist.empty())
primary = song->artist[0];
// add to the artist map
artists[primary].push_back(&(*song));
}
/*
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.
*/
bool compilation = !songsByAlbumName->first.empty() && (isCompilation || !tracksOverlap); // 1+2b+2a
if (artists.size() == 1)
{
string artist = artists.begin()->first; StringUtils::ToLower(artist);
if (!StringUtils::EqualsNoCase(artist, "various") &&
//.........这里部分代码省略.........
开发者ID:Sithisackt,项目名称:kodi,代码行数:101,代码来源:MusicInfoScanner.cpp
示例11: UpdateMusic
bool CRecentlyAddedJob::UpdateMusic()
{
CGUIWindow* home = g_windowManager.GetWindow(WINDOW_HOME);
if ( home == NULL )
return false;
CLog::Log(LOGDEBUG, "CRecentlyAddedJob::UpdateMusic() - Running RecentlyAdded home screen update");
int i = 0;
CFileItemList musicItems;
CMusicDatabase musicdatabase;
musicdatabase.Open();
if (musicdatabase.GetRecentlyAddedAlbumSongs("musicdb://", musicItems, NUM_ITEMS))
{
for (; i < musicItems.Size(); ++i)
{
CFileItemPtr item = musicItems.Get(i);
CStdString value;
value.Format("%i", i + 1);
CStdString strThumb;
CStdString strRating;
CStdString strAlbum = item->GetMusicInfoTag()->GetAlbum();
CStdString strArtist = item->GetMusicInfoTag()->GetArtist();
long idAlbum = musicdatabase.GetAlbumByName(strAlbum,strArtist);
if (idAlbum != -1)
musicdatabase.GetAlbumThumb(idAlbum,strThumb);
strRating.Format("%c", item->GetMusicInfoTag()->GetRating());
home->SetProperty("LatestSong." + value + ".Title" , item->GetMusicInfoTag()->GetTitle());
home->SetProperty("LatestSong." + value + ".Year" , item->GetMusicInfoTag()->GetYear());
home->SetProperty("LatestSong." + value + ".Artist" , strArtist);
home->SetProperty("LatestSong." + value + ".Album" , strAlbum);
home->SetProperty("LatestSong." + value + ".Rating" , strRating);
home->SetProperty("LatestSong." + value + ".Path" , item->GetMusicInfoTag()->GetURL());
home->SetProperty("LatestSong." + value + ".Thumb" , strThumb);
home->SetProperty("LatestSong." + value + ".Fanart" , item->GetCachedFanart());
}
}
for (; i < NUM_ITEMS; ++i)
{
CStdString value;
value.Format("%i", i + 1);
home->SetProperty("LatestSong." + value + ".Title" , "");
home->SetProperty("LatestSong." + value + ".Year" , "");
home->SetProperty("LatestSong." + value + ".Artist" , "");
home->SetProperty("LatestSong." + value + ".Album" , "");
home->SetProperty("LatestSong." + value + ".Rating" , "");
home->SetProperty("LatestSong." + value + ".Path" , "");
home->SetProperty("LatestSong." + value + ".Thumb" , "");
home->SetProperty("LatestSong." + value + ".Fanart" , "");
}
i = 0;
VECALBUMS albums;
if (musicdatabase.GetRecentlyAddedAlbums(albums, NUM_ITEMS))
{
for (; i < (int)albums.size(); ++i)
{
CStdString value;
CStdString strPath;
CStdString strThumb;
CStdString strDBpath;
CStdString strSQLAlbum;
CAlbum& album=albums[i];
value.Format("%i", i + 1);
musicdatabase.GetAlbumThumb(album.idAlbum,strThumb);
strDBpath.Format("musicdb://3/%i/", album.idAlbum);
strSQLAlbum.Format("idAlbum=%i", album.idAlbum);
CStdString strArtist = musicdatabase.GetSingleValue("albumview", "strArtist", strSQLAlbum);
home->SetProperty("LatestAlbum." + value + ".Title" , musicdatabase.GetAlbumById(album.idAlbum));
home->SetProperty("LatestAlbum." + value + ".Year" , atoi(musicdatabase.GetSingleValue("album", "iYear", strSQLAlbum)));
home->SetProperty("LatestAlbum." + value + ".Artist" , strArtist);
home->SetProperty("LatestAlbum." + value + ".Rating" , musicdatabase.GetSingleValue("albumview", "iRating", strSQLAlbum));
home->SetProperty("LatestAlbum." + value + ".Path" , strDBpath);
home->SetProperty("LatestAlbum." + value + ".Thumb" , strThumb);
home->SetProperty("LatestAlbum." + value + ".Fanart" , CFileItem::GetCachedThumb(strArtist,g_settings.GetMusicFanartFolder()));
}
}
for (; i < NUM_ITEMS; ++i)
{
CStdString value;
value.Format("%i", i + 1);
home->SetProperty("LatestAlbum." + value + ".Title" , "");
home->SetProperty("LatestAlbum." + value + ".Year" , "");
home->SetProperty("LatestAlbum." + value + ".Artist" , "");
home->SetProperty("LatestAlbum." + value + ".Rating" , "");
home->SetProperty("LatestAlbum." + value + ".Path" , "");
home->SetProperty("LatestAlbum." + value + ".Thumb" , "");
home->SetProperty("LatestAlbum." + value + ".Fanart" , "");
}
//.........这里部分代码省略.........
开发者ID:nonspin,项目名称:spotyxbmc2,代码行数:101,代码来源:RecentlyAddedJob.cpp
示例12: if
JSONRPC_STATUS CAudioLibrary::GetAlbums(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
{
CMusicDatabase musicdatabase;
if (!musicdatabase.Open())
return InternalError;
CMusicDbUrl musicUrl;
if (!musicUrl.FromString("musicdb://albums/"))
return InternalError;
if (parameterObject["includesingles"].asBoolean())
musicUrl.AddOption("show_singles", true);
const CVariant &filter = parameterObject["filter"];
if (filter.isMember("artistid"))
musicUrl.AddOption("artistid", (int)filter["artistid"].asInteger());
else if (filter.isMember("artist"))
musicUrl.AddOption("artist", filter["artist"].asString());
else if (filter.isMember("genreid"))
musicUrl.AddOption("genreid", (int)filter["genreid"].asInteger());
else if (filter.isMember("genre"))
musicUrl.AddOption("genre", filter["genre"].asString());
else if (filter.isObject())
{
std::string xsp;
if (!GetXspFiltering("albums", filter, xsp))
return InvalidParams;
musicUrl.AddOption("xsp", xsp);
}
SortDescription sorting;
ParseLimits(parameterObject, sorting.limitStart, sorting.limitEnd);
if (!ParseSorting(parameterObject, sorting.sortBy, sorting.sortOrder, sorting.sortAttributes))
return InvalidParams;
int total;
VECALBUMS albums;
if (!musicdatabase.GetAlbumsByWhere(musicUrl.ToString(), CDatabase::Filter(), albums, total, sorting))
return InternalError;
CFileItemList items;
items.Reserve(albums.size());
for (unsigned int index = 0; index < albums.size(); index++)
{
CMusicDbUrl itemUrl = musicUrl;
std::string path = StringUtils::Format("%i/", albums[index].idAlbum);
itemUrl.AppendPath(path);
CFileItemPtr pItem;
FillAlbumItem(albums[index], itemUrl.ToString(), pItem);
items.Add(pItem);
}
//Get Genre IDs
JSONRPC_STATUS ret = GetAdditionalAlbumDetails(parameterObject, items, musicdatabase);
if (ret != OK)
return ret;
int size = items.Size();
if (total > size)
size = total;
HandleFileItemList("albumid", false, "albums", items, parameterObject, result, size, false);
return OK;
}
开发者ID:louis89,项目名称:xbmc,代码行数:66,代码来源:AudioLibrary.cpp
注:本文中的VECALBUMS类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论