From d61adeb595cedfa820f0f79bf2d1beac51bf4dc5 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sat, 18 Oct 2025 19:57:38 +0200 Subject: [PATCH] Add option not to remove "Remastered", etc from song titles --- src/constants/qobuzsettings.h | 1 + src/constants/spotifysettings.h | 1 + src/constants/tidalsettings.h | 1 + src/qobuz/qobuzrequest.cpp | 4 ++- src/qobuz/qobuzservice.cpp | 2 ++ src/qobuz/qobuzservice.h | 2 ++ src/settings/qobuzsettingspage.cpp | 2 ++ src/settings/qobuzsettingspage.ui | 7 +++++ src/settings/spotifysettingspage.cpp | 2 ++ src/settings/spotifysettingspage.ui | 7 +++++ src/settings/tidalsettingspage.cpp | 2 ++ src/settings/tidalsettingspage.ui | 41 ++++++++++++++++------------ src/spotify/spotifyrequest.cpp | 4 ++- src/spotify/spotifyservice.cpp | 2 ++ src/spotify/spotifyservice.h | 2 ++ src/tidal/tidalrequest.cpp | 4 ++- src/tidal/tidalservice.cpp | 4 ++- src/tidal/tidalservice.h | 2 ++ 18 files changed, 69 insertions(+), 21 deletions(-) diff --git a/src/constants/qobuzsettings.h b/src/constants/qobuzsettings.h index f4f52b82b..51c3f5247 100644 --- a/src/constants/qobuzsettings.h +++ b/src/constants/qobuzsettings.h @@ -36,6 +36,7 @@ constexpr char kAlbumsSearchLimit[] = "albumssearchlimit"; constexpr char kSongsSearchLimit[] = "songssearchlimit"; constexpr char kBase64Secret[] = "base64secret"; constexpr char kDownloadAlbumCovers[] = "downloadalbumcovers"; +constexpr char kRemoveRemastered[] = "remove_remastered"; constexpr char kUserId[] = "user_id"; constexpr char kCredentialsId[] = "credentials_id"; diff --git a/src/constants/spotifysettings.h b/src/constants/spotifysettings.h index 7d1090ac8..6c185ea20 100644 --- a/src/constants/spotifysettings.h +++ b/src/constants/spotifysettings.h @@ -31,6 +31,7 @@ constexpr char kAlbumsSearchLimit[] = "albumssearchlimit"; constexpr char kSongsSearchLimit[] = "songssearchlimit"; constexpr char kFetchAlbums[] = "fetchalbums"; constexpr char kDownloadAlbumCovers[] = "downloadalbumcovers"; +constexpr char kRemoveRemastered[] = "remove_remastered"; constexpr char kAccessToken[] = "access_token"; constexpr char kRefreshToken[] = "refresh_token"; diff --git a/src/constants/tidalsettings.h b/src/constants/tidalsettings.h index c7c83f0b8..8a1737ace 100644 --- a/src/constants/tidalsettings.h +++ b/src/constants/tidalsettings.h @@ -40,6 +40,7 @@ constexpr char kDownloadAlbumCovers[] = "downloadalbumcovers"; constexpr char kCoverSize[] = "coversize"; constexpr char kStreamUrl[] = "streamurl"; constexpr char kAlbumExplicit[] = "album_explicit"; +constexpr char kRemoveRemastered[] = "remove_remastered"; enum class StreamUrlMethod { StreamUrl, diff --git a/src/qobuz/qobuzrequest.cpp b/src/qobuz/qobuzrequest.cpp index 57d8e48c0..514278e2f 100644 --- a/src/qobuz/qobuzrequest.cpp +++ b/src/qobuz/qobuzrequest.cpp @@ -1156,7 +1156,9 @@ void QobuzRequest::ParseSong(Song &song, const QJsonObject &json_obj, const Arti url.setScheme(url_handler_->scheme()); url.setPath(song_id); - title = Song::TitleRemoveMisc(title); + if (service_->remove_remastered()) { + title = Song::TitleRemoveMisc(title); + } //qLog(Debug) << "id" << song_id << "track" << track << "title" << title << "album" << album << "album artist" << album_artist << cover_url << streamable << url; diff --git a/src/qobuz/qobuzservice.cpp b/src/qobuz/qobuzservice.cpp index 40cdf9b8a..fd796a47d 100644 --- a/src/qobuz/qobuzservice.cpp +++ b/src/qobuz/qobuzservice.cpp @@ -99,6 +99,7 @@ QobuzService::QobuzService(const SharedPtr task_manager, albumssearchlimit_(1), songssearchlimit_(1), download_album_covers_(true), + remove_remastered_(true), user_id_(-1), credential_id_(-1), pending_search_id_(0), @@ -227,6 +228,7 @@ void QobuzService::ReloadSettings() { albumssearchlimit_ = s.value(QobuzSettings::kAlbumsSearchLimit, 10).toInt(); songssearchlimit_ = s.value(QobuzSettings::kSongsSearchLimit, 10).toInt(); download_album_covers_ = s.value(QobuzSettings::kDownloadAlbumCovers, true).toBool(); + remove_remastered_ = s.value(QobuzSettings::kRemoveRemastered, true).toBool(); user_id_ = s.value(QobuzSettings::kUserId).toInt(); device_id_ = s.value(QobuzSettings::kDeviceId).toString(); diff --git a/src/qobuz/qobuzservice.h b/src/qobuz/qobuzservice.h index 75cae0623..7bd34acb4 100644 --- a/src/qobuz/qobuzservice.h +++ b/src/qobuz/qobuzservice.h @@ -95,6 +95,7 @@ class QobuzService : public StreamingService { int albumssearchlimit() const { return albumssearchlimit_; } int songssearchlimit() const { return songssearchlimit_; } bool download_album_covers() const { return download_album_covers_; } + bool remove_remastered() const { return remove_remastered_; } QString user_auth_token() const { return user_auth_token_; } qint64 user_id() const { return user_id_; } @@ -187,6 +188,7 @@ class QobuzService : public StreamingService { int albumssearchlimit_; int songssearchlimit_; bool download_album_covers_; + bool remove_remastered_; qint64 user_id_; QString user_auth_token_; diff --git a/src/settings/qobuzsettingspage.cpp b/src/settings/qobuzsettingspage.cpp index 36ddf283c..4f65e8f96 100644 --- a/src/settings/qobuzsettingspage.cpp +++ b/src/settings/qobuzsettingspage.cpp @@ -99,6 +99,7 @@ void QobuzSettingsPage::Load() { ui_->songssearchlimit->setValue(s.value(kSongsSearchLimit, 10).toInt()); ui_->checkbox_base64_secret->setChecked(s.value(kBase64Secret, false).toBool()); ui_->checkbox_download_album_covers->setChecked(s.value(kDownloadAlbumCovers, true).toBool()); + ui_->checkbox_remove_remastered->setChecked(s.value(kRemoveRemastered, true).toBool()); s.endGroup(); @@ -128,6 +129,7 @@ void QobuzSettingsPage::Save() { s.setValue(kSongsSearchLimit, ui_->songssearchlimit->value()); s.setValue(kBase64Secret, ui_->checkbox_base64_secret->isChecked()); s.setValue(kDownloadAlbumCovers, ui_->checkbox_download_album_covers->isChecked()); + s.setValue(kRemoveRemastered, ui_->checkbox_remove_remastered->isChecked()); s.endGroup(); } diff --git a/src/settings/qobuzsettingspage.ui b/src/settings/qobuzsettingspage.ui index 9f005da5e..8a0d9dd73 100644 --- a/src/settings/qobuzsettingspage.ui +++ b/src/settings/qobuzsettingspage.ui @@ -248,6 +248,13 @@ + + + + Remove (Remastered), etc from song titles + + + diff --git a/src/settings/spotifysettingspage.cpp b/src/settings/spotifysettingspage.cpp index a21f93c2a..1096030e4 100644 --- a/src/settings/spotifysettingspage.cpp +++ b/src/settings/spotifysettingspage.cpp @@ -100,6 +100,7 @@ void SpotifySettingsPage::Load() { ui_->songssearchlimit->setValue(s.value(kSongsSearchLimit, 10).toInt()); ui_->checkbox_fetchalbums->setChecked(s.value(kFetchAlbums, false).toBool()); ui_->checkbox_download_album_covers->setChecked(s.value(kDownloadAlbumCovers, true).toBool()); + ui_->checkbox_remove_remastered->setChecked(s.value(kRemoveRemastered, true).toBool()); s.endGroup(); @@ -122,6 +123,7 @@ void SpotifySettingsPage::Save() { s.setValue(kSongsSearchLimit, ui_->songssearchlimit->value()); s.setValue(kFetchAlbums, ui_->checkbox_fetchalbums->isChecked()); s.setValue(kDownloadAlbumCovers, ui_->checkbox_download_album_covers->isChecked()); + s.setValue(kRemoveRemastered, ui_->checkbox_remove_remastered->isChecked()); s.endGroup(); } diff --git a/src/settings/spotifysettingspage.ui b/src/settings/spotifysettingspage.ui index d047fea8d..1b1026f8c 100644 --- a/src/settings/spotifysettingspage.ui +++ b/src/settings/spotifysettingspage.ui @@ -202,6 +202,13 @@ + + + + Remove (Remastered), etc from song titles + + + diff --git a/src/settings/tidalsettingspage.cpp b/src/settings/tidalsettingspage.cpp index 02bca1f45..e7b061bf9 100644 --- a/src/settings/tidalsettingspage.cpp +++ b/src/settings/tidalsettingspage.cpp @@ -104,6 +104,7 @@ void TidalSettingsPage::Load() { ComboBoxLoadFromSettings(s, ui_->coversize, QLatin1String(kCoverSize), u"640x640"_s); ui_->streamurl->setCurrentIndex(ui_->streamurl->findData(s.value(kStreamUrl, static_cast(StreamUrlMethod::StreamUrl)).toInt())); ui_->checkbox_album_explicit->setChecked(s.value(kAlbumExplicit, false).toBool()); + ui_->checkbox_remove_remastered->setChecked(s.value(kRemoveRemastered, true).toBool()); s.endGroup(); if (service_->authenticated()) { @@ -144,6 +145,7 @@ void TidalSettingsPage::Save() { s.setValue(kCoverSize, ui_->coversize->currentData().toString()); s.setValue(kStreamUrl, ui_->streamurl->currentData().toInt()); s.setValue(kAlbumExplicit, ui_->checkbox_album_explicit->isChecked()); + s.setValue(kRemoveRemastered, ui_->checkbox_remove_remastered->isChecked()); s.endGroup(); } diff --git a/src/settings/tidalsettingspage.ui b/src/settings/tidalsettingspage.ui index 39494fd56..974839298 100644 --- a/src/settings/tidalsettingspage.ui +++ b/src/settings/tidalsettingspage.ui @@ -172,6 +172,19 @@ + + + + 1 + + + 1000 + + + 50 + + + @@ -186,13 +199,6 @@ - - - - - - - @@ -200,16 +206,10 @@ - - - - 1 - - - 1000 - - - 50 + + + + @@ -234,6 +234,13 @@ + + + + Remove (Remastered), etc from song titles + + + diff --git a/src/spotify/spotifyrequest.cpp b/src/spotify/spotifyrequest.cpp index 25fb6363b..250a2a71e 100644 --- a/src/spotify/spotifyrequest.cpp +++ b/src/spotify/spotifyrequest.cpp @@ -1115,7 +1115,9 @@ void SpotifyRequest::ParseSong(Song &song, const QJsonObject &json_obj, const Ar QUrl url(uri); - title = Song::TitleRemoveMisc(title); + if (service_->remove_remastered()) { + title = Song::TitleRemoveMisc(title); + } song.set_source(Song::Source::Spotify); song.set_song_id(song_id); diff --git a/src/spotify/spotifyservice.cpp b/src/spotify/spotifyservice.cpp index b777e8ca3..a56c05469 100644 --- a/src/spotify/spotifyservice.cpp +++ b/src/spotify/spotifyservice.cpp @@ -86,6 +86,7 @@ SpotifyService::SpotifyService(const SharedPtr task_manager, songssearchlimit_(1), fetchalbums_(true), download_album_covers_(true), + remove_remastered_(true), pending_search_id_(0), next_pending_search_id_(1), pending_search_type_(SearchType::Artists), @@ -204,6 +205,7 @@ void SpotifyService::ReloadSettings() { songssearchlimit_ = s.value(SpotifySettings::kSongsSearchLimit, 10).toInt(); fetchalbums_ = s.value(SpotifySettings::kFetchAlbums, false).toBool(); download_album_covers_ = s.value(SpotifySettings::kDownloadAlbumCovers, true).toBool(); + remove_remastered_ = s.value(SpotifySettings::kRemoveRemastered, true).toBool(); s.endGroup(); diff --git a/src/spotify/spotifyservice.h b/src/spotify/spotifyservice.h index 7826a34ce..1c4356a76 100644 --- a/src/spotify/spotifyservice.h +++ b/src/spotify/spotifyservice.h @@ -73,6 +73,7 @@ class SpotifyService : public StreamingService { int songssearchlimit() const { return songssearchlimit_; } bool fetchalbums() const { return fetchalbums_; } bool download_album_covers() const { return download_album_covers_; } + bool remove_remastered() const { return remove_remastered_; } bool authenticated() const override; QByteArray authorization_header() const; @@ -150,6 +151,7 @@ class SpotifyService : public StreamingService { int songssearchlimit_; bool fetchalbums_; bool download_album_covers_; + bool remove_remastered_; int pending_search_id_; int next_pending_search_id_; diff --git a/src/tidal/tidalrequest.cpp b/src/tidal/tidalrequest.cpp index 569a1548a..a02ebb6ef 100644 --- a/src/tidal/tidalrequest.cpp +++ b/src/tidal/tidalrequest.cpp @@ -1077,7 +1077,9 @@ void TidalRequest::ParseSong(Song &song, const QJsonObject &json_obj, const Arti } } - title = Song::TitleRemoveMisc(title); + if (service_->remove_remastered()) { + title = Song::TitleRemoveMisc(title); + } //qLog(Debug) << "id" << song_id << "track" << track << "disc" << disc << "title" << title << "album" << album << "album artist" << album_artist << "artist" << artist << cover << allow_streaming << url; diff --git a/src/tidal/tidalservice.cpp b/src/tidal/tidalservice.cpp index 510844707..3370dec3b 100644 --- a/src/tidal/tidalservice.cpp +++ b/src/tidal/tidalservice.cpp @@ -96,6 +96,7 @@ TidalService::TidalService(const SharedPtr task_manager, download_album_covers_(true), stream_url_method_(TidalSettings::StreamUrlMethod::StreamUrl), album_explicit_(false), + remove_remastered_(true), pending_search_id_(0), next_pending_search_id_(1), pending_search_type_(SearchType::Artists), @@ -232,7 +233,8 @@ void TidalService::ReloadSettings() { coversize_ = s.value(TidalSettings::kCoverSize, u"640x640"_s).toString(); download_album_covers_ = s.value(TidalSettings::kDownloadAlbumCovers, true).toBool(); stream_url_method_ = static_cast(s.value(TidalSettings::kStreamUrl, static_cast(TidalSettings::StreamUrlMethod::StreamUrl)).toInt()); - album_explicit_ = s.value(TidalSettings::kAlbumExplicit).toBool(); + album_explicit_ = s.value(TidalSettings::kAlbumExplicit, false).toBool(); + remove_remastered_ = s.value(TidalSettings::kRemoveRemastered, true).toBool(); s.endGroup(); oauth_->set_client_id(client_id_); diff --git a/src/tidal/tidalservice.h b/src/tidal/tidalservice.h index fcef59e57..b576d20d5 100644 --- a/src/tidal/tidalservice.h +++ b/src/tidal/tidalservice.h @@ -89,6 +89,7 @@ class TidalService : public StreamingService { bool download_album_covers() const { return download_album_covers_; } TidalSettings::StreamUrlMethod stream_url_method() const { return stream_url_method_; } bool album_explicit() const { return album_explicit_; } + bool remove_remastered() const { return remove_remastered_; } bool authenticated() const override; QByteArray authorization_header() const; @@ -171,6 +172,7 @@ class TidalService : public StreamingService { bool download_album_covers_; TidalSettings::StreamUrlMethod stream_url_method_; bool album_explicit_; + bool remove_remastered_; int pending_search_id_; int next_pending_search_id_;