5 #include <QApplication> 9 #include <QScopedPointer> 10 #include <QDomDocument> 63 UrlList lurls, QString llogourl, QString lgenre, QString lmetaformat,
64 QString lcountry, QString llanguage, QString lformat)
66 m_compilation_artist(
""),
69 m_formattedartist(
""),
85 m_lastplay(QDateTime()),
86 m_templastplay(QDateTime()),
87 m_dateadded(QDateTime()),
92 m_lyricsData(nullptr),
98 m_broadcaster(lbroadcaster),
100 m_description(ldescription),
102 m_metaFormat(lmetaformat),
104 m_language(llanguage)
173 for (
int x = 0; x < 5; x++)
226 query.
prepare(
"UPDATE music_songs set rating = :RATING , " 227 "numplays = :PLAYCOUNT , lastplay = :LASTPLAY " 228 "where song_id = :ID ;");
246 query.
prepare(
"UPDATE music_songs SET hostname = :HOSTNAME " 247 "WHERE song_id = :ID ;");
259 QString sqldir = filename.section(
'/', 0, -2);
261 QString sqlfilename = filename.section(
'/', -1);
265 "SELECT song_id FROM music_songs " 266 "LEFT JOIN music_directories ON music_songs.directory_id=music_directories.directory_id " 267 "WHERE music_songs.filename = :FILENAME " 268 "AND music_directories.path = :DIRECTORY ;");
269 query.
bindValue(
":FILENAME", sqlfilename);
280 LOG(VB_GENERAL, LOG_WARNING,
281 QString(
"MusicMetadata::createFromFilename: Could not find '%1'")
286 int songID = query.
value(0).toInt();
295 query.
prepare(
"SELECT music_artists.artist_name, " 296 "music_comp_artists.artist_name AS compilation_artist, " 297 "music_albums.album_name, music_songs.name, music_genres.genre, " 298 "music_songs.year, music_songs.track, music_songs.length, " 299 "music_songs.song_id, music_songs.rating, music_songs.numplays, " 300 "music_songs.lastplay, music_albums.compilation, music_songs.format, " 301 "music_songs.track_count, music_songs.size, music_songs.date_entered, " 302 "music_songs.disc_number, music_songs.disc_count, " 303 "CONCAT_WS('/', music_directories.path, music_songs.filename) AS filename, " 304 "music_songs.hostname " 306 "LEFT JOIN music_directories ON music_songs.directory_id=music_directories.directory_id " 307 "LEFT JOIN music_artists ON music_songs.artist_id=music_artists.artist_id " 308 "LEFT JOIN music_albums ON music_songs.album_id=music_albums.album_id " 309 "LEFT JOIN music_artists AS music_comp_artists ON music_albums.artist_id=music_comp_artists.artist_id " 310 "LEFT JOIN music_genres ON music_songs.genre_id=music_genres.genre_id " 311 "WHERE music_songs.song_id = :SONGID; ");
340 if (!QHostAddress(mdata->
m_hostname).isNull())
356 GetMythDB()->ClearSetting(
"MusicStreamListModified");
361 LOG(VB_GENERAL, LOG_ERR,
"MusicMetadata: looks like we are already updating the radio streams list");
365 QByteArray compressedData;
366 QByteArray uncompressedData;
375 LOG(VB_GENERAL, LOG_INFO,
"MusicMetadata: radio streams list is already up to date");
381 LOG(VB_GENERAL, LOG_INFO,
"MusicMetadata: downloading radio streams list");
386 LOG(VB_GENERAL, LOG_ERR,
"MusicMetadata: failed to download radio stream list");
401 if (!domDoc.setContent(uncompressedData,
false, &errorMsg,
402 &errorLine, &errorColumn))
404 LOG(VB_GENERAL, LOG_ERR,
405 "MusicMetadata: Could not read content of streams.xml" +
407 QString(
"\n\t\t\tat line: %1 column: %2 msg: %3")
408 .arg(errorLine).arg(errorColumn).arg(errorMsg));
414 query.
prepare(
"DELETE FROM music_streams;");
422 LOG(VB_GENERAL, LOG_INFO,
"MusicMetadata: processing radio streams list");
424 QDomNodeList itemList = domDoc.elementsByTagName(
"item");
427 for (
int i = 0; i < itemList.count(); i++)
429 itemNode = itemList.item(i);
431 query.
prepare(
"INSERT INTO music_streams (broadcaster, channel, description, url1, url2, url3, url4, url5," 432 " logourl, genre, metaformat, country, language) " 433 "VALUES (:BROADCASTER, :CHANNEL, :DESC, :URL1, :URL2, :URL3, :URL4, :URL5," 434 " :LOGOURL, :GENRE, :META, :COUNTRY, :LANG);");
436 query.
bindValue(
":BROADCASTER", itemNode.namedItem(QString(
"broadcaster")).toElement().text());
437 query.
bindValue(
":CHANNEL", itemNode.namedItem(QString(
"channel")).toElement().text());
438 query.
bindValue(
":DESC", itemNode.namedItem(QString(
"description")).toElement().text());
439 query.
bindValue(
":URL1", itemNode.namedItem(QString(
"url1")).toElement().text());
440 query.
bindValue(
":URL2", itemNode.namedItem(QString(
"url2")).toElement().text());
441 query.
bindValue(
":URL3", itemNode.namedItem(QString(
"url3")).toElement().text());
442 query.
bindValue(
":URL4", itemNode.namedItem(QString(
"url4")).toElement().text());
443 query.
bindValue(
":URL5", itemNode.namedItem(QString(
"url5")).toElement().text());
444 query.
bindValue(
":LOGOURL", itemNode.namedItem(QString(
"logourl")).toElement().text());
445 query.
bindValue(
":GENRE", itemNode.namedItem(QString(
"genre")).toElement().text());
446 query.
bindValue(
":META", itemNode.namedItem(QString(
"metadataformat")).toElement().text());
447 query.
bindValue(
":COUNTRY", itemNode.namedItem(QString(
"country")).toElement().text());
448 query.
bindValue(
":LANG", itemNode.namedItem(QString(
"language")).toElement().text());
460 LOG(VB_GENERAL, LOG_INFO,
"MusicMetadata: updating radio streams list completed OK");
471 LOG(VB_GENERAL, LOG_ERR, QString(
"MusicMetadata: Asked to reload metadata " 472 "for trackID: %1 but not found!").arg(
m_id));
492 QString sqldir =
m_filename.section(
'/', 0, -2);
493 QString sqlfilename =
m_filename.section(
'/', -1);
499 if (sqldir.isEmpty())
506 query.
prepare(
"SELECT directory_id FROM music_directories " 507 "WHERE path = :DIRECTORY ;");
521 query.
prepare(
"INSERT INTO music_directories (path) VALUES (:DIRECTORY);");
544 query.
prepare(
"SELECT artist_id FROM music_artists " 545 "WHERE artist_name = :ARTIST ;");
559 query.
prepare(
"INSERT INTO music_artists (artist_name) VALUES (:ARTIST);");
577 query.
prepare(
"SELECT artist_id FROM music_artists " 578 "WHERE artist_name = :ARTIST ;");
591 query.
prepare(
"INSERT INTO music_artists (artist_name) VALUES (:ARTIST);");
613 query.
prepare(
"SELECT album_id FROM music_albums " 614 "WHERE artist_id = :COMP_ARTIST_ID " 615 " AND album_name = :ALBUM ;");
629 query.
prepare(
"INSERT INTO music_albums (artist_id, album_name, compilation, year) " 630 "VALUES (:COMP_ARTIST_ID, :ALBUM, :COMPILATION, :YEAR);");
654 query.
prepare(
"SELECT genre_id FROM music_genres " 655 "WHERE genre = :GENRE ;");
668 query.
prepare(
"INSERT INTO music_genres (genre) VALUES (:GENRE);");
715 strQuery =
"INSERT INTO music_songs ( directory_id," 716 " artist_id, album_id, name, genre_id," 717 " year, track, length, filename," 718 " rating, format, date_entered, date_modified," 719 " numplays, track_count, disc_number, disc_count," 723 " :ARTIST, :ALBUM, :TITLE, :GENRE," 724 " :YEAR, :TRACKNUM, :LENGTH, :FILENAME," 725 " :RATING, :FORMAT, :DATE_ADD, :DATE_MOD," 726 " :PLAYCOUNT,:TRACKCOUNT, :DISC_NUMBER, :DISC_COUNT," 727 " :SIZE, :HOSTNAME );";
731 strQuery =
"UPDATE music_songs SET" 732 " directory_id = :DIRECTORY" 733 ", artist_id = :ARTIST" 734 ", album_id = :ALBUM" 736 ", genre_id = :GENRE" 738 ", track = :TRACKNUM" 740 ", filename = :FILENAME" 743 ", date_modified = :DATE_MOD " 744 ", numplays = :PLAYCOUNT " 745 ", track_count = :TRACKCOUNT " 746 ", disc_number = :DISC_NUMBER " 747 ", disc_count = :DISC_COUNT " 749 ", hostname = :HOSTNAME " 750 "WHERE song_id= :ID ;";
753 QString sqldir =
m_filename.section(
'/', 0, -2);
754 QString sqlfilename =
m_filename.section(
'/', -1);
768 query.
bindValue(
":FILENAME", sqlfilename);
786 MythDB::DBError(
"MusicMetadata::dumpToDatabase - updating music_songs",
797 query.
prepare(
"UPDATE music_albums SET compilation = :COMPILATION, year = :YEAR " 798 "WHERE music_albums.album_id = :ALBUMID");
874 rv.replace(
"TRACK", QString(
"%1").arg(
m_tracknum, 2));
881 m_artist = tr(
"Unknown Artist",
"Default artist if no artist");
886 m_album = tr(
"Unknown Album",
"Default album if no album");
890 m_genre = tr(
"Unknown Genre",
"Default genre if no genre");
910 QString format_artist, format_title;
1006 if (!mythUrl.isEmpty())
1012 QHostAddress(url.host()).isNull())
1022 LOG(VB_GENERAL, LOG_ERR, QString(
"MusicMetadata: Asked to get the filename for a track but no file found: %1")
1044 if (field ==
"artist")
1046 else if (field ==
"compilation_artist")
1048 else if (field ==
"album")
1050 else if (field ==
"title")
1052 else if (field ==
"genre")
1054 else if (field ==
"filename")
1056 else if (field ==
"year")
1058 else if (field ==
"tracknum")
1060 else if (field ==
"trackcount")
1062 else if (field ==
"discnum")
1064 else if (field ==
"disccount")
1066 else if (field ==
"length")
1068 else if (field ==
"compilation")
1072 LOG(VB_GENERAL, LOG_ERR, QString(
"Something asked me to set data " 1073 "for a field called %1").arg(field));
1080 if (field ==
"artist")
1082 else if (field ==
"album")
1084 else if (field ==
"title")
1086 else if (field ==
"genre")
1090 LOG(VB_GENERAL, LOG_ERR, QString(
"Something asked me to return data " 1091 "about a field called %1").arg(field));
1099 metadataMap[
prefix +
"songid"] = QString::number(
m_id);
1124 int eh = len / 3600;
1125 int em = (len / 60) % 60;
1128 metadataMap[
prefix +
"length"] = QString().sprintf(
"%d:%02d:%02d", eh, em, es);
1130 metadataMap[
prefix +
"length"] = QString().sprintf(
"%02d:%02d", em, es);
1133 metadataMap[
prefix +
"lastplayed"] =
1136 metadataMap[
prefix +
"lastplayed"] = tr(
"Never Played");
1144 QString tmpSize = locale.toString(
m_fileSize *
1145 (1.0 / (1024.0 * 1024.0)),
'f', 2);
1146 metadataMap[
prefix +
"filesize"] = tmpSize;
1165 metadataMap[
prefix +
"url"] = url.toString(QUrl::RemoveUserInfo);
1217 for (
int x = 0; x < albumart.size(); x++)
1229 QStringList searchList;
1233 if (
"artist" == field)
1235 query.
prepare(
"SELECT artist_name FROM music_artists ORDER BY artist_name;");
1237 else if (
"compilation_artist" == field)
1239 query.
prepare(
"SELECT DISTINCT artist_name FROM music_artists, music_albums where " 1240 "music_albums.artist_id=music_artists.artist_id ORDER BY artist_name");
1242 else if (
"album" == field)
1244 query.
prepare(
"SELECT album_name FROM music_albums ORDER BY album_name;");
1246 else if (
"title" == field)
1248 query.
prepare(
"SELECT name FROM music_songs ORDER BY name;");
1250 else if (
"genre" == field)
1252 query.
prepare(
"SELECT genre FROM music_genres ORDER BY genre;");
1261 while (query.
next())
1263 searchList << query.
value(0).toString();
1289 if (!res.isEmpty() && albumart_image)
1295 QString path =
GetConfDir() +
"/MythMusic/AlbumArt/";
1297 QString filename = QString(
"%1-%2.%3").arg(
m_id).arg(
"front").arg(fi.suffix());
1299 albumart_image->
filename = path + filename;
1301 if (!QFile::exists(albumart_image->
filename))
1318 if (url.path().isEmpty() || url.host().isEmpty() || url.userName().isEmpty())
1330 QStringList paramList;
1331 paramList.append(QString(
"--songid='%1'").arg(
ID()));
1332 paramList.append(QString(
"--imagetype='%1'").arg(albumart_image->
imageType));
1334 QString command =
"mythutil --extractimage " + paramList.join(
" ");
1344 slist <<
"MUSIC_TAG_GETIMAGE" 1346 << QString::number(
ID())
1347 << QString::number(albumart_image->
imageType);
1403 if (!filename.isEmpty())
1405 LOG(VB_FILE, LOG_INFO, QString(
"MusicMetadata::getTagger - creating tagger for %1").arg(filename));
1409 LOG(VB_GENERAL, LOG_ERR, QString(
"MusicMetadata::getTagger - failed to find %1 on the local filesystem").arg(
Filename(
false)));
1416 MThread(
"MetadataLoading"), parent(parent_ptr)
1432 m_metadata_loader(nullptr),
1433 m_done_loading(
false),
1437 #if QT_VERSION < QT_VERSION_CHECK(5,8,0)
1514 uint added = 0, removed = 0, changed = 0;
1518 QString aquery =
"SELECT music_songs.song_id, music_artists.artist_id, music_artists.artist_name, " 1519 "music_comp_artists.artist_name AS compilation_artist, " 1520 "music_albums.album_id, music_albums.album_name, music_songs.name, music_genres.genre, music_songs.year, " 1521 "music_songs.track, music_songs.length, music_songs.directory_id, " 1522 "CONCAT_WS('/', music_directories.path, music_songs.filename) AS filename, " 1523 "music_songs.rating, music_songs.numplays, music_songs.lastplay, music_songs.date_entered, " 1524 "music_albums.compilation, music_songs.format, music_songs.track_count, " 1525 "music_songs.size, music_songs.hostname, music_songs.disc_number, music_songs.disc_count " 1527 "LEFT JOIN music_directories ON music_songs.directory_id=music_directories.directory_id " 1528 "LEFT JOIN music_artists ON music_songs.artist_id=music_artists.artist_id " 1529 "LEFT JOIN music_albums ON music_songs.album_id=music_albums.album_id " 1530 "LEFT JOIN music_artists AS music_comp_artists ON music_albums.artist_id=music_comp_artists.artist_id " 1531 "LEFT JOIN music_genres ON music_songs.genre_id=music_genres.genre_id " 1532 "ORDER BY music_songs.song_id;";
1534 QString filename, artist, album, title, compartist;
1537 if (!query.
exec(aquery))
1542 QList<MusicMetadata::IdType> idList;
1546 while (query.
next())
1553 query.
value(12).toString(),
1554 query.
value(2).toString(),
1555 query.
value(3).toString(),
1556 query.
value(5).toString(),
1557 query.
value(6).toString(),
1558 query.
value(7).toString(),
1559 query.
value(8).toInt(),
1560 query.
value(9).toInt(),
1561 query.
value(10).toInt(),
1562 query.
value(0).toInt(),
1563 query.
value(13).toInt(),
1564 query.
value(14).toInt(),
1565 query.
value(15).toDateTime(),
1566 query.
value(16).toDateTime(),
1567 (query.
value(17).toInt() > 0),
1568 query.
value(18).toString());
1595 if (cacheMeta && !cacheMeta->
compare(dbMeta))
1606 if (query.
at() == 0)
1610 #if QT_VERSION < QT_VERSION_CHECK(5,8,0) 1618 int playCount = query.
value(13).toInt();
1619 #if QT_VERSION < QT_VERSION_CHECK(5,8,0) 1620 double lastPlay = query.
value(14).toDateTime().toTime_t();
1622 qint64 lastPlay = query.
value(14).toDateTime().toSecsSinceEpoch();
1635 LOG(VB_GENERAL, LOG_ERR,
"MythMusic hasn't found any tracks!");
1639 QList<MusicMetadata::IdType> deleteList;
1649 for (
int x = 0; x < deleteList.size(); x++)
1660 LOG(VB_GENERAL, LOG_DEBUG, QString(
"AllMusic::resync sending MUSIC_RESYNC_FINISHED added: %1, removed: %2, changed: %3")
1661 .arg(added).arg(removed).arg(changed));
1687 *mdata = *the_track;
1697 MetadataPtrList::iterator it =
m_all_music.begin();
1700 if ((*it)->hasChanged())
1743 MetadataPtrList::iterator anit;
1746 if ((*anit)->Track() == the_track)
1801 QString aquery =
"SELECT intid, broadcaster, channel, description, url1, url2, url3, url4, url5," 1802 "logourl, genre, metaformat, country, language, format " 1803 "FROM music_radios " 1804 "ORDER BY broadcaster,channel;";
1807 if (!query.
exec(aquery))
1812 while (query.
next())
1816 urls[x] = query.
value(4 + x).toString();
1819 query.
value(0).toInt(),
1820 query.
value(1).toString(),
1821 query.
value(2).toString(),
1822 query.
value(3).toString(),
1824 query.
value(9).toString(),
1825 query.
value(10).toString(),
1826 query.
value(11).toString(),
1827 query.
value(12).toString(),
1828 query.
value(13).toString(),
1829 query.
value(14).toString());
1838 LOG(VB_GENERAL, LOG_WARNING,
"MythMusic hasn't found any radio streams!");
1846 query.
prepare(
"INSERT INTO music_radios (broadcaster, channel, description, " 1847 "url1, url2, url3, url4, url5, " 1848 "logourl, genre, country, language, format, metaformat) " 1849 "VALUES (:BROADCASTER, :CHANNEL, :DESCRIPTION, :URL1, :URL2, :URL3, :URL4, :URL5, " 1850 ":LOGOURL, :GENRE, :COUNTRY, :LANGUAGE, :FORMAT, :METAFORMAT);");
1883 query.prepare(
"DELETE FROM music_radios WHERE intid = :ID");
1884 query.bindValue(
":ID",
id);
1886 if (!query.exec() || query.numRowsAffected() <= 0)
1900 query.prepare(
"UPDATE music_radios set broadcaster = :BROADCASTER, channel = :CHANNEL, description = :DESCRIPTION, " 1901 "url1 = :URL1, url2 = :URL2, url3 = :URL3, url4 = :URL4, url5 = :URL5, " 1902 "logourl = :LOGOURL, genre = :GENRE, country = :COUNTRY, language = :LANGUAGE, " 1903 "format = :FORMAT, metaformat = :METAFORMAT " 1904 "WHERE intid = :ID");
1905 query.bindValue(
":BROADCASTER", mdata->
Broadcaster());
1906 query.bindValue(
":CHANNEL", mdata->
Channel());
1907 query.bindValue(
":DESCRIPTION", mdata->
Description());
1908 query.bindValue(
":URL1", mdata->
Url(0));
1909 query.bindValue(
":URL2", mdata->
Url(1));
1910 query.bindValue(
":URL3", mdata->
Url(2));
1911 query.bindValue(
":URL4", mdata->
Url(3));
1912 query.bindValue(
":URL5", mdata->
Url(4));
1913 query.bindValue(
":LOGOURL", mdata->
LogoUrl());
1914 query.bindValue(
":GENRE", mdata->
Genre());
1915 query.bindValue(
":COUNTRY", mdata->
Country());
1916 query.bindValue(
":LANGUAGE", mdata->
Language());
1917 query.bindValue(
":FORMAT", mdata->
Format());
1919 query.bindValue(
":ID",
id);
1921 if (!query.exec() || !query.isActive() || query.numRowsAffected() <= 0)
1933 : m_parent(metadata)
1966 query.
prepare(
"SELECT logourl FROM music_radios WHERE url1 = :URL;");
1970 while (query.
next())
1972 QString logoUrl = query.
value(0).toString();
1990 QString dir = fi.path();
1993 query.
prepare(
"SELECT albumart_id, CONCAT_WS('/', music_directories.path, " 1994 "music_albumart.filename), music_albumart.filename, music_albumart.imagetype, " 1995 "music_albumart.embedded, music_albumart.hostname " 1996 "FROM music_albumart " 1997 "LEFT JOIN music_directories ON " 1998 "music_directories.directory_id = music_albumart.directory_id " 1999 "WHERE music_directories.path = :DIR " 2000 "OR song_id = :SONGID " 2001 "ORDER BY music_albumart.imagetype;");
2006 while (query.
next())
2009 bool embedded = (query.
value(4).toInt() == 1);
2010 image->
id = query.
value(0).toInt();
2016 if (url.scheme() ==
"myth")
2018 QString(
"AlbumArt/") + query.
value(1).toString(),
2025 if (url.scheme() ==
"myth")
2027 query.
value(1).toString(),
2043 if (
findIcon(
"artist", artist) != QString())
2060 popupStack,
"scanbusydialog");
2072 QStringList strList;
2073 strList <<
"MUSIC_FIND_ALBUMART" 2079 scanThread->start();
2081 while (scanThread->isRunning())
2083 qApp->processEvents();
2087 strList = scanThread->getResult();
2100 for (
int x = 2; x < strList.count(); x += 6)
2103 image->
id = strList[x].toInt();
2105 image->
embedded = (strList[x + 2].toInt() == 1);
2111 QString(
"AlbumArt/") + strList[x + 4],
2123 LOG(VB_FILE, LOG_INFO,
"AlbumArtImages::scanForImages found image");
2124 LOG(VB_FILE, LOG_INFO, QString(
"ID: %1").arg(image->
id));
2125 LOG(VB_FILE, LOG_INFO, QString(
"ImageType: %1").arg(image->
imageType));
2126 LOG(VB_FILE, LOG_INFO, QString(
"Embedded: %1").arg(image->
embedded));
2127 LOG(VB_FILE, LOG_INFO, QString(
"Description: %1").arg(image->
description));
2128 LOG(VB_FILE, LOG_INFO, QString(
"Filename: %1").arg(image->
filename));
2129 LOG(VB_FILE, LOG_INFO, QString(
"Hostname: %1").arg(image->
hostname));
2130 LOG(VB_FILE, LOG_INFO,
"-------------------------------");
2143 if ((*it)->imageType ==
type)
2155 if ((*it)->id == imageID)
2166 AlbumArtList::const_iterator it =
m_imageList.begin();
2168 paths += (*it)->filename;
2185 static const char* type_strings[] = {
2186 QT_TR_NOOP(
"Unknown"),
2187 QT_TR_NOOP(
"Front Cover"),
2188 QT_TR_NOOP(
"Back Cover"),
2190 QT_TR_NOOP(
"Inlay"),
2191 QT_TR_NOOP(
"Artist"),
2194 return QCoreApplication::translate(
"AlbumArtImages",
2195 type_strings[
type]);
2202 static const char* filename_strings[] = {
2203 QT_TR_NOOP(
"unknown"),
2204 QT_TR_NOOP(
"front"),
2207 QT_TR_NOOP(
"inlay"),
2208 QT_TR_NOOP(
"artist")
2211 return QCoreApplication::translate(
"AlbumArtImages",
2212 filename_strings[
type]);
2220 if (filename.contains(
"front", Qt::CaseInsensitive) ||
2221 filename.contains(tr(
"front"), Qt::CaseInsensitive))
2223 else if (filename.contains(
"back", Qt::CaseInsensitive) ||
2224 filename.contains(tr(
"back"), Qt::CaseInsensitive))
2226 else if (filename.contains(
"inlay", Qt::CaseInsensitive) ||
2227 filename.contains(tr(
"inlay"), Qt::CaseInsensitive))
2229 else if (filename.contains(
"cd", Qt::CaseInsensitive) ||
2230 filename.contains(tr(
"cd"), Qt::CaseInsensitive))
2232 else if (filename.contains(
"cover", Qt::CaseInsensitive) ||
2233 filename.contains(tr(
"cover"), Qt::CaseInsensitive))
2244 if (
name.toLower() ==
"front")
2246 else if (
name.toLower() ==
"back")
2248 else if (
name.toLower() ==
"inlay")
2250 else if (
name.toLower() ==
"cd")
2252 else if (
name.toLower() ==
"artist")
2254 else if (
name.toLower() ==
"unknown")
2268 if ((*it)->imageType == newImage.
imageType && (*it)->embedded == newImage.
embedded)
2299 if (trackID == 0 || directoryID == -1)
2301 LOG(VB_GENERAL, LOG_ERR,
"AlbumArtImages: Asked to save to the DB but " 2302 "have invalid songid or directoryid");
2309 query.
prepare(
"DELETE FROM music_albumart " 2310 "WHERE song_id = :SONGID " 2311 "OR (embedded = 0 AND directory_id = :DIRECTORYID)");
2314 query.
bindValue(
":DIRECTORYID", directoryID);
2319 "deleting existing albumart", query);
2335 query.
prepare(
"INSERT INTO music_albumart ( albumart_id, " 2336 "filename, imagetype, song_id, directory_id, embedded, hostname ) " 2337 "VALUES ( :ID, :FILENAME, :TYPE, :SONGID, :DIRECTORYID, :EMBED, :HOSTNAME );");
2342 query.
prepare(
"INSERT INTO music_albumart ( filename, " 2343 "imagetype, song_id, directory_id, embedded, hostname ) VALUES ( " 2344 ":FILENAME, :TYPE, :SONGID, :DIRECTORYID, :EMBED, :HOSTNAME );");
2348 query.
bindValue(
":FILENAME", fi.fileName());
2358 "add/update music_albumart", query);
void RunEpilog(void)
Cleans up a thread's resources, call this if you reimplement run().
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
void start(QThread::Priority=QThread::InheritPriority)
Tell MThread to start running the thread in the near future.
bool checkCDTrack(MusicMetadata *the_track)
avoid disabling UI drawing
AlbumArtImages(MusicMetadata *metadata, bool loadFromDB=true)
This is a wrapper around QThread that does several additional things.
void bindValue(const QString &placeholder, const QVariant &val)
void addCDTrack(const MusicMetadata &the_track)
automatically delete if backgrounded
QString GenMythURL(QString host=QString(), QString port=QString(), QString path=QString(), QString storageGroup=QString())
QDateTime lastUpdate(GrabberScript *script)
void updateStream(MusicMetadata *mdata)
QSqlQuery wrapper that fetches a DB connection from the connection pool.
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)
bool wait(unsigned long time=ULONG_MAX)
Wait for the MThread to exit, with a maximum timeout.
run child in the background
static QString FindFile(const QString &filename, const QString &host, const QString &storageGroup, bool useRegex=false, bool allowFallback=false)
Search all BE's for a file in the give storage group.
void addStream(MusicMetadata *mdata)
const QLocale GetQLocale(void)
bool startLoading(void)
Start loading metadata.
static QString getTypeFilename(ImageType type)
static MythSystem * Create(const QStringList &args, uint flags=kMSNone, QString startPath=QString(), Priority cpuPriority=kInheritPriority, Priority diskPriority=kInheritPriority)
MythScreenStack * GetStack(const QString &stackname)
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
static QString getTypeName(ImageType type)
void save()
Check each MusicMetadata entry and save those that have changed (ratings, etc.)
AlbumArtList * getImageList(void)
AlbumArtImage * getImageByID(int imageID)
QDateTime as_utc(const QDateTime &old_dt)
Returns copy of QDateTime with TimeSpec set to UTC.
void SendMessage(const QString &message)
process events while waiting
bool isValidID(MusicMetadata::IdType an_id)
QVariant value(int i) const
bool SendReceiveStringList(QStringList &strlist, bool quickTimeout=false, bool block=true)
Send a message to the backend and wait for a response.
bool updateMetadata(int an_id, MusicMetadata *the_track)
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
bool Create(void) override
MusicMetadata * getMetadata(int an_id)
QVariant lastInsertId()
Return the id of the last inserted row.
QHash< QString, QString > InfoMap
static ImageType getImageTypeFromName(const QString &name)
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
QString GetSetting(const QString &key, const QString &defaultval="")
MusicMetadata * getMetadata(MusicMetadata::IdType an_id)
QString findIcon(const QString &type, const QString &name, bool ignoreCache)
find an image for a artist or genre
QByteArray gzipUncompress(const QByteArray &data)
bool isActive(void) const
MythDownloadManager * GetMythDownloadManager(void)
Gets the pointer to the MythDownloadManager singleton.
bool download(const QString &url, const QString &dest, const bool reload=false)
Downloads a URL to a file in blocking mode.
QString GetMasterHostName(void)
QDateTime GetLastModified(const QString &url)
Gets the Last Modified timestamp for a URI.
static MSqlQueryInfo InitCon(ConnectionReuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Do Today/Yesterday/Tomorrow transform.
void resync()
resync our cache with the database
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
MythMainWindow * GetMythMainWindow(void)
static ImageType guessImageType(const QString &filename)
AlbumArtImage * getImageAt(uint index)
void dumpToDatabase(void)
saves or updates the image details in the DB
static bool Exists(const QString &url, struct stat *fileinfo)
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
#define LOG(_MASK_, _LEVEL_, _STRING_)
QStringList getImageFilenames(void) const
AlbumArtImage * getImage(ImageType type)
QString FindFile(const QString &filename)
void RunProlog(void)
Sets up a thread, call this if you reimplement run().
MusicMetadata * getCDMetadata(int m_the_track)
int numRowsAffected() const
bool isFinished(void) const
Add year to string if not included.
void removeStream(MusicMetadata *mdata)
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
bool isValidID(int an_id)
bool SaveSettingOnHost(const QString &key, const QString &newValue, const QString &host)
static void DBError(const QString &where, const MSqlQuery &query)
bool IsMasterBackend(void)
is this the actual MBE process
QString GetHostName(void)
MetadataPtrList m_all_music
void addImage(const AlbumArtImage &newImage)
QDateTime fromString(const QString &dtstr)
Converts kFilename && kISODate formats to QDateTime.
avoid blocking LIRC & Joystick Menu
std::shared_ptr< MythSortHelper > getMythSortHelper(void)
Get a pointer to the MythSortHelper singleton.
MetadataLoadingThread * m_metadata_loader