diff --git a/ext/libstrawberry-tagreader/tagreadermessages.proto b/ext/libstrawberry-tagreader/tagreadermessages.proto index 22ad1cdfb..5a620821b 100644 --- a/ext/libstrawberry-tagreader/tagreadermessages.proto +++ b/ext/libstrawberry-tagreader/tagreadermessages.proto @@ -62,8 +62,8 @@ message SongMetadata { optional int64 mtime = 25; optional int64 ctime = 26; - optional int32 playcount = 27; - optional int32 skipcount = 28; + optional uint32 playcount = 27; + optional uint32 skipcount = 28; optional int64 lastplayed = 29; optional int64 lastseen = 30; diff --git a/ext/libstrawberry-tagreader/tagreadertaglib.cpp b/ext/libstrawberry-tagreader/tagreadertaglib.cpp index 9edbc2709..0d8b665ac 100644 --- a/ext/libstrawberry-tagreader/tagreadertaglib.cpp +++ b/ext/libstrawberry-tagreader/tagreadertaglib.cpp @@ -332,7 +332,7 @@ void TagReaderTagLib::ReadFile(const QString &filename, spb::tagreader::SongMeta const TagLib::ID3v2::PopularimeterFrame *frame = dynamic_cast(map["POPM"].front()); if (frame) { if (song->playcount() <= 0 && frame->counter() > 0) { - song->set_playcount(static_cast(frame->counter())); + song->set_playcount(frame->counter()); } if (song->rating() <= 0 && frame->rating() > 0) { song->set_rating(ConvertPOPMRating(frame->rating())); @@ -386,7 +386,7 @@ void TagReaderTagLib::ReadFile(const QString &filename, spb::tagreader::SongMeta if (item.isValid()) { const int playcount = TStringToQString(item.toStringList().toString('\n')).toInt(); if (song->playcount() <= 0 && playcount > 0) { - song->set_playcount(playcount); + song->set_playcount(static_cast(playcount)); } } } @@ -432,7 +432,7 @@ void TagReaderTagLib::ReadFile(const QString &filename, spb::tagreader::SongMeta if (!attributes.isEmpty()) { int playcount = TStringToQString(attributes.front().toString()).toInt(); if (song->playcount() <= 0 && playcount > 0) { - song->set_playcount(playcount); + song->set_playcount(static_cast(playcount)); } } } @@ -486,16 +486,15 @@ void TagReaderTagLib::ReadFile(const QString &filename, spb::tagreader::SongMeta if (!lyrics.isEmpty()) song->set_lyrics(lyrics.toStdString()); // Set integer fields to -1 if they're not valid - #define SetDefault(field) if (song->field() <= 0) { song->set_##field(-1); } - SetDefault(track); - SetDefault(disc); - SetDefault(year); - SetDefault(originalyear); - SetDefault(bitrate); - SetDefault(samplerate); - SetDefault(bitdepth); - SetDefault(lastplayed); - #undef SetDefault + + if (song->track() <= 0) { song->set_track(-1); } + if (song->disc() <= 0) { song->set_disc(-1); } + if (song->year() <= 0) { song->set_year(-1); } + if (song->originalyear() <= 0) { song->set_originalyear(-1); } + if (song->samplerate() <= 0) { song->set_samplerate(-1); } + if (song->bitdepth() <= 0) { song->set_bitdepth(-1); } + if (song->bitrate() <= 0) { song->set_bitrate(-1); } + if (song->lastplayed() <= 0) { song->set_lastplayed(-1); } } @@ -530,7 +529,10 @@ void TagReaderTagLib::ParseOggTag(const TagLib::Ogg::FieldListMap &map, QString if (!map["COVERART"].isEmpty()) song->set_art_automatic(kEmbeddedCover); if (!map["METADATA_BLOCK_PICTURE"].isEmpty()) song->set_art_automatic(kEmbeddedCover); - if (!map["FMPS_PLAYCOUNT"].isEmpty() && song->playcount() <= 0) song->set_playcount(TStringToQString(map["FMPS_PLAYCOUNT"].front()).trimmed().toInt()); + if (!map["FMPS_PLAYCOUNT"].isEmpty() && song->playcount() <= 0) { + const int playcount = TStringToQString(map["FMPS_PLAYCOUNT"].front()).trimmed().toInt(); + song->set_playcount(static_cast(playcount)); + } if (!map["FMPS_RATING"].isEmpty() && song->rating() <= 0) song->set_rating(TStringToQString(map["FMPS_RATING"].front()).trimmed().toFloat()); if (!map["LYRICS"].isEmpty()) Decode(map["LYRICS"].front(), song->mutable_lyrics()); @@ -576,7 +578,7 @@ void TagReaderTagLib::ParseAPETag(const TagLib::APE::ItemListMap &map, QString * if (map.contains("FMPS_PLAYCOUNT")) { const int playcount = TStringToQString(map["FMPS_PLAYCOUNT"].toString()).toInt(); if (song->playcount() <= 0 && playcount > 0) { - song->set_playcount(playcount); + song->set_playcount(static_cast(playcount)); } } @@ -1060,7 +1062,7 @@ bool TagReaderTagLib::SaveSongPlaycountToFile(const QString &filename, const spb TagLib::Ogg::XiphComment *vorbis_comments = flac_file->xiphComment(true); if (!vorbis_comments) return false; if (song.playcount() > 0) { - vorbis_comments->addField("FMPS_PLAYCOUNT", TagLib::String::number(song.playcount()), true); + vorbis_comments->addField("FMPS_PLAYCOUNT", TagLib::String::number(static_cast(song.playcount())), true); } else { vorbis_comments->removeFields("FMPS_PLAYCOUNT"); @@ -1070,19 +1072,19 @@ bool TagReaderTagLib::SaveSongPlaycountToFile(const QString &filename, const spb TagLib::APE::Tag *tag = wavpack_file->APETag(true); if (!tag) return false; if (song.playcount() > 0) { - tag->setItem("FMPS_PlayCount", TagLib::APE::Item("FMPS_PlayCount", TagLib::String::number(song.playcount()))); + tag->setItem("FMPS_PlayCount", TagLib::APE::Item("FMPS_PlayCount", TagLib::String::number(static_cast(song.playcount())))); } } else if (TagLib::APE::File *ape_file = dynamic_cast(fileref->file())) { TagLib::APE::Tag *tag = ape_file->APETag(true); if (!tag) return false; if (song.playcount() > 0) { - tag->setItem("FMPS_PlayCount", TagLib::APE::Item("FMPS_PlayCount", TagLib::String::number(song.playcount()))); + tag->setItem("FMPS_PlayCount", TagLib::APE::Item("FMPS_PlayCount", TagLib::String::number(static_cast(song.playcount())))); } } else if (TagLib::Ogg::XiphComment *xiph_comment = dynamic_cast(fileref->file()->tag())) { if (song.playcount() > 0) { - xiph_comment->addField("FMPS_PLAYCOUNT", TagLib::String::number(song.playcount()), true); + xiph_comment->addField("FMPS_PLAYCOUNT", TagLib::String::number(static_cast(song.playcount())), true); } else { xiph_comment->removeFields("FMPS_PLAYCOUNT"); @@ -1104,14 +1106,14 @@ bool TagReaderTagLib::SaveSongPlaycountToFile(const QString &filename, const spb TagLib::MP4::Tag *tag = mp4_file->tag(); if (!tag) return false; if (song.playcount() > 0) { - tag->setItem(kMP4_FMPS_Playcount_ID, TagLib::MP4::Item(TagLib::String::number(song.playcount()))); + tag->setItem(kMP4_FMPS_Playcount_ID, TagLib::MP4::Item(TagLib::String::number(static_cast(song.playcount())))); } } else if (TagLib::MPC::File *mpc_file = dynamic_cast(fileref->file())) { TagLib::APE::Tag *tag = mpc_file->APETag(true); if (!tag) return false; if (song.playcount() > 0) { - tag->setItem("FMPS_PlayCount", TagLib::APE::Item("FMPS_PlayCount", TagLib::String::number(song.playcount()))); + tag->setItem("FMPS_PlayCount", TagLib::APE::Item("FMPS_PlayCount", TagLib::String::number(static_cast(song.playcount())))); } } else if (TagLib::ASF::File *asf_file = dynamic_cast(fileref->file())) { diff --git a/ext/libstrawberry-tagreader/tagreadertagparser.cpp b/ext/libstrawberry-tagreader/tagreadertagparser.cpp index 6b8dba6b6..74ae2f86f 100644 --- a/ext/libstrawberry-tagreader/tagreadertagparser.cpp +++ b/ext/libstrawberry-tagreader/tagreadertagparser.cpp @@ -225,20 +225,19 @@ void TagReaderTagParser::ReadFile(const QString &filename, spb::tagreader::SongM } // Set integer fields to -1 if they're not valid - #define SetDefault(field) if (song->field() <= 0) { song->set_##field(-1); } - SetDefault(track); - SetDefault(disc); - SetDefault(year); - SetDefault(originalyear); - SetDefault(bitrate); - SetDefault(samplerate); - SetDefault(bitdepth); - SetDefault(lastplayed); - #undef SetDefault + if (song->track() <= 0) { song->set_track(-1); } + if (song->disc() <= 0) { song->set_disc(-1); } + if (song->year() <= 0) { song->set_year(-1); } + if (song->originalyear() <= 0) { song->set_originalyear(-1); } + if (song->samplerate() <= 0) { song->set_samplerate(-1); } + if (song->bitdepth() <= 0) { song->set_bitdepth(-1); } + if (song->bitrate() <= 0) { song->set_bitrate(-1); } + if (song->lastplayed() <= 0) { song->set_lastplayed(-1); } song->set_valid(true); taginfo.close(); + } catch(...) {} diff --git a/src/core/song.cpp b/src/core/song.cpp index 5868c4dec..43820c2c8 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -209,8 +209,8 @@ struct Song::Private : public QSharedData { QString fingerprint_; - int playcount_; - int skipcount_; + uint playcount_; + uint skipcount_; qint64 lastplayed_; qint64 lastseen_; @@ -337,8 +337,8 @@ qint64 Song::ctime() const { return d->ctime_; } QString Song::fingerprint() const { return d->fingerprint_; } -int Song::playcount() const { return d->playcount_; } -int Song::skipcount() const { return d->skipcount_; } +uint Song::playcount() const { return d->playcount_; } +uint Song::skipcount() const { return d->skipcount_; } qint64 Song::lastplayed() const { return d->lastplayed_; } qint64 Song::lastseen() const { return d->lastseen_; } @@ -408,8 +408,8 @@ bool Song::art_manual_is_valid() const { bool Song::has_valid_art() const { return art_automatic_is_valid() || art_manual_is_valid(); } -void Song::set_id(int id) { d->id_ = id; } -void Song::set_valid(bool v) { d->valid_ = v; } +void Song::set_id(const int id) { d->id_ = id; } +void Song::set_valid(const bool v) { d->valid_ = v; } void Song::set_artist_id(const QString &v) { d->artist_id_ = v; } void Song::set_album_id(const QString &v) { d->album_id_ = v; } @@ -433,10 +433,10 @@ void Song::set_title(const QString &v) { d->title_sortable_ = sortable(v); d->ti void Song::set_album(const QString &v) { d->album_sortable_ = sortable(v); d->album_ = v; } void Song::set_artist(const QString &v) { d->artist_sortable_ = sortable(v); d->artist_ = v; } void Song::set_albumartist(const QString &v) { d->albumartist_sortable_ = sortable(v); d->albumartist_ = v; } -void Song::set_track(int v) { d->track_ = v; } -void Song::set_disc(int v) { d->disc_ = v; } -void Song::set_year(int v) { d->year_ = v; } -void Song::set_originalyear(int v) { d->originalyear_ = v; } +void Song::set_track(const int v) { d->track_ = v; } +void Song::set_disc(const int v) { d->disc_ = v; } +void Song::set_year(const int v) { d->year_ = v; } +void Song::set_originalyear(const int v) { d->originalyear_ = v; } void Song::set_genre(const QString &v) { d->genre_ = v; } void Song::set_compilation(bool v) { d->compilation_ = v; } void Song::set_composer(const QString &v) { d->composer_ = v; } @@ -445,40 +445,40 @@ void Song::set_grouping(const QString &v) { d->grouping_ = v; } void Song::set_comment(const QString &v) { d->comment_ = v; } void Song::set_lyrics(const QString &v) { d->lyrics_ = v; } -void Song::set_beginning_nanosec(qint64 v) { d->beginning_ = qMax(0LL, v); } -void Song::set_end_nanosec(qint64 v) { d->end_ = v; } -void Song::set_length_nanosec(qint64 v) { d->end_ = d->beginning_ + v; } +void Song::set_beginning_nanosec(const qint64 v) { d->beginning_ = qMax(0LL, v); } +void Song::set_end_nanosec(const qint64 v) { d->end_ = v; } +void Song::set_length_nanosec(const qint64 v) { d->end_ = d->beginning_ + v; } -void Song::set_bitrate(int v) { d->bitrate_ = v; } -void Song::set_samplerate(int v) { d->samplerate_ = v; } -void Song::set_bitdepth(int v) { d->bitdepth_ = v; } +void Song::set_bitrate(const int v) { d->bitrate_ = v; } +void Song::set_samplerate(const int v) { d->samplerate_ = v; } +void Song::set_bitdepth(const int v) { d->bitdepth_ = v; } -void Song::set_source(Source v) { d->source_ = v; } -void Song::set_directory_id(int v) { d->directory_id_ = v; } +void Song::set_source(const Source v) { d->source_ = v; } +void Song::set_directory_id(const int v) { d->directory_id_ = v; } void Song::set_url(const QUrl &v) { d->url_ = v; } void Song::set_basefilename(const QString &v) { d->basefilename_ = v; } -void Song::set_filetype(FileType v) { d->filetype_ = v; } -void Song::set_filesize(qint64 v) { d->filesize_ = v; } -void Song::set_mtime(qint64 v) { d->mtime_ = v; } -void Song::set_ctime(qint64 v) { d->ctime_ = v; } -void Song::set_unavailable(bool v) { d->unavailable_ = v; } +void Song::set_filetype(const FileType v) { d->filetype_ = v; } +void Song::set_filesize(const qint64 v) { d->filesize_ = v; } +void Song::set_mtime(const qint64 v) { d->mtime_ = v; } +void Song::set_ctime(const qint64 v) { d->ctime_ = v; } +void Song::set_unavailable(const bool v) { d->unavailable_ = v; } void Song::set_fingerprint(const QString &v) { d->fingerprint_ = v; } -void Song::set_playcount(int v) { d->playcount_ = v; } -void Song::set_skipcount(int v) { d->skipcount_ = v; } -void Song::set_lastplayed(qint64 v) { d->lastplayed_ = v; } -void Song::set_lastseen(qint64 v) { d->lastseen_ = v; } +void Song::set_playcount(const uint v) { d->playcount_ = v; } +void Song::set_skipcount(const uint v) { d->skipcount_ = v; } +void Song::set_lastplayed(const qint64 v) { d->lastplayed_ = v; } +void Song::set_lastseen(const qint64 v) { d->lastseen_ = v; } -void Song::set_compilation_detected(bool v) { d->compilation_detected_ = v; } -void Song::set_compilation_on(bool v) { d->compilation_on_ = v; } -void Song::set_compilation_off(bool v) { d->compilation_off_ = v; } +void Song::set_compilation_detected(const bool v) { d->compilation_detected_ = v; } +void Song::set_compilation_on(const bool v) { d->compilation_on_ = v; } +void Song::set_compilation_off(const bool v) { d->compilation_off_ = v; } void Song::set_art_automatic(const QUrl &v) { d->art_automatic_ = v; } void Song::set_art_manual(const QUrl &v) { d->art_manual_ = v; } void Song::set_cue_path(const QString &v) { d->cue_path_ = v; } -void Song::set_rating(float v) { d->rating_ = v; } +void Song::set_rating(const float v) { d->rating_ = v; } void Song::set_stream_url(const QUrl &v) { d->stream_url_ = v; } void Song::set_image(const QImage &i) { d->image_ = i; } @@ -919,203 +919,77 @@ void Song::ToProtobuf(spb::tagreader::SongMetadata *pb) const { } -#define tostr(n) (q.value(n).isNull() ? QString() : q.value(n).toString()) -#define toint(n) (q.value(n).isNull() ? -1 : q.value(n).toInt()) -#define tolonglong(n) (q.value(n).isNull() ? -1 : q.value(n).toLongLong()) -#define tofloat(n) (q.value(n).isNull() ? -1 : q.value(n).toFloat()) +void Song::InitFromQuery(const SqlRow &q, const bool reliable_metadata) { -void Song::InitFromQuery(const SqlRow &q, bool reliable_metadata, int col) { + d->id_ = q.value("rowid").isNull() ? -1 : q.value("rowid").toInt(); - //qLog(Debug) << "Song::kColumns.size():" << Song::kColumns.size() << "q.columns_.size():" << q.columns_.size() << "col:" << col; - - int x = col; - d->id_ = toint(col); - - for (int i = 0; i < Song::kColumns.size(); i++) { - x++; - - if (x >= q.columns_.size()) { - qLog(Error) << "Skipping" << Song::kColumns.value(i); - break; + set_title(q.ValueToString("title")); + set_album(q.ValueToString("album")); + set_artist(q.ValueToString("artist")); + set_albumartist(q.ValueToString("albumartist")); + d->track_ = q.ValueToInt("track"); + d->disc_ = q.ValueToInt("disc"); + d->year_ = q.ValueToInt("year"); + d->originalyear_ = q.ValueToInt("originalyear"); + d->genre_ = q.ValueToString("genre"); + d->compilation_ = q.value("compilation").toBool(); + d->composer_ = q.ValueToString("composer"); + d->performer_ = q.ValueToString("performer"); + d->grouping_ = q.ValueToString("grouping"); + d->comment_ = q.ValueToString("comment"); + d->lyrics_ = q.ValueToString("lyrics"); + d->artist_id_ = q.ValueToString("artist_id"); + d->album_id_ = q.ValueToString("album_id"); + d->song_id_ = q.ValueToString("song_id"); + d->beginning_ = q.value("beginning").isNull() ? 0 : q.value("beginning").toLongLong(); + set_length_nanosec(q.ValueToLongLong("length")); + d->bitrate_ = q.ValueToInt("bitrate"); + d->samplerate_ = q.ValueToInt("samplerate"); + d->bitdepth_ = q.ValueToInt("bitdepth"); + d->source_ = Source(q.value("source").isNull() ? 0 : q.value("source").toInt()); + d->directory_id_ = q.ValueToInt("directory_id"); + set_url(QUrl::fromEncoded(q.ValueToString("url").toUtf8())); + d->basefilename_ = QFileInfo(d->url_.toLocalFile()).fileName(); + d->filetype_ = FileType(q.value("filetype").isNull() ? 0 : q.value("filetype").toInt()); + d->filesize_ = q.ValueToLongLong("filesize"); + d->mtime_ = q.ValueToLongLong("mtime"); + d->ctime_ = q.ValueToLongLong("ctime"); + d->unavailable_ = q.value("unavailable").toBool(); + d->fingerprint_ = q.ValueToString("fingerprint"); + d->playcount_ = q.ValueToUInt("playcount"); + d->skipcount_ = q.ValueToUInt("skipcount"); + d->lastplayed_ = q.ValueToLongLong("lastplayed"); + d->lastseen_ = q.ValueToLongLong("lastseen"); + d->compilation_detected_ = q.ValueToBool("compilation_detected"); + d->compilation_on_ = q.ValueToBool("compilation_on"); + d->compilation_off_ = q.ValueToBool("compilation_off"); + QString art_automatic = q.ValueToString("art_automatic"); + if (!art_automatic.isEmpty()) { + if (art_automatic.contains(QRegularExpression("..+:.*"))) { + set_art_automatic(QUrl::fromEncoded(art_automatic.toUtf8())); } - - //qLog(Debug) << "Index:" << i << x << Song::kColumns.value(i) << q.value(x).toString(); - - if (Song::kColumns.value(i) == "title") { - set_title(tostr(x)); - } - else if (Song::kColumns.value(i) == "album") { - set_album(tostr(x)); - } - else if (Song::kColumns.value(i) == "artist") { - set_artist(tostr(x)); - } - else if (Song::kColumns.value(i) == "albumartist") { - set_albumartist(tostr(x)); - } - else if (Song::kColumns.value(i) == "track") { - d->track_ = toint(x); - } - else if (Song::kColumns.value(i) == "disc") { - d->disc_ = toint(x); - } - else if (Song::kColumns.value(i) == "year") { - d->year_ = toint(x); - } - else if (Song::kColumns.value(i) == "originalyear") { - d->originalyear_ = toint(x); - } - else if (Song::kColumns.value(i) == "genre") { - d->genre_ = tostr(x); - } - else if (Song::kColumns.value(i) == "compilation") { - d->compilation_ = q.value(x).toBool(); - } - else if (Song::kColumns.value(i) == "composer") { - d->composer_ = tostr(x); - } - else if (Song::kColumns.value(i) == "performer") { - d->performer_ = tostr(x); - } - else if (Song::kColumns.value(i) == "grouping") { - d->grouping_ = tostr(x); - } - else if (Song::kColumns.value(i) == "comment") { - d->comment_ = tostr(x); - } - else if (Song::kColumns.value(i) == "lyrics") { - d->lyrics_ = tostr(x); - } - - else if (Song::kColumns.value(i) == "artist_id") { - d->artist_id_ = tostr(x); - } - else if (Song::kColumns.value(i) == "album_id") { - d->album_id_ = tostr(x); - } - else if (Song::kColumns.value(i) == "song_id") { - d->song_id_ = tostr(x); - } - - else if (Song::kColumns.value(i) == "beginning") { - d->beginning_ = q.value(x).isNull() ? 0 : q.value(x).toLongLong(); - } - else if (Song::kColumns.value(i) == "length") { - set_length_nanosec(tolonglong(x)); - } - - else if (Song::kColumns.value(i) == "bitrate") { - d->bitrate_ = toint(x); - } - else if (Song::kColumns.value(i) == "samplerate") { - d->samplerate_ = toint(x); - } - else if (Song::kColumns.value(i) == "bitdepth") { - d->bitdepth_ = toint(x); - } - - else if (Song::kColumns.value(i) == "source") { - d->source_ = Source(q.value(x).toInt()); - } - else if (Song::kColumns.value(i) == "directory_id") { - d->directory_id_ = toint(x); - } - else if (Song::kColumns.value(i) == "url") { - set_url(QUrl::fromEncoded(tostr(x).toUtf8())); - d->basefilename_ = QFileInfo(d->url_.toLocalFile()).fileName(); - } - else if (Song::kColumns.value(i) == "filetype") { - d->filetype_ = FileType(q.value(x).toInt()); - } - else if (Song::kColumns.value(i) == "filesize") { - d->filesize_ = tolonglong(x); - } - else if (Song::kColumns.value(i) == "mtime") { - d->mtime_ = tolonglong(x); - } - else if (Song::kColumns.value(i) == "ctime") { - d->ctime_ = tolonglong(x); - } - else if (Song::kColumns.value(i) == "unavailable") { - d->unavailable_ = q.value(x).toBool(); - } - - else if (Song::kColumns.value(i) == "fingerprint") { - d->fingerprint_ = tostr(x); - } - - else if (Song::kColumns.value(i) == "playcount") { - d->playcount_ = q.value(x).isNull() ? 0 : q.value(x).toInt(); - } - else if (Song::kColumns.value(i) == "skipcount") { - d->skipcount_ = q.value(x).isNull() ? 0 : q.value(x).toInt(); - } - else if (Song::kColumns.value(i) == "lastplayed") { - d->lastplayed_ = tolonglong(x); - } - else if (Song::kColumns.value(i) == "lastseen") { - d->lastseen_ = tolonglong(x); - } - - else if (Song::kColumns.value(i) == "compilation_detected") { - d->compilation_detected_ = q.value(x).toBool(); - } - else if (Song::kColumns.value(i) == "compilation_on") { - d->compilation_on_ = q.value(x).toBool(); - } - else if (Song::kColumns.value(i) == "compilation_off") { - d->compilation_off_ = q.value(x).toBool(); - } - else if (Song::kColumns.value(i) == "compilation_effective") { - } - - else if (Song::kColumns.value(i) == "art_automatic") { - QString art_automatic = tostr(x); - if (art_automatic.contains(QRegularExpression("..+:.*"))) { - set_art_automatic(QUrl::fromEncoded(art_automatic.toUtf8())); - } - else { - set_art_automatic(QUrl::fromLocalFile(art_automatic)); - } - } - else if (Song::kColumns.value(i) == "art_manual") { - QString art_manual = tostr(x); - if (art_manual.contains(QRegularExpression("..+:.*"))) { - set_art_manual(QUrl::fromEncoded(art_manual.toUtf8())); - } - else { - set_art_manual(QUrl::fromLocalFile(art_manual)); - } - } - - else if (Song::kColumns.value(i) == "effective_albumartist") { - } - else if (Song::kColumns.value(i) == "effective_originalyear") { - } - - else if (Song::kColumns.value(i) == "cue_path") { - d->cue_path_ = tostr(x); - } - - else if (Song::kColumns.value(i) == "rating") { - d->rating_ = tofloat(x); - } - else { - qLog(Error) << "Forgot to handle" << Song::kColumns.value(i); + set_art_automatic(QUrl::fromLocalFile(art_automatic)); } } + QString art_manual = q.ValueToString("art_manual"); + if (!art_manual.isEmpty()) { + if (art_manual.contains(QRegularExpression("..+:.*"))) { + set_art_manual(QUrl::fromEncoded(art_manual.toUtf8())); + } + else { + set_art_manual(QUrl::fromLocalFile(art_manual)); + } + } + + d->cue_path_ = q.ValueToString("cue_path"); + d->rating_ = q.ValueToFloat("rating"); d->valid_ = true; d->init_from_file_ = reliable_metadata; InitArtManual(); -#undef tostr -#undef toint -#undef tolonglong -#undef tofloat - } void Song::InitFromFilePartial(const QString &filename, const QFileInfo &fileinfo) { @@ -1280,7 +1154,7 @@ void Song::InitFromMTP(const LIBMTP_track_t *track, const QString &host) { d->bitdepth_ = 0; d->bitrate_ = static_cast(track->bitrate); - d->playcount_ = static_cast(track->usecount); + d->playcount_ = track->usecount; switch (track->filetype) { case LIBMTP_FILETYPE_WAV: d->filetype_ = FileType_WAV; break; @@ -1403,73 +1277,65 @@ bool Song::MergeFromSimpleMetaBundle(const Engine::SimpleMetaBundle &bundle) { void Song::BindToQuery(SqlQuery *query) const { -#define strval(x) ((x).isNull() ? "" : (x)) -#define intval(x) ((x) <= 0 ? -1 : (x)) -#define notnullintval(x) ((x) == -1 ? QVariant() : (x)) - // Remember to bind these in the same order as kBindSpec - query->BindValue(":title", strval(d->title_)); - query->BindValue(":album", strval(d->album_)); - query->BindValue(":artist", strval(d->artist_)); - query->BindValue(":albumartist", strval(d->albumartist_)); - query->BindValue(":track", intval(d->track_)); - query->BindValue(":disc", intval(d->disc_)); - query->BindValue(":year", intval(d->year_)); - query->BindValue(":originalyear", intval(d->originalyear_)); - query->BindValue(":genre", strval(d->genre_)); - query->BindValue(":compilation", d->compilation_ ? 1 : 0); - query->BindValue(":composer", strval(d->composer_)); - query->BindValue(":performer", strval(d->performer_)); - query->BindValue(":grouping", strval(d->grouping_)); - query->BindValue(":comment", strval(d->comment_)); - query->BindValue(":lyrics", strval(d->lyrics_)); + query->BindStringValue(":title", d->title_); + query->BindStringValue(":album", d->album_); + query->BindStringValue(":artist", d->artist_); + query->BindStringValue(":albumartist", d->albumartist_); + query->BindIntValue(":track", d->track_); + query->BindIntValue(":disc", d->disc_); + query->BindIntValue(":year", d->year_); + query->BindIntValue(":originalyear", d->originalyear_); + query->BindStringValue(":genre", d->genre_); + query->BindBoolValue(":compilation", d->compilation_); + query->BindStringValue(":composer", d->composer_); + query->BindStringValue(":performer", d->performer_); + query->BindStringValue(":grouping", d->grouping_); + query->BindStringValue(":comment", d->comment_); + query->BindStringValue(":lyrics", d->lyrics_); - query->BindValue(":artist_id", strval(d->artist_id_)); - query->BindValue(":album_id", strval(d->album_id_)); - query->BindValue(":song_id", strval(d->song_id_)); + query->BindStringValue(":artist_id", d->artist_id_); + query->BindStringValue(":album_id", d->album_id_); + query->BindStringValue(":song_id", d->song_id_); query->BindValue(":beginning", d->beginning_); - query->BindValue(":length", intval(length_nanosec())); + query->BindLongLongValue(":length", length_nanosec()); - query->BindValue(":bitrate", intval(d->bitrate_)); - query->BindValue(":samplerate", intval(d->samplerate_)); - query->BindValue(":bitdepth", intval(d->bitdepth_)); + query->BindIntValue(":bitrate", d->bitrate_); + query->BindIntValue(":samplerate", d->samplerate_); + query->BindIntValue(":bitdepth", d->bitdepth_); query->BindValue(":source", d->source_); - query->BindValue(":directory_id", notnullintval(d->directory_id_)); - query->BindValue(":url", d->url_.toString(QUrl::FullyEncoded)); + query->BindNotNullIntValue(":directory_id", d->directory_id_); + query->BindUrlValue(":url", d->url_); query->BindValue(":filetype", d->filetype_); - query->BindValue(":filesize", notnullintval(d->filesize_)); - query->BindValue(":mtime", notnullintval(d->mtime_)); - query->BindValue(":ctime", notnullintval(d->ctime_)); - query->BindValue(":unavailable", d->unavailable_ ? 1 : 0); + query->BindNotNullLongLongValue(":filesize", d->filesize_); + query->BindNotNullLongLongValue(":mtime", d->mtime_); + query->BindNotNullLongLongValue(":ctime", d->ctime_); + query->BindBoolValue(":unavailable", d->unavailable_); - query->BindValue(":fingerprint", strval(d->fingerprint_)); + query->BindStringValue(":fingerprint", d->fingerprint_); query->BindValue(":playcount", d->playcount_); query->BindValue(":skipcount", d->skipcount_); - query->BindValue(":lastplayed", intval(d->lastplayed_)); - query->BindValue(":lastseen", intval(d->lastseen_)); + query->BindLongLongValue(":lastplayed", d->lastplayed_); + query->BindLongLongValue(":lastseen", d->lastseen_); - query->BindValue(":compilation_detected", d->compilation_detected_ ? 1 : 0); - query->BindValue(":compilation_on", d->compilation_on_ ? 1 : 0); - query->BindValue(":compilation_off", d->compilation_off_ ? 1 : 0); - query->BindValue(":compilation_effective", is_compilation() ? 1 : 0); + query->BindBoolValue(":compilation_detected", d->compilation_detected_); + query->BindBoolValue(":compilation_on", d->compilation_on_); + query->BindBoolValue(":compilation_off", d->compilation_off_); + query->BindBoolValue(":compilation_effective", is_compilation()); - query->BindValue(":art_automatic", d->art_automatic_.isValid() ? d->art_automatic_.toString(QUrl::FullyEncoded) : ""); - query->BindValue(":art_manual", d->art_manual_.isValid() ? d->art_manual_.toString(QUrl::FullyEncoded) : ""); + query->BindUrlValue(":art_automatic", d->art_automatic_); + query->BindUrlValue(":art_manual", d->art_manual_); - query->BindValue(":effective_albumartist", strval(effective_albumartist())); - query->BindValue(":effective_originalyear", intval(effective_originalyear())); + query->BindStringValue(":effective_albumartist", effective_albumartist()); + query->BindIntValue(":effective_originalyear", effective_originalyear()); query->BindValue(":cue_path", d->cue_path_); - query->BindValue(":rating", intval(d->rating_)); - -#undef intval -#undef notnullintval -#undef strval + query->BindFloatValue(":rating", d->rating_); } @@ -1603,12 +1469,7 @@ bool Song::IsMetadataAndMoreEqual(const Song &other) const { } bool Song::IsEditable() const { - - return d->valid_ && - !d->url_.isEmpty() && - (d->url_.isLocalFile() || d->source_ == Source_Stream) && - !has_cue(); - + return d->valid_ && d->url_.isValid() && (d->url_.isLocalFile() || d->source_ == Source_Stream) && !has_cue(); } bool Song::operator==(const Song &other) const { @@ -1668,7 +1529,7 @@ void Song::ToXesam(QVariantMap *map) const { AddMetadataAsList("xesam:artist", artist(), map); AddMetadata("xesam:album", album(), map); AddMetadataAsList("xesam:albumArtist", albumartist(), map); - AddMetadata("mpris:length", length_nanosec() / kNsecPerUsec, map); + AddMetadata("mpris:length", (length_nanosec() / kNsecPerUsec), map); AddMetadata("xesam:trackNumber", track(), map); AddMetadataAsList("xesam:genre", genre(), map); AddMetadata("xesam:discNumber", disc(), map); @@ -1676,7 +1537,7 @@ void Song::ToXesam(QVariantMap *map) const { AddMetadata("xesam:contentCreated", AsMPRISDateTimeType(ctime()), map); AddMetadata("xesam:lastUsed", AsMPRISDateTimeType(lastplayed()), map); AddMetadataAsList("xesam:composer", composer(), map); - AddMetadata("xesam:useCount", playcount(), map); + AddMetadata("xesam:useCount", static_cast(playcount()), map); } diff --git a/src/core/song.h b/src/core/song.h index fdb49590c..a15f2d0f5 100644 --- a/src/core/song.h +++ b/src/core/song.h @@ -168,7 +168,7 @@ class Song { void Init(const QString &title, const QString &artist, const QString &album, qint64 length_nanosec); void Init(const QString &title, const QString &artist, const QString &album, qint64 beginning, qint64 end); void InitFromProtobuf(const spb::tagreader::SongMetadata &pb); - void InitFromQuery(const SqlRow &query, bool reliable_metadata, int col = 0); + void InitFromQuery(const SqlRow &query, const bool reliable_metadata); void InitFromFilePartial(const QString &filename, const QFileInfo &fileinfo); void InitArtManual(); void InitArtAutomatic(); @@ -243,8 +243,8 @@ class Song { QString fingerprint() const; - int playcount() const; - int skipcount() const; + uint playcount() const; + uint skipcount() const; qint64 lastplayed() const; qint64 lastseen() const; @@ -318,16 +318,16 @@ class Song { // Setters bool IsEditable() const; - void set_id(int id); - void set_valid(bool v); + void set_id(const int id); + void set_valid(const bool v); void set_title(const QString &v); void set_album(const QString &v); void set_artist(const QString &v); void set_albumartist(const QString &v); - void set_track(int v); - void set_disc(int v); - void set_year(int v); + void set_track(const int v); + void set_disc(const int v); + void set_year(const int v); void set_originalyear(int v); void set_genre(const QString &v); void set_compilation(bool v); @@ -345,30 +345,30 @@ class Song { void set_end_nanosec(qint64 v); void set_length_nanosec(qint64 v); - void set_bitrate(int v); - void set_samplerate(int v); - void set_bitdepth(int v); + void set_bitrate(const int v); + void set_samplerate(const int v); + void set_bitdepth(const int v); - void set_source(Source v); - void set_directory_id(int v); + void set_source(const Source v); + void set_directory_id(const int v); void set_url(const QUrl &v); void set_basefilename(const QString &v); - void set_filetype(FileType v); - void set_filesize(qint64 v); - void set_mtime(qint64 v); - void set_ctime(qint64 v); - void set_unavailable(bool v); + void set_filetype(const FileType v); + void set_filesize(const qint64 v); + void set_mtime(const qint64 v); + void set_ctime(const qint64 v); + void set_unavailable(const bool v); void set_fingerprint(const QString &v); - void set_playcount(int v); - void set_skipcount(int v); - void set_lastplayed(qint64 v); - void set_lastseen(qint64 v); + void set_playcount(const uint v); + void set_skipcount(const uint v); + void set_lastplayed(const qint64 v); + void set_lastseen(const qint64 v); - void set_compilation_detected(bool v); - void set_compilation_on(bool v); - void set_compilation_off(bool v); + void set_compilation_detected(const bool v); + void set_compilation_on(const bool v); + void set_compilation_off(const bool v); void set_art_automatic(const QUrl &v); void set_art_manual(const QUrl &v); diff --git a/src/dialogs/edittagdialog.cpp b/src/dialogs/edittagdialog.cpp index 51e95aa91..de904d2c7 100644 --- a/src/dialogs/edittagdialog.cpp +++ b/src/dialogs/edittagdialog.cpp @@ -836,8 +836,8 @@ QString EditTagDialog::GetArtSummary(const Song &song, const UpdateCoverAction c void EditTagDialog::UpdateStatisticsTab(const Song &song) { - ui_->playcount->setText(QString::number(qMax(0, song.playcount()))); - ui_->skipcount->setText(QString::number(qMax(0, song.skipcount()))); + ui_->playcount->setText(QString::number(song.playcount())); + ui_->skipcount->setText(QString::number(song.skipcount())); ui_->lastplayed->setText(song.lastplayed() <= 0 ? tr("Never") : QDateTime::fromSecsSinceEpoch(song.lastplayed()).toString(QLocale::system().dateTimeFormat(QLocale::LongFormat))); } diff --git a/src/internet/internetplaylistitem.cpp b/src/internet/internetplaylistitem.cpp index 993167bd4..e1dcc4d59 100644 --- a/src/internet/internetplaylistitem.cpp +++ b/src/internet/internetplaylistitem.cpp @@ -55,7 +55,7 @@ InternetPlaylistItem::InternetPlaylistItem(InternetService *service, const Song bool InternetPlaylistItem::InitFromQuery(const SqlRow &query) { - metadata_.InitFromQuery(query, false, (static_cast(Song::kColumns.count()) + 1) * 1); + metadata_.InitFromQuery(query, false); InitMetadata(); return true; diff --git a/src/playlist/songplaylistitem.cpp b/src/playlist/songplaylistitem.cpp index 53b417bbb..6d32cba56 100644 --- a/src/playlist/songplaylistitem.cpp +++ b/src/playlist/songplaylistitem.cpp @@ -33,7 +33,7 @@ SongPlaylistItem::SongPlaylistItem(const Song::Source source) : PlaylistItem(sou SongPlaylistItem::SongPlaylistItem(const Song &song) : PlaylistItem(song.source()), song_(song) {} bool SongPlaylistItem::InitFromQuery(const SqlRow &query) { - song_.InitFromQuery(query, false, (static_cast(Song::kColumns.count()) + 1)); + song_.InitFromQuery(query, false); return true; } diff --git a/src/radios/radioplaylistitem.cpp b/src/radios/radioplaylistitem.cpp index 8c929bd62..6dfe95618 100644 --- a/src/radios/radioplaylistitem.cpp +++ b/src/radios/radioplaylistitem.cpp @@ -41,7 +41,7 @@ RadioPlaylistItem::RadioPlaylistItem(const Song &metadata) bool RadioPlaylistItem::InitFromQuery(const SqlRow &query) { - metadata_.InitFromQuery(query, false, (static_cast(Song::kColumns.count()) + 1) * 1); + metadata_.InitFromQuery(query, false); InitMetadata(); return true;