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 }