5 #include <QApplication>
8 #include <QDomDocument>
9 #include <QScopedPointer>
52 const UrlList &lurls, QString llogourl, QString lgenre, QString lmetaformat,
53 QString lcountry, QString llanguage, QString lformat)
54 : m_genre(
std::move(lgenre)),
55 m_format(
std::move(lformat)),
58 m_broadcaster(
std::move(lbroadcaster)),
59 m_channel(
std::move(lchannel)),
60 m_description(
std::move(ldescription)),
62 m_logoUrl(
std::move(llogourl)),
63 m_metaFormat(
std::move(lmetaformat)),
64 m_country(
std::move(lcountry)),
65 m_language(
std::move(llanguage))
189 query.
prepare(
"UPDATE music_songs set rating = :RATING , "
190 "numplays = :PLAYCOUNT , lastplay = :LASTPLAY "
191 "where song_id = :ID ;");
209 query.
prepare(
"UPDATE music_songs SET hostname = :HOSTNAME "
210 "WHERE song_id = :ID ;");
222 QString sqldir =
filename.section(
'/', 0, -2);
224 QString sqlfilename =
filename.section(
'/', -1);
228 "SELECT song_id FROM music_songs "
229 "LEFT JOIN music_directories ON music_songs.directory_id=music_directories.directory_id "
230 "WHERE music_songs.filename = :FILENAME "
231 "AND music_directories.path = :DIRECTORY ;");
232 query.
bindValue(
":FILENAME", sqlfilename);
243 LOG(VB_GENERAL, LOG_WARNING,
244 QString(
"MusicMetadata::createFromFilename: Could not find '%1'")
249 int songID = query.
value(0).toInt();
258 query.
prepare(
"SELECT music_artists.artist_name, "
259 "music_comp_artists.artist_name AS compilation_artist, "
260 "music_albums.album_name, music_songs.name, music_genres.genre, "
261 "music_songs.year, music_songs.track, music_songs.length, "
262 "music_songs.song_id, music_songs.rating, music_songs.numplays, "
263 "music_songs.lastplay, music_albums.compilation, music_songs.format, "
264 "music_songs.track_count, music_songs.size, music_songs.date_entered, "
265 "music_songs.disc_number, music_songs.disc_count, "
266 "CONCAT_WS('/', music_directories.path, music_songs.filename) AS filename, "
267 "music_songs.hostname "
269 "LEFT JOIN music_directories ON music_songs.directory_id=music_directories.directory_id "
270 "LEFT JOIN music_artists ON music_songs.artist_id=music_artists.artist_id "
271 "LEFT JOIN music_albums ON music_songs.album_id=music_albums.album_id "
272 "LEFT JOIN music_artists AS music_comp_artists ON music_albums.artist_id=music_comp_artists.artist_id "
273 "LEFT JOIN music_genres ON music_songs.genre_id=music_genres.genre_id "
274 "WHERE music_songs.song_id = :SONGID; ");
280 mdata->m_artist = query.
value(0).toString();
281 mdata->m_compilationArtist = query.
value(1).toString();
282 mdata->m_album = query.
value(2).toString();
283 mdata->m_title = query.
value(3).toString();
284 mdata->m_genre = query.
value(4).toString();
285 mdata->m_year = query.
value(5).toInt();
286 mdata->m_trackNum = query.
value(6).toInt();
287 mdata->m_length = std::chrono::milliseconds(query.
value(7).toInt());
288 mdata->m_id = query.
value(8).toUInt();
289 mdata->m_rating = query.
value(9).toInt();
290 mdata->m_playCount = query.
value(10).toInt();
291 mdata->m_lastPlay = query.
value(11).toDateTime();
292 mdata->m_compilation = (query.
value(12).toInt() > 0);
293 mdata->m_format = query.
value(13).toString();
294 mdata->m_trackCount = query.
value(14).toInt();
295 mdata->m_fileSize = query.
value(15).toULongLong();
296 mdata->m_dateAdded = query.
value(16).toDateTime();
297 mdata->m_discNum = query.
value(17).toInt();
298 mdata->m_discCount = query.
value(18).toInt();
299 mdata->m_filename = query.
value(19).toString();
300 mdata->m_hostname = query.
value(20).toString();
301 mdata->ensureSortFields();
303 if (!QHostAddress(mdata->m_hostname).isNull())
305 mdata->m_hostname =
"";
306 mdata->saveHostname();
319 GetMythDB()->ClearSetting(
"MusicStreamListModified");
324 LOG(VB_GENERAL, LOG_ERR,
"MusicMetadata: looks like we are already updating the radio streams list");
328 QByteArray compressedData;
329 QByteArray uncompressedData;
338 LOG(VB_GENERAL, LOG_INFO,
"MusicMetadata: radio streams list is already up to date");
344 LOG(VB_GENERAL, LOG_INFO,
"MusicMetadata: downloading radio streams list");
349 LOG(VB_GENERAL, LOG_ERR,
"MusicMetadata: failed to download radio stream list");
364 if (!domDoc.setContent(uncompressedData,
false, &errorMsg,
365 &errorLine, &errorColumn))
367 LOG(VB_GENERAL, LOG_ERR,
368 "MusicMetadata: Could not read content of streams.xml" +
370 QString(
"\n\t\t\tat line: %1 column: %2 msg: %3")
371 .arg(errorLine).arg(errorColumn).arg(errorMsg));
377 query.
prepare(
"DELETE FROM music_streams;");
385 LOG(VB_GENERAL, LOG_INFO,
"MusicMetadata: processing radio streams list");
387 QDomNodeList itemList = domDoc.elementsByTagName(
"item");
390 for (
int i = 0; i < itemList.count(); i++)
392 itemNode = itemList.item(i);
394 query.
prepare(
"INSERT INTO music_streams (broadcaster, channel, description, url1, url2, url3, url4, url5,"
395 " logourl, genre, metaformat, country, language) "
396 "VALUES (:BROADCASTER, :CHANNEL, :DESC, :URL1, :URL2, :URL3, :URL4, :URL5,"
397 " :LOGOURL, :GENRE, :META, :COUNTRY, :LANG);");
399 query.
bindValue(
":BROADCASTER", itemNode.namedItem(QString(
"broadcaster")).toElement().text());
400 query.
bindValue(
":CHANNEL", itemNode.namedItem(QString(
"channel")).toElement().text());
401 query.
bindValue(
":DESC", itemNode.namedItem(QString(
"description")).toElement().text());
402 query.
bindValue(
":URL1", itemNode.namedItem(QString(
"url1")).toElement().text());
403 query.
bindValue(
":URL2", itemNode.namedItem(QString(
"url2")).toElement().text());
404 query.
bindValue(
":URL3", itemNode.namedItem(QString(
"url3")).toElement().text());
405 query.
bindValue(
":URL4", itemNode.namedItem(QString(
"url4")).toElement().text());
406 query.
bindValue(
":URL5", itemNode.namedItem(QString(
"url5")).toElement().text());
407 query.
bindValue(
":LOGOURL", itemNode.namedItem(QString(
"logourl")).toElement().text());
408 query.
bindValue(
":GENRE", itemNode.namedItem(QString(
"genre")).toElement().text());
409 query.
bindValue(
":META", itemNode.namedItem(QString(
"metadataformat")).toElement().text());
410 query.
bindValue(
":COUNTRY", itemNode.namedItem(QString(
"country")).toElement().text());
411 query.
bindValue(
":LANG", itemNode.namedItem(QString(
"language")).toElement().text());
423 LOG(VB_GENERAL, LOG_INFO,
"MusicMetadata: updating radio streams list completed OK");
434 LOG(VB_GENERAL, LOG_ERR, QString(
"MusicMetadata: Asked to reload metadata "
435 "for trackID: %1 but not found!").arg(
m_id));
455 QString sqldir =
m_filename.section(
'/', 0, -2);
461 if (sqldir.isEmpty())
468 query.
prepare(
"SELECT directory_id FROM music_directories "
469 "WHERE path = :DIRECTORY ;");
483 query.
prepare(
"INSERT INTO music_directories (path) VALUES (:DIRECTORY);");
506 query.
prepare(
"SELECT artist_id FROM music_artists "
507 "WHERE artist_name = :ARTIST ;");
521 query.
prepare(
"INSERT INTO music_artists (artist_name) VALUES (:ARTIST);");
548 query.
prepare(
"SELECT artist_id FROM music_artists "
549 "WHERE artist_name = :ARTIST ;");
562 query.
prepare(
"INSERT INTO music_artists (artist_name) VALUES (:ARTIST);");
584 query.
prepare(
"SELECT album_id FROM music_albums "
585 "WHERE artist_id = :COMP_ARTIST_ID "
586 " AND album_name = :ALBUM ;");
600 query.
prepare(
"INSERT INTO music_albums (artist_id, album_name, compilation, year) "
601 "VALUES (:COMP_ARTIST_ID, :ALBUM, :COMPILATION, :YEAR);");
625 query.
prepare(
"SELECT genre_id FROM music_genres "
626 "WHERE genre = :GENRE ;");
639 query.
prepare(
"INSERT INTO music_genres (genre) VALUES (:GENRE);");
691 strQuery =
"INSERT INTO music_songs ( directory_id,"
692 " artist_id, album_id, name, genre_id,"
693 " year, track, length, filename,"
694 " rating, format, date_entered, date_modified,"
695 " numplays, track_count, disc_number, disc_count,"
699 " :ARTIST, :ALBUM, :TITLE, :GENRE,"
700 " :YEAR, :TRACKNUM, :LENGTH, :FILENAME,"
701 " :RATING, :FORMAT, :DATE_ADD, :DATE_MOD,"
702 " :PLAYCOUNT,:TRACKCOUNT, :DISC_NUMBER, :DISC_COUNT,"
703 " :SIZE, :HOSTNAME );";
707 strQuery =
"UPDATE music_songs SET"
708 " directory_id = :DIRECTORY"
709 ", artist_id = :ARTIST"
710 ", album_id = :ALBUM"
712 ", genre_id = :GENRE"
714 ", track = :TRACKNUM"
716 ", filename = :FILENAME"
719 ", date_modified = :DATE_MOD "
720 ", numplays = :PLAYCOUNT "
721 ", track_count = :TRACKCOUNT "
722 ", disc_number = :DISC_NUMBER "
723 ", disc_count = :DISC_COUNT "
725 ", hostname = :HOSTNAME "
726 "WHERE song_id= :ID ;";
729 QString sqlfilename =
m_filename.section(
'/', -1);
743 query.
bindValue(
":FILENAME", sqlfilename);
761 MythDB::DBError(
"MusicMetadata::dumpToDatabase - updating music_songs",
772 query.
prepare(
"UPDATE music_albums SET album_name = :ALBUM_NAME, "
773 "artist_id = :COMP_ARTIST_ID, compilation = :COMPILATION, "
775 "WHERE music_albums.album_id = :ALBUMID");
853 rv.replace(
"TRACK", QString(
"%1").arg(
m_trackNum, 2));
861 m_artist = tr(
"Unknown Artist",
"Default artist if no artist");
872 m_album = tr(
"Unknown Album",
"Default album if no album");
879 m_genre = tr(
"Unknown Genre",
"Default genre if no genre");
901 QString format_artist;
902 QString format_title;
998 if (!mythUrl.isEmpty())
1004 QHostAddress(url.host()).isNull())
1014 LOG(VB_GENERAL, LOG_ERR, QString(
"MusicMetadata: Asked to get the filename for a track but no file found: %1")
1036 if (field ==
"artist")
1038 else if (field ==
"compilation_artist")
1040 else if (field ==
"album")
1042 else if (field ==
"title")
1044 else if (field ==
"genre")
1046 else if (field ==
"filename")
1048 else if (field ==
"year")
1050 else if (field ==
"tracknum")
1052 else if (field ==
"trackcount")
1054 else if (field ==
"discnum")
1056 else if (field ==
"disccount")
1058 else if (field ==
"length")
1059 m_length = std::chrono::milliseconds(data.toInt());
1060 else if (field ==
"compilation")
1064 LOG(VB_GENERAL, LOG_ERR, QString(
"Something asked me to set data "
1065 "for a field called %1").arg(field));
1072 if (field ==
"artist")
1074 else if (field ==
"album")
1076 else if (field ==
"title")
1078 else if (field ==
"genre")
1082 LOG(VB_GENERAL, LOG_ERR, QString(
"Something asked me to return data "
1083 "about a field called %1").arg(field));
1091 metadataMap[
prefix +
"songid"] = QString::number(
m_id);
1115 QString fmt = (
m_length >= 1h) ?
"H:mm:ss" :
"mm:ss";
1120 metadataMap[
prefix +
"lastplayed"] =
1125 metadataMap[
prefix +
"lastplayed"] = tr(
"Never Played");
1134 QString tmpSize = locale.toString(
m_fileSize *
1135 (1.0 / (1024.0 * 1024.0)),
'f', 2);
1136 metadataMap[
prefix +
"filesize"] = tmpSize;
1155 metadataMap[
prefix +
"url"] = url.toString(QUrl::RemoveUserInfo);
1207 for (
auto *art : std::as_const(albumart))
1209 art->m_filename = QString(
"%1-%2").arg(
m_id).arg(art->m_filename);
1218 QStringList searchList;
1222 if (
"artist" == field)
1224 query.
prepare(
"SELECT artist_name FROM music_artists ORDER BY artist_name;");
1226 else if (
"compilation_artist" == field)
1228 query.
prepare(
"SELECT DISTINCT artist_name FROM music_artists, music_albums where "
1229 "music_albums.artist_id=music_artists.artist_id ORDER BY artist_name");
1231 else if (
"album" == field)
1233 query.
prepare(
"SELECT album_name FROM music_albums ORDER BY album_name;");
1235 else if (
"title" == field)
1237 query.
prepare(
"SELECT name FROM music_songs ORDER BY name;");
1239 else if (
"genre" == field)
1241 query.
prepare(
"SELECT genre FROM music_genres ORDER BY genre;");
1250 while (query.
next())
1252 searchList << query.
value(0).toString();
1269 if (albumart_image ==
nullptr)
1276 if (!res.isEmpty() && albumart_image)
1282 QString path =
GetConfDir() +
"/MythMusic/AlbumArt/";
1284 QString
filename = QString(
"%1-%2.%3").arg(
m_id).arg(
"front", fi.suffix());
1288 if (!QFile::exists(albumart_image->
m_filename))
1300 else if (repo ==
RT_CD)
1310 if (url.path().isEmpty() || url.host().isEmpty() || url.userName().isEmpty())
1322 QStringList paramList;
1323 paramList.append(QString(
"--songid='%1'").arg(
ID()));
1324 paramList.append(QString(
"--imagetype='%1'").arg(albumart_image->
m_imageType));
1326 QString command =
"mythutil --extractimage " + paramList.join(
" ");
1336 slist <<
"MUSIC_TAG_GETIMAGE"
1338 << QString::number(
ID())
1397 LOG(VB_FILE, LOG_INFO, QString(
"MusicMetadata::getTagger - creating tagger for %1").arg(
filename));
1401 LOG(VB_GENERAL, LOG_ERR, QString(
"MusicMetadata::getTagger - failed to find %1 on the local filesystem").arg(
Filename(
false)));
1424 while (!m_allMusic.empty())
1426 delete m_allMusic.back();
1427 m_allMusic.pop_back();
1430 while (!m_cdData.empty())
1432 delete m_cdData.back();
1433 m_cdData.pop_back();
1436 m_metadataLoader->wait();
1437 delete m_metadataLoader;
1446 if (m_metadataLoader->isFinished())
1451 m_metadataLoader->wait();
1470 m_doneLoading =
false;
1472 if (m_metadataLoader)
1475 delete m_metadataLoader;
1479 m_metadataLoader->start();
1491 m_doneLoading =
false;
1493 QString aquery =
"SELECT music_songs.song_id, music_artists.artist_id, music_artists.artist_name, "
1494 "music_comp_artists.artist_name AS compilation_artist, "
1495 "music_albums.album_id, music_albums.album_name, music_songs.name, music_genres.genre, music_songs.year, "
1496 "music_songs.track, music_songs.length, music_songs.directory_id, "
1497 "CONCAT_WS('/', music_directories.path, music_songs.filename) AS filename, "
1498 "music_songs.rating, music_songs.numplays, music_songs.lastplay, music_songs.date_entered, "
1499 "music_albums.compilation, music_songs.format, music_songs.track_count, "
1500 "music_songs.size, music_songs.hostname, music_songs.disc_number, music_songs.disc_count "
1502 "LEFT JOIN music_directories ON music_songs.directory_id=music_directories.directory_id "
1503 "LEFT JOIN music_artists ON music_songs.artist_id=music_artists.artist_id "
1504 "LEFT JOIN music_albums ON music_songs.album_id=music_albums.album_id "
1505 "LEFT JOIN music_artists AS music_comp_artists ON music_albums.artist_id=music_comp_artists.artist_id "
1506 "LEFT JOIN music_genres ON music_songs.genre_id=music_genres.genre_id "
1507 "ORDER BY music_songs.song_id;";
1510 if (!query.
exec(aquery))
1513 m_numPcs = query.
size() * 2;
1515 QList<MusicMetadata::IdType> idList;
1519 while (query.
next())
1526 query.
value(12).toString(),
1527 query.
value(2).toString(),
1528 query.
value(3).toString(),
1529 query.
value(5).toString(),
1530 query.
value(6).toString(),
1531 query.
value(7).toString(),
1532 query.
value(8).toInt(),
1533 query.
value(9).toInt(),
1534 std::chrono::milliseconds(query.
value(10).toInt()),
1535 query.
value(0).toInt(),
1536 query.
value(13).toInt(),
1537 query.
value(14).toInt(),
1538 query.
value(15).toDateTime(),
1539 query.
value(16).toDateTime(),
1540 (query.
value(17).toInt() > 0),
1541 query.
value(18).toString());
1543 dbMeta->setDirectoryId(query.
value(11).toInt());
1544 dbMeta->setArtistId(query.
value(1).toInt());
1545 dbMeta->setCompilationArtistId(query.
value(3).toInt());
1546 dbMeta->setAlbumId(query.
value(4).toInt());
1547 dbMeta->setTrackCount(query.
value(19).toInt());
1548 dbMeta->setFileSize(query.
value(20).toULongLong());
1549 dbMeta->setHostname(query.
value(21).toString());
1550 dbMeta->setDiscNumber(query.
value(22).toInt());
1551 dbMeta->setDiscCount(query.
value(23).toInt());
1553 if (!m_musicMap.contains(
id))
1558 m_allMusic.append(dbMeta);
1560 m_musicMap[id] = dbMeta;
1569 if (cacheMeta && !cacheMeta->
compare(dbMeta))
1580 if (query.
at() == 0)
1583 m_playCountMin = m_playCountMax = query.
value(13).toInt();
1584 m_lastPlayMin = m_lastPlayMax = query.
value(14).toDateTime().toSecsSinceEpoch();
1588 int playCount = query.
value(13).toInt();
1589 qint64 lastPlay = query.
value(14).toDateTime().toSecsSinceEpoch();
1591 m_playCountMin = std::min(playCount, m_playCountMin);
1592 m_playCountMax = std::max(playCount, m_playCountMax);
1593 m_lastPlayMin = std::min(lastPlay, m_lastPlayMin);
1594 m_lastPlayMax = std::max(lastPlay, m_lastPlayMax);
1601 LOG(VB_GENERAL, LOG_ERR,
"MythMusic hasn't found any tracks!");
1605 QList<MusicMetadata::IdType> deleteList;
1606 for (
const auto *track : std::as_const(m_allMusic))
1608 if (!idList.contains(track->ID()))
1610 deleteList.append(track->ID());
1615 for (
uint id : deleteList)
1618 m_allMusic.removeAll(mdata);
1619 m_musicMap.remove(
id);
1625 LOG(VB_GENERAL, LOG_DEBUG, QString(
"AllMusic::resync sending MUSIC_RESYNC_FINISHED added: %1, removed: %2, changed: %3")
1626 .arg(added).arg(removed).arg(changed));
1629 m_doneLoading =
true;
1634 if (m_musicMap.contains(an_id))
1635 return m_musicMap[an_id];
1642 return m_musicMap.contains(an_id);
1652 *mdata = *the_track;
1662 for (
auto *item : std::as_const(m_allMusic))
1664 if (item->hasChanged())
1672 while (!m_cdData.empty())
1675 if (m_musicMap.contains(mdata->
ID()))
1676 m_musicMap.remove(mdata->
ID());
1678 delete m_cdData.back();
1679 m_cdData.pop_back();
1682 m_cdTitle = tr(
"CD -- none");
1688 mdata->setID(m_cdData.count() + 1);
1689 mdata->setRepo(
RT_CD);
1690 m_cdData.append(mdata);
1691 m_musicMap[mdata->ID()] = mdata;
1696 if (m_cdData.count() < 1)
1699 return m_cdData.last()->FormatTitle() == the_track->
FormatTitle();
1704 for (
auto *anit : std::as_const(m_cdData))
1706 if (anit->Track() == the_track)
1724 while (!m_streamList.empty())
1726 delete m_streamList.back();
1727 m_streamList.pop_back();
1733 for (
int x = 0; x < m_streamList.count(); x++)
1735 if (m_streamList.at(x)->ID() == an_id)
1744 for (
int x = 0; x < m_streamList.count(); x++)
1746 if (m_streamList.at(x)->ID() == an_id)
1747 return m_streamList.at(x);
1755 while (!m_streamList.empty())
1757 delete m_streamList.back();
1758 m_streamList.pop_back();
1761 QString aquery =
"SELECT intid, broadcaster, channel, description, url1, url2, url3, url4, url5,"
1762 "logourl, genre, metaformat, country, language, format "
1763 "FROM music_radios "
1764 "ORDER BY broadcaster,channel;";
1767 if (!query.
exec(aquery))
1772 while (query.
next())
1776 urls[x] = query.
value(4 + x).toString();
1779 query.
value(0).toInt(),
1780 query.
value(1).toString(),
1781 query.
value(2).toString(),
1782 query.
value(3).toString(),
1784 query.
value(9).toString(),
1785 query.
value(10).toString(),
1786 query.
value(11).toString(),
1787 query.
value(12).toString(),
1788 query.
value(13).toString(),
1789 query.
value(14).toString());
1793 m_streamList.append(mdata);
1798 LOG(VB_GENERAL, LOG_WARNING,
"MythMusic hasn't found any radio streams!");
1806 query.
prepare(
"INSERT INTO music_radios (broadcaster, channel, description, "
1807 "url1, url2, url3, url4, url5, "
1808 "logourl, genre, country, language, format, metaformat) "
1809 "VALUES (:BROADCASTER, :CHANNEL, :DESCRIPTION, :URL1, :URL2, :URL3, :URL4, :URL5, "
1810 ":LOGOURL, :GENRE, :COUNTRY, :LANGUAGE, :FORMAT, :METAFORMAT);");
1843 query.
prepare(
"DELETE FROM music_radios WHERE intid = :ID");
1860 query.
prepare(
"UPDATE music_radios set broadcaster = :BROADCASTER, channel = :CHANNEL, description = :DESCRIPTION, "
1861 "url1 = :URL1, url2 = :URL2, url3 = :URL3, url4 = :URL4, url5 = :URL5, "
1862 "logourl = :LOGOURL, genre = :GENRE, country = :COUNTRY, language = :LANGUAGE, "
1863 "format = :FORMAT, metaformat = :METAFORMAT "
1864 "WHERE intid = :ID");
1893 : m_parent(metadata)
1900 : m_parent(metadata)
1902 for (
const auto &srcImage : std::as_const(other.
m_imageList))
1935 query.
prepare(
"SELECT logourl FROM music_radios WHERE url1 = :URL;");
1939 while (query.
next())
1941 QString logoUrl = query.
value(0).toString();
1945 image->m_filename = logoUrl;
1947 image->m_embedded =
false;
1948 image->m_hostname =
"";
1959 QString dir = fi.path();
1962 query.
prepare(
"SELECT albumart_id, CONCAT_WS('/', music_directories.path, "
1963 "music_albumart.filename), music_albumart.filename, music_albumart.imagetype, "
1964 "music_albumart.embedded, music_albumart.hostname "
1965 "FROM music_albumart "
1966 "LEFT JOIN music_directories ON "
1967 "music_directories.directory_id = music_albumart.directory_id "
1968 "WHERE music_directories.path = :DIR "
1969 "OR song_id = :SONGID "
1970 "ORDER BY music_albumart.imagetype;");
1975 while (query.
next())
1978 bool embedded = (query.
value(4).toInt() == 1);
1979 image->m_id = query.
value(0).toInt();
1985 if (url.scheme() ==
"myth")
1988 QString(
"AlbumArt/") + query.
value(1).toString(),
1993 image->m_filename = query.
value(1).toString();
1998 if (url.scheme() ==
"myth")
2001 query.
value(1).toString(),
2006 image->m_filename = query.
value(1).toString();
2011 image->m_embedded = embedded;
2012 image->m_hostname = query.
value(5).toString();
2020 if (
findIcon(
"artist", artist) != QString())
2024 image->m_filename =
findIcon(
"artist", artist);
2026 image->m_embedded =
false;
2037 popupStack,
"scanbusydialog");
2049 QStringList strList;
2050 strList <<
"MUSIC_FIND_ALBUMART"
2056 scanThread->start();
2058 while (scanThread->isRunning())
2060 QCoreApplication::processEvents();
2064 strList = scanThread->getResult();
2077 for (
int x = 2; x < strList.count(); x += 6)
2080 image->
m_id = strList[x].toInt();
2081 image->m_imageType = (
ImageType) strList[x + 1].toInt();
2082 image->m_embedded = (strList[x + 2].toInt() == 1);
2083 image->m_description = strList[x + 3];
2085 if (image->m_embedded)
2088 QString(
"AlbumArt/") + strList[x + 4],
2098 image->m_hostname = strList[x + 5];
2100 LOG(VB_FILE, LOG_INFO,
"AlbumArtImages::scanForImages found image");
2101 LOG(VB_FILE, LOG_INFO, QString(
"ID: %1").arg(image->m_id));
2102 LOG(VB_FILE, LOG_INFO, QString(
"ImageType: %1").arg(image->m_imageType));
2103 LOG(VB_FILE, LOG_INFO, QString(
"Embedded: %1").arg(image->m_embedded));
2104 LOG(VB_FILE, LOG_INFO, QString(
"Description: %1").arg(image->m_description));
2105 LOG(VB_FILE, LOG_INFO, QString(
"Filename: %1").arg(image->m_filename));
2106 LOG(VB_FILE, LOG_INFO, QString(
"Hostname: %1").arg(image->m_hostname));
2107 LOG(VB_FILE, LOG_INFO,
"-------------------------------");
2119 if (item->m_imageType ==
type)
2130 if (item->m_id == imageID)
2141 for (
const auto *item : std::as_const(
m_imageList))
2142 paths += item->m_filename;
2159 static const std::array<const std::string,6> s_typeStrings {
2160 QT_TR_NOOP(
"Unknown"),
2161 QT_TR_NOOP(
"Front Cover"),
2162 QT_TR_NOOP(
"Back Cover"),
2164 QT_TR_NOOP(
"Inlay"),
2165 QT_TR_NOOP(
"Artist"),
2168 return QCoreApplication::translate(
"AlbumArtImages",
2169 s_typeStrings[
type].c_str());
2176 static const std::array<const std::string,6> s_filenameStrings {
2177 QT_TR_NOOP(
"unknown"),
2178 QT_TR_NOOP(
"front"),
2181 QT_TR_NOOP(
"inlay"),
2182 QT_TR_NOOP(
"artist")
2185 return QCoreApplication::translate(
"AlbumArtImages",
2186 s_filenameStrings[
type].c_str());
2194 if (
filename.contains(
"front", Qt::CaseInsensitive) ||
2195 filename.contains(tr(
"front"), Qt::CaseInsensitive) ||
2196 filename.contains(
"cover", Qt::CaseInsensitive) ||
2197 filename.contains(tr(
"cover"), Qt::CaseInsensitive))
2199 else if (
filename.contains(
"back", Qt::CaseInsensitive) ||
2200 filename.contains(tr(
"back"), Qt::CaseInsensitive))
2202 else if (
filename.contains(
"inlay", Qt::CaseInsensitive) ||
2203 filename.contains(tr(
"inlay"), Qt::CaseInsensitive))
2205 else if (
filename.contains(
"cd", Qt::CaseInsensitive) ||
2206 filename.contains(tr(
"cd"), Qt::CaseInsensitive))
2217 if (name.toLower() ==
"front")
2219 else if (name.toLower() ==
"back")
2221 else if (name.toLower() ==
"inlay")
2223 else if (name.toLower() ==
"cd")
2225 else if (name.toLower() ==
"artist")
2227 else if (name.toLower() ==
"unknown")
2272 if (trackID == 0 || directoryID == -1)
2274 LOG(VB_GENERAL, LOG_ERR,
"AlbumArtImages: Asked to save to the DB but "
2275 "have invalid songid or directoryid");
2282 query.
prepare(
"DELETE FROM music_albumart "
2283 "WHERE song_id = :SONGID "
2284 "OR (embedded = 0 AND directory_id = :DIRECTORYID)");
2287 query.
bindValue(
":DIRECTORYID", directoryID);
2292 "deleting existing albumart", query);
2302 if (image->m_id > 0)
2305 query.
prepare(
"INSERT INTO music_albumart ( albumart_id, "
2306 "filename, imagetype, song_id, directory_id, embedded, hostname ) "
2307 "VALUES ( :ID, :FILENAME, :TYPE, :SONGID, :DIRECTORYID, :EMBED, :HOSTNAME );");
2312 query.
prepare(
"INSERT INTO music_albumart ( filename, "
2313 "imagetype, song_id, directory_id, embedded, hostname ) VALUES ( "
2314 ":FILENAME, :TYPE, :SONGID, :DIRECTORYID, :EMBED, :HOSTNAME );");
2317 QFileInfo fi(image->m_filename);
2318 query.
bindValue(
":FILENAME", fi.fileName());
2320 query.
bindValue(
":TYPE", image->m_imageType);
2321 query.
bindValue(
":SONGID", image->m_embedded ? trackID : 0);
2322 query.
bindValue(
":DIRECTORYID", image->m_embedded ? 0 : directoryID);
2323 query.
bindValue(
":EMBED", image->m_embedded);
2324 query.
bindValue(
":HOSTNAME", image->m_hostname);
2329 "add/update music_albumart", query);
2333 if (image->m_id <= 0)