Rewrite album cover loader
This commit is contained in:
270
src/core/song.h
270
src/core/song.h
@@ -2,7 +2,7 @@
|
||||
* Strawberry Music Player
|
||||
* This file was part of Clementine.
|
||||
* Copyright 2010, David Sansome <me@davidsansome.com>
|
||||
* Copyright 2018-2021, Jonas Kvinge <jonas@jkvinge.net>
|
||||
* Copyright 2018-2023, Jonas Kvinge <jonas@jkvinge.net>
|
||||
*
|
||||
* Strawberry is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -109,10 +109,6 @@ class Song {
|
||||
Stream = 91
|
||||
};
|
||||
|
||||
Song(const Source source = Source::Unknown);
|
||||
Song(const Song &other);
|
||||
~Song();
|
||||
|
||||
static const QStringList kColumns;
|
||||
static const QString kColumnSpec;
|
||||
static const QString kBindSpec;
|
||||
@@ -123,9 +119,6 @@ class Song {
|
||||
static const QString kFtsBindSpec;
|
||||
static const QString kFtsUpdateSpec;
|
||||
|
||||
static const QString kManuallyUnsetCover;
|
||||
static const QString kEmbeddedCover;
|
||||
|
||||
static const QRegularExpression kAlbumRemoveDisc;
|
||||
static const QRegularExpression kAlbumRemoveMisc;
|
||||
static const QRegularExpression kTitleRemoveMisc;
|
||||
@@ -134,77 +127,22 @@ class Song {
|
||||
|
||||
static const QStringList kAcceptedExtensions;
|
||||
|
||||
static QString JoinSpec(const QString &table);
|
||||
Song(const Source source = Source::Unknown);
|
||||
Song(const Song &other);
|
||||
~Song();
|
||||
|
||||
static Source SourceFromURL(const QUrl &url);
|
||||
static QString TextForSource(const Source source);
|
||||
static QString DescriptionForSource(const Source source);
|
||||
static Source SourceFromText(const QString &source);
|
||||
static QIcon IconForSource(const Source source);
|
||||
static QString TextForFiletype(const FileType filetype);
|
||||
static QString ExtensionForFiletype(const FileType filetype);
|
||||
static QIcon IconForFiletype(const FileType filetype);
|
||||
|
||||
QString TextForSource() const { return TextForSource(source()); }
|
||||
QString DescriptionForSource() const { return DescriptionForSource(source()); }
|
||||
QIcon IconForSource() const { return IconForSource(source()); }
|
||||
QString TextForFiletype() const { return TextForFiletype(filetype()); }
|
||||
QIcon IconForFiletype() const { return IconForFiletype(filetype()); }
|
||||
|
||||
bool IsFileLossless() const;
|
||||
static FileType FiletypeByMimetype(const QString &mimetype);
|
||||
static FileType FiletypeByDescription(const QString &text);
|
||||
static FileType FiletypeByExtension(const QString &ext);
|
||||
static QString ImageCacheDir(const Source source);
|
||||
|
||||
// Sort songs alphabetically using their pretty title
|
||||
static int CompareSongsName(const Song &song1, const Song &song2);
|
||||
static void SortSongsListAlphabetically(QList<Song> *songs);
|
||||
|
||||
// Constructors
|
||||
void Init(const QString &title, const QString &artist, const QString &album, const qint64 length_nanosec);
|
||||
void Init(const QString &title, const QString &artist, const QString &album, const qint64 beginning, const qint64 end);
|
||||
void InitFromProtobuf(const spb::tagreader::SongMetadata &pb);
|
||||
void InitFromQuery(const SqlRow &query, const bool reliable_metadata);
|
||||
void InitFromFilePartial(const QString &filename, const QFileInfo &fileinfo);
|
||||
void InitArtManual();
|
||||
void InitArtAutomatic();
|
||||
|
||||
bool MergeFromEngineMetadata(const EngineMetadata &engine_metadata);
|
||||
|
||||
#ifdef HAVE_LIBGPOD
|
||||
void InitFromItdb(_Itdb_Track *track, const QString &prefix);
|
||||
void ToItdb(_Itdb_Track *track) const;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBMTP
|
||||
void InitFromMTP(const LIBMTP_track_struct *track, const QString &host);
|
||||
void ToMTP(LIBMTP_track_struct *track) const;
|
||||
#endif
|
||||
|
||||
// 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_playcount, const bool merge_rating);
|
||||
|
||||
// Save
|
||||
void BindToQuery(SqlQuery *query) const;
|
||||
void BindToFtsQuery(SqlQuery *query) const;
|
||||
void ToXesam(QVariantMap *map) const;
|
||||
void ToProtobuf(spb::tagreader::SongMetadata *pb) const;
|
||||
bool operator==(const Song &other) const;
|
||||
bool operator!=(const Song &other) const;
|
||||
Song &operator=(const Song &other);
|
||||
|
||||
// Simple accessors
|
||||
bool is_valid() const;
|
||||
bool is_unavailable() const;
|
||||
int id() const;
|
||||
bool is_valid() const;
|
||||
|
||||
const QString &title() const;
|
||||
const QString &title_sortable() const;
|
||||
const QString &album() const;
|
||||
const QString &album_sortable() const;
|
||||
const QString &artist() const;
|
||||
const QString &artist_sortable() const;
|
||||
const QString &albumartist() const;
|
||||
const QString &albumartist_sortable() const;
|
||||
int track() const;
|
||||
int disc() const;
|
||||
int year() const;
|
||||
@@ -237,6 +175,7 @@ class Song {
|
||||
qint64 filesize() const;
|
||||
qint64 mtime() const;
|
||||
qint64 ctime() const;
|
||||
bool unavailable() const;
|
||||
|
||||
QString fingerprint() const;
|
||||
|
||||
@@ -246,14 +185,15 @@ class Song {
|
||||
qint64 lastseen() const;
|
||||
|
||||
bool compilation_detected() const;
|
||||
bool compilation_off() const;
|
||||
bool compilation_on() const;
|
||||
bool compilation_off() const;
|
||||
|
||||
bool art_embedded() const;
|
||||
const QUrl &art_automatic() const;
|
||||
const QUrl &art_manual() const;
|
||||
bool art_unset() const;
|
||||
|
||||
const QString &cue_path() const;
|
||||
bool has_cue() const;
|
||||
|
||||
float rating() const;
|
||||
|
||||
@@ -271,74 +211,16 @@ class Song {
|
||||
const QString &musicbrainz_release_group_id() const;
|
||||
const QString &musicbrainz_work_id() const;
|
||||
|
||||
const QString &effective_album() const;
|
||||
int effective_originalyear() const;
|
||||
const QString &effective_albumartist() const;
|
||||
const QString &effective_albumartist_sortable() const;
|
||||
|
||||
bool is_collection_song() const;
|
||||
bool is_stream() const;
|
||||
bool is_radio() const;
|
||||
bool is_cdda() const;
|
||||
bool is_metadata_good() const;
|
||||
bool art_automatic_is_valid() const;
|
||||
bool art_manual_is_valid() const;
|
||||
bool has_valid_art() const;
|
||||
bool is_compilation() const;
|
||||
bool stream_url_can_expire() const;
|
||||
bool is_module_music() const;
|
||||
|
||||
// Playlist views are special because you don't want to fill in album artists automatically for compilations, but you do for normal albums:
|
||||
const QString &playlist_albumartist() const;
|
||||
const QString &playlist_albumartist_sortable() const;
|
||||
|
||||
// Returns true if this Song had it's cover manually unset by user.
|
||||
bool has_manually_unset_cover() const;
|
||||
// This method represents an explicit request to unset this song's cover.
|
||||
void set_manually_unset_cover();
|
||||
|
||||
// Returns true if this song (it's media file) has an embedded cover.
|
||||
bool has_embedded_cover() const;
|
||||
// Sets a flag saying that this song (it's media file) has an embedded cover.
|
||||
void set_embedded_cover();
|
||||
|
||||
void clear_art_automatic();
|
||||
void clear_art_manual();
|
||||
|
||||
static bool save_embedded_cover_supported(const FileType filetype);
|
||||
bool save_embedded_cover_supported() const { return url().isLocalFile() && save_embedded_cover_supported(filetype()) && !has_cue(); };
|
||||
|
||||
bool additional_tags_supported() const;
|
||||
bool albumartist_supported() const;
|
||||
bool composer_supported() const;
|
||||
bool performer_supported() const;
|
||||
bool grouping_supported() const;
|
||||
bool genre_supported() const;
|
||||
bool compilation_supported() const;
|
||||
bool rating_supported() const;
|
||||
bool comment_supported() const;
|
||||
bool lyrics_supported() const;
|
||||
|
||||
const QUrl &stream_url() const;
|
||||
const QUrl &effective_stream_url() const;
|
||||
bool init_from_file() const;
|
||||
|
||||
// Pretty accessors
|
||||
QString PrettyTitle() const;
|
||||
QString PrettyTitleWithArtist() const;
|
||||
QString PrettyLength() const;
|
||||
QString PrettyYear() const;
|
||||
QString PrettyOriginalYear() const;
|
||||
const QString &title_sortable() const;
|
||||
const QString &album_sortable() const;
|
||||
const QString &artist_sortable() const;
|
||||
const QString &albumartist_sortable() const;
|
||||
|
||||
QString TitleWithCompilationArtist() const;
|
||||
|
||||
QString SampleRateBitDepthToText() const;
|
||||
|
||||
QString PrettyRating() const;
|
||||
const QUrl &stream_url() const;
|
||||
|
||||
// Setters
|
||||
bool IsEditable() const;
|
||||
|
||||
void set_id(const int id);
|
||||
void set_valid(const bool v);
|
||||
|
||||
@@ -391,8 +273,10 @@ class Song {
|
||||
void set_compilation_on(const bool v);
|
||||
void set_compilation_off(const bool v);
|
||||
|
||||
void set_art_embedded(const bool v);
|
||||
void set_art_automatic(const QUrl &v);
|
||||
void set_art_manual(const QUrl &v);
|
||||
void set_art_unset(const bool v);
|
||||
|
||||
void set_cue_path(const QString &v);
|
||||
|
||||
@@ -414,6 +298,61 @@ class Song {
|
||||
|
||||
void set_stream_url(const QUrl &v);
|
||||
|
||||
const QUrl &effective_stream_url() const;
|
||||
const QString &effective_albumartist() const;
|
||||
const QString &effective_albumartist_sortable() const;
|
||||
const QString &effective_album() const;
|
||||
int effective_originalyear() const;
|
||||
const QString &playlist_albumartist() const;
|
||||
const QString &playlist_albumartist_sortable() const;
|
||||
|
||||
bool is_metadata_good() const;
|
||||
bool is_collection_song() const;
|
||||
bool is_stream() const;
|
||||
bool is_radio() const;
|
||||
bool is_cdda() const;
|
||||
bool is_compilation() const;
|
||||
bool stream_url_can_expire() const;
|
||||
bool is_module_music() const;
|
||||
bool has_cue() const;
|
||||
|
||||
bool art_automatic_is_valid() const;
|
||||
bool art_manual_is_valid() const;
|
||||
bool has_valid_art() const;
|
||||
void clear_art_automatic();
|
||||
void clear_art_manual();
|
||||
|
||||
bool additional_tags_supported() const;
|
||||
bool albumartist_supported() const;
|
||||
bool composer_supported() const;
|
||||
bool performer_supported() const;
|
||||
bool grouping_supported() const;
|
||||
bool genre_supported() const;
|
||||
bool compilation_supported() const;
|
||||
bool rating_supported() const;
|
||||
bool comment_supported() const;
|
||||
bool lyrics_supported() const;
|
||||
|
||||
static bool save_embedded_cover_supported(const FileType filetype);
|
||||
bool save_embedded_cover_supported() const { return url().isLocalFile() && save_embedded_cover_supported(filetype()) && !has_cue(); };
|
||||
|
||||
static QString JoinSpec(const QString &table);
|
||||
|
||||
// Pretty accessors
|
||||
QString PrettyTitle() const;
|
||||
QString PrettyTitleWithArtist() const;
|
||||
QString PrettyLength() const;
|
||||
QString PrettyYear() const;
|
||||
QString PrettyOriginalYear() const;
|
||||
|
||||
QString TitleWithCompilationArtist() const;
|
||||
|
||||
QString SampleRateBitDepthToText() const;
|
||||
|
||||
QString PrettyRating() const;
|
||||
|
||||
bool IsEditable() const;
|
||||
|
||||
// Comparison functions
|
||||
bool IsMetadataEqual(const Song &other) const;
|
||||
bool IsPlayStatisticsEqual(const Song &other) const;
|
||||
@@ -427,16 +366,69 @@ class Song {
|
||||
bool IsOnSameAlbum(const Song &other) const;
|
||||
bool IsSimilar(const Song &other) const;
|
||||
|
||||
bool operator==(const Song &other) const;
|
||||
bool operator!=(const Song &other) const;
|
||||
static Source SourceFromURL(const QUrl &url);
|
||||
static QString TextForSource(const Source source);
|
||||
static QString DescriptionForSource(const Source source);
|
||||
static Source SourceFromText(const QString &source);
|
||||
static QIcon IconForSource(const Source source);
|
||||
static QString TextForFiletype(const FileType filetype);
|
||||
static QString ExtensionForFiletype(const FileType filetype);
|
||||
static QIcon IconForFiletype(const FileType filetype);
|
||||
|
||||
QString TextForSource() const { return TextForSource(source()); }
|
||||
QString DescriptionForSource() const { return DescriptionForSource(source()); }
|
||||
QIcon IconForSource() const { return IconForSource(source()); }
|
||||
QString TextForFiletype() const { return TextForFiletype(filetype()); }
|
||||
QIcon IconForFiletype() const { return IconForFiletype(filetype()); }
|
||||
|
||||
bool IsFileLossless() const;
|
||||
static FileType FiletypeByMimetype(const QString &mimetype);
|
||||
static FileType FiletypeByDescription(const QString &text);
|
||||
static FileType FiletypeByExtension(const QString &ext);
|
||||
static QString ImageCacheDir(const Source source);
|
||||
|
||||
// Sort songs alphabetically using their pretty title
|
||||
static int CompareSongsName(const Song &song1, const Song &song2);
|
||||
static void SortSongsListAlphabetically(QList<Song> *songs);
|
||||
|
||||
// Constructors
|
||||
void Init(const QString &title, const QString &artist, const QString &album, const qint64 length_nanosec);
|
||||
void Init(const QString &title, const QString &artist, const QString &album, const qint64 beginning, const qint64 end);
|
||||
void InitFromProtobuf(const spb::tagreader::SongMetadata &pb);
|
||||
void InitFromQuery(const SqlRow &query, const bool reliable_metadata);
|
||||
void InitFromFilePartial(const QString &filename, const QFileInfo &fileinfo);
|
||||
void InitArtManual();
|
||||
void InitArtAutomatic();
|
||||
|
||||
#ifdef HAVE_LIBGPOD
|
||||
void InitFromItdb(_Itdb_Track *track, const QString &prefix);
|
||||
void ToItdb(_Itdb_Track *track) const;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBMTP
|
||||
void InitFromMTP(const LIBMTP_track_struct *track, const QString &host);
|
||||
void ToMTP(LIBMTP_track_struct *track) const;
|
||||
#endif
|
||||
|
||||
// Save
|
||||
void BindToQuery(SqlQuery *query) const;
|
||||
void BindToFtsQuery(SqlQuery *query) const;
|
||||
void ToXesam(QVariantMap *map) const;
|
||||
void ToProtobuf(spb::tagreader::SongMetadata *pb) const;
|
||||
|
||||
bool MergeFromEngineMetadata(const EngineMetadata &engine_metadata);
|
||||
|
||||
// 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_playcount, const bool merge_rating);
|
||||
|
||||
// Two songs that are on the same album will have the same AlbumKey.
|
||||
// It is more efficient to use IsOnSameAlbum, but this function can be used when you need to hash the key to do fast lookups.
|
||||
QString AlbumKey() const;
|
||||
|
||||
Song &operator=(const Song &other);
|
||||
|
||||
private:
|
||||
static const QString kManuallyUnsetCover;
|
||||
static const QString kEmbeddedCover;
|
||||
struct Private;
|
||||
|
||||
static QString sortable(const QString &v);
|
||||
|
||||
Reference in New Issue
Block a user