File indexing completed on 2024-04-21 04:54:00
0001 /* 0002 SPDX-FileCopyrightText: 2005 Koos Vriezen <koos.vriezen@gmail.com> 0003 0004 SPDX-License-Identifier: LGPL-2.0-only 0005 */ 0006 0007 #include "config-kmplayer.h" 0008 0009 #include "kmplayercommon_log.h" 0010 #include "kmplayer_rss.h" 0011 #include "kmplayer_atom.h" 0012 0013 using namespace KMPlayer; 0014 0015 Node *RSS::Rss::childFromTag (const QString & tag) { 0016 if (!strcmp (tag.toLatin1 ().constData (), "channel")) 0017 return new RSS::Channel (m_doc); 0018 return nullptr; 0019 } 0020 0021 void *RSS::Rss::role (RoleType msg, void *content) 0022 { 0023 if (RolePlaylist == msg) 0024 return nullptr; 0025 return Element::role (msg, content); 0026 } 0027 0028 Node *RSS::Channel::childFromTag (const QString & tag) { 0029 QByteArray ba = tag.toLatin1 (); 0030 const char *ctag = ba.constData (); 0031 if (!strcmp (ctag, "item")) 0032 return new RSS::Item (m_doc); 0033 else if (!strcmp (ctag, "title")) 0034 return new DarkNode (m_doc, ctag, id_node_title); 0035 else if (!strncmp (ctag, "itunes", 6) || 0036 !strncmp (ctag, "media", 5)) 0037 return new DarkNode (m_doc, ctag, id_node_ignored); 0038 return nullptr; 0039 } 0040 0041 void RSS::Channel::closed () { 0042 for (Node *c = firstChild (); c; c = c->nextSibling ()) 0043 if (c->id == id_node_title) { 0044 title = c->innerText ().simplified (); 0045 break; 0046 } 0047 Element::closed (); 0048 } 0049 0050 void *RSS::Channel::role (RoleType msg, void *content) 0051 { 0052 if (RolePlaylist == msg) 0053 return !title.isEmpty () || //return false if no title and only one 0054 previousSibling () || nextSibling () ? (PlaylistRole *) this : nullptr; 0055 return Element::role (msg, content); 0056 } 0057 0058 Node *RSS::Item::childFromTag (const QString & tag) { 0059 QByteArray ba = tag.toLatin1 (); 0060 const char *ctag = ba.constData (); 0061 if (!strcmp (ctag, "enclosure")) 0062 return new RSS::Enclosure (m_doc); 0063 else if (!strcmp (ctag, "title")) 0064 return new DarkNode (m_doc, ctag, id_node_title); 0065 else if (!strcmp (ctag, "description")) 0066 return new DarkNode (m_doc, ctag, id_node_description); 0067 else if (!strcmp (ctag, "category")) 0068 return new DarkNode (m_doc, ctag, id_node_category); 0069 else if (!strcmp (ctag, "media:group")) 0070 return new ATOM::MediaGroup (m_doc); 0071 else if (!strcmp (ctag, "media:thumbnail")) 0072 return new DarkNode (m_doc, ctag, id_node_thumbnail); 0073 else if (!strncmp (ctag, "itunes", 6) || 0074 !strncmp (ctag, "feedburner", 10) || 0075 !strcmp (ctag, "link") || 0076 !strcmp (ctag, "pubDate") || 0077 !strcmp (ctag, "guid") || 0078 !strncmp (ctag, "media", 5)) 0079 return new DarkNode (m_doc, ctag, id_node_ignored); 0080 return nullptr; 0081 } 0082 0083 void RSS::Item::closed () { 0084 if (!summary_added) { 0085 ATOM::MediaGroup *group = nullptr; 0086 Enclosure *enclosure = nullptr; 0087 QString description; 0088 QString thumbnail; 0089 int width = 0, height = 0; 0090 for (Node *c = firstChild (); c; c = c->nextSibling ()) { 0091 switch (c->id) { 0092 case id_node_title: 0093 title = c->innerText ().simplified (); 0094 break; 0095 case id_node_enclosure: 0096 enclosure = static_cast <Enclosure *> (c); 0097 break; 0098 case id_node_description: 0099 description = c->innerText (); 0100 break; 0101 case ATOM::id_node_media_group: 0102 group = static_cast <ATOM::MediaGroup *> (c); 0103 break; 0104 case id_node_thumbnail: 0105 thumbnail = static_cast<Element*>(c)->getAttribute(Ids::attr_url); 0106 width = static_cast<Element*>(c)->getAttribute(Ids::attr_width).toInt(); 0107 height = static_cast<Element*>(c)->getAttribute(Ids::attr_height).toInt(); 0108 break; 0109 } 0110 } 0111 if (group) 0112 group->addSummary (this, nullptr, title, description, thumbnail, width, height); 0113 if (enclosure) { 0114 enclosure->setCaption (title); 0115 enclosure->description = description; 0116 } 0117 summary_added = true; 0118 } 0119 Element::closed (); 0120 } 0121 0122 void RSS::Enclosure::activate () { 0123 document ()->message (MsgInfoString, &description); 0124 Mrl::activate (); 0125 } 0126 0127 void RSS::Enclosure::deactivate () { 0128 document ()->message (MsgInfoString, nullptr); 0129 Mrl::deactivate (); 0130 } 0131 0132 void RSS::Enclosure::closed () { 0133 src = getAttribute (Ids::attr_url); 0134 Mrl::closed (); 0135 }