From 6c0b395f4a9ae40ce94a301fa7542ea3007d647d Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sun, 5 Jun 2022 04:59:50 +0200 Subject: [PATCH] Add option for overwriting playcounts Fixes #962 --- src/collection/collectionwatcher.cpp | 6 ++++-- src/collection/collectionwatcher.h | 1 + src/core/song.cpp | 4 ++-- src/core/song.h | 2 +- src/dialogs/edittagdialog.cpp | 2 +- src/settings/collectionsettingspage.cpp | 2 ++ src/settings/collectionsettingspage.ui | 9 ++++++++- 7 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/collection/collectionwatcher.cpp b/src/collection/collectionwatcher.cpp index a238c89b9..8e57a1428 100644 --- a/src/collection/collectionwatcher.cpp +++ b/src/collection/collectionwatcher.cpp @@ -82,6 +82,7 @@ CollectionWatcher::CollectionWatcher(Song::Source source, QObject *parent) song_tracking_(false), mark_songs_unavailable_(source_ == Song::Source_Collection), expire_unavailable_songs_days_(60), + overwrite_playcount_(false), overwrite_rating_(false), stop_requested_(false), abort_requested_(false), @@ -153,6 +154,7 @@ void CollectionWatcher::ReloadSettings() { mark_songs_unavailable_ = false; } expire_unavailable_songs_days_ = s.value("expire_unavailable_songs", 60).toInt(); + overwrite_playcount_ = s.value("overwrite_playcount", false).toBool(); overwrite_rating_ = s.value("overwrite_rating", false).toBool(); s.endGroup(); @@ -734,7 +736,7 @@ void CollectionWatcher::UpdateCueAssociatedSongs(const QString &file, const Song matching_cue_song = sections_map[new_cue_song.beginning_nanosec()]; new_cue_song.set_id(matching_cue_song.id()); if (!new_cue_song.has_embedded_cover()) new_cue_song.set_art_automatic(image); - new_cue_song.MergeUserSetData(matching_cue_song, true); + new_cue_song.MergeUserSetData(matching_cue_song, true, true); AddChangedSong(file, matching_cue_song, new_cue_song, t); used_ids.insert(matching_cue_song.id()); } @@ -777,7 +779,7 @@ void CollectionWatcher::UpdateNonCueAssociatedSong(const QString &file, song_on_disk.set_id(matching_song.id()); song_on_disk.set_fingerprint(fingerprint); if (!song_on_disk.has_embedded_cover()) song_on_disk.set_art_automatic(image); - song_on_disk.MergeUserSetData(matching_song, !overwrite_rating_); + song_on_disk.MergeUserSetData(matching_song, !overwrite_playcount_, !overwrite_rating_); AddChangedSong(file, matching_song, song_on_disk, t); } diff --git a/src/collection/collectionwatcher.h b/src/collection/collectionwatcher.h index 06bce4a34..8caae4909 100644 --- a/src/collection/collectionwatcher.h +++ b/src/collection/collectionwatcher.h @@ -218,6 +218,7 @@ class CollectionWatcher : public QObject { bool song_tracking_; bool mark_songs_unavailable_; int expire_unavailable_songs_days_; + bool overwrite_playcount_; bool overwrite_rating_; bool stop_requested_; diff --git a/src/core/song.cpp b/src/core/song.cpp index 9c069f313..e9d0a2e1a 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -1541,9 +1541,9 @@ void Song::ToXesam(QVariantMap *map) const { } -void Song::MergeUserSetData(const Song &other, const bool merge_rating) { +void Song::MergeUserSetData(const Song &other, const bool merge_playcount, const bool merge_rating) { - if (other.playcount() > 0) { + if (merge_playcount && other.playcount() > 0) { set_playcount(other.playcount()); } diff --git a/src/core/song.h b/src/core/song.h index a15f2d0f5..5c5f63e95 100644 --- a/src/core/song.h +++ b/src/core/song.h @@ -187,7 +187,7 @@ class Song { // Copies important statistics from the other song to this one, overwriting any data that already exists. // Useful when you want updated tags from disk but you want to keep user stats. - void MergeUserSetData(const Song &other, const bool merge_rating); + void MergeUserSetData(const Song &other, const bool merge_playcount, const bool merge_rating); // Save void BindToQuery(SqlQuery *query) const; diff --git a/src/dialogs/edittagdialog.cpp b/src/dialogs/edittagdialog.cpp index de904d2c7..9b6dcbdb0 100644 --- a/src/dialogs/edittagdialog.cpp +++ b/src/dialogs/edittagdialog.cpp @@ -393,7 +393,7 @@ QList EditTagDialog::LoadData(const SongList &songs) { Song copy(song); TagReaderClient::Instance()->ReadFileBlocking(copy.url().toLocalFile(), ©); if (copy.is_valid()) { - copy.MergeUserSetData(song, false); + copy.MergeUserSetData(song, false, false); ret << Data(copy); } } diff --git a/src/settings/collectionsettingspage.cpp b/src/settings/collectionsettingspage.cpp index 774e6af89..84931a322 100644 --- a/src/settings/collectionsettingspage.cpp +++ b/src/settings/collectionsettingspage.cpp @@ -221,6 +221,7 @@ void CollectionSettingsPage::Load() { ui_->checkbox_save_playcounts->setChecked(s.value("save_playcounts", false).toBool()); ui_->checkbox_save_ratings->setChecked(s.value("save_ratings", false).toBool()); + ui_->checkbox_overwrite_playcount->setChecked(s.value("overwrite_playcount", false).toBool()); ui_->checkbox_overwrite_rating->setChecked(s.value("overwrite_rating", false).toBool()); #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) @@ -301,6 +302,7 @@ void CollectionSettingsPage::Save() { s.setValue("save_playcounts", ui_->checkbox_save_playcounts->isChecked()); s.setValue("save_ratings", ui_->checkbox_save_ratings->isChecked()); + s.setValue("overwrite_playcount", ui_->checkbox_overwrite_playcount->isChecked()); s.setValue("overwrite_rating", ui_->checkbox_overwrite_rating->isChecked()); s.setValue("delete_files", ui_->checkbox_delete_files->isChecked()); diff --git a/src/settings/collectionsettingspage.ui b/src/settings/collectionsettingspage.ui index 88633af1b..35a0d2bc8 100644 --- a/src/settings/collectionsettingspage.ui +++ b/src/settings/collectionsettingspage.ui @@ -7,7 +7,7 @@ 0 0 516 - 1490 + 1513 @@ -560,6 +560,13 @@ If there are no matches then it will use the largest image in the directory. + + + + Overwrite database playcount when songs are re-read from disk + + +