15 #define LOC QString("NewsSite: ")
16 #define LOC_WARN QString("NewsSite, Warning: ")
17 #define LOC_ERR QString("NewsSite, Error: ")
20 QDateTime updated,
const bool podcast) :
22 m_updated(
std::move(updated)),
32 QMutexLocker locker(&
m_lock);
36 QObject::deleteLater();
41 QMutexLocker locker(&
m_lock);
48 QMutexLocker locker(&
m_lock);
54 QMutexLocker locker(&
m_lock);
60 QMutexLocker locker(&
m_lock);
73 QMutexLocker locker(&
m_lock);
80 QMutexLocker locker(&
m_lock);
86 QMutexLocker locker(&
m_lock);
92 QMutexLocker locker(&
m_lock);
98 QMutexLocker locker(&
m_lock);
104 QMutexLocker locker(&
m_lock);
110 QMutexLocker locker(&
m_lock);
116 QMutexLocker locker(&
m_lock);
130 QMutexLocker locker(&
m_lock);
136 QMutexLocker locker(&
m_lock);
142 QMutexLocker locker(&
m_lock);
148 QMutexLocker locker(&
m_lock);
151 auto secs = std::chrono::seconds(
m_updated.secsTo(curTime));
152 return duration_cast<std::chrono::minutes>(secs);
159 auto *me =
dynamic_cast<MythEvent *
>(event);
162 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
163 QStringList tokens = me->
Message().split(
" ", QString::SkipEmptyParts);
165 QStringList tokens = me->Message().split(
" ", Qt::SkipEmptyParts);
168 if (tokens.isEmpty())
171 if (tokens[0] ==
"DOWNLOAD_FILE")
173 QStringList
args = me->ExtraDataList();
175 if (tokens[1] ==
"UPDATE")
179 else if (tokens[1] ==
"FINISHED")
183 int fileSize =
args[2].toInt();
184 QString errorStr =
args[3];
185 int errorCode =
args[4].toInt();
187 if ((errorCode != 0) || (fileSize == 0))
189 LOG(VB_GENERAL, LOG_ERR,
LOC +
"HTTP Connection Error - " +
190 QString(
"%1\n\t\t\tExplanation: %2: %3, filesize: %4, filename: %5")
191 .arg(
url).arg(errorCode).arg(errorStr).arg(fileSize).arg(
filename));
227 QMutexLocker locker(&
m_lock);
238 if (!xmlFile.exists())
247 if (!xmlFile.open(QIODevice::ReadOnly))
250 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to open xmlfile");
256 if (!domDoc.setContent(&xmlFile))
259 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to set content from xmlfile");
274 QString rootName = domDoc.documentElement().nodeName();
275 if (rootName ==
"rss" || rootName ==
"rdf:RDF")
281 if (rootName ==
"feed")
287 LOG(VB_GENERAL, LOG_ERR,
LOC +
"XML-file is not valid RSS-feed");
293 return mimeType ==
"image/png" || mimeType ==
"image/jpeg" ||
294 mimeType ==
"image/jpg" || mimeType ==
"image/gif" ||
295 mimeType ==
"image/bmp";
300 return mimeType ==
"video/mpeg" || mimeType ==
"video/x-ms-wmv" ||
301 mimeType ==
"application/x-troff-msvideo" || mimeType ==
"video/avi" ||
302 mimeType ==
"video/msvideo" || mimeType ==
"video/x-msvideo";
307 QMutexLocker locker(&
m_lock);
309 QDomNode channelNode = domDoc.documentElement().namedItem(
"channel");
311 m_desc = channelNode.namedItem(
"description")
312 .toElement().text().simplified();
314 QDomNode imageNode = channelNode.namedItem(
"image");
315 if (!imageNode.isNull())
316 m_imageURL = imageNode.namedItem(
"url").toElement().text().simplified();
318 QDomNodeList items = domDoc.elementsByTagName(
"item");
320 for (
unsigned int i = 0; i < (unsigned) items.count(); i++)
322 QDomNode itemNode = items.item(i);
324 .toElement().text().simplified());
326 QDomNode descNode = itemNode.namedItem(
"description");
328 if (!descNode.isNull())
330 description = descNode.toElement().text().simplified();
334 QDomNode linkNode = itemNode.namedItem(
"link");
336 if (!linkNode.isNull())
337 url = linkNode.toElement().text().simplified();
339 QDomNode enclosureNode = itemNode.namedItem(
"enclosure");
341 QString enclosure_type;
343 if (!enclosureNode.isNull())
345 QDomAttr enclosureURL = enclosureNode.toElement()
346 .attributeNode(
"url");
348 if (!enclosureURL.isNull())
349 enclosure = enclosureURL.value();
351 QDomAttr enclosureType = enclosureNode.toElement()
352 .attributeNode(
"type");
353 if (!enclosureType.isNull())
355 enclosure_type = enclosureType.value();
357 if (enclosure_type ==
"image/jpeg")
359 thumbnail = enclosure;
364 if (enclosure_type ==
"" || enclosure_type.isNull())
366 QStringList imageExtensions = QStringList() <<
".jpg" <<
".jpeg" <<
".png" <<
".gif";
367 for (
int x = 0; x < imageExtensions.count(); x++)
369 if (enclosure.endsWith(imageExtensions[x], Qt::CaseInsensitive))
371 thumbnail = enclosure;
394 QDomNode mediaGroup = itemNode.namedItem(
"media:group");
395 if (!mediaGroup.isNull())
396 itemNode = mediaGroup;
398 QDomNode thumbNode = itemNode.namedItem(
"media:thumbnail");
399 if (!thumbNode.isNull())
401 QDomAttr thumburl = thumbNode.toElement().attributeNode(
"url");
402 if (!thumburl.isNull())
403 thumbnail = thumburl.value();
406 QDomNode playerNode = itemNode.namedItem(
"media:player");
408 if (!playerNode.isNull())
410 QDomAttr mediaURL = playerNode.toElement().attributeNode(
"url");
411 if (!mediaURL.isNull())
412 mediaurl = mediaURL.value();
416 descNode = itemNode.namedItem(
"media:description");
417 if (!descNode.isNull())
418 description = descNode.toElement().text().simplified();
421 QDomElement e = itemNode.toElement();
422 QDomNodeList mediaNodes = e.elementsByTagName(
"media:content");
423 for (
int x = 0; x < mediaNodes.count(); x++)
429 QDomElement mediaElement = mediaNodes.at(x).toElement();
431 if (mediaElement.isNull())
434 if (mediaElement.hasAttribute(
"medium"))
435 medium = mediaElement.attributeNode(
"medium").value();
437 if (mediaElement.hasAttribute(
"type"))
438 type = mediaElement.attributeNode(
"type").value();
440 if (mediaElement.hasAttribute(
"url"))
441 url2 = mediaElement.attributeNode(
"url").value();
443 LOG(VB_GENERAL, LOG_DEBUG,
444 QString(
"parseRSS found media:content: medium: %1, type: %2, url: %3")
445 .arg(medium,
type, url2));
448 if (thumbnail.isEmpty() && (medium ==
"image" ||
isImage(
type)))
452 if (enclosure.isEmpty() && (medium ==
"video" ||
isVideo(
type)))
457 thumbnail, mediaurl, enclosure));
463 QDomNodeList entries = domDoc.elementsByTagName(
"entry");
465 for (
unsigned int i = 0; i < (unsigned) entries.count(); i++)
467 QDomNode itemNode = entries.item(i);
468 QString title =
ReplaceHtmlChar(itemNode.namedItem(
"title").toElement()
469 .text().simplified());
471 QDomNode summNode = itemNode.namedItem(
"summary");
473 if (!summNode.isNull())
476 summNode.toElement().text().simplified());
479 QDomNode linkNode = itemNode.namedItem(
"link");
481 if (!linkNode.isNull())
483 QDomAttr linkHref = linkNode.toElement().attributeNode(
"href");
484 if (!linkHref.isNull())
485 url = linkHref.value();
498 s.replace(
"&",
"&");
499 s.replace(
"£",
"£");
500 s.replace(
"<",
"<");
501 s.replace(
">",
">");
502 s.replace(
""",
"\"");
503 s.replace(
"'",
"\'");
504 s.replace(
"…",QChar(8230));
505 s.replace(
"é",QChar(233));
506 s.replace(
"—", QChar(8212));
507 s.replace(
" ",
" ");
508 s.replace(
" ", QChar(160));
509 s.replace(
"á", QChar(225));
510 s.replace(
"‘", QChar(8216));
511 s.replace(
"’", QChar(8217));
512 s.replace(
"'",
"\'");
513 s.replace(
"–", QChar(8211));
515 s.replace(
"ä", QChar(0x00e4));
516 s.replace(
"ö", QChar(0x00f6));
517 s.replace(
"ü", QChar(0x00fc));
518 s.replace(
"Ä", QChar(0x00c4));
519 s.replace(
"Ö", QChar(0x00d6));
520 s.replace(
"Ü", QChar(0x00dc));
521 s.replace(
"ß", QChar(0x00df));