Fix a number of potential zero-value field values.

This commit is contained in:
James D. Smith 2019-04-03 10:13:57 -06:00
parent 553c4013cf
commit 96a7e18a8d

View File

@ -692,10 +692,10 @@ void TagReader::SetVorbisComments(
vorbis_comments->addField( vorbis_comments->addField(
"DISCNUMBER", "DISCNUMBER",
QStringToTaglibString( QStringToTaglibString(
song.disc() <= 0 - 1 ? QString() : QString::number(song.disc())), song.disc() <= 0 ? QString() : QString::number(song.disc())),
true); true);
vorbis_comments->addField( vorbis_comments->addField(
"COMPILATION", StdStringToTaglibString(song.compilation() ? "1" : "0"), "COMPILATION", QStringToTaglibString(song.compilation() ? QString::number(1) : QString()),
true); true);
// Try to be coherent, the two forms are used but the first one is preferred // Try to be coherent, the two forms are used but the first one is preferred
@ -712,19 +712,20 @@ void TagReader::SetVorbisComments(
void TagReader::SetFMPSStatisticsVorbisComments( void TagReader::SetFMPSStatisticsVorbisComments(
TagLib::Ogg::XiphComment* vorbis_comments, TagLib::Ogg::XiphComment* vorbis_comments,
const pb::tagreader::SongMetadata& song) const { const pb::tagreader::SongMetadata& song) const {
vorbis_comments->addField( if (song.playcount())
"FMPS_PLAYCOUNT", vorbis_comments->addField(
QStringToTaglibString(QString::number(song.playcount()))); "FMPS_PLAYCOUNT", TagLib::String::number(song.playcount()), true);
vorbis_comments->addField( if (song.score())
"FMPS_RATING_AMAROK_SCORE", vorbis_comments->addField(
QStringToTaglibString(QString::number(song.score() / 100.0))); "FMPS_RATING_AMAROK_SCORE", QStringToTaglibString(
QString::number(song.score() / 100.0)), true);
} }
void TagReader::SetFMPSRatingVorbisComments( void TagReader::SetFMPSRatingVorbisComments(
TagLib::Ogg::XiphComment* vorbis_comments, TagLib::Ogg::XiphComment* vorbis_comments,
const pb::tagreader::SongMetadata& song) const { const pb::tagreader::SongMetadata& song) const {
vorbis_comments->addField( vorbis_comments->addField(
"FMPS_RATING", QStringToTaglibString(QString::number(song.rating()))); "FMPS_RATING", QStringToTaglibString(QString::number(song.rating())), true);
} }
pb::tagreader::SongMetadata_Type TagReader::GuessFileType( pb::tagreader::SongMetadata_Type TagReader::GuessFileType(
@ -783,20 +784,14 @@ bool TagReader::SaveFile(const QString& filename,
fileref->tag()->setAlbum(StdStringToTaglibString(song.album())); fileref->tag()->setAlbum(StdStringToTaglibString(song.album()));
fileref->tag()->setGenre(StdStringToTaglibString(song.genre())); fileref->tag()->setGenre(StdStringToTaglibString(song.genre()));
fileref->tag()->setComment(StdStringToTaglibString(song.comment())); fileref->tag()->setComment(StdStringToTaglibString(song.comment()));
fileref->tag()->setYear(song.year()); fileref->tag()->setYear(song.year() <= 0 - 1 ? 0: song.year());
fileref->tag()->setTrack(song.track()); fileref->tag()->setTrack(song.track() <= 0 - 1 ? 0: song.track());
auto saveApeTag = [&](TagLib::APE::Tag* tag) { auto saveApeTag = [&](TagLib::APE::Tag* tag) {
tag->setItem( tag->addValue("disc", QStringToTaglibString(
"disc", song.disc() <= 0 ? QString() : QString::number(song.disc())), true);
TagLib::APE::Item("disc", TagLib::String::number( tag->addValue("bpm", QStringToTaglibString(
song.disc() <= 0 - 1 ? 0 : song.disc()))); song.bpm() <= 0 - 1 ? QString() : QString::number(song.bpm())), true);
tag->setItem("bpm",
TagLib::APE::Item(
"bpm", TagLib::StringList(
song.bpm() <= 0 - 1
? "0"
: TagLib::String::number(song.bpm()))));
tag->setItem("composer", tag->setItem("composer",
TagLib::APE::Item( TagLib::APE::Item(
"composer", TagLib::StringList(song.composer().c_str()))); "composer", TagLib::StringList(song.composer().c_str())));
@ -812,17 +807,14 @@ bool TagReader::SaveFile(const QString& filename,
TagLib::StringList(song.albumartist().c_str()))); TagLib::StringList(song.albumartist().c_str())));
tag->setItem("lyrics", tag->setItem("lyrics",
TagLib::APE::Item("lyrics", TagLib::String(song.lyrics()))); TagLib::APE::Item("lyrics", TagLib::String(song.lyrics())));
tag->setItem( tag->addValue("compilation", QStringToTaglibString(song.compilation() ? QString::number(1) : QString()), true);
"compilation",
TagLib::APE::Item("compilation",
TagLib::StringList(song.compilation() ? "1" : "0")));
}; };
if (TagLib::MPEG::File* file = if (TagLib::MPEG::File* file =
dynamic_cast<TagLib::MPEG::File*>(fileref->file())) { dynamic_cast<TagLib::MPEG::File*>(fileref->file())) {
TagLib::ID3v2::Tag* tag = file->ID3v2Tag(true); TagLib::ID3v2::Tag* tag = file->ID3v2Tag(true);
SetTextFrame( SetTextFrame(
"TPOS", song.disc() <= 0 - 1 ? QString() : QString::number(song.disc()), "TPOS", song.disc() <= 0 ? QString() : QString::number(song.disc()),
tag); tag);
SetTextFrame("TBPM", SetTextFrame("TBPM",
song.bpm() <= 0 - 1 ? QString() : QString::number(song.bpm()), song.bpm() <= 0 - 1 ? QString() : QString::number(song.bpm()),
@ -833,7 +825,7 @@ bool TagReader::SaveFile(const QString& filename,
SetUnsyncLyricsFrame(song.lyrics(), tag); SetUnsyncLyricsFrame(song.lyrics(), tag);
// Skip TPE1 (which is the artist) here because we already set it // Skip TPE1 (which is the artist) here because we already set it
SetTextFrame("TPE2", song.albumartist(), tag); SetTextFrame("TPE2", song.albumartist(), tag);
SetTextFrame("TCMP", std::string(song.compilation() ? "1" : "0"), tag); SetTextFrame("TCMP", song.compilation() ? QString::number(1) : QString(), tag);
} else if (TagLib::FLAC::File* file = } else if (TagLib::FLAC::File* file =
dynamic_cast<TagLib::FLAC::File*>(fileref->file())) { dynamic_cast<TagLib::FLAC::File*>(fileref->file())) {
TagLib::Ogg::XiphComment* tag = file->xiphComment(); TagLib::Ogg::XiphComment* tag = file->xiphComment();
@ -894,30 +886,33 @@ bool TagReader::SaveSongStatisticsToFile(
return false; return false;
auto saveApeSongStats = [&](TagLib::APE::Tag* tag) { auto saveApeSongStats = [&](TagLib::APE::Tag* tag) {
tag->setItem( if (song.score())
"FMPS_Rating_Amarok_Score", tag->setItem(
TagLib::APE::Item("FMPS_Rating_Amarok_Score", "FMPS_Rating_Amarok_Score",
TagLib::StringList(QStringToTaglibString( TagLib::APE::Item("FMPS_Rating_Amarok_Score", QStringToTaglibString(
QString::number(song.score() / 100.0))))); QString::number(song.score() / 100.0))));
tag->setItem( if (song.playcount())
"FMPS_PlayCount", tag->setItem("FMPS_PlayCount", TagLib::APE::Item(
TagLib::APE::Item( "FMPS_PlayCount", TagLib::String::number(song.playcount())));
"FMPS_PlayCount",
TagLib::StringList(TagLib::String::number(song.playcount()))));
}; };
if (TagLib::MPEG::File* file = if (TagLib::MPEG::File* file =
dynamic_cast<TagLib::MPEG::File*>(fileref->file())) { dynamic_cast<TagLib::MPEG::File*>(fileref->file())) {
TagLib::ID3v2::Tag* tag = file->ID3v2Tag(true); TagLib::ID3v2::Tag* tag = file->ID3v2Tag(true);
// Save as FMPS if (song.playcount()) {
SetUserTextFrame("FMPS_PlayCount", QString::number(song.playcount()), tag); // Save as FMPS
SetUserTextFrame("FMPS_Rating_Amarok_Score", SetUserTextFrame("FMPS_PlayCount", QString::number(
QString::number(song.score() / 100.0), tag); song.playcount()), tag);
// Also save as POPM // Also save as POPM
TagLib::ID3v2::PopularimeterFrame* frame = GetPOPMFrameFromTag(tag); TagLib::ID3v2::PopularimeterFrame* frame = GetPOPMFrameFromTag(tag);
frame->setCounter(song.playcount()); frame->setCounter(song.playcount());
}
if (song.score())
SetUserTextFrame("FMPS_Rating_Amarok_Score",
QString::number(song.score() / 100.0), tag);
} else if (TagLib::FLAC::File* file = } else if (TagLib::FLAC::File* file =
dynamic_cast<TagLib::FLAC::File*>(fileref->file())) { dynamic_cast<TagLib::FLAC::File*>(fileref->file())) {
@ -932,18 +927,23 @@ bool TagReader::SaveSongStatisticsToFile(
else if (TagLib::ASF::File* file = else if (TagLib::ASF::File* file =
dynamic_cast<TagLib::ASF::File*>(fileref->file())) { dynamic_cast<TagLib::ASF::File*>(fileref->file())) {
TagLib::ASF::Tag* tag = file->tag(); TagLib::ASF::Tag* tag = file->tag();
tag->addAttribute("FMPS/Playcount", NumberToASFAttribute(song.playcount())); if (song.playcount())
tag->addAttribute("FMPS/Rating_Amarok_Score", tag->addAttribute("FMPS/Playcount", NumberToASFAttribute(
NumberToASFAttribute(song.score() / 100.0)); song.playcount()));
if (song.score())
tag->addAttribute("FMPS/Rating_Amarok_Score",
NumberToASFAttribute(song.score() / 100.0));
} }
#endif #endif
else if (TagLib::MP4::File* file = else if (TagLib::MP4::File* file =
dynamic_cast<TagLib::MP4::File*>(fileref->file())) { dynamic_cast<TagLib::MP4::File*>(fileref->file())) {
TagLib::MP4::Tag* tag = file->tag(); TagLib::MP4::Tag* tag = file->tag();
tag->itemListMap()[kMP4_FMPS_Score_ID] = TagLib::StringList( if (song.score())
QStringToTaglibString(QString::number(song.score() / 100.0))); tag->itemListMap()[kMP4_FMPS_Score_ID] = TagLib::MP4::Item(
tag->itemListMap()[kMP4_FMPS_Playcount_ID] = QStringToTaglibString(QString::number(song.score() / 100.0)));
TagLib::StringList(TagLib::String::number(song.playcount())); if (song.playcount())
tag->itemListMap()[kMP4_FMPS_Playcount_ID] = TagLib::MP4::Item(
TagLib::String::number(song.playcount()));
} else if (TagLib::APE::File* file = } else if (TagLib::APE::File* file =
dynamic_cast<TagLib::APE::File*>(fileref->file())) { dynamic_cast<TagLib::APE::File*>(fileref->file())) {
saveApeSongStats(file->APETag(true)); saveApeSongStats(file->APETag(true));
@ -974,7 +974,7 @@ bool TagReader::SaveSongRatingToFile(
if (filename.isNull()) return false; if (filename.isNull()) return false;
qLog(Debug) << "Saving song rating tags to" << filename; qLog(Debug) << "Saving song rating tags to" << filename;
if (song.rating() < 0) { if (song.rating()) {
// The FMPS spec says unrated == "tag not present". For us, no rating // The FMPS spec says unrated == "tag not present". For us, no rating
// results in rating being -1, so don't write anything in that case. // results in rating being -1, so don't write anything in that case.
// Actually, we should also remove tag set in this case, but in // Actually, we should also remove tag set in this case, but in