TagReaderTagLib: Fix reading MusicBrainz from ID3v2 tags

This commit is contained in:
Jonas Kvinge 2023-03-26 04:33:15 +02:00
parent ac59fff346
commit 49384ce294
1 changed files with 61 additions and 46 deletions

View File

@ -136,18 +136,18 @@ TagLib::String QStringToTaglibString(const QString &s) {
namespace { namespace {
constexpr char kID3v2_AcoustID_ID[] = "TXXX:Acoustid Id"; constexpr char kID3v2_AcoustID_ID[] = "Acoustid Id";
constexpr char kID3v2_AcoustID_Fingerprint[] = "TXXX:Acoustid Fingerprint"; constexpr char kID3v2_AcoustID_Fingerprint[] = "Acoustid Fingerprint";
constexpr char kID3v2_MusicBrainz_AlbumArtistID[] = "TXXX:MusicBrainz Album Artist Id"; constexpr char kID3v2_MusicBrainz_AlbumArtistID[] = "MusicBrainz Album Artist Id";
constexpr char kID3v2_MusicBrainz_ArtistID[] = "TXXX:MusicBrainz Artist Id"; constexpr char kID3v2_MusicBrainz_ArtistID[] = "MusicBrainz Artist Id";
constexpr char kID3v2_MusicBrainz_OriginalArtistID[] = "TXXX:MusicBrainz Original Artist Id"; constexpr char kID3v2_MusicBrainz_OriginalArtistID[] = "MusicBrainz Original Artist Id";
constexpr char kID3v2_MusicBrainz_AlbumID[] = "TXXX:MusicBrainz Album Id"; constexpr char kID3v2_MusicBrainz_AlbumID[] = "MusicBrainz Album Id";
constexpr char kID3v2_MusicBrainz_OriginalAlbumID[] = "TXXX:MusicBrainz Original Album Id"; constexpr char kID3v2_MusicBrainz_OriginalAlbumID[] = "MusicBrainz Original Album Id";
constexpr char kID3v2_MusicBrainz_RecordingID[] = "UFID:http://musicbrainz.org"; constexpr char kID3v2_MusicBrainz_RecordingID[] = "MUSICBRAINZ_TRACKID";
constexpr char kID3v2_MusicBrainz_TrackID[] = "TXXX:MusicBrainz Release Track Id"; constexpr char kID3v2_MusicBrainz_TrackID[] = "MusicBrainz Release Track Id";
constexpr char kID3v2_MusicBrainz_DiscID[] = "TXXX:MusicBrainz Disc Id"; constexpr char kID3v2_MusicBrainz_DiscID[] = "MusicBrainz Disc Id";
constexpr char kID3v2_MusicBrainz_ReleaseGroupID[] = "TXXX:MusicBrainz Release Group Id"; constexpr char kID3v2_MusicBrainz_ReleaseGroupID[] = "MusicBrainz Release Group Id";
constexpr char kID3v2_MusicBrainz_WorkID[] = "TXXX:MusicBrainz Work Id"; constexpr char kID3v2_MusicBrainz_WorkID[] = "MusicBrainz Work Id";
constexpr char kMP4_OriginalYear_ID[] = "----:com.apple.iTunes:ORIGINAL YEAR"; constexpr char kMP4_OriginalYear_ID[] = "----:com.apple.iTunes:ORIGINAL YEAR";
constexpr char kMP4_FMPS_Playcount_ID[] = "----:com.apple.iTunes:FMPS_Playcount"; constexpr char kMP4_FMPS_Playcount_ID[] = "----:com.apple.iTunes:FMPS_Playcount";
@ -399,42 +399,57 @@ bool TagReaderTagLib::ReadFile(const QString &filename, spb::tagreader::SongMeta
} }
} }
if (map.contains(kID3v2_AcoustID_ID)) { if (map.contains("UFID")) {
TStringToStdString(map[kID3v2_AcoustID_ID].front()->toString(), song->mutable_acoustid_id()); for (uint i = 0; i < map["UFID"].size(); ++i) {
} if (TagLib::ID3v2::UniqueFileIdentifierFrame *frame = dynamic_cast<TagLib::ID3v2::UniqueFileIdentifierFrame*>(map["UFID"][i])) {
if (map.contains(kID3v2_AcoustID_Fingerprint)) { const TagLib::PropertyMap property_map = frame->asProperties();
TStringToStdString(map[kID3v2_AcoustID_Fingerprint].front()->toString(), song->mutable_acoustid_fingerprint()); if (property_map.contains(kID3v2_MusicBrainz_RecordingID)) {
TStringToStdString(property_map[kID3v2_MusicBrainz_RecordingID].toString(), song->mutable_musicbrainz_recording_id());
}
}
}
} }
if (map.contains(kID3v2_MusicBrainz_AlbumArtistID)) { if (map.contains("TXXX")) {
TStringToStdString(map[kID3v2_MusicBrainz_AlbumArtistID].front()->toString(), song->mutable_musicbrainz_album_artist_id()); for (uint i = 0; i < map["TXXX"].size(); ++i) {
} if (TagLib::ID3v2::UserTextIdentificationFrame *frame = dynamic_cast<TagLib::ID3v2::UserTextIdentificationFrame*>(map["TXXX"][i])) {
if (map.contains(kID3v2_MusicBrainz_ArtistID)) { const TagLib::StringList frame_field_list = frame->fieldList();
TStringToStdString(map[kID3v2_MusicBrainz_ArtistID].front()->toString(), song->mutable_musicbrainz_artist_id()); if (frame_field_list.size() != 2) continue;
} if (frame->description() == kID3v2_AcoustID_ID) {
if (map.contains(kID3v2_MusicBrainz_OriginalArtistID)) { TStringToStdString(frame_field_list.back(), song->mutable_acoustid_id());
TStringToStdString(map[kID3v2_MusicBrainz_OriginalArtistID].front()->toString(), song->mutable_musicbrainz_original_artist_id()); }
} if (frame->description() == kID3v2_AcoustID_Fingerprint) {
if (map.contains(kID3v2_MusicBrainz_AlbumID)) { TStringToStdString(frame_field_list.back(), song->mutable_acoustid_fingerprint());
TStringToStdString(map[kID3v2_MusicBrainz_AlbumID].front()->toString(), song->mutable_musicbrainz_album_id()); }
} if (frame->description() == kID3v2_MusicBrainz_AlbumArtistID) {
if (map.contains(kID3v2_MusicBrainz_OriginalAlbumID)) { TStringToStdString(frame_field_list.back(), song->mutable_musicbrainz_album_artist_id());
TStringToStdString(map[kID3v2_MusicBrainz_OriginalAlbumID].front()->toString(), song->mutable_musicbrainz_original_album_id()); }
} if (frame->description() == kID3v2_MusicBrainz_ArtistID) {
if (map.contains(kID3v2_MusicBrainz_RecordingID)) { TStringToStdString(frame_field_list.back(), song->mutable_musicbrainz_artist_id());
TStringToStdString(map[kID3v2_MusicBrainz_RecordingID].front()->toString(), song->mutable_musicbrainz_recording_id()); }
} if (frame->description() == kID3v2_MusicBrainz_OriginalArtistID) {
if (map.contains(kID3v2_MusicBrainz_TrackID)) { TStringToStdString(frame_field_list.back(), song->mutable_musicbrainz_original_artist_id());
TStringToStdString(map[kID3v2_MusicBrainz_TrackID].front()->toString(), song->mutable_musicbrainz_track_id()); }
} if (frame->description() == kID3v2_MusicBrainz_AlbumID) {
if (map.contains(kID3v2_MusicBrainz_DiscID)) { TStringToStdString(frame_field_list.back(), song->mutable_musicbrainz_album_id());
TStringToStdString(map[kID3v2_MusicBrainz_DiscID].front()->toString(), song->mutable_musicbrainz_disc_id()); }
} if (frame->description() == kID3v2_MusicBrainz_OriginalAlbumID) {
if (map.contains(kID3v2_MusicBrainz_ReleaseGroupID)) { TStringToStdString(frame_field_list.back(), song->mutable_musicbrainz_original_album_id());
TStringToStdString(map[kID3v2_MusicBrainz_ReleaseGroupID].front()->toString(), song->mutable_musicbrainz_release_group_id()); }
} if (frame->description() == kID3v2_MusicBrainz_TrackID) {
if (map.contains(kID3v2_MusicBrainz_WorkID)) { TStringToStdString(frame_field_list.back(), song->mutable_musicbrainz_track_id());
TStringToStdString(map[kID3v2_MusicBrainz_WorkID].front()->toString(), song->mutable_musicbrainz_work_id()); }
if (frame->description() == kID3v2_MusicBrainz_DiscID) {
TStringToStdString(frame_field_list.back(), song->mutable_musicbrainz_disc_id());
}
if (frame->description() == kID3v2_MusicBrainz_ReleaseGroupID) {
TStringToStdString(frame_field_list.back(), song->mutable_musicbrainz_release_group_id());
}
if (frame->description() == kID3v2_MusicBrainz_WorkID) {
TStringToStdString(frame_field_list.back(), song->mutable_musicbrainz_work_id());
}
}
}
} }
} }