1#ifndef MUSICMETADATA_H_
2#define MUSICMETADATA_H_
4#include "libmythbase/mythconfig.h"
12#include <QCoreApplication>
45 m_filename(
""), m_hostname(
""), m_description(
"") {}
47 m_id(image->m_id), m_filename(image->m_filename),
48 m_hostname(image->m_hostname), m_imageType(image->m_imageType),
49 m_description(image->m_description), m_embedded(image->m_embedded) {}
55 bool m_embedded {
false};
79using UrlList = std::array<QString,STREAMURLCOUNT>;
89 explicit MusicMetadata(QString lfilename =
"", QString lartist =
"", QString lcompilation_artist =
"",
90 QString lalbum =
"", QString ltitle =
"", QString lgenre =
"",
91 int lyear = 0,
int ltracknum = 0, std::chrono::milliseconds llength = 0ms,
int lid = 0,
92 int lrating = 0,
int lplaycount = 0, QDateTime llastplay = QDateTime(),
93 QDateTime ldateadded = QDateTime(),
bool lcompilation =
false, QString lformat =
"")
94 : m_artist(std::move(lartist)),
95 m_compilationArtist(std::move(lcompilation_artist)),
96 m_album(std::move(lalbum)),
97 m_title(std::move(ltitle)),
98 m_genre(std::move(lgenre)),
99 m_format(std::move(lformat)),
101 m_trackNum(ltracknum),
104 m_lastPlay(std::move(llastplay)),
105 m_dateAdded(std::move(ldateadded)),
106 m_playCount(lplaycount),
107 m_compilation(lcompilation),
109 m_filename(std::move(lfilename))
114 MusicMetadata(
int lid, QString lbroadcaster, QString lchannel, QString ldescription,
const UrlList &lurls, QString llogourl,
115 QString lgenre, QString lmetaformat, QString lcountry, QString llanguage, QString lformat);
126 QString
Artist()
const {
return m_artist; }
129 const QString &lartist_sort =
nullptr)
133 m_artistSort = lartist_sort;
134 m_formattedArtist.clear(); m_formattedTitle.clear();
141 const QString &lcompilation_artist_sort =
nullptr)
143 m_compilationArtist = lcompilation_artist;
145 m_compilationArtistSort = lcompilation_artist_sort;
146 m_formattedArtist.clear(); m_formattedTitle.clear();
150 QString
Album()
const {
return m_album; }
153 const QString &lalbum_sort =
nullptr)
157 m_albumSort = lalbum_sort;
158 m_formattedArtist.clear(); m_formattedTitle.clear();
162 QString
Title()
const {
return m_title; }
165 const QString <itle_sort =
nullptr)
168 m_titleSort = ltitle_sort;
172 QString FormatArtist();
173 QString FormatTitle();
175 QString
Genre()
const {
return m_genre; }
182 int getDirectoryId();
188 int getCompilationArtistId();
196 int Year()
const {
return m_year; }
199 int Track()
const {
return m_trackNum; }
205 std::chrono::milliseconds
Length()
const {
return m_length; }
206 template <
typename T>
208#if HAVE_IS_DURATION_V
209 requires (std::chrono::__is_duration_v<T>)
211 requires (std::chrono::__is_duration<T>::value)
213 { m_length = llength; }
232 QString Filename(
bool find =
true);
233 void setFilename(
const QString &lfilename);
234 QString getLocalFilename(
void);
242 QString
Format()
const {
return m_format; }
243 void setFormat(
const QString &lformat) { m_format = lformat; }
252 void setLastPlay(
const QDateTime& lastPlay);
261 m_compilation = state;
262 m_formattedArtist.clear();
263 m_formattedTitle.clear();
265 bool determineIfCompilation(
bool cd =
false);
271 void setChannel(
const QString &channel) { m_channel = channel; }
277 void setUrl(
const QString &url,
size_t index = 0);
278 QString Url(
size_t index = 0);
280 void setLogoUrl(
const QString &logourl) { m_logoUrl = logourl; }
286 void setCountry(
const QString &country) { m_country = country; }
289 void setLanguage(
const QString &language) { m_language = language; }
294 void reloadMetadata(
void);
295 void dumpToDatabase(
void);
296 void setField(
const QString &field,
const QString &data);
297 void getField(
const QString& field, QString *data);
298 void toMap(
InfoMap &metadataMap,
const QString &
prefix =
"");
309 static void setArtistAndTrackFormats();
310 static QStringList fillFieldList(
const QString& field);
311 static bool updateStreamList(
void);
314 QString getAlbumArtFile(
void);
319 void reloadAlbumArtImages(
void);
326 void setCompilationFormatting(
bool cd =
false);
327 QString formatReplaceSymbols(
const QString &format);
328 void checkEmptyFields(
void);
329 void ensureSortFields(
void);
330 void saveHostname(
void);
346 int m_trackCount {0};
349 std::chrono::milliseconds m_length {0ms};
351 int m_directoryId {-1};
353 int m_compartistId {-1};
360 int m_tempPlayCount {0};
361 bool m_compilation {
false};
371 uint64_t m_fileSize {0};
372 bool m_changed {
false};
414 :
MThread(
"MetadataLoading"), m_parent(parent_ptr) {}
435 int count()
const {
return m_numPcs; }
438 bool startLoading(
void);
442 void clearCDData(
void);
447 void setCDTitle(
const QString &a_title) { m_cdTitle = a_title; }
451 bool cleanOutThreads();
456 bool isValidID(
int an_id);
472 bool m_doneLoading {
false};
474 int m_playCountMin {0};
475 int m_playCountMax {0};
476 qint64 m_lastPlayMin {0};
477 qint64 m_lastPlayMax {0};
489 void loadStreams(
void);
530 void scanForImages(
void);
535 QStringList getImageFilenames(
void)
const;
539 void dumpToDatabase(
void);
544 static ImageType getImageTypeFromName(
const QString &name);
547 void findImages(
void);
AlbumArtImage(const AlbumArtImage *const image)
AlbumArtList * getImageList(void)
Q_DECLARE_TR_FUNCTIONS(AlbumArtImages)
QStringList getResult(void)
AlbumArtScannerThread(QStringList strList)
void run() override
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
QMap< int, MusicMetadata * > MusicMap
int getCDTrackCount(void) const
MetadataPtrList * getAllCDMetadata(void)
MetadataPtrList * getAllMetadata(void)
Q_DECLARE_TR_FUNCTIONS(AllMusic)
QString getCDTitle(void) const
MetadataPtrList m_allMusic
void setCDTitle(const QString &a_title)
StreamList * getStreams(void)
This is a wrapper around QThread that does several additional things.
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)
QHash< QString, QString > InfoMap
void run(const QString &name, Class *object, void(Class::*fn)())