5 #include <QCoreApplication>
8 #include <QRegularExpression>
19 static int x0 = qRegisterMetaType< RefCountHandler<MetadataLookup> >();
37 QStringList categories,
38 const float userrating,
50 QString chanplaybackfilters,
64 QString certification,
65 QStringList countries,
66 const float popularity,
73 const QDate releasedate,
74 QDateTime lastupdated,
75 std::chrono::minutes runtime,
76 std::chrono::seconds runtimesecs,
78 QString collectionref,
91 m_data(
std::move(data)),
93 m_automatic(automatic),
94 m_handleImages(handleimages),
95 m_allowOverwrites(allowoverwrites),
96 m_allowGeneric(allowgeneric),
97 m_dvdOrder(preferdvdorder),
98 m_host(
std::move(host)),
101 m_network(
std::move(network)),
102 m_status(
std::move(status)),
103 m_categories(
std::move(categories)),
104 m_userRating(userrating),
105 m_ratingCount(ratingcount),
106 m_language(
std::move(language)),
107 m_subtitle(
std::move(subtitle)),
108 m_tagline(
std::move(tagline)),
109 m_description(
std::move(description)),
113 m_chanNum(
std::move(channum)),
114 m_chanSign(
std::move(chansign)),
115 m_chanName(
std::move(channame)),
116 m_chanPlaybackFilters(
std::move(chanplaybackfilters)),
117 m_recGroup(
std::move(recgroup)),
118 m_playGroup(
std::move(playgroup)),
119 m_seriesId(
std::move(seriesid)),
120 m_programid(
std::move(programid)),
121 m_storageGroup(
std::move(storagegroup)),
122 m_startTs(
std::move(startts)),
123 m_endTs(
std::move(endts)),
124 m_recStartTs(
std::move(recstartts)),
125 m_recEndTs(
std::move(recendts)),
126 m_programFlags(programflags),
127 m_audioProperties(audioproperties),
128 m_videoProperties(videoproperties),
129 m_subtitleType(subtitletype),
130 m_certification(
std::move(certification)),
131 m_countries(
std::move(countries)),
132 m_popularity(popularity),
135 m_album(
std::move(album)),
136 m_trackNum(tracknum),
137 m_system(
std::move(system)),
139 m_releaseDate(releasedate),
140 m_lastUpdated(
std::move(lastupdated)),
142 m_runtimeSecs(runtimesecs),
143 m_inetRef(
std::move(inetref)),
144 m_collectionRef(
std::move(collectionref)),
145 m_tmsRef(
std::move(tmsref)),
146 m_imdb(
std::move(imdb)),
147 m_people(
std::move(people)),
148 m_studios(
std::move(studios)),
149 m_homepage(
std::move(homepage)),
150 m_trailerURL(
std::move(trailerURL)),
151 m_artwork(
std::move(artwork)),
152 m_downloads(
std::move(downloads))
154 QString manRecSuffix = QString(
" (%1)").arg(QObject::tr(
"Manual Record"));
167 bool allowoverwrites,
172 const QString &title,
173 QStringList categories,
174 const float userrating,
181 QString chanplaybackfilters,
186 QString storagegroup,
189 QDateTime recstartts,
192 uint audioproperties,
193 uint videoproperties,
196 const QDate releasedate,
197 QDateTime lastupdated,
198 std::chrono::minutes runtime,
199 std::chrono::seconds runtimesecs) :
204 m_data(
std::move(data)),
206 m_automatic(automatic),
207 m_handleImages(handleimages),
208 m_allowOverwrites(allowoverwrites),
209 m_allowGeneric(allowgeneric),
210 m_dvdOrder(preferdvdorder),
211 m_host(
std::move(host)),
214 m_categories(
std::move(categories)),
215 m_userRating(userrating),
216 m_subtitle(
std::move(subtitle)),
217 m_description(
std::move(description)),
219 m_chanNum(
std::move(channum)),
220 m_chanSign(
std::move(chansign)),
221 m_chanName(
std::move(channame)),
222 m_chanPlaybackFilters(
std::move(chanplaybackfilters)),
223 m_recGroup(
std::move(recgroup)),
224 m_playGroup(
std::move(playgroup)),
225 m_seriesId(
std::move(seriesid)),
226 m_programid(
std::move(programid)),
227 m_storageGroup(
std::move(storagegroup)),
228 m_startTs(
std::move(startts)),
229 m_endTs(
std::move(endts)),
230 m_recStartTs(
std::move(recstartts)),
231 m_recEndTs(
std::move(recendts)),
232 m_programFlags(programflags),
233 m_audioProperties(audioproperties),
234 m_videoProperties(videoproperties),
235 m_subtitleType(subtitletype),
237 m_releaseDate(releasedate),
238 m_lastUpdated(
std::move(lastupdated)),
240 m_runtimeSecs(runtimesecs)
242 QString manRecSuffix = QString(
" (%1)").arg(QObject::tr(
"Manual Record"));
255 bool allowoverwrites,
260 const QString &title,
261 QStringList categories,
262 const float userrating,
268 QString certification,
270 const QDate releasedate,
271 std::chrono::minutes runtime,
272 std::chrono::seconds runtimesecs,
282 m_data(
std::move(data)),
284 m_automatic(automatic),
285 m_handleImages(handleimages),
286 m_allowOverwrites(allowoverwrites),
287 m_allowGeneric(allowgeneric),
288 m_dvdOrder(preferdvdorder),
289 m_host(
std::move(host)),
292 m_categories(
std::move(categories)),
293 m_userRating(userrating),
294 m_subtitle(
std::move(subtitle)),
295 m_tagline(
std::move(tagline)),
296 m_description(
std::move(description)),
299 m_certification(
std::move(certification)),
301 m_releaseDate(releasedate),
303 m_runtimeSecs(runtimesecs),
304 m_inetRef(
std::move(inetref)),
305 m_people(
std::move(people)),
306 m_trailerURL(
std::move(trailerURL)),
307 m_artwork(
std::move(artwork)),
308 m_downloads(
std::move(downloads))
310 QString manRecSuffix = QString(
" (%1)").arg(QObject::tr(
"Manual Record"));
317 QList<PersonInfo> ret;
325 while (it.hasPrevious())
326 ret.append(it.previous());
342 while (it.hasPrevious())
343 ret.append(it.previous());
351 metadataMap[
"title"] =
m_title;
355 metadataMap[
"userrating"] = QString::number(
m_userRating);
360 metadataMap[
"description0"] = metadataMap[
"description"] =
m_description;
361 metadataMap[
"season"] = QString::number(
m_season);
362 metadataMap[
"episode"] = QString::number(
m_episode);
363 metadataMap[
"chanid"] = QString::number(
m_chanId);
379 metadataMap[
"popularity"] = QString::number(
m_popularity);
380 metadataMap[
"budget"] = QString::number(
m_budget);
381 metadataMap[
"revenue"] = QString::number(
m_revenue);
382 metadataMap[
"album"] =
m_album;
383 metadataMap[
"tracknum"] = QString::number(
m_trackNum);
385 metadataMap[
"year"] = QString::number(
m_year);
391 metadataMap[
"runtime"] = QCoreApplication::translate(
"(Common)",
397 metadataMap[
"runtimesecs"] = QCoreApplication::translate(
"(Common)",
404 metadataMap[
"imdb"] =
m_imdb;
405 metadataMap[
"studios"] =
m_studios.join(
", ");
415 auto runtime = duration_cast<std::chrono::minutes>(runtimesecs);
418 QVariant::fromValue(pginfo),
kLookupData,
false,
false,
false,
false,
false,
442 QDomDocument doc(
"MythMetadataXML");
444 QDomElement root = doc.createElement(
"metadata");
445 doc.appendChild(root);
447 for (
const auto & item : std::as_const(list))
455 QDomDocument doc(
"MythMetadataXML");
457 QDomElement root = doc.createElement(
"metadata");
458 doc.appendChild(root);
467 QDomDocument doc(
"MythMetadataXML");
481 QDomElement placetoadd,
482 QDomDocument docroot)
487 QDomElement item = docroot.createElement(
"item");
488 placetoadd.appendChild(item);
489 QString RFC822(
"ddd, d MMMM yyyy hh:mm:ss");
494 QDomElement language = docroot.createElement(
"language");
495 item.appendChild(language);
496 language.appendChild(docroot.createTextNode(lookup->
GetLanguage()));
501 QDomElement title = docroot.createElement(
"title");
502 item.appendChild(title);
503 title.appendChild(docroot.createTextNode(lookup->
GetTitle()));
508 QDomElement subtitle = docroot.createElement(
"subtitle");
509 item.appendChild(subtitle);
510 subtitle.appendChild(docroot.createTextNode(lookup->
GetSubtitle()));
515 QDomElement network = docroot.createElement(
"network");
516 item.appendChild(network);
517 network.appendChild(docroot.createTextNode(lookup->
GetNetwork()));
522 QDomElement status = docroot.createElement(
"status");
523 item.appendChild(status);
524 status.appendChild(docroot.createTextNode(lookup->
GetStatus()));
529 QDomElement season = docroot.createElement(
"season");
530 item.appendChild(season);
531 season.appendChild(docroot.createTextNode(
534 QDomElement episode = docroot.createElement(
"episode");
535 item.appendChild(episode);
536 episode.appendChild(docroot.createTextNode(
542 QDomElement tagline = docroot.createElement(
"tagline");
543 item.appendChild(tagline);
544 tagline.appendChild(docroot.createTextNode(lookup->
GetTagline()));
549 QDomElement desc = docroot.createElement(
"description");
550 item.appendChild(desc);
551 desc.appendChild(docroot.createTextNode(lookup->
GetDescription()));
556 QDomElement albumname = docroot.createElement(
"albumname");
557 item.appendChild(albumname);
558 albumname.appendChild(docroot.createTextNode(lookup->
GetAlbumTitle()));
563 QDomElement inetref = docroot.createElement(
"inetref");
564 item.appendChild(inetref);
565 inetref.appendChild(docroot.createTextNode(lookup->
GetInetref()));
570 QDomElement collectionref = docroot.createElement(
"collectionref");
571 item.appendChild(collectionref);
572 collectionref.appendChild(docroot.createTextNode(lookup->
GetCollectionref()));
577 QDomElement tmsref = docroot.createElement(
"tmsref");
578 item.appendChild(tmsref);
579 tmsref.appendChild(docroot.createTextNode(lookup->
GetTMSref()));
582 if (!lookup->
GetIMDB().isEmpty())
584 QDomElement imdb = docroot.createElement(
"imdb");
585 item.appendChild(imdb);
586 imdb.appendChild(docroot.createTextNode(lookup->
GetIMDB()));
591 QDomElement homepage = docroot.createElement(
"homepage");
592 item.appendChild(homepage);
593 homepage.appendChild(docroot.createTextNode(lookup->
GetHomepage()));
598 QDomElement trailer = docroot.createElement(
"trailer");
599 item.appendChild(trailer);
600 trailer.appendChild(docroot.createTextNode(lookup->
GetTrailerURL()));
605 QDomElement chanid = docroot.createElement(
"chanid");
606 item.appendChild(chanid);
607 chanid.appendChild(docroot.createTextNode(
613 QDomElement channum = docroot.createElement(
"channum");
614 item.appendChild(channum);
615 channum.appendChild(docroot.createTextNode(lookup->
GetChanNum()));
620 QDomElement callsign = docroot.createElement(
"chansign");
621 item.appendChild(callsign);
622 callsign.appendChild(docroot.createTextNode(lookup->
GetChanSign()));
627 QDomElement channame = docroot.createElement(
"channame");
628 item.appendChild(channame);
629 channame.appendChild(docroot.createTextNode(lookup->
GetChanName()));
634 QDomElement filters = docroot.createElement(
"filters");
635 item.appendChild(filters);
636 filters.appendChild(docroot.createTextNode(
642 QDomElement recgroup = docroot.createElement(
"recgroup");
643 item.appendChild(recgroup);
644 recgroup.appendChild(docroot.createTextNode(lookup->
GetRecGroup()));
649 QDomElement playgroup = docroot.createElement(
"playgroup");
650 item.appendChild(playgroup);
651 playgroup.appendChild(docroot.createTextNode(lookup->
GetPlayGroup()));
656 QDomElement seriesid = docroot.createElement(
"seriesid");
657 item.appendChild(seriesid);
658 seriesid.appendChild(docroot.createTextNode(lookup->
GetSeriesId()));
663 QDomElement programid = docroot.createElement(
"programid");
664 item.appendChild(programid);
665 programid.appendChild(docroot.createTextNode(lookup->
GetProgramId()));
670 QDomElement sgroup = docroot.createElement(
"storagegroup");
671 item.appendChild(sgroup);
677 QDomElement startts = docroot.createElement(
"startts");
678 item.appendChild(startts);
679 startts.appendChild(docroot.createTextNode(
685 QDomElement endts = docroot.createElement(
"endts");
686 item.appendChild(endts);
687 endts.appendChild(docroot.createTextNode(
688 lookup->
GetEndTS().toString(RFC822)));
693 QDomElement recstartts = docroot.createElement(
"recstartts");
694 item.appendChild(recstartts);
695 recstartts.appendChild(docroot.createTextNode(
701 QDomElement recendts = docroot.createElement(
"recendts");
702 item.appendChild(recendts);
703 recendts.appendChild(docroot.createTextNode(
709 QDomElement progflags = docroot.createElement(
"programflags");
710 item.appendChild(progflags);
711 progflags.appendChild(docroot.createTextNode(
717 QDomElement audioprops = docroot.createElement(
"audioproperties");
718 item.appendChild(audioprops);
719 audioprops.appendChild(docroot.createTextNode(
725 QDomElement videoprops = docroot.createElement(
"videoproperties");
726 item.appendChild(videoprops);
727 videoprops.appendChild(docroot.createTextNode(
733 QDomElement subprops = docroot.createElement(
"subtitletype");
734 item.appendChild(subprops);
735 subprops.appendChild(docroot.createTextNode(
741 QDomElement releasedate = docroot.createElement(
"releasedate");
742 item.appendChild(releasedate);
743 releasedate.appendChild(docroot.createTextNode(
749 QDomElement lastupdated = docroot.createElement(
"lastupdated");
750 item.appendChild(lastupdated);
751 lastupdated.appendChild(docroot.createTextNode(
757 QDomElement userrating = docroot.createElement(
"userrating");
758 item.appendChild(userrating);
759 userrating.appendChild(docroot.createTextNode(QString::number(
765 QDomElement ratingcount = docroot.createElement(
"ratingcount");
766 item.appendChild(ratingcount);
767 ratingcount.appendChild(docroot.createTextNode(QString::number(
773 QDomElement tracknum = docroot.createElement(
"tracknum");
774 item.appendChild(tracknum);
775 tracknum.appendChild(docroot.createTextNode(QString::number(
781 QDomElement popularity = docroot.createElement(
"popularity");
782 item.appendChild(popularity);
783 popularity.appendChild(docroot.createTextNode(QString::number(
789 QDomElement budget = docroot.createElement(
"budget");
790 item.appendChild(budget);
791 budget.appendChild(docroot.createTextNode(QString::number(
797 QDomElement revenue = docroot.createElement(
"revenue");
798 item.appendChild(revenue);
799 revenue.appendChild(docroot.createTextNode(QString::number(
806 QDomElement runtime = docroot.createElement(
"runtime");
807 item.appendChild(runtime);
808 runtime.appendChild(docroot.createTextNode(QString::number(
815 QDomElement runtimesecs = docroot.createElement(
"runtimesecs");
816 item.appendChild(runtimesecs);
817 runtimesecs.appendChild(docroot.createTextNode(QString::number(
832 QDomElement placetoadd,
833 QDomDocument docroot)
836 QDomElement certifications = docroot.createElement(
"certifications");
837 placetoadd.appendChild(certifications);
839 QDomElement cert = docroot.createElement(
"certification");
840 certifications.appendChild(cert);
842 cert.setAttribute(
"name", certstr);
846 QDomElement placetoadd,
847 QDomDocument docroot)
850 QDomElement categories = docroot.createElement(
"categories");
851 placetoadd.appendChild(categories);
853 for (
const auto & str : std::as_const(cats))
855 QDomElement
cat = docroot.createElement(
"category");
856 categories.appendChild(
cat);
857 cat.setAttribute(
"type",
"genre");
858 cat.setAttribute(
"name", str);
863 QDomElement placetoadd,
864 QDomDocument docroot)
867 QDomElement studios = docroot.createElement(
"studios");
868 placetoadd.appendChild(studios);
870 for (
const auto & str : std::as_const(studs))
872 QDomElement stud = docroot.createElement(
"studio");
873 studios.appendChild(stud);
874 stud.setAttribute(
"name", str);
879 QDomElement placetoadd,
880 QDomDocument docroot)
883 QDomElement countries = docroot.createElement(
"countries");
884 placetoadd.appendChild(countries);
886 for (
const auto & str : std::as_const(counts))
888 QDomElement count = docroot.createElement(
"country");
889 countries.appendChild(count);
890 count.setAttribute(
"name", str);
904 uint programflags = 0;
905 uint audioproperties = 0;
906 uint videoproperties = 0;
907 uint subtitletype = 0;
912 uint ratingcount = 0;
919 QString certification;
923 QString chanplaybackfilters;
928 QString storagegroup;
932 QString collectionref;
938 QStringList categories;
939 QStringList countries;
941 float userrating = 0;
942 float popularity = 0;
944 QDateTime lastupdated;
947 QDateTime recstartts;
953 language = item.firstChildElement(
"language").text();
961 inetref = item.firstChildElement(
"inetref").text();
962 collectionref = item.firstChildElement(
"collectionref").text();
963 tmsref = item.firstChildElement(
"tmsref").text();
964 imdb = item.firstChildElement(
"imdb").text();
965 homepage = item.firstChildElement(
"homepage").text();
966 trailerURL = item.firstChildElement(
"trailer").text();
969 chanid = item.firstChildElement(
"chanid").text().toUInt();
970 channum = item.firstChildElement(
"channum").text();
971 chansign = item.firstChildElement(
"chansign").text();
972 channame = item.firstChildElement(
"channame").text();
973 chanplaybackfilters = item.firstChildElement(
"chanplaybackfilters").text();
974 recgroup = item.firstChildElement(
"recgroup").text();
975 playgroup = item.firstChildElement(
"playgroup").text();
976 seriesid = item.firstChildElement(
"seriesid").text();
977 programid = item.firstChildElement(
"programid").text();
978 storagegroup = item.firstChildElement(
"storagegroup").text();
980 firstChildElement(
"startts").text());
982 firstChildElement(
"endts").text());
984 firstChildElement(
"recstartts").text());
986 firstChildElement(
"recendts").text());
987 programflags = item.firstChildElement(
"programflags").text().toUInt();
988 audioproperties = item.firstChildElement(
"audioproperties").text().toUInt();
989 videoproperties = item.firstChildElement(
"videoproperties").text().toUInt();
990 subtitletype = item.firstChildElement(
"subtitletype").text().toUInt();
992 QString tmpDate = item.firstChildElement(
"releasedate").text();
993 if (!tmpDate.isEmpty())
996 firstChildElement(
"lastupdated").text());
998 userrating = item.firstChildElement(
"userrating").text().toFloat();
999 ratingcount = item.firstChildElement(
"ratingcount").text().toUInt();
1000 tracknum = item.firstChildElement(
"tracknum").text().toUInt();
1001 popularity = item.firstChildElement(
"popularity").text().toFloat();
1002 budget = item.firstChildElement(
"budget").text().toUInt();
1003 revenue = item.firstChildElement(
"revenue").text().toUInt();
1004 year = item.firstChildElement(
"year").text().toUInt();
1005 if (!year && !releasedate.isNull())
1006 year = releasedate.toString(
"yyyy").toUInt();
1007 auto runtime = std::chrono::minutes(item.firstChildElement(
"runtime").text().toUInt());
1008 auto runtimesecs = std::chrono::seconds(item.firstChildElement(
"runtimesecs").text().toUInt());
1010 QDomElement systems = item.firstChildElement(
"systems");
1011 if (!systems.isNull())
1013 QDomElement firstSystem = systems.firstChildElement(
"system");
1014 if (!firstSystem.isNull())
1015 system = firstSystem.text();
1020 QDomElement certifications = item.firstChildElement(
"certifications");
1021 QVector< QPair<QString,QString> > ratinglist;
1022 if (!certifications.isNull())
1024 QDomElement cert = certifications.firstChildElement(
"certification");
1027 while (!cert.isNull())
1029 if (cert.hasAttribute(
"locale") && cert.hasAttribute(
"name"))
1031 QPair<QString,QString> newcert(cert.attribute(
"locale"),
1032 cert.attribute(
"name"));
1033 ratinglist.append(newcert);
1035 cert = cert.nextSiblingElement(
"certification");
1040 if (!ratinglist.isEmpty())
1041 certification = ratinglist.takeFirst().second;
1044 QDomElement categoriesxml = item.firstChildElement(
"categories");
1045 if (!categoriesxml.isNull())
1047 QDomElement
cat = categoriesxml.firstChildElement(
"category");
1050 while (!
cat.isNull())
1052 if (
cat.hasAttribute(
"name"))
1053 categories.append(
cat.attribute(
"name"));
1054 cat =
cat.nextSiblingElement(
"category");
1060 QDomElement countriesxml = item.firstChildElement(
"countries");
1061 if (!countriesxml.isNull())
1063 QDomElement cntry = countriesxml.firstChildElement(
"country");
1064 if (!cntry.isNull())
1066 while (!cntry.isNull())
1068 if (cntry.hasAttribute(
"name"))
1069 countries.append(cntry.attribute(
"name"));
1070 cntry = cntry.nextSiblingElement(
"country");
1076 QDomElement studiosxml = item.firstChildElement(
"studios");
1077 if (!studiosxml.isNull())
1079 QDomElement studio = studiosxml.firstChildElement(
"studio");
1080 if (!studio.isNull())
1082 while (!studio.isNull())
1084 if (studio.hasAttribute(
"name"))
1085 studios.append(studio.attribute(
"name"));
1086 studio = studio.nextSiblingElement(
"studio");
1092 QDomElement peoplexml = item.firstChildElement(
"people");
1093 if (!peoplexml.isNull())
1099 QDomElement artworkxml = item.firstChildElement(
"images");
1100 if (!artworkxml.isNull())
1119 season = item.firstChildElement(
"dvdseason").text().toUInt();
1123 episode = item.firstChildElement(
"dvdepisode").text().toUInt();
1129 season = item.firstChildElement(
"season").text().toUInt();
1133 episode = item.firstChildElement(
"episode").text().toUInt();
1135 LOG(VB_GENERAL, LOG_INFO, QString(
"Result Found, Season %1 Episode %2")
1136 .arg(season).arg(episode));
1142 lookup->
GetFilename(), title, network, status, categories, userrating,
1143 ratingcount, language, subtitle, tagline, description, season,
1144 episode, chanid, channum, chansign, channame,
1145 chanplaybackfilters, recgroup, playgroup, seriesid, programid,
1146 storagegroup, startts, endts, recstartts, recendts, programflags,
1147 audioproperties, videoproperties, subtitletype, certification,
1148 countries, popularity, budget, revenue, album, tracknum, system, year,
1149 releasedate, lastupdated, runtime, runtimesecs, inetref, collectionref,
1150 tmsref, imdb, people, studios, homepage, trailerURL, artwork,
DownloadMap());
1165 QString description;
1168 QString certification;
1169 float userrating = 0;
1171 QStringList categories;
1176 if (item.tagName() ==
"movie")
1178 else if (item.tagName() ==
"episodedetails")
1180 userrating = item.firstChildElement(
"rating").text().toFloat();
1181 year = item.firstChildElement(
"year").text().toUInt();
1182 season = item.firstChildElement(
"season").text().toUInt();
1183 episode = item.firstChildElement(
"episode").text().toUInt();
1186 inetref = item.firstChildElement(
"id").text();
1187 trailer = item.firstChildElement(
"trailer").text();
1188 certification = item.firstChildElement(
"mpaa").text();
1189 categories.append(item.firstChildElement(
"genre").text());
1191 QString tmpDate = item.firstChildElement(
"releasedate").text();
1192 if (!tmpDate.isEmpty())
1197 static const QRegularExpression kAlphaRE {
"[A-Za-z]" };
1199 std::chrono::minutes(item.firstChildElement(
"runtime").text()
1201 .trimmed().toUInt());
1203 QDomElement actor = item.firstChildElement(
"actor");
1204 if (!actor.isNull())
1206 while (!actor.isNull())
1209 info.
name = actor.firstChildElement(
"name").text();
1210 info.
role = actor.firstChildElement(
"role").text();
1211 info.
thumbnail = actor.firstChildElement(
"thumb").text();
1213 actor = actor.nextSiblingElement(
"actor");
1217 QString director = item.firstChildElement(
"director").text();
1218 if (!director.isEmpty())
1221 info.
name = director;
1231 userrating, subtitle, tagline, description, season, episode,
1232 certification, year, releasedate, runtime, runtime,
1233 inetref, people, trailer, artwork,
DownloadMap());
1240 QDomElement person = people.firstChildElement(
"person");
1241 if (!person.isNull())
1243 while (!person.isNull())
1245 if (person.hasAttribute(
"job"))
1247 QString jobstring = person.attribute(
"job");
1249 if (jobstring.toLower() ==
"actor")
1251 else if (jobstring.toLower() ==
"author")
1253 else if (jobstring.toLower() ==
"producer")
1255 else if (jobstring.toLower() ==
"executive producer")
1257 else if (jobstring.toLower() ==
"director")
1259 else if (jobstring.toLower() ==
"cinematographer")
1261 else if (jobstring.toLower() ==
"composer")
1263 else if (jobstring.toLower() ==
"editor")
1265 else if (jobstring.toLower() ==
"casting")
1267 else if (jobstring.toLower() ==
"artist")
1269 else if (jobstring.toLower() ==
"album artist")
1271 else if (jobstring.toLower() ==
"guest star")
1277 if (person.hasAttribute(
"name"))
1278 info.
name = person.attribute(
"name");
1279 if (person.hasAttribute(
"character"))
1280 info.
role = person.attribute(
"character");
1281 if (person.hasAttribute(
"thumb"))
1282 info.
thumbnail = person.attribute(
"thumb");
1283 if (person.hasAttribute(
"url"))
1284 info.
url = person.attribute(
"url");
1286 ret.insert(
type,info);
1288 person = person.nextSiblingElement(
"person");
1298 QDomElement image = artwork.firstChildElement(
"image");
1299 if (!image.isNull())
1301 while (!image.isNull())
1303 if (image.hasAttribute(
"type"))
1305 QString typestring = image.attribute(
"type");
1307 if (typestring.toLower() ==
"coverart")
1309 else if (typestring.toLower() ==
"fanart")
1311 else if (typestring.toLower() ==
"banner")
1313 else if (typestring.toLower() ==
"screenshot")
1315 else if (typestring.toLower() ==
"poster")
1317 else if (typestring.toLower() ==
"back cover")
1319 else if (typestring.toLower() ==
"inside cover")
1321 else if (typestring.toLower() ==
"cd image")
1327 if (image.hasAttribute(
"thumb"))
1328 info.
thumbnail = image.attribute(
"thumb");
1329 if (image.hasAttribute(
"url"))
1330 info.
url = image.attribute(
"url");
1331 if (image.hasAttribute(
"width"))
1332 info.
width = image.attribute(
"width").toUInt();
1335 if (image.hasAttribute(
"height"))
1336 info.
height = image.attribute(
"height").toUInt();
1340 ret.insert(
type,info);
1342 image = image.nextSiblingElement(
"image");
1351 #define D( i, j ) d[(i) * n + (j)]
1352 size_t m = s.length() + 1;
1353 size_t n =
t.length() + 1;
1354 int *
d =
new int[m * n];
1356 for (
size_t i = 0; i < m; i++ )
1358 for (
size_t j = 0; j < n; j++ )
1360 for (
size_t i = 1; i < m; i++ )
1362 for (
size_t j = 1; j < n; j++ )
1365 #
if QT_VERSION < QT_VERSION_CHECK(6,0,0)
1366 s[
static_cast<int>(i) - 1] ==
t[
static_cast<int>(j) - 1]
1368 s[i - 1] ==
t[j - 1]
1371 D( i, j ) =
D( i - 1, j - 1 );
1374 int x =
D( i - 1, j );
1375 int y =
D( i - 1, j - 1 );
1376 int z =
D( i, j - 1 );
1377 D( i, j ) = 1 + std::min({x, y, z});
1381 int result =
D( m - 1, n - 1 );
1387 QString
nearestName(
const QString& actual,
const QStringList& candidates)
1389 int deltaBest = 10000;
1394 QStringList::ConstIterator i = candidates.begin();
1395 while ( i != candidates.end() )
1397 QString candidate = *i;
1398 int delta =
editDistance( actual.toLower(), candidate.toLower() );
1399 if ( delta < deltaBest )
1405 else if ( delta == deltaBest )
1412 if ( numBest == 1 && deltaBest <= tolerance &&
1413 actual.length() + best.length() >= 5 )
1420 QMap<QString, int> TimezoneOffsets;
1425 QString time =
t.simplified();
1426 short int hoursShift = 0;
1427 short int minutesShift = 0;
1429 QStringList
tmp = time.split(
' ');
1432 static const QRegularExpression kNonDigitRE {
"\\D" };
1433 if (
tmp.at(0).contains(kNonDigitRE))
1435 if (
tmp.size() != 5)
1437 QString ltimezone =
tmp.takeAt(
tmp.size() -1);
1438 if (ltimezone.size() == 5)
1441 int tz = ltimezone.toInt(&ok);
1444 hoursShift = tz / 100;
1445 minutesShift = tz % 100;
1449 hoursShift = TimezoneOffsets.value(ltimezone, 0);
1451 if (
tmp.at(0).size() == 1)
1452 tmp[0].prepend(
"0");
1453 tmp [1].truncate(3);
1455 time =
tmp.join(
" ");
1458 if (
tmp.at(2).size() == 4)
1459 result = QLocale::c().toDateTime(time,
"dd MMM yyyy hh:mm:ss");
1461 result = QLocale::c().toDateTime(time,
"dd MMM yy hh:mm:ss");
1462 if (result.isNull() || !result.isValid())
1464 result = result.addSecs(hoursShift * 3600 * (-1) + minutesShift *60 * (-1));
1465 result.setTimeSpec(Qt::UTC);