Use C++11 enum class

This commit is contained in:
Jonas Kvinge
2023-02-18 14:09:27 +01:00
parent e6c5f76872
commit dd72fb4ca5
237 changed files with 2915 additions and 2840 deletions

View File

@@ -158,7 +158,7 @@ const QStringList Song::kAcceptedExtensions = QStringList() << "wav" << "flac" <
struct Song::Private : public QSharedData {
explicit Private(Source source = Source_Unknown);
explicit Private(Source source = Source::Unknown);
bool valid_;
int id_;
@@ -229,7 +229,7 @@ struct Song::Private : public QSharedData {
};
Song::Private::Private(Song::Source source)
Song::Private::Private(const Source source)
: valid_(false),
id_(-1),
@@ -248,7 +248,7 @@ Song::Private::Private(Song::Source source)
source_(source),
directory_id_(-1),
filetype_(FileType_Unknown),
filetype_(FileType::Unknown),
filesize_(-1),
mtime_(-1),
ctime_(-1),
@@ -270,7 +270,7 @@ Song::Private::Private(Song::Source source)
{}
Song::Song(Song::Source source) : d(new Private(source)) {}
Song::Song(const Source source) : d(new Private(source)) {}
Song::Song(const Song &other) = default;
Song::~Song() = default;
@@ -353,16 +353,16 @@ void Song::clear_art_automatic() { d->art_automatic_.clear(); }
void Song::clear_art_manual() { d->art_manual_.clear(); }
bool Song::additional_tags_supported() const {
return d->filetype_ == FileType_FLAC ||
d->filetype_ == FileType_WavPack ||
d->filetype_ == FileType_OggFlac ||
d->filetype_ == FileType_OggVorbis ||
d->filetype_ == FileType_OggOpus ||
d->filetype_ == FileType_OggSpeex ||
d->filetype_ == FileType_MPEG ||
d->filetype_ == FileType_MP4 ||
d->filetype_ == FileType_MPC ||
d->filetype_ == FileType_APE;
return d->filetype_ == FileType::FLAC ||
d->filetype_ == FileType::WavPack ||
d->filetype_ == FileType::OggFlac ||
d->filetype_ == FileType::OggVorbis ||
d->filetype_ == FileType::OggOpus ||
d->filetype_ == FileType::OggSpeex ||
d->filetype_ == FileType::MPEG ||
d->filetype_ == FileType::MP4 ||
d->filetype_ == FileType::MPC ||
d->filetype_ == FileType::APE;
}
bool Song::albumartist_supported() const {
@@ -374,15 +374,15 @@ bool Song::composer_supported() const {
}
bool Song::performer_supported() const {
return d->filetype_ == FileType_FLAC ||
d->filetype_ == FileType_WavPack ||
d->filetype_ == FileType_OggFlac ||
d->filetype_ == FileType_OggVorbis ||
d->filetype_ == FileType_OggOpus ||
d->filetype_ == FileType_OggSpeex ||
d->filetype_ == FileType_MPEG ||
d->filetype_ == FileType_MPC ||
d->filetype_ == FileType_APE;
return d->filetype_ == FileType::FLAC ||
d->filetype_ == FileType::WavPack ||
d->filetype_ == FileType::OggFlac ||
d->filetype_ == FileType::OggVorbis ||
d->filetype_ == FileType::OggOpus ||
d->filetype_ == FileType::OggSpeex ||
d->filetype_ == FileType::MPEG ||
d->filetype_ == FileType::MPC ||
d->filetype_ == FileType::APE;
}
bool Song::grouping_supported() const {
@@ -398,17 +398,17 @@ bool Song::compilation_supported() const {
}
bool Song::rating_supported() const {
return d->filetype_ == FileType_FLAC ||
d->filetype_ == FileType_WavPack ||
d->filetype_ == FileType_OggFlac ||
d->filetype_ == FileType_OggVorbis ||
d->filetype_ == FileType_OggOpus ||
d->filetype_ == FileType_OggSpeex ||
d->filetype_ == FileType_MPEG ||
d->filetype_ == FileType_MP4 ||
d->filetype_ == FileType_ASF ||
d->filetype_ == FileType_MPC ||
d->filetype_ == FileType_APE;
return d->filetype_ == FileType::FLAC ||
d->filetype_ == FileType::WavPack ||
d->filetype_ == FileType::OggFlac ||
d->filetype_ == FileType::OggVorbis ||
d->filetype_ == FileType::OggOpus ||
d->filetype_ == FileType::OggSpeex ||
d->filetype_ == FileType::MPEG ||
d->filetype_ == FileType::MP4 ||
d->filetype_ == FileType::ASF ||
d->filetype_ == FileType::MPC ||
d->filetype_ == FileType::APE;
}
bool Song::comment_supported() const {
@@ -421,11 +421,11 @@ bool Song::lyrics_supported() const {
bool Song::save_embedded_cover_supported(const FileType filetype) {
return filetype == FileType_FLAC ||
filetype == FileType_OggVorbis ||
filetype == FileType_OggOpus ||
filetype == FileType_MPEG ||
filetype == FileType_MP4;
return filetype == FileType::FLAC ||
filetype == FileType::OggVorbis ||
filetype == FileType::OggOpus ||
filetype == FileType::MPEG ||
filetype == FileType::MP4;
}
@@ -438,14 +438,14 @@ bool Song::has_cue() const { return !d->cue_path_.isEmpty(); }
float Song::rating() const { return d->rating_; }
bool Song::is_collection_song() const { return d->source_ == Source_Collection; }
bool Song::is_collection_song() const { return d->source_ == Source::Collection; }
bool Song::is_metadata_good() const { return !d->url_.isEmpty() && !d->artist_.isEmpty() && !d->title_.isEmpty(); }
bool Song::is_stream() const { return is_radio() || d->source_ == Source_Tidal || d->source_ == Source_Subsonic || d->source_ == Source_Qobuz; }
bool Song::is_radio() const { return d->source_ == Source_Stream || d->source_ == Source_SomaFM || d->source_ == Source_RadioParadise; }
bool Song::is_cdda() const { return d->source_ == Source_CDDA; }
bool Song::is_stream() const { return is_radio() || d->source_ == Source::Tidal || d->source_ == Source::Subsonic || d->source_ == Source::Qobuz; }
bool Song::is_radio() const { return d->source_ == Source::Stream || d->source_ == Source::SomaFM || d->source_ == Source::RadioParadise; }
bool Song::is_cdda() const { return d->source_ == Source::CDDA; }
bool Song::is_compilation() const { return (d->compilation_ || d->compilation_detected_ || d->compilation_on_) && !d->compilation_off_; }
bool Song::stream_url_can_expire() const { return d->source_ == Song::Source_Tidal || d->source_ == Song::Source_Qobuz; }
bool Song::is_module_music() const { return d->filetype_ == Song::FileType_MOD || d->filetype_ == Song::FileType_S3M || d->filetype_ == Song::FileType_XM || d->filetype_ == Song::FileType_IT; }
bool Song::stream_url_can_expire() const { return d->source_ == Source::Tidal || d->source_ == Source::Qobuz; }
bool Song::is_module_music() const { return d->filetype_ == FileType::MOD || d->filetype_ == FileType::S3M || d->filetype_ == FileType::XM || d->filetype_ == FileType::IT; }
bool Song::art_automatic_is_valid() const {
return !d->art_automatic_.isEmpty() &&
@@ -551,55 +551,55 @@ QString Song::JoinSpec(const QString &table) {
Song::Source Song::SourceFromURL(const QUrl &url) {
if (url.isLocalFile()) return Source_LocalFile;
else if (url.scheme() == "cdda") return Source_CDDA;
else if (url.scheme() == "tidal") return Source_Tidal;
else if (url.scheme() == "subsonic") return Source_Subsonic;
else if (url.scheme() == "qobuz") return Source_Qobuz;
if (url.isLocalFile()) return Source::LocalFile;
else if (url.scheme() == "cdda") return Source::CDDA;
else if (url.scheme() == "tidal") return Source::Tidal;
else if (url.scheme() == "subsonic") return Source::Subsonic;
else if (url.scheme() == "qobuz") return Source::Qobuz;
else if (url.scheme() == "http" || url.scheme() == "https" || url.scheme() == "rtsp") {
if (url.host().endsWith("tidal.com", Qt::CaseInsensitive)) { return Source_Tidal; }
if (url.host().endsWith("qobuz.com", Qt::CaseInsensitive)) { return Source_Qobuz; }
if (url.host().endsWith("somafm.com", Qt::CaseInsensitive)) { return Source_SomaFM; }
if (url.host().endsWith("radioparadise.com", Qt::CaseInsensitive)) { return Source_RadioParadise; }
return Source_Stream;
if (url.host().endsWith("tidal.com", Qt::CaseInsensitive)) { return Source::Tidal; }
if (url.host().endsWith("qobuz.com", Qt::CaseInsensitive)) { return Source::Qobuz; }
if (url.host().endsWith("somafm.com", Qt::CaseInsensitive)) { return Source::SomaFM; }
if (url.host().endsWith("radioparadise.com", Qt::CaseInsensitive)) { return Source::RadioParadise; }
return Source::Stream;
}
else return Source_Unknown;
else return Source::Unknown;
}
QString Song::TextForSource(Source source) {
QString Song::TextForSource(const Source source) {
switch (source) {
case Song::Source_LocalFile: return "file";
case Song::Source_Collection: return "collection";
case Song::Source_CDDA: return "cd";
case Song::Source_Device: return "device";
case Song::Source_Stream: return "stream";
case Song::Source_Tidal: return "tidal";
case Song::Source_Subsonic: return "subsonic";
case Song::Source_Qobuz: return "qobuz";
case Song::Source_SomaFM: return "somafm";
case Song::Source_RadioParadise: return "radioparadise";
case Song::Source_Unknown: return "unknown";
case Source::LocalFile: return "file";
case Source::Collection: return "collection";
case Source::CDDA: return "cd";
case Source::Device: return "device";
case Source::Stream: return "stream";
case Source::Tidal: return "tidal";
case Source::Subsonic: return "subsonic";
case Source::Qobuz: return "qobuz";
case Source::SomaFM: return "somafm";
case Source::RadioParadise: return "radioparadise";
case Source::Unknown: return "unknown";
}
return "unknown";
}
QString Song::DescriptionForSource(Source source) {
QString Song::DescriptionForSource(const Source source) {
switch (source) {
case Song::Source_LocalFile: return "File";
case Song::Source_Collection: return "Collection";
case Song::Source_CDDA: return "CD";
case Song::Source_Device: return "Device";
case Song::Source_Stream: return "Stream";
case Song::Source_Tidal: return "Tidal";
case Song::Source_Subsonic: return "Subsonic";
case Song::Source_Qobuz: return "Qobuz";
case Song::Source_SomaFM: return "SomaFM";
case Song::Source_RadioParadise: return "Radio Paradise";
case Song::Source_Unknown: return "Unknown";
case Source::LocalFile: return "File";
case Source::Collection: return "Collection";
case Source::CDDA: return "CD";
case Source::Device: return "Device";
case Source::Stream: return "Stream";
case Source::Tidal: return "Tidal";
case Source::Subsonic: return "Subsonic";
case Source::Qobuz: return "Qobuz";
case Source::SomaFM: return "SomaFM";
case Source::RadioParadise: return "Radio Paradise";
case Source::Unknown: return "Unknown";
}
return "unknown";
@@ -607,132 +607,132 @@ QString Song::DescriptionForSource(Source source) {
Song::Source Song::SourceFromText(const QString &source) {
if (source.compare("file", Qt::CaseInsensitive) == 0) return Source_LocalFile;
if (source.compare("collection", Qt::CaseInsensitive) == 0) return Source_Collection;
if (source.compare("cd", Qt::CaseInsensitive) == 0) return Source_CDDA;
if (source.compare("device", Qt::CaseInsensitive) == 0) return Source_Device;
if (source.compare("stream", Qt::CaseInsensitive) == 0) return Source_Stream;
if (source.compare("tidal", Qt::CaseInsensitive) == 0) return Source_Tidal;
if (source.compare("subsonic", Qt::CaseInsensitive) == 0) return Source_Subsonic;
if (source.compare("qobuz", Qt::CaseInsensitive) == 0) return Source_Qobuz;
if (source.compare("somafm", Qt::CaseInsensitive) == 0) return Source_SomaFM;
if (source.compare("radioparadise", Qt::CaseInsensitive) == 0) return Source_RadioParadise;
if (source.compare("file", Qt::CaseInsensitive) == 0) return Source::LocalFile;
if (source.compare("collection", Qt::CaseInsensitive) == 0) return Source::Collection;
if (source.compare("cd", Qt::CaseInsensitive) == 0) return Source::CDDA;
if (source.compare("device", Qt::CaseInsensitive) == 0) return Source::Device;
if (source.compare("stream", Qt::CaseInsensitive) == 0) return Source::Stream;
if (source.compare("tidal", Qt::CaseInsensitive) == 0) return Source::Tidal;
if (source.compare("subsonic", Qt::CaseInsensitive) == 0) return Source::Subsonic;
if (source.compare("qobuz", Qt::CaseInsensitive) == 0) return Source::Qobuz;
if (source.compare("somafm", Qt::CaseInsensitive) == 0) return Source::SomaFM;
if (source.compare("radioparadise", Qt::CaseInsensitive) == 0) return Source::RadioParadise;
return Source_Unknown;
return Source::Unknown;
}
QIcon Song::IconForSource(Source source) {
QIcon Song::IconForSource(const Source source) {
switch (source) {
case Song::Source_LocalFile: return IconLoader::Load("folder-sound");
case Song::Source_Collection: return IconLoader::Load("library-music");
case Song::Source_CDDA: return IconLoader::Load("media-optical");
case Song::Source_Device: return IconLoader::Load("device");
case Song::Source_Stream: return IconLoader::Load("applications-internet");
case Song::Source_Tidal: return IconLoader::Load("tidal");
case Song::Source_Subsonic: return IconLoader::Load("subsonic");
case Song::Source_Qobuz: return IconLoader::Load("qobuz");
case Song::Source_SomaFM: return IconLoader::Load("somafm");
case Song::Source_RadioParadise: return IconLoader::Load("radioparadise");
case Song::Source_Unknown: return IconLoader::Load("edit-delete");
case Source::LocalFile: return IconLoader::Load("folder-sound");
case Source::Collection: return IconLoader::Load("library-music");
case Source::CDDA: return IconLoader::Load("media-optical");
case Source::Device: return IconLoader::Load("device");
case Source::Stream: return IconLoader::Load("applications-internet");
case Source::Tidal: return IconLoader::Load("tidal");
case Source::Subsonic: return IconLoader::Load("subsonic");
case Source::Qobuz: return IconLoader::Load("qobuz");
case Source::SomaFM: return IconLoader::Load("somafm");
case Source::RadioParadise: return IconLoader::Load("radioparadise");
case Source::Unknown: return IconLoader::Load("edit-delete");
}
return IconLoader::Load("edit-delete");
}
QString Song::TextForFiletype(FileType filetype) {
QString Song::TextForFiletype(const FileType filetype) {
switch (filetype) {
case Song::FileType_WAV: return "Wav";
case Song::FileType_FLAC: return "FLAC";
case Song::FileType_WavPack: return "WavPack";
case Song::FileType_OggFlac: return "Ogg FLAC";
case Song::FileType_OggVorbis: return "Ogg Vorbis";
case Song::FileType_OggOpus: return "Ogg Opus";
case Song::FileType_OggSpeex: return "Ogg Speex";
case Song::FileType_MPEG: return "MP3";
case Song::FileType_MP4: return "MP4 AAC";
case Song::FileType_ASF: return "Windows Media audio";
case Song::FileType_AIFF: return "AIFF";
case Song::FileType_MPC: return "MPC";
case Song::FileType_TrueAudio: return "TrueAudio";
case Song::FileType_DSF: return "DSF";
case Song::FileType_DSDIFF: return "DSDIFF";
case Song::FileType_PCM: return "PCM";
case Song::FileType_APE: return "Monkey's Audio";
case Song::FileType_MOD: return "Module Music Format";
case Song::FileType_S3M: return "Module Music Format";
case Song::FileType_XM: return "Module Music Format";
case Song::FileType_IT: return "Module Music Format";
case Song::FileType_CDDA: return "CDDA";
case Song::FileType_SPC: return "SNES SPC700";
case Song::FileType_VGM: return "VGM";
case Song::FileType_Stream: return "Stream";
case Song::FileType_Unknown:
case FileType::WAV: return "Wav";
case FileType::FLAC: return "FLAC";
case FileType::WavPack: return "WavPack";
case FileType::OggFlac: return "Ogg FLAC";
case FileType::OggVorbis: return "Ogg Vorbis";
case FileType::OggOpus: return "Ogg Opus";
case FileType::OggSpeex: return "Ogg Speex";
case FileType::MPEG: return "MP3";
case FileType::MP4: return "MP4 AAC";
case FileType::ASF: return "Windows Media audio";
case FileType::AIFF: return "AIFF";
case FileType::MPC: return "MPC";
case FileType::TrueAudio: return "TrueAudio";
case FileType::DSF: return "DSF";
case FileType::DSDIFF: return "DSDIFF";
case FileType::PCM: return "PCM";
case FileType::APE: return "Monkey's Audio";
case FileType::MOD: return "Module Music Format";
case FileType::S3M: return "Module Music Format";
case FileType::XM: return "Module Music Format";
case FileType::IT: return "Module Music Format";
case FileType::CDDA: return "CDDA";
case FileType::SPC: return "SNES SPC700";
case FileType::VGM: return "VGM";
case FileType::Stream: return "Stream";
case FileType::Unknown:
default: return QObject::tr("Unknown");
}
}
QString Song::ExtensionForFiletype(FileType filetype) {
QString Song::ExtensionForFiletype(const FileType filetype) {
switch (filetype) {
case Song::FileType_WAV: return "wav";
case Song::FileType_FLAC: return "flac";
case Song::FileType_WavPack: return "wv";
case Song::FileType_OggFlac: return "flac";
case Song::FileType_OggVorbis: return "ogg";
case Song::FileType_OggOpus: return "opus";
case Song::FileType_OggSpeex: return "spx";
case Song::FileType_MPEG: return "mp3";
case Song::FileType_MP4: return "mp4";
case Song::FileType_ASF: return "wma";
case Song::FileType_AIFF: return "aiff";
case Song::FileType_MPC: return "mpc";
case Song::FileType_TrueAudio: return "tta";
case Song::FileType_DSF: return "dsf";
case Song::FileType_DSDIFF: return "dsd";
case Song::FileType_APE: return "ape";
case Song::FileType_MOD: return "mod";
case Song::FileType_S3M: return "s3m";
case Song::FileType_XM: return "xm";
case Song::FileType_IT: return "it";
case Song::FileType_SPC: return "spc";
case Song::FileType_VGM: return "vgm";
case Song::FileType_Unknown:
case FileType::WAV: return "wav";
case FileType::FLAC: return "flac";
case FileType::WavPack: return "wv";
case FileType::OggFlac: return "flac";
case FileType::OggVorbis: return "ogg";
case FileType::OggOpus: return "opus";
case FileType::OggSpeex: return "spx";
case FileType::MPEG: return "mp3";
case FileType::MP4: return "mp4";
case FileType::ASF: return "wma";
case FileType::AIFF: return "aiff";
case FileType::MPC: return "mpc";
case FileType::TrueAudio: return "tta";
case FileType::DSF: return "dsf";
case FileType::DSDIFF: return "dsd";
case FileType::APE: return "ape";
case FileType::MOD: return "mod";
case FileType::S3M: return "s3m";
case FileType::XM: return "xm";
case FileType::IT: return "it";
case FileType::SPC: return "spc";
case FileType::VGM: return "vgm";
case FileType::Unknown:
default: return "dat";
}
}
QIcon Song::IconForFiletype(FileType filetype) {
QIcon Song::IconForFiletype(const FileType filetype) {
switch (filetype) {
case Song::FileType_WAV: return IconLoader::Load("wav");
case Song::FileType_FLAC: return IconLoader::Load("flac");
case Song::FileType_WavPack: return IconLoader::Load("wavpack");
case Song::FileType_OggFlac: return IconLoader::Load("flac");
case Song::FileType_OggVorbis: return IconLoader::Load("vorbis");
case Song::FileType_OggOpus: return IconLoader::Load("opus");
case Song::FileType_OggSpeex: return IconLoader::Load("speex");
case Song::FileType_MPEG: return IconLoader::Load("mp3");
case Song::FileType_MP4: return IconLoader::Load("mp4");
case Song::FileType_ASF: return IconLoader::Load("wma");
case Song::FileType_AIFF: return IconLoader::Load("aiff");
case Song::FileType_MPC: return IconLoader::Load("mpc");
case Song::FileType_TrueAudio: return IconLoader::Load("trueaudio");
case Song::FileType_DSF: return IconLoader::Load("dsf");
case Song::FileType_DSDIFF: return IconLoader::Load("dsd");
case Song::FileType_PCM: return IconLoader::Load("pcm");
case Song::FileType_APE: return IconLoader::Load("ape");
case Song::FileType_MOD: return IconLoader::Load("mod");
case Song::FileType_S3M: return IconLoader::Load("s3m");
case Song::FileType_XM: return IconLoader::Load("xm");
case Song::FileType_IT: return IconLoader::Load("it");
case Song::FileType_CDDA: return IconLoader::Load("cd");
case Song::FileType_Stream: return IconLoader::Load("applications-internet");
case Song::FileType_Unknown:
case FileType::WAV: return IconLoader::Load("wav");
case FileType::FLAC: return IconLoader::Load("flac");
case FileType::WavPack: return IconLoader::Load("wavpack");
case FileType::OggFlac: return IconLoader::Load("flac");
case FileType::OggVorbis: return IconLoader::Load("vorbis");
case FileType::OggOpus: return IconLoader::Load("opus");
case FileType::OggSpeex: return IconLoader::Load("speex");
case FileType::MPEG: return IconLoader::Load("mp3");
case FileType::MP4: return IconLoader::Load("mp4");
case FileType::ASF: return IconLoader::Load("wma");
case FileType::AIFF: return IconLoader::Load("aiff");
case FileType::MPC: return IconLoader::Load("mpc");
case FileType::TrueAudio: return IconLoader::Load("trueaudio");
case FileType::DSF: return IconLoader::Load("dsf");
case FileType::DSDIFF: return IconLoader::Load("dsd");
case FileType::PCM: return IconLoader::Load("pcm");
case FileType::APE: return IconLoader::Load("ape");
case FileType::MOD: return IconLoader::Load("mod");
case FileType::S3M: return IconLoader::Load("s3m");
case FileType::XM: return IconLoader::Load("xm");
case FileType::IT: return IconLoader::Load("it");
case FileType::CDDA: return IconLoader::Load("cd");
case FileType::Stream: return IconLoader::Load("applications-internet");
case FileType::Unknown:
default: return IconLoader::Load("edit-delete");
}
@@ -740,17 +740,17 @@ QIcon Song::IconForFiletype(FileType filetype) {
bool Song::IsFileLossless() const {
switch (filetype()) {
case Song::FileType_WAV:
case Song::FileType_FLAC:
case Song::FileType_OggFlac:
case Song::FileType_WavPack:
case Song::FileType_AIFF:
case Song::FileType_DSF:
case Song::FileType_DSDIFF:
case Song::FileType_APE:
case Song::FileType_TrueAudio:
case Song::FileType_PCM:
case Song::FileType_CDDA:
case FileType::WAV:
case FileType::FLAC:
case FileType::OggFlac:
case FileType::WavPack:
case FileType::AIFF:
case FileType::DSF:
case FileType::DSDIFF:
case FileType::APE:
case FileType::TrueAudio:
case FileType::PCM:
case FileType::CDDA:
return true;
default:
return false;
@@ -759,103 +759,103 @@ bool Song::IsFileLossless() const {
Song::FileType Song::FiletypeByMimetype(const QString &mimetype) {
if (mimetype.compare("audio/wav", Qt::CaseInsensitive) == 0 || mimetype.compare("audio/x-wav", Qt::CaseInsensitive) == 0) return Song::FileType_WAV;
else if (mimetype.compare("audio/x-flac", Qt::CaseInsensitive) == 0) return Song::FileType_FLAC;
else if (mimetype.compare("audio/x-wavpack", Qt::CaseInsensitive) == 0) return Song::FileType_WavPack;
else if (mimetype.compare("audio/x-vorbis", Qt::CaseInsensitive) == 0) return Song::FileType_OggVorbis;
else if (mimetype.compare("audio/x-opus", Qt::CaseInsensitive) == 0) return Song::FileType_OggOpus;
else if (mimetype.compare("audio/x-speex", Qt::CaseInsensitive) == 0) return Song::FileType_OggSpeex;
if (mimetype.compare("audio/wav", Qt::CaseInsensitive) == 0 || mimetype.compare("audio/x-wav", Qt::CaseInsensitive) == 0) return FileType::WAV;
else if (mimetype.compare("audio/x-flac", Qt::CaseInsensitive) == 0) return FileType::FLAC;
else if (mimetype.compare("audio/x-wavpack", Qt::CaseInsensitive) == 0) return FileType::WavPack;
else if (mimetype.compare("audio/x-vorbis", Qt::CaseInsensitive) == 0) return FileType::OggVorbis;
else if (mimetype.compare("audio/x-opus", Qt::CaseInsensitive) == 0) return FileType::OggOpus;
else if (mimetype.compare("audio/x-speex", Qt::CaseInsensitive) == 0) return FileType::OggSpeex;
// Gstreamer returns audio/mpeg for both MP3 and MP4/AAC.
// else if (mimetype.compare("audio/mpeg", Qt::CaseInsensitive) == 0) return Song::FileType_MPEG;
else if (mimetype.compare("audio/aac", Qt::CaseInsensitive) == 0) return Song::FileType_MP4;
else if (mimetype.compare("audio/x-wma", Qt::CaseInsensitive) == 0) return Song::FileType_ASF;
else if (mimetype.compare("audio/aiff", Qt::CaseInsensitive) == 0 || mimetype.compare("audio/x-aiff", Qt::CaseInsensitive) == 0) return Song::FileType_AIFF;
else if (mimetype.compare("application/x-project", Qt::CaseInsensitive) == 0) return Song::FileType_MPC;
else if (mimetype.compare("audio/x-dsf", Qt::CaseInsensitive) == 0) return Song::FileType_DSF;
else if (mimetype.compare("audio/x-dsd", Qt::CaseInsensitive) == 0) return Song::FileType_DSDIFF;
else if (mimetype.compare("audio/x-ape", Qt::CaseInsensitive) == 0 || mimetype.compare("application/x-ape", Qt::CaseInsensitive) == 0 || mimetype.compare("audio/x-ffmpeg-parsed-ape", Qt::CaseInsensitive) == 0) return Song::FileType_APE;
else if (mimetype.compare("audio/x-mod", Qt::CaseInsensitive) == 0) return Song::FileType_MOD;
else if (mimetype.compare("audio/x-s3m", Qt::CaseInsensitive) == 0) return Song::FileType_S3M;
else if (mimetype.compare("audio/x-spc", Qt::CaseInsensitive) == 0) return Song::FileType_SPC;
else if (mimetype.compare("audio/x-vgm", Qt::CaseInsensitive) == 0) return Song::FileType_VGM;
// else if (mimetype.compare("audio/mpeg", Qt::CaseInsensitive) == 0) return FileType::MPEG;
else if (mimetype.compare("audio/aac", Qt::CaseInsensitive) == 0) return FileType::MP4;
else if (mimetype.compare("audio/x-wma", Qt::CaseInsensitive) == 0) return FileType::ASF;
else if (mimetype.compare("audio/aiff", Qt::CaseInsensitive) == 0 || mimetype.compare("audio/x-aiff", Qt::CaseInsensitive) == 0) return FileType::AIFF;
else if (mimetype.compare("application/x-project", Qt::CaseInsensitive) == 0) return FileType::MPC;
else if (mimetype.compare("audio/x-dsf", Qt::CaseInsensitive) == 0) return FileType::DSF;
else if (mimetype.compare("audio/x-dsd", Qt::CaseInsensitive) == 0) return FileType::DSDIFF;
else if (mimetype.compare("audio/x-ape", Qt::CaseInsensitive) == 0 || mimetype.compare("application/x-ape", Qt::CaseInsensitive) == 0 || mimetype.compare("audio/x-ffmpeg-parsed-ape", Qt::CaseInsensitive) == 0) return FileType::APE;
else if (mimetype.compare("audio/x-mod", Qt::CaseInsensitive) == 0) return FileType::MOD;
else if (mimetype.compare("audio/x-s3m", Qt::CaseInsensitive) == 0) return FileType::S3M;
else if (mimetype.compare("audio/x-spc", Qt::CaseInsensitive) == 0) return FileType::SPC;
else if (mimetype.compare("audio/x-vgm", Qt::CaseInsensitive) == 0) return FileType::VGM;
else return Song::FileType_Unknown;
else return FileType::Unknown;
}
Song::FileType Song::FiletypeByDescription(const QString &text) {
if (text.compare("WAV", Qt::CaseInsensitive) == 0) return Song::FileType_WAV;
else if (text.compare("Free Lossless Audio Codec (FLAC)", Qt::CaseInsensitive) == 0) return Song::FileType_FLAC;
else if (text.compare("Wavpack", Qt::CaseInsensitive) == 0) return Song::FileType_WavPack;
else if (text.compare("Vorbis", Qt::CaseInsensitive) == 0) return Song::FileType_OggVorbis;
else if (text.compare("Opus", Qt::CaseInsensitive) == 0) return Song::FileType_OggOpus;
else if (text.compare("Speex", Qt::CaseInsensitive) == 0) return Song::FileType_OggSpeex;
else if (text.compare("MPEG-1 Layer 3 (MP3)", Qt::CaseInsensitive) == 0) return Song::FileType_MPEG;
else if (text.compare("MPEG-4 AAC", Qt::CaseInsensitive) == 0) return Song::FileType_MP4;
else if (text.compare("WMA", Qt::CaseInsensitive) == 0) return Song::FileType_ASF;
else if (text.compare("Audio Interchange File Format", Qt::CaseInsensitive) == 0) return Song::FileType_AIFF;
else if (text.compare("MPC", Qt::CaseInsensitive) == 0) return Song::FileType_MPC;
else if (text.compare("audio/x-dsf", Qt::CaseInsensitive) == 0) return Song::FileType_DSF;
else if (text.compare("audio/x-dsd", Qt::CaseInsensitive) == 0) return Song::FileType_DSDIFF;
else if (text.compare("audio/x-ffmpeg-parsed-ape", Qt::CaseInsensitive) == 0) return Song::FileType_APE;
else if (text.compare("Module Music Format (MOD)", Qt::CaseInsensitive) == 0) return Song::FileType_MOD;
else if (text.compare("Module Music Format (MOD)", Qt::CaseInsensitive) == 0) return Song::FileType_S3M;
else if (text.compare("SNES SPC700", Qt::CaseInsensitive) == 0) return Song::FileType_SPC;
else if (text.compare("VGM", Qt::CaseInsensitive) == 0) return Song::FileType_VGM;
else return Song::FileType_Unknown;
if (text.compare("WAV", Qt::CaseInsensitive) == 0) return FileType::WAV;
else if (text.compare("Free Lossless Audio Codec (FLAC)", Qt::CaseInsensitive) == 0) return FileType::FLAC;
else if (text.compare("Wavpack", Qt::CaseInsensitive) == 0) return FileType::WavPack;
else if (text.compare("Vorbis", Qt::CaseInsensitive) == 0) return FileType::OggVorbis;
else if (text.compare("Opus", Qt::CaseInsensitive) == 0) return FileType::OggOpus;
else if (text.compare("Speex", Qt::CaseInsensitive) == 0) return FileType::OggSpeex;
else if (text.compare("MPEG-1 Layer 3 (MP3)", Qt::CaseInsensitive) == 0) return FileType::MPEG;
else if (text.compare("MPEG-4 AAC", Qt::CaseInsensitive) == 0) return FileType::MP4;
else if (text.compare("WMA", Qt::CaseInsensitive) == 0) return FileType::ASF;
else if (text.compare("Audio Interchange File Format", Qt::CaseInsensitive) == 0) return FileType::AIFF;
else if (text.compare("MPC", Qt::CaseInsensitive) == 0) return FileType::MPC;
else if (text.compare("audio/x-dsf", Qt::CaseInsensitive) == 0) return FileType::DSF;
else if (text.compare("audio/x-dsd", Qt::CaseInsensitive) == 0) return FileType::DSDIFF;
else if (text.compare("audio/x-ffmpeg-parsed-ape", Qt::CaseInsensitive) == 0) return FileType::APE;
else if (text.compare("Module Music Format (MOD)", Qt::CaseInsensitive) == 0) return FileType::MOD;
else if (text.compare("Module Music Format (MOD)", Qt::CaseInsensitive) == 0) return FileType::S3M;
else if (text.compare("SNES SPC700", Qt::CaseInsensitive) == 0) return FileType::SPC;
else if (text.compare("VGM", Qt::CaseInsensitive) == 0) return FileType::VGM;
else return FileType::Unknown;
}
Song::FileType Song::FiletypeByExtension(const QString &ext) {
if (ext.compare("wav", Qt::CaseInsensitive) == 0 || ext.compare("wave", Qt::CaseInsensitive) == 0) return Song::FileType_WAV;
else if (ext.compare("flac", Qt::CaseInsensitive) == 0) return Song::FileType_FLAC;
else if (ext.compare("wavpack", Qt::CaseInsensitive) == 0 || ext.compare("wv", Qt::CaseInsensitive) == 0) return Song::FileType_WavPack;
else if (ext.compare("ogg", Qt::CaseInsensitive) == 0 || ext.compare("oga", Qt::CaseInsensitive) == 0) return Song::FileType_OggVorbis;
else if (ext.compare("opus", Qt::CaseInsensitive) == 0) return Song::FileType_OggOpus;
else if (ext.compare("speex", Qt::CaseInsensitive) == 0 || ext.compare("spx", Qt::CaseInsensitive) == 0) return Song::FileType_OggSpeex;
else if (ext.compare("mp3", Qt::CaseInsensitive) == 0) return Song::FileType_MPEG;
else if (ext.compare("mp4", Qt::CaseInsensitive) == 0 || ext.compare("m4a", Qt::CaseInsensitive) == 0 || ext.compare("aac", Qt::CaseInsensitive) == 0) return Song::FileType_MP4;
else if (ext.compare("asf", Qt::CaseInsensitive) == 0 || ext.compare("wma", Qt::CaseInsensitive) == 0) return Song::FileType_ASF;
else if (ext.compare("aiff", Qt::CaseInsensitive) == 0 || ext.compare("aif", Qt::CaseInsensitive) == 0 || ext.compare("aifc", Qt::CaseInsensitive) == 0) return Song::FileType_AIFF;
else if (ext.compare("mpc", Qt::CaseInsensitive) == 0 || ext.compare("mp+", Qt::CaseInsensitive) == 0 || ext.compare("mpp", Qt::CaseInsensitive) == 0) return Song::FileType_MPC;
else if (ext.compare("dsf", Qt::CaseInsensitive) == 0) return Song::FileType_DSF;
else if (ext.compare("dsd", Qt::CaseInsensitive) == 0 || ext.compare("dff", Qt::CaseInsensitive) == 0) return Song::FileType_DSDIFF;
else if (ext.compare("ape", Qt::CaseInsensitive) == 0) return Song::FileType_APE;
if (ext.compare("wav", Qt::CaseInsensitive) == 0 || ext.compare("wave", Qt::CaseInsensitive) == 0) return FileType::WAV;
else if (ext.compare("flac", Qt::CaseInsensitive) == 0) return FileType::FLAC;
else if (ext.compare("wavpack", Qt::CaseInsensitive) == 0 || ext.compare("wv", Qt::CaseInsensitive) == 0) return FileType::WavPack;
else if (ext.compare("ogg", Qt::CaseInsensitive) == 0 || ext.compare("oga", Qt::CaseInsensitive) == 0) return FileType::OggVorbis;
else if (ext.compare("opus", Qt::CaseInsensitive) == 0) return FileType::OggOpus;
else if (ext.compare("speex", Qt::CaseInsensitive) == 0 || ext.compare("spx", Qt::CaseInsensitive) == 0) return FileType::OggSpeex;
else if (ext.compare("mp3", Qt::CaseInsensitive) == 0) return FileType::MPEG;
else if (ext.compare("mp4", Qt::CaseInsensitive) == 0 || ext.compare("m4a", Qt::CaseInsensitive) == 0 || ext.compare("aac", Qt::CaseInsensitive) == 0) return FileType::MP4;
else if (ext.compare("asf", Qt::CaseInsensitive) == 0 || ext.compare("wma", Qt::CaseInsensitive) == 0) return FileType::ASF;
else if (ext.compare("aiff", Qt::CaseInsensitive) == 0 || ext.compare("aif", Qt::CaseInsensitive) == 0 || ext.compare("aifc", Qt::CaseInsensitive) == 0) return FileType::AIFF;
else if (ext.compare("mpc", Qt::CaseInsensitive) == 0 || ext.compare("mp+", Qt::CaseInsensitive) == 0 || ext.compare("mpp", Qt::CaseInsensitive) == 0) return FileType::MPC;
else if (ext.compare("dsf", Qt::CaseInsensitive) == 0) return FileType::DSF;
else if (ext.compare("dsd", Qt::CaseInsensitive) == 0 || ext.compare("dff", Qt::CaseInsensitive) == 0) return FileType::DSDIFF;
else if (ext.compare("ape", Qt::CaseInsensitive) == 0) return FileType::APE;
else if (ext.compare("mod", Qt::CaseInsensitive) == 0 ||
ext.compare("module", Qt::CaseInsensitive) == 0 ||
ext.compare("nst", Qt::CaseInsensitive) == 0||
ext.compare("wow", Qt::CaseInsensitive) == 0) return Song::FileType_MOD;
else if (ext.compare("s3m", Qt::CaseInsensitive) == 0) return Song::FileType_S3M;
else if (ext.compare("xm", Qt::CaseInsensitive) == 0) return Song::FileType_XM;
else if (ext.compare("it", Qt::CaseInsensitive) == 0) return Song::FileType_IT;
else if (ext.compare("spc", Qt::CaseInsensitive) == 0) return Song::FileType_SPC;
else if (ext.compare("vgm", Qt::CaseInsensitive) == 0) return Song::FileType_VGM;
ext.compare("wow", Qt::CaseInsensitive) == 0) return FileType::MOD;
else if (ext.compare("s3m", Qt::CaseInsensitive) == 0) return FileType::S3M;
else if (ext.compare("xm", Qt::CaseInsensitive) == 0) return FileType::XM;
else if (ext.compare("it", Qt::CaseInsensitive) == 0) return FileType::IT;
else if (ext.compare("spc", Qt::CaseInsensitive) == 0) return FileType::SPC;
else if (ext.compare("vgm", Qt::CaseInsensitive) == 0) return FileType::VGM;
else return Song::FileType_Unknown;
else return FileType::Unknown;
}
QString Song::ImageCacheDir(const Song::Source source) {
QString Song::ImageCacheDir(const Source source) {
switch (source) {
case Song::Source_Collection:
case Source::Collection:
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/collectionalbumcovers";
case Song::Source_Subsonic:
case Source::Subsonic:
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/subsonicalbumcovers";
case Song::Source_Tidal:
case Source::Tidal:
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/tidalalbumcovers";
case Song::Source_Qobuz:
case Source::Qobuz:
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/qobuzalbumcovers";
case Song::Source_Device:
case Source::Device:
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/devicealbumcovers";
case Song::Source_LocalFile:
case Song::Source_CDDA:
case Song::Source_Stream:
case Song::Source_SomaFM:
case Song::Source_RadioParadise:
case Song::Source_Unknown:
case Source::LocalFile:
case Source::CDDA:
case Source::Stream:
case Source::SomaFM:
case Source::RadioParadise:
case Source::Unknown:
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/albumcovers";
}
@@ -899,7 +899,7 @@ void Song::Init(const QString &title, const QString &artist, const QString &albu
void Song::InitFromProtobuf(const spb::tagreader::SongMetadata &pb) {
if (d->source_ == Source_Unknown) d->source_ = Source_LocalFile;
if (d->source_ == Source::Unknown) d->source_ = Source::LocalFile;
d->init_from_file_ = true;
d->valid_ = pb.valid();
@@ -1068,7 +1068,7 @@ void Song::InitFromFilePartial(const QString &filename, const QFileInfo &fileinf
set_url(QUrl::fromLocalFile(filename));
d->valid_ = true;
d->source_ = Source_LocalFile;
d->source_ = Source::LocalFile;
d->filetype_ = FiletypeByExtension(fileinfo.suffix());
d->basefilename_ = fileinfo.fileName();
d->title_ = fileinfo.fileName();
@@ -1091,7 +1091,7 @@ void Song::InitArtManual() {
void Song::InitArtAutomatic() {
if (d->source_ == Source_LocalFile && d->url_.isLocalFile() && d->art_automatic_.isEmpty()) {
if (d->source_ == Source::LocalFile && d->url_.isLocalFile() && d->art_automatic_.isEmpty()) {
// Pick the first image file in the album directory.
QFileInfo file(d->url_.toLocalFile());
QDir dir(file.path());
@@ -1127,7 +1127,7 @@ void Song::InitFromItdb(Itdb_Track *track, const QString &prefix) {
d->samplerate_ = track->samplerate;
d->bitdepth_ = -1; //track->bitdepth;
d->source_ = Source_Device;
d->source_ = Source::Device;
QString filename = QString::fromLocal8Bit(track->ipod_path);
filename.replace(':', '/');
if (prefix.contains("://")) {
@@ -1138,7 +1138,7 @@ void Song::InitFromItdb(Itdb_Track *track, const QString &prefix) {
}
d->basefilename_ = QFileInfo(filename).fileName();
d->filetype_ = track->type2 ? FileType_MPEG : FileType_MP4;
d->filetype_ = track->type2 ? FileType::MPEG : FileType::MP4;
d->filesize_ = track->size;
d->mtime_ = track->time_modified;
d->ctime_ = track->time_added;
@@ -1150,7 +1150,7 @@ void Song::InitFromItdb(Itdb_Track *track, const QString &prefix) {
if (itdb_track_has_thumbnails(track) && !d->artist_.isEmpty() && !d->title_.isEmpty()) {
GdkPixbuf *pixbuf = static_cast<GdkPixbuf*>(itdb_track_get_thumbnail(track, -1, -1));
if (pixbuf) {
QString cover_path = ImageCacheDir(Source_Device);
QString cover_path = ImageCacheDir(Source::Device);
QDir dir(cover_path);
if (!dir.exists()) dir.mkpath(cover_path);
QString cover_file = cover_path + "/" + Utilities::Sha1CoverHash(effective_albumartist(), effective_album()).toHex() + ".jpg";
@@ -1184,8 +1184,8 @@ void Song::ToItdb(Itdb_Track *track) const {
track->bitrate = d->bitrate_;
track->samplerate = d->samplerate_;
track->type1 = (d->filetype_ == FileType_MPEG ? 1 : 0);
track->type2 = (d->filetype_ == FileType_MPEG ? 1 : 0);
track->type1 = (d->filetype_ == FileType::MPEG ? 1 : 0);
track->type2 = (d->filetype_ == FileType::MPEG ? 1 : 0);
track->mediatype = 1; // Audio
track->size = static_cast<uint>(d->filesize_);
track->time_modified = d->mtime_;
@@ -1202,7 +1202,7 @@ void Song::ToItdb(Itdb_Track *track) const {
void Song::InitFromMTP(const LIBMTP_track_t *track, const QString &host) {
d->valid_ = true;
d->source_ = Source_Device;
d->source_ = Source::Device;
set_title(QString::fromUtf8(track->title));
set_artist(QString::fromUtf8(track->artist));
@@ -1226,19 +1226,19 @@ void Song::InitFromMTP(const LIBMTP_track_t *track, const QString &host) {
d->playcount_ = track->usecount;
switch (track->filetype) {
case LIBMTP_FILETYPE_WAV: d->filetype_ = FileType_WAV; break;
case LIBMTP_FILETYPE_MP3: d->filetype_ = FileType_MPEG; break;
case LIBMTP_FILETYPE_WMA: d->filetype_ = FileType_ASF; break;
case LIBMTP_FILETYPE_OGG: d->filetype_ = FileType_OggVorbis; break;
case LIBMTP_FILETYPE_MP4: d->filetype_ = FileType_MP4; break;
case LIBMTP_FILETYPE_AAC: d->filetype_ = FileType_MP4; break;
case LIBMTP_FILETYPE_FLAC: d->filetype_ = FileType_OggFlac; break;
case LIBMTP_FILETYPE_MP2: d->filetype_ = FileType_MPEG; break;
case LIBMTP_FILETYPE_M4A: d->filetype_ = FileType_MP4; break;
default:
d->filetype_ = FileType_Unknown;
d->valid_ = false;
break;
case LIBMTP_FILETYPE_WAV: d->filetype_ = FileType::WAV; break;
case LIBMTP_FILETYPE_MP3: d->filetype_ = FileType::MPEG; break;
case LIBMTP_FILETYPE_WMA: d->filetype_ = FileType::ASF; break;
case LIBMTP_FILETYPE_OGG: d->filetype_ = FileType::OggVorbis; break;
case LIBMTP_FILETYPE_MP4: d->filetype_ = FileType::MP4; break;
case LIBMTP_FILETYPE_AAC: d->filetype_ = FileType::MP4; break;
case LIBMTP_FILETYPE_FLAC: d->filetype_ = FileType::OggFlac; break;
case LIBMTP_FILETYPE_MP2: d->filetype_ = FileType::MPEG; break;
case LIBMTP_FILETYPE_M4A: d->filetype_ = FileType::MP4; break;
default:
d->filetype_ = FileType::Unknown;
d->valid_ = false;
break;
}
}
@@ -1276,14 +1276,14 @@ void Song::ToMTP(LIBMTP_track_t *track) const {
track->usecount = d->playcount_;
switch (d->filetype_) {
case FileType_ASF: track->filetype = LIBMTP_FILETYPE_ASF; break;
case FileType_MP4: track->filetype = LIBMTP_FILETYPE_MP4; break;
case FileType_MPEG: track->filetype = LIBMTP_FILETYPE_MP3; break;
case FileType_FLAC:
case FileType_OggFlac: track->filetype = LIBMTP_FILETYPE_FLAC; break;
case FileType_OggSpeex:
case FileType_OggVorbis: track->filetype = LIBMTP_FILETYPE_OGG; break;
case FileType_WAV: track->filetype = LIBMTP_FILETYPE_WAV; break;
case FileType::ASF: track->filetype = LIBMTP_FILETYPE_ASF; break;
case FileType::MP4: track->filetype = LIBMTP_FILETYPE_MP4; break;
case FileType::MPEG: track->filetype = LIBMTP_FILETYPE_MP3; break;
case FileType::FLAC:
case FileType::OggFlac: track->filetype = LIBMTP_FILETYPE_FLAC; break;
case FileType::OggSpeex:
case FileType::OggVorbis: track->filetype = LIBMTP_FILETYPE_OGG; break;
case FileType::WAV: track->filetype = LIBMTP_FILETYPE_WAV; break;
default: track->filetype = LIBMTP_FILETYPE_UNDEF_AUDIO; break;
}
@@ -1335,7 +1335,7 @@ bool Song::MergeFromSimpleMetaBundle(const Engine::SimpleMetaBundle &bundle) {
if (bundle.length > 0) set_length_nanosec(bundle.length);
if (bundle.year > 0) d->year_ = bundle.year;
if (bundle.track > 0) d->track_ = bundle.track;
if (bundle.filetype != FileType_Unknown) d->filetype_ = bundle.filetype;
if (bundle.filetype != FileType::Unknown) d->filetype_ = bundle.filetype;
if (bundle.samplerate > 0) d->samplerate_ = bundle.samplerate;
if (bundle.bitdepth > 0) d->bitdepth_ = bundle.bitdepth;
if (bundle.bitrate > 0) d->bitrate_ = bundle.bitrate;
@@ -1375,10 +1375,10 @@ void Song::BindToQuery(SqlQuery *query) const {
query->BindIntValue(":samplerate", d->samplerate_);
query->BindIntValue(":bitdepth", d->bitdepth_);
query->BindValue(":source", d->source_);
query->BindValue(":source", static_cast<int>(d->source_));
query->BindNotNullIntValue(":directory_id", d->directory_id_);
query->BindUrlValue(":url", d->url_);
query->BindValue(":filetype", d->filetype_);
query->BindValue(":filetype", static_cast<int>(d->filetype_));
query->BindLongLongValueOrZero(":filesize", d->filesize_);
query->BindLongLongValueOrZero(":mtime", d->mtime_);
query->BindLongLongValueOrZero(":ctime", d->ctime_);
@@ -1564,7 +1564,7 @@ bool Song::IsAllMetadataEqual(const Song &other) const {
}
bool Song::IsEditable() const {
return d->valid_ && d->url_.isValid() && (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 {