From 99569081c98e118da41c053881693bb2071f47b0 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Wed, 31 Jul 2019 22:26:51 +0200 Subject: [PATCH] Simply some song checks and make url always unique by using stream url instead --- src/context/contextview.cpp | 17 ++--------------- src/core/player.cpp | 2 +- src/core/song.cpp | 33 +++++++++++++++++++-------------- src/core/song.h | 3 +++ src/playlist/playlist.cpp | 7 +++---- src/widgets/playingwidget.cpp | 3 +-- 6 files changed, 29 insertions(+), 36 deletions(-) diff --git a/src/context/contextview.cpp b/src/context/contextview.cpp index bfda19f0e..983ae1b84 100644 --- a/src/context/contextview.cpp +++ b/src/context/contextview.cpp @@ -189,18 +189,7 @@ void ContextView::UpdateNoSong() { void ContextView::SongChanged(const Song &song) { - if (song_playing_.is_valid() && song.id() == song_playing_.id() && song.source() == song_playing_.source() && - ( - song.url() == song_playing_.url() - || - ( - song.albumartist() == song_playing_.albumartist() && - song.artist() == song_playing_.artist() && - song.album() == song_playing_.album() && - song.title() == song_playing_.title() - ) - ) - ) { + if (song_playing_.is_valid() && song == song_playing_) { UpdateSong(song); } else { @@ -606,9 +595,7 @@ void ContextView::ScaleCover() { void ContextView::AlbumCoverLoaded(const Song &song, const QUrl &cover_url, const QImage &image) { - if (song.id() != song_playing_.id() || song.url() != song_playing_.url()) return; - if (song.effective_albumartist() != song_playing_.effective_albumartist() || song.effective_album() != song_playing_.effective_album() || song.title() != song_playing_.title()) return; - if (image == image_original_) return; + if (song != song_playing_ || image == image_original_) return; active_ = true; downloading_covers_ = false; diff --git a/src/core/player.cpp b/src/core/player.cpp index 53d162456..4b9a8d1ce 100644 --- a/src/core/player.cpp +++ b/src/core/player.cpp @@ -306,7 +306,7 @@ void Player::HandleLoadResult(const UrlHandler::LoadResult &result) { (result.media_url_ != song.url()) ) { - song.set_url(result.media_url_); + song.set_stream_url(result.media_url_); update = true; } diff --git a/src/core/song.cpp b/src/core/song.cpp index 1f09e42be..332a5c06d 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -207,21 +207,22 @@ struct Song::Private : public QSharedData { int skipcount_; int lastplayed_; - bool compilation_detected_; // From the collection scanner - bool compilation_on_; // Set by the user - bool compilation_off_; // Set by the user + bool compilation_detected_; // From the collection scanner + bool compilation_on_; // Set by the user + bool compilation_off_; // Set by the user // Filenames to album art for this song. - QUrl art_automatic_; // Guessed by CollectionWatcher - QUrl art_manual_; // Set by the user - should take priority + QUrl art_automatic_; // Guessed by CollectionWatcher + QUrl art_manual_; // Set by the user - should take priority - QString cue_path_; // If the song has a CUE, this contains it's path. + QString cue_path_; // If the song has a CUE, this contains it's path. - QImage image_; - bool init_from_file_; // Whether this song was loaded from a file using taglib. - bool suspicious_tags_; // Whether our encoding guesser thinks these tags might be incorrectly encoded. + QUrl stream_url_; // Temporary stream url set by url handler. + QImage image_; // Album Cover image set by album cover loader. + bool init_from_file_; // Whether this song was loaded from a file using taglib. + bool suspicious_tags_; // Whether our encoding guesser thinks these tags might be incorrectly encoded. - QString error_; + QString error_; // Song load error set by song loader. }; @@ -336,12 +337,15 @@ bool Song::has_manually_unset_cover() const { return d->art_manual_.path() == kM void Song::manually_unset_cover() { d->art_manual_ = QUrl::fromLocalFile(kManuallyUnsetCover); } bool Song::has_embedded_cover() const { return d->art_automatic_.path() == kEmbeddedCover; } void Song::set_embedded_cover() { d->art_automatic_ = QUrl::fromLocalFile(kEmbeddedCover); } + +const QUrl &Song::stream_url() const { return d->stream_url_; } +const QUrl &Song::effective_stream_url() const { return d->stream_url_.isEmpty() ? d->url_ : d->stream_url_; } const QImage &Song::image() const { return d->image_; } const QString &Song::cue_path() const { return d->cue_path_; } bool Song::has_cue() const { return !d->cue_path_.isEmpty(); } -bool Song::is_collection_song() const { return !is_cdda() && !is_stream() && id() != -1; } +bool Song::is_collection_song() const { return d->source_ == Source_Collection; } bool Song::is_metadata_good() const { return !d->title_.isEmpty() && !d->album_.isEmpty() && !d->artist_.isEmpty() && !d->url_.isEmpty() && d->end_ > 0; } bool Song::is_stream() const { return d->source_ == Source_Stream || d->source_ == Source_Tidal || d->source_ == Source_Subsonic || d->source_ == Source_Qobuz; } bool Song::is_cdda() const { return d->source_ == Source_CDDA; } @@ -444,6 +448,7 @@ 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_stream_url(const QUrl &v) { d->stream_url_ = v; } void Song::set_image(const QImage &i) { d->image_ = i; } QString Song::JoinSpec(const QString &table) { @@ -1354,11 +1359,11 @@ bool Song::IsEditable() const { } bool Song::operator==(const Song &other) const { - return url() == other.url() && beginning_nanosec() == other.beginning_nanosec(); + return source() == other.source() && url() == other.url() && beginning_nanosec() == other.beginning_nanosec(); } bool Song::operator!=(const Song &other) const { - return id() != other.id() || url() != other.url() || beginning_nanosec() != other.beginning_nanosec(); + return source() != other.source() || url() != other.url() || beginning_nanosec() != other.beginning_nanosec(); } uint qHash(const Song &song) { @@ -1398,7 +1403,7 @@ void Song::ToXesam(QVariantMap *map) const { using mpris::AddMetadataAsList; using mpris::AsMPRISDateTimeType; - AddMetadata("xesam:url", url().toString(), map); + AddMetadata("xesam:url", effective_stream_url().toString(), map); AddMetadata("xesam:title", PrettyTitle(), map); AddMetadataAsList("xesam:artist", artist(), map); AddMetadata("xesam:album", album(), map); diff --git a/src/core/song.h b/src/core/song.h index 45b9c2682..952c7204a 100644 --- a/src/core/song.h +++ b/src/core/song.h @@ -261,6 +261,8 @@ class Song { // Sets a flag saying that this song (it's media file) has an embedded cover. void set_embedded_cover(); + const QUrl &stream_url() const; + const QUrl &effective_stream_url() const; const QImage &image() const; const QString &error() const; @@ -334,6 +336,7 @@ class Song { void set_cue_path(const QString &v); + void set_stream_url(const QUrl &v); void set_image(const QImage &i); // Comparison functions diff --git a/src/playlist/playlist.cpp b/src/playlist/playlist.cpp index e0aeb88e5..75fe95b70 100644 --- a/src/playlist/playlist.cpp +++ b/src/playlist/playlist.cpp @@ -307,7 +307,7 @@ QVariant Playlist::data(const QModelIndex &idx, int role) const { case Column_Bitdepth: return song.bitdepth(); case Column_Bitrate: return song.bitrate(); - case Column_Filename: return song.url(); + case Column_Filename: return song.effective_stream_url(); case Column_BaseFilename: return song.basefilename(); case Column_Filesize: return song.filesize(); case Column_Filetype: return song.filetype(); @@ -1020,10 +1020,9 @@ void Playlist::UpdateItems(const SongList &songs) { item->Metadata().source() == Song::Source_Unknown || item->Metadata().filetype() == Song::FileType_Unknown || // Stream may change and may need to be updated too - item->Metadata().source() == Song::Source_Stream || - item->Metadata().source() == Song::Source_Tidal || + item->Metadata().is_stream() || // And CD tracks as well (tags are loaded in a second step) - item->Metadata().source() == Song::Source_CDDA + item->Metadata().is_cdda() ) ) { PlaylistItemPtr new_item; diff --git a/src/widgets/playingwidget.cpp b/src/widgets/playingwidget.cpp index ae0e77be6..3fb879dd6 100644 --- a/src/widgets/playingwidget.cpp +++ b/src/widgets/playingwidget.cpp @@ -267,8 +267,7 @@ void PlayingWidget::SongChanged(const Song &song) { void PlayingWidget::AlbumCoverLoaded(const Song &song, const QUrl &cover_url, const QImage &image) { - if (!playing_ || song.id() != song_playing_.id() || song.url() != song_playing_.url() || song.effective_albumartist() != song_playing_.effective_albumartist() || song.effective_album() != song_playing_.effective_album() || song.title() != song_playing_.title()) return; - if (timeline_fade_->state() == QTimeLine::Running && image == image_original_) return; + if (!playing_ || song != song_playing_ || (timeline_fade_->state() == QTimeLine::Running && image == image_original_)) return; active_ = true; downloading_covers_ = false;