Added multi artists support
This commit is contained in:
@@ -9,118 +9,103 @@
|
||||
#include "metadata/AvFormat.hpp"
|
||||
#include "metadata/TagLibParser.hpp"
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const MetaData::Artist& artist)
|
||||
{
|
||||
os << artist.name;
|
||||
|
||||
if (!artist.musicBrainzArtistID.empty())
|
||||
os << " (" << artist.musicBrainzArtistID << ")";
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const MetaData::Album& album)
|
||||
{
|
||||
os << album.name;
|
||||
|
||||
if (!album.musicBrainzAlbumID.empty())
|
||||
os << " (" << album.musicBrainzAlbumID << ")";
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void parse(MetaData::Parser& parser, const boost::filesystem::path& file)
|
||||
{
|
||||
using namespace MetaData;
|
||||
|
||||
parser.setClusterTypeNames( {"MOOD", "GENRE"} );
|
||||
|
||||
boost::optional<MetaData::Items> items {parser.parse(file, true)};
|
||||
if (!items)
|
||||
boost::optional<Track> track {parser.parse(file, true)};
|
||||
if (!track)
|
||||
{
|
||||
std::cerr << "Parsing failed" << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
std::cout << "Items:" << std::endl;
|
||||
for (auto item : (*items))
|
||||
std::cout << "Track metadata:" << std::endl;
|
||||
|
||||
for (const Artist& artist : track->artists)
|
||||
std::cout << "Artist: " << artist << std::endl;
|
||||
|
||||
if (track->albumArtist)
|
||||
std::cout << "Album artist: " << *track->albumArtist << std::endl;
|
||||
|
||||
if (track->album)
|
||||
std::cout << "Album: " << *track->album << std::endl;
|
||||
|
||||
std::cout << "Title: " << track->title << std::endl;
|
||||
|
||||
if (!track->musicBrainzTrackID.empty())
|
||||
std::cout << "MB TrackID = " << track->musicBrainzTrackID << std::endl;
|
||||
|
||||
if (!track->musicBrainzRecordID.empty())
|
||||
std::cout << "MB RecordID = " << track->musicBrainzRecordID << std::endl;
|
||||
|
||||
for (const auto& cluster : track->clusters)
|
||||
{
|
||||
switch (item.first)
|
||||
std::cout << "Cluster: " << cluster.first << std::endl;
|
||||
for (const auto& name : cluster.second)
|
||||
{
|
||||
case MetaData::Type::Title:
|
||||
std::cout << "Title: " << boost::any_cast<std::string>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::Artists:
|
||||
for (const std::string& artist : boost::any_cast<std::set<std::string>>(item.second))
|
||||
std::cout << "Artist: " << artist << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::Album:
|
||||
std::cout << "Album: " << boost::any_cast<std::string>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::Clusters:
|
||||
for (const auto& cluster : boost::any_cast<MetaData::Clusters>(item.second))
|
||||
{
|
||||
std::cout << "Cluster: " << cluster.first << std::endl;
|
||||
for (const auto name : cluster.second)
|
||||
{
|
||||
std::cout << "\t" << name << std::endl;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case MetaData::Type::Duration:
|
||||
std::cout << "Duration: " << boost::any_cast<std::chrono::milliseconds>(item.second).count() / 1000 << "s" << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::TrackNumber:
|
||||
std::cout << "Track: " << boost::any_cast<std::size_t>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::TotalTrack:
|
||||
std::cout << "TotalTrack: " << boost::any_cast<std::size_t>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::DiscNumber:
|
||||
std::cout << "Disc: " << boost::any_cast<std::size_t>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::TotalDisc:
|
||||
std::cout << "TotalDisc: " << boost::any_cast<std::size_t>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::Year:
|
||||
std::cout << "Year: " << std::to_string(boost::any_cast<int>(item.second)) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::OriginalYear:
|
||||
std::cout << "Original year: " << std::to_string(boost::any_cast<int>(item.second)) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::HasCover:
|
||||
std::cout << "HasCover = " << std::boolalpha << boost::any_cast<bool>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::AudioStreams:
|
||||
for (const auto& audioStream : boost::any_cast<std::vector<MetaData::AudioStream> >(item.second))
|
||||
std::cout << "Audio stream: " << audioStream.bitRate << " bps" << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::MusicBrainzArtistID:
|
||||
for (const std::string& mbid : boost::any_cast<std::set<std::string>>(item.second))
|
||||
std::cout << "MusicBrainzArtistID: " << mbid << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::MusicBrainzAlbumID:
|
||||
std::cout << "MusicBrainzAlbumID: " << boost::any_cast<std::string>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::MusicBrainzTrackID:
|
||||
std::cout << "MusicBrainzTrackID: " << boost::any_cast<std::string>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::MusicBrainzRecordingID:
|
||||
std::cout << "MusicBrainzRecordingID: " << boost::any_cast<std::string>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::AcoustID:
|
||||
std::cout << "AcoustID: " << boost::any_cast<std::string>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::Copyright:
|
||||
std::cout << "Copyright: " << boost::any_cast<std::string>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
case MetaData::Type::CopyrightURL:
|
||||
std::cout << "CopyrightURL: " << boost::any_cast<std::string>(item.second) << std::endl;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
std::cout << "\t" << name << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "Duration: " << track->duration.count() / 1000 << "s" << std::endl;
|
||||
|
||||
if (track->trackNumber)
|
||||
std::cout << "Track: " << *track->trackNumber << std::endl;
|
||||
|
||||
if (track->totalTrack)
|
||||
std::cout << "TotalTrack: " << *track->totalTrack << std::endl;
|
||||
|
||||
if (track->discNumber)
|
||||
std::cout << "Disc: " << *track->discNumber << std::endl;
|
||||
|
||||
if (track->totalDisc)
|
||||
std::cout << "TotalDisc: " << *track->totalDisc << std::endl;
|
||||
|
||||
if (track->year)
|
||||
std::cout << "Year: " << *track->year << std::endl;
|
||||
|
||||
if (track->originalYear)
|
||||
std::cout << "Original year: " << *track->originalYear << std::endl;
|
||||
|
||||
std::cout << "HasCover = " << std::boolalpha << track->hasCover << std::endl;
|
||||
|
||||
for (const auto& audioStream : track->audioStreams)
|
||||
std::cout << "Audio stream: " << audioStream.bitRate << " bps" << std::endl;
|
||||
|
||||
if (!track->acoustID.empty())
|
||||
std::cout << "AcoustID: " << track->acoustID << std::endl;
|
||||
|
||||
if (!track->copyright.empty())
|
||||
std::cout << "Copyright: " << track->copyright << std::endl;
|
||||
|
||||
if (!track->copyrightURL.empty())
|
||||
std::cout << "CopyrightURL: " << track->copyrightURL << std::endl;
|
||||
|
||||
std::cout << std::endl;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user