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))
186 query.
prepare(
"UPDATE music_songs set rating = :RATING , "
187 "numplays = :PLAYCOUNT , lastplay = :LASTPLAY "
188 "where song_id = :ID ;");
206 query.
prepare(
"UPDATE music_songs SET hostname = :HOSTNAME "
207 "WHERE song_id = :ID ;");
219 QString sqldir =
filename.section(
'/', 0, -2);
221 QString sqlfilename =
filename.section(
'/', -1);
225 "SELECT song_id FROM music_songs "
226 "LEFT JOIN music_directories ON music_songs.directory_id=music_directories.directory_id "
227 "WHERE music_songs.filename = :FILENAME "
228 "AND music_directories.path = :DIRECTORY ;");
229 query.
bindValue(
":FILENAME", sqlfilename);
240 LOG(VB_GENERAL, LOG_WARNING,
241 QString(
"MusicMetadata::createFromFilename: Could not find '%1'")
246 int songID = query.
value(0).toInt();
255 query.
prepare(
"SELECT music_artists.artist_name, "
256 "music_comp_artists.artist_name AS compilation_artist, "
257 "music_albums.album_name, music_songs.name, music_genres.genre, "
258 "music_songs.year, music_songs.track, music_songs.length, "
259 "music_songs.song_id, music_songs.rating, music_songs.numplays, "
260 "music_songs.lastplay, music_albums.compilation, music_songs.format, "
261 "music_songs.track_count, music_songs.size, music_songs.date_entered, "
262 "music_songs.disc_number, music_songs.disc_count, "
263 "CONCAT_WS('/', music_directories.path, music_songs.filename) AS filename, "
264 "music_songs.hostname "
266 "LEFT JOIN music_directories ON music_songs.directory_id=music_directories.directory_id "
267 "LEFT JOIN music_artists ON music_songs.artist_id=music_artists.artist_id "
268 "LEFT JOIN music_albums ON music_songs.album_id=music_albums.album_id "
269 "LEFT JOIN music_artists AS music_comp_artists ON music_albums.artist_id=music_comp_artists.artist_id "
270 "LEFT JOIN music_genres ON music_songs.genre_id=music_genres.genre_id "
271 "WHERE music_songs.song_id = :SONGID; ");
277 mdata->m_artist = query.
value(0).toString();
278 mdata->m_compilationArtist = query.
value(1).toString();
279 mdata->m_album = query.
value(2).toString();
280 mdata->m_title = query.
value(3).toString();
281 mdata->m_genre = query.
value(4).toString();
282 mdata->m_year = query.
value(5).toInt();
283 mdata->m_trackNum = query.
value(6).toInt();
284 mdata->m_length = std::chrono::milliseconds(query.
value(7).toInt());
285 mdata->m_id = query.
value(8).toUInt();
286 mdata->m_rating = query.
value(9).toInt();
287 mdata->m_playCount = query.
value(10).toInt();
288 mdata->m_lastPlay = query.
value(11).toDateTime();
289 mdata->m_compilation = (query.
value(12).toInt() > 0);
290 mdata->m_format = query.
value(13).toString();
291 mdata->m_trackCount = query.
value(14).toInt();
292 mdata->m_fileSize = query.
value(15).toULongLong();
293 mdata->m_dateAdded = query.
value(16).toDateTime();
294 mdata->m_discNum = query.
value(17).toInt();
295 mdata->m_discCount = query.
value(18).toInt();
296 mdata->m_filename = query.
value(19).toString();
297 mdata->m_hostname = query.
value(20).toString();
298 mdata->ensureSortFields();
300 if (!QHostAddress(mdata->m_hostname).isNull())
302 mdata->m_hostname =
"";
303 mdata->saveHostname();
316 GetMythDB()->ClearSetting(
"MusicStreamListModified");
321 LOG(VB_GENERAL, LOG_ERR,
"MusicMetadata: looks like we are already updating the radio streams list");
325 QByteArray compressedData;
326 QByteArray uncompressedData;
335 LOG(VB_GENERAL, LOG_INFO,
"MusicMetadata: radio streams list is already up to date");
341 LOG(VB_GENERAL, LOG_INFO,
"MusicMetadata: downloading radio streams list");
346 LOG(VB_GENERAL, LOG_ERR,
"MusicMetadata: failed to download radio stream list");
361 if (!domDoc.setContent(uncompressedData,
false, &errorMsg,
362 &errorLine, &errorColumn))
364 LOG(VB_GENERAL, LOG_ERR,
365 "MusicMetadata: Could not read content of streams.xml" +
367 QString(
"\n\t\t\tat line: %1 column: %2 msg: %3")
368 .arg(errorLine).arg(errorColumn).arg(errorMsg));
374 query.
prepare(
"DELETE FROM music_streams;");
382 LOG(VB_GENERAL, LOG_INFO,
"MusicMetadata: processing radio streams list");
384 QDomNodeList itemList = domDoc.elementsByTagName(
"item");
387 for (
int i = 0; i < itemList.count(); i++)
389 itemNode = itemList.item(i);
391 query.
prepare(
"INSERT INTO music_streams (broadcaster, channel, description, url1, url2, url3, url4, url5,"
392 " logourl, genre, metaformat, country, language) "
393 "VALUES (:BROADCASTER, :CHANNEL, :DESC, :URL1, :URL2, :URL3, :URL4, :URL5,"
394 " :LOGOURL, :GENRE, :META, :COUNTRY, :LANG);");
396 query.
bindValue(
":BROADCASTER", itemNode.namedItem(QString(
"broadcaster")).toElement().text());
397 query.
bindValue(
":CHANNEL", itemNode.namedItem(QString(
"channel")).toElement().text());
398 query.
bindValue(
":DESC", itemNode.namedItem(QString(
"description")).toElement().text());
399 query.
bindValue(
":URL1", itemNode.namedItem(QString(
"url1")).toElement().text());
400 query.
bindValue(
":URL2", itemNode.namedItem(QString(
"url2")).toElement().text());
401 query.
bindValue(
":URL3", itemNode.namedItem(QString(
"url3")).toElement().text());
402 query.
bindValue(
":URL4", itemNode.namedItem(QString(
"url4")).toElement().text());
403 query.
bindValue(
":URL5", itemNode.namedItem(QString(
"url5")).toElement().text());
404 query.
bindValue(
":LOGOURL", itemNode.namedItem(QString(
"logourl")).toElement().text());
405 query.
bindValue(
":GENRE", itemNode.namedItem(QString(
"genre")).toElement().text());
406 query.
bindValue(
":META", itemNode.namedItem(QString(
"metadataformat")).toElement().text());
407 query.
bindValue(
":COUNTRY", itemNode.namedItem(QString(
"country")).toElement().text());
408 query.
bindValue(
":LANG", itemNode.namedItem(QString(
"language")).toElement().text());
420 LOG(VB_GENERAL, LOG_INFO,
"MusicMetadata: updating radio streams list completed OK");
431 LOG(VB_GENERAL, LOG_ERR, QString(
"MusicMetadata: Asked to reload metadata "
432 "for trackID: %1 but not found!").arg(
m_id));
452 QString sqldir =
m_filename.section(
'/', 0, -2);
458 if (sqldir.isEmpty())
465 query.
prepare(
"SELECT directory_id FROM music_directories "
466 "WHERE path = :DIRECTORY ;");
480 query.
prepare(
"INSERT INTO music_directories (path) VALUES (:DIRECTORY);");
503 query.
prepare(
"SELECT artist_id FROM music_artists "
504 "WHERE artist_name = :ARTIST ;");
518 query.
prepare(
"INSERT INTO music_artists (artist_name) VALUES (:ARTIST);");
545 query.
prepare(
"SELECT artist_id FROM music_artists "
546 "WHERE artist_name = :ARTIST ;");
559 query.
prepare(
"INSERT INTO music_artists (artist_name) VALUES (:ARTIST);");
581 query.
prepare(
"SELECT album_id FROM music_albums "
582 "WHERE artist_id = :COMP_ARTIST_ID "
583 " AND album_name = :ALBUM ;");
597 query.
prepare(
"INSERT INTO music_albums (artist_id, album_name, compilation, year) "
598 "VALUES (:COMP_ARTIST_ID, :ALBUM, :COMPILATION, :YEAR);");
622 query.
prepare(
"SELECT genre_id FROM music_genres "
623 "WHERE genre = :GENRE ;");
636 query.
prepare(
"INSERT INTO music_genres (genre) VALUES (:GENRE);");
688 strQuery =
"INSERT INTO music_songs ( directory_id,"
689 " artist_id, album_id, name, genre_id,"
690 " year, track, length, filename,"
691 " rating, format, date_entered, date_modified,"
692 " numplays, track_count, disc_number, disc_count,"
696 " :ARTIST, :ALBUM, :TITLE, :GENRE,"
697 " :YEAR, :TRACKNUM, :LENGTH, :FILENAME,"
698 " :RATING, :FORMAT, :DATE_ADD, :DATE_MOD,"
699 " :PLAYCOUNT,:TRACKCOUNT, :DISC_NUMBER, :DISC_COUNT,"
700 " :SIZE, :HOSTNAME );";
704 strQuery =
"UPDATE music_songs SET"
705 " directory_id = :DIRECTORY"
706 ", artist_id = :ARTIST"
707 ", album_id = :ALBUM"
709 ", genre_id = :GENRE"
711 ", track = :TRACKNUM"
713 ", filename = :FILENAME"
716 ", date_modified = :DATE_MOD "
717 ", numplays = :PLAYCOUNT "
718 ", track_count = :TRACKCOUNT "
719 ", disc_number = :DISC_NUMBER "
720 ", disc_count = :DISC_COUNT "
722 ", hostname = :HOSTNAME "
723 "WHERE song_id= :ID ;";
726 QString sqlfilename =
m_filename.section(
'/', -1);
740 query.
bindValue(
":FILENAME", sqlfilename);
758 MythDB::DBError(
"MusicMetadata::dumpToDatabase - updating music_songs",
769 query.
prepare(
"UPDATE music_albums SET album_name = :ALBUM_NAME, "
770 "artist_id = :COMP_ARTIST_ID, compilation = :COMPILATION, "
772 "WHERE music_albums.album_id = :ALBUMID");
850 rv.replace(
"TRACK", QString(
"%1").arg(
m_trackNum, 2));
858 m_artist = tr(
"Unknown Artist",
"Default artist if no artist");
869 m_album = tr(
"Unknown Album",
"Default album if no album");
876 m_genre = tr(
"Unknown Genre",
"Default genre if no genre");
898 QString format_artist;
899 QString format_title;
995 if (!mythUrl.isEmpty())
1001 QHostAddress(url.host()).isNull())
1011 LOG(VB_GENERAL, LOG_ERR, QString(
"MusicMetadata: Asked to get the filename for a track but no file found: %1")
1033 if (field ==
"artist")
1035 else if (field ==
"compilation_artist")
1037 else if (field ==
"album")
1039 else if (field ==
"title")
1041 else if (field ==
"genre")
1043 else if (field ==
"filename")
1045 else if (field ==
"year")
1047 else if (field ==
"tracknum")
1049 else if (field ==
"trackcount")
1051 else if (field ==
"discnum")
1053 else if (field ==
"disccount")
1055 else if (field ==
"length")
1056 m_length = std::chrono::milliseconds(data.toInt());
1057 else if (field ==
"compilation")
1061 LOG(VB_GENERAL, LOG_ERR, QString(
"Something asked me to set data "
1062 "for a field called %1").arg(field));
1069 if (field ==
"artist")
1071 else if (field ==
"album")
1073 else if (field ==
"title")
1075 else if (field ==
"genre")
1079 LOG(VB_GENERAL, LOG_ERR, QString(
"Something asked me to return data "
1080 "about a field called %1").arg(field));
1088 metadataMap[
prefix +
"songid"] = QString::number(
m_id);
1112 QString fmt = (
m_length >= 1h) ?
"H:mm:ss" :
"mm:ss";
1117 metadataMap[
prefix +
"lastplayed"] =
1122 metadataMap[
prefix +
"lastplayed"] = tr(
"Never Played");
1131 QString tmpSize = locale.toString(
m_fileSize *
1132 (1.0 / (1024.0 * 1024.0)),
'f', 2);
1133 metadataMap[
prefix +
"filesize"] = tmpSize;
1152 metadataMap[
prefix +
"url"] = url.toString(QUrl::RemoveUserInfo);
1204 for (
auto *art : qAsConst(albumart))
1206 art->m_filename = QString(
"%1-%2").arg(
m_id).arg(art->m_filename);
1215 QStringList searchList;
1219 if (
"artist" == field)
1221 query.
prepare(
"SELECT artist_name FROM music_artists ORDER BY artist_name;");
1223 else if (
"compilation_artist" == field)
1225 query.
prepare(
"SELECT DISTINCT artist_name FROM music_artists, music_albums where "
1226 "music_albums.artist_id=music_artists.artist_id ORDER BY artist_name");
1228 else if (
"album" == field)
1230 query.
prepare(
"SELECT album_name FROM music_albums ORDER BY album_name;");
1232 else if (
"title" == field)
1234 query.
prepare(
"SELECT name FROM music_songs ORDER BY name;");
1236 else if (
"genre" == field)
1238 query.
prepare(
"SELECT genre FROM music_genres ORDER BY genre;");
1247 while (query.
next())
1249 searchList << query.
value(0).toString();
1275 if (!res.isEmpty() && albumart_image)
1281 QString path =
GetConfDir() +
"/MythMusic/AlbumArt/";
1283 QString
filename = QString(
"%1-%2.%3").arg(
m_id).arg(
"front", fi.suffix());
1287 if (!QFile::exists(albumart_image->
m_filename))
1304 if (url.path().isEmpty() || url.host().isEmpty() || url.userName().isEmpty())
1316 QStringList paramList;
1317 paramList.append(QString(
"--songid='%1'").arg(
ID()));
1318 paramList.append(QString(
"--imagetype='%1'").arg(albumart_image->
m_imageType));
1320 QString command =
"mythutil --extractimage " + paramList.join(
" ");
1330 slist <<
"MUSIC_TAG_GETIMAGE"
1332 << QString::number(
ID())
1391 LOG(VB_FILE, LOG_INFO, QString(
"MusicMetadata::getTagger - creating tagger for %1").arg(
filename));
1395 LOG(VB_GENERAL, LOG_ERR, QString(
"MusicMetadata::getTagger - failed to find %1 on the local filesystem").arg(
Filename(
false)));
1418 while (!m_allMusic.empty())
1420 delete m_allMusic.back();
1421 m_allMusic.pop_back();
1424 while (!m_cdData.empty())
1426 delete m_cdData.back();
1427 m_cdData.pop_back();
1430 m_metadataLoader->wait();
1431 delete m_metadataLoader;
1440 if (m_metadataLoader->isFinished())
1445 m_metadataLoader->wait();
1464 m_doneLoading =
false;
1466 if (m_metadataLoader)
1469 delete m_metadataLoader;
1473 m_metadataLoader->start();
1485 m_doneLoading =
false;
1487 QString aquery =
"SELECT music_songs.song_id, music_artists.artist_id, music_artists.artist_name, "
1488 "music_comp_artists.artist_name AS compilation_artist, "
1489 "music_albums.album_id, music_albums.album_name, music_songs.name, music_genres.genre, music_songs.year, "
1490 "music_songs.track, music_songs.length, music_songs.directory_id, "
1491 "CONCAT_WS('/', music_directories.path, music_songs.filename) AS filename, "
1492 "music_songs.rating, music_songs.numplays, music_songs.lastplay, music_songs.date_entered, "
1493 "music_albums.compilation, music_songs.format, music_songs.track_count, "
1494 "music_songs.size, music_songs.hostname, music_songs.disc_number, music_songs.disc_count "
1496 "LEFT JOIN music_directories ON music_songs.directory_id=music_directories.directory_id "
1497 "LEFT JOIN music_artists ON music_songs.artist_id=music_artists.artist_id "
1498 "LEFT JOIN music_albums ON music_songs.album_id=music_albums.album_id "
1499 "LEFT JOIN music_artists AS music_comp_artists ON music_albums.artist_id=music_comp_artists.artist_id "
1500 "LEFT JOIN music_genres ON music_songs.genre_id=music_genres.genre_id "
1501 "ORDER BY music_songs.song_id;";
1504 if (!query.
exec(aquery))
1507 m_numPcs = query.
size() * 2;
1509 QList<MusicMetadata::IdType> idList;
1513 while (query.
next())
1520 query.
value(12).toString(),
1521 query.
value(2).toString(),
1522 query.
value(3).toString(),
1523 query.
value(5).toString(),
1524 query.
value(6).toString(),
1525 query.
value(7).toString(),
1526 query.
value(8).toInt(),
1527 query.
value(9).toInt(),
1528 std::chrono::milliseconds(query.
value(10).toInt()),
1529 query.
value(0).toInt(),
1530 query.
value(13).toInt(),
1531 query.
value(14).toInt(),
1532 query.
value(15).toDateTime(),
1533 query.
value(16).toDateTime(),
1534 (query.
value(17).toInt() > 0),
1535 query.
value(18).toString());
1537 dbMeta->setDirectoryId(query.
value(11).toInt());
1538 dbMeta->setArtistId(query.
value(1).toInt());
1539 dbMeta->setCompilationArtistId(query.
value(3).toInt());
1540 dbMeta->setAlbumId(query.
value(4).toInt());
1541 dbMeta->setTrackCount(query.
value(19).toInt());
1542 dbMeta->setFileSize(query.
value(20).toULongLong());
1543 dbMeta->setHostname(query.
value(21).toString());
1544 dbMeta->setDiscNumber(query.
value(22).toInt());
1545 dbMeta->setDiscCount(query.
value(23).toInt());
1547 if (!m_musicMap.contains(
id))
1552 m_allMusic.append(dbMeta);
1554 m_musicMap[id] = dbMeta;
1563 if (cacheMeta && !cacheMeta->
compare(dbMeta))
1574 if (query.
at() == 0)
1577 m_playCountMin = m_playCountMax = query.
value(13).toInt();
1578 m_lastPlayMin = m_lastPlayMax = query.
value(14).toDateTime().toSecsSinceEpoch();
1582 int playCount = query.
value(13).toInt();
1583 qint64 lastPlay = query.
value(14).toDateTime().toSecsSinceEpoch();
1585 m_playCountMin = std::min(playCount, m_playCountMin);
1586 m_playCountMax = std::max(playCount, m_playCountMax);
1587 m_lastPlayMin = std::min(lastPlay, m_lastPlayMin);
1588 m_lastPlayMax = std::max(lastPlay, m_lastPlayMax);
1595 LOG(VB_GENERAL, LOG_ERR,
"MythMusic hasn't found any tracks!");
1599 QList<MusicMetadata::IdType> deleteList;
1600 for (
const auto *track : qAsConst(m_allMusic))
1602 if (!idList.contains(track->ID()))
1604 deleteList.append(track->ID());
1609 for (
uint id : deleteList)
1612 m_allMusic.removeAll(mdata);
1613 m_musicMap.remove(
id);
1619 LOG(VB_GENERAL, LOG_DEBUG, QString(
"AllMusic::resync sending MUSIC_RESYNC_FINISHED added: %1, removed: %2, changed: %3")
1620 .arg(added).arg(removed).arg(changed));
1623 m_doneLoading =
true;
1628 if (m_musicMap.contains(an_id))
1629 return m_musicMap[an_id];
1636 return m_musicMap.contains(an_id);
1646 *mdata = *the_track;
1656 for (
auto *item : qAsConst(m_allMusic))
1658 if (item->hasChanged())
1666 while (!m_cdData.empty())
1669 if (m_musicMap.contains(mdata->
ID()))
1670 m_musicMap.remove(mdata->
ID());
1672 delete m_cdData.back();
1673 m_cdData.pop_back();
1676 m_cdTitle = tr(
"CD -- none");
1682 mdata->setID(m_cdData.count() + 1);
1683 mdata->setRepo(
RT_CD);
1684 m_cdData.append(mdata);
1685 m_musicMap[mdata->ID()] = mdata;
1690 if (m_cdData.count() < 1)
1693 return m_cdData.last()->FormatTitle() == the_track->
FormatTitle();
1698 for (
auto *anit : qAsConst(m_cdData))
1700 if (anit->Track() == the_track)
1718 while (!m_streamList.empty())
1720 delete m_streamList.back();
1721 m_streamList.pop_back();
1727 for (
int x = 0; x < m_streamList.count(); x++)
1729 if (m_streamList.at(x)->ID() == an_id)
1738 for (
int x = 0; x < m_streamList.count(); x++)
1740 if (m_streamList.at(x)->ID() == an_id)
1741 return m_streamList.at(x);
1749 while (!m_streamList.empty())
1751 delete m_streamList.back();
1752 m_streamList.pop_back();
1755 QString aquery =
"SELECT intid, broadcaster, channel, description, url1, url2, url3, url4, url5,"
1756 "logourl, genre, metaformat, country, language, format "
1757 "FROM music_radios "
1758 "ORDER BY broadcaster,channel;";
1761 if (!query.
exec(aquery))
1766 while (query.
next())
1770 urls[x] = query.
value(4 + x).toString();
1773 query.
value(0).toInt(),
1774 query.
value(1).toString(),
1775 query.
value(2).toString(),
1776 query.
value(3).toString(),
1778 query.
value(9).toString(),
1779 query.
value(10).toString(),
1780 query.
value(11).toString(),
1781 query.
value(12).toString(),
1782 query.
value(13).toString(),
1783 query.
value(14).toString());
1787 m_streamList.append(mdata);
1792 LOG(VB_GENERAL, LOG_WARNING,
"MythMusic hasn't found any radio streams!");
1800 query.
prepare(
"INSERT INTO music_radios (broadcaster, channel, description, "
1801 "url1, url2, url3, url4, url5, "
1802 "logourl, genre, country, language, format, metaformat) "
1803 "VALUES (:BROADCASTER, :CHANNEL, :DESCRIPTION, :URL1, :URL2, :URL3, :URL4, :URL5, "
1804 ":LOGOURL, :GENRE, :COUNTRY, :LANGUAGE, :FORMAT, :METAFORMAT);");
1837 query.
prepare(
"DELETE FROM music_radios WHERE intid = :ID");
1854 query.
prepare(
"UPDATE music_radios set broadcaster = :BROADCASTER, channel = :CHANNEL, description = :DESCRIPTION, "
1855 "url1 = :URL1, url2 = :URL2, url3 = :URL3, url4 = :URL4, url5 = :URL5, "
1856 "logourl = :LOGOURL, genre = :GENRE, country = :COUNTRY, language = :LANGUAGE, "
1857 "format = :FORMAT, metaformat = :METAFORMAT "
1858 "WHERE intid = :ID");
1887 : m_parent(metadata)
1920 query.
prepare(
"SELECT logourl FROM music_radios WHERE url1 = :URL;");
1924 while (query.
next())
1926 QString logoUrl = query.
value(0).toString();
1930 image->m_filename = logoUrl;
1932 image->m_embedded =
false;
1933 image->m_hostname =
"";
1944 QString dir = fi.path();
1947 query.
prepare(
"SELECT albumart_id, CONCAT_WS('/', music_directories.path, "
1948 "music_albumart.filename), music_albumart.filename, music_albumart.imagetype, "
1949 "music_albumart.embedded, music_albumart.hostname "
1950 "FROM music_albumart "
1951 "LEFT JOIN music_directories ON "
1952 "music_directories.directory_id = music_albumart.directory_id "
1953 "WHERE music_directories.path = :DIR "
1954 "OR song_id = :SONGID "
1955 "ORDER BY music_albumart.imagetype;");
1960 while (query.
next())
1963 bool embedded = (query.
value(4).toInt() == 1);
1964 image->m_id = query.
value(0).toInt();
1970 if (url.scheme() ==
"myth")
1973 QString(
"AlbumArt/") + query.
value(1).toString(),
1978 image->m_filename = query.
value(1).toString();
1983 if (url.scheme() ==
"myth")
1986 query.
value(1).toString(),
1991 image->m_filename = query.
value(1).toString();
1996 image->m_embedded = embedded;
1997 image->m_hostname = query.
value(5).toString();
2005 if (
findIcon(
"artist", artist) != QString())
2009 image->m_filename =
findIcon(
"artist", artist);
2011 image->m_embedded =
false;
2022 popupStack,
"scanbusydialog");
2034 QStringList strList;
2035 strList <<
"MUSIC_FIND_ALBUMART"
2041 scanThread->start();
2043 while (scanThread->isRunning())
2045 QCoreApplication::processEvents();
2049 strList = scanThread->getResult();
2062 for (
int x = 2; x < strList.count(); x += 6)
2065 image->
m_id = strList[x].toInt();
2066 image->m_imageType = (
ImageType) strList[x + 1].toInt();
2067 image->m_embedded = (strList[x + 2].toInt() == 1);
2068 image->m_description = strList[x + 3];
2070 if (image->m_embedded)
2073 QString(
"AlbumArt/") + strList[x + 4],
2083 image->m_hostname = strList[x + 5];
2085 LOG(VB_FILE, LOG_INFO,
"AlbumArtImages::scanForImages found image");
2086 LOG(VB_FILE, LOG_INFO, QString(
"ID: %1").arg(image->m_id));
2087 LOG(VB_FILE, LOG_INFO, QString(
"ImageType: %1").arg(image->m_imageType));
2088 LOG(VB_FILE, LOG_INFO, QString(
"Embedded: %1").arg(image->m_embedded));
2089 LOG(VB_FILE, LOG_INFO, QString(
"Description: %1").arg(image->m_description));
2090 LOG(VB_FILE, LOG_INFO, QString(
"Filename: %1").arg(image->m_filename));
2091 LOG(VB_FILE, LOG_INFO, QString(
"Hostname: %1").arg(image->m_hostname));
2092 LOG(VB_FILE, LOG_INFO,
"-------------------------------");
2104 if (item->m_imageType ==
type)
2115 if (item->m_id == imageID)
2127 paths += item->m_filename;
2144 static const std::array<const std::string,6> s_typeStrings {
2145 QT_TR_NOOP(
"Unknown"),
2146 QT_TR_NOOP(
"Front Cover"),
2147 QT_TR_NOOP(
"Back Cover"),
2149 QT_TR_NOOP(
"Inlay"),
2150 QT_TR_NOOP(
"Artist"),
2153 return QCoreApplication::translate(
"AlbumArtImages",
2154 s_typeStrings[
type].c_str());
2161 static const std::array<const std::string,6> s_filenameStrings {
2162 QT_TR_NOOP(
"unknown"),
2163 QT_TR_NOOP(
"front"),
2166 QT_TR_NOOP(
"inlay"),
2167 QT_TR_NOOP(
"artist")
2170 return QCoreApplication::translate(
"AlbumArtImages",
2171 s_filenameStrings[
type].c_str());
2179 if (
filename.contains(
"front", Qt::CaseInsensitive) ||
2180 filename.contains(tr(
"front"), Qt::CaseInsensitive) ||
2181 filename.contains(
"cover", Qt::CaseInsensitive) ||
2182 filename.contains(tr(
"cover"), Qt::CaseInsensitive))
2184 else if (
filename.contains(
"back", Qt::CaseInsensitive) ||
2185 filename.contains(tr(
"back"), Qt::CaseInsensitive))
2187 else if (
filename.contains(
"inlay", Qt::CaseInsensitive) ||
2188 filename.contains(tr(
"inlay"), Qt::CaseInsensitive))
2190 else if (
filename.contains(
"cd", Qt::CaseInsensitive) ||
2191 filename.contains(tr(
"cd"), Qt::CaseInsensitive))
2202 if (name.toLower() ==
"front")
2204 else if (name.toLower() ==
"back")
2206 else if (name.toLower() ==
"inlay")
2208 else if (name.toLower() ==
"cd")
2210 else if (name.toLower() ==
"artist")
2212 else if (name.toLower() ==
"unknown")
2257 if (trackID == 0 || directoryID == -1)
2259 LOG(VB_GENERAL, LOG_ERR,
"AlbumArtImages: Asked to save to the DB but "
2260 "have invalid songid or directoryid");
2267 query.
prepare(
"DELETE FROM music_albumart "
2268 "WHERE song_id = :SONGID "
2269 "OR (embedded = 0 AND directory_id = :DIRECTORYID)");
2272 query.
bindValue(
":DIRECTORYID", directoryID);
2277 "deleting existing albumart", query);
2287 if (image->m_id > 0)
2290 query.
prepare(
"INSERT INTO music_albumart ( albumart_id, "
2291 "filename, imagetype, song_id, directory_id, embedded, hostname ) "
2292 "VALUES ( :ID, :FILENAME, :TYPE, :SONGID, :DIRECTORYID, :EMBED, :HOSTNAME );");
2297 query.
prepare(
"INSERT INTO music_albumart ( filename, "
2298 "imagetype, song_id, directory_id, embedded, hostname ) VALUES ( "
2299 ":FILENAME, :TYPE, :SONGID, :DIRECTORYID, :EMBED, :HOSTNAME );");
2302 QFileInfo fi(image->m_filename);
2303 query.
bindValue(
":FILENAME", fi.fileName());
2305 query.
bindValue(
":TYPE", image->m_imageType);
2306 query.
bindValue(
":SONGID", image->m_embedded ? trackID : 0);
2307 query.
bindValue(
":DIRECTORYID", image->m_embedded ? 0 : directoryID);
2308 query.
bindValue(
":EMBED", image->m_embedded);
2309 query.
bindValue(
":HOSTNAME", image->m_hostname);
2314 "add/update music_albumart", query);
2318 if (image->m_id <= 0)