File indexing completed on 2024-04-14 04:48:59

0001 /*
0002     SPDX-FileCopyrightText: 2006 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_xspf.h"
0011 
0012 using namespace KMPlayer;
0013 
0014 
0015 Node *XSPF::Playlist::childFromTag (const QString & tag) {
0016     QByteArray ba = tag.toLatin1();
0017     const char * name = ba.constData ();
0018     if (!strcasecmp (name, "tracklist"))
0019         return new Tracklist (m_doc);
0020     else if (!strcasecmp (name, "creator"))
0021         return new DarkNode (m_doc, name, id_node_creator);
0022     else if (!strcasecmp (name, "title"))
0023         return new DarkNode (m_doc, name, id_node_title);
0024     else if (!strcasecmp (name, "annotation"))
0025         return new DarkNode (m_doc, name, id_node_annotation);
0026     else if (!strcasecmp (name, "info"))
0027         return new DarkNode (m_doc, name, id_node_info);
0028     else if (!strcasecmp (name, "location"))
0029         return new DarkNode (m_doc, name, id_node_location);
0030     else if (!strcasecmp (name, "identifier"))
0031         return new DarkNode (m_doc, name, id_node_identifier);
0032     else if (!strcasecmp (name, "image"))
0033         return new DarkNode (m_doc, name, id_node_image);
0034     else if (!strcasecmp (name, "date"))
0035         return new DarkNode (m_doc, name, id_node_date);
0036     else if (!strcasecmp (name, "license"))
0037         return new DarkNode (m_doc, name, id_node_license);
0038     else if (!strcasecmp (name, "attribution"))
0039         return new DarkNode (m_doc, name, id_node_attribution);
0040     else if (!strcasecmp (name, "link"))
0041         return new DarkNode (m_doc, name, id_node_link);
0042     else if (!strcasecmp (name, "meta"))
0043         return new DarkNode (m_doc, name, id_node_meta);
0044     else if (!strcasecmp (name, "extension"))
0045         return new DarkNode (m_doc, name, id_node_extension);
0046     return nullptr;
0047 }
0048 
0049 void XSPF::Playlist::closed () {
0050     for (Node *e = firstChild (); e; e = e->nextSibling ()) {
0051         if (e->id == id_node_title)
0052             title = e->innerText ().simplified ();
0053         else if (e->id == id_node_location)
0054             src = e->innerText ().trimmed ();
0055     }
0056     Mrl::closed ();
0057 }
0058 
0059 void *XSPF::Playlist::role (RoleType msg, void *content)
0060 {
0061     if (RolePlaylist == msg)
0062         return !title.isEmpty () ? (PlaylistRole *) this : nullptr;
0063     return Mrl::role (msg, content);
0064 }
0065 
0066 //-----------------------------------------------------------------------------
0067 
0068 Node *XSPF::Tracklist::childFromTag (const QString & tag) {
0069     QByteArray ba = tag.toLatin1 ();
0070     const char *name = ba.constData ();
0071     if (!strcasecmp (name, "track"))
0072         return new XSPF::Track (m_doc);
0073     return nullptr;
0074 }
0075 
0076 //-----------------------------------------------------------------------------
0077 
0078 Node *XSPF::Track::childFromTag (const QString & tag) {
0079     QByteArray ba = tag.toLatin1 ();
0080     const char *name = ba.constData ();
0081     if (!strcasecmp (name, "location"))
0082         return new Location (m_doc);
0083     else if (!strcasecmp (name, "creator"))
0084         return new DarkNode (m_doc, name, id_node_creator);
0085     else if (!strcasecmp (name, "title"))
0086         return new DarkNode (m_doc, name, id_node_title);
0087     else if (!strcasecmp (name, "annotation"))
0088         return new DarkNode (m_doc, name, id_node_annotation);
0089     else if (!strcasecmp (name, "info"))
0090         return new DarkNode (m_doc, name, id_node_info);
0091     else if (!strcasecmp (name, "identifier"))
0092         return new DarkNode (m_doc, name, id_node_identifier);
0093     else if (!strcasecmp (name, "album"))
0094         return new DarkNode (m_doc, name, id_node_album);
0095     else if (!strcasecmp (name, "image"))
0096         return new DarkNode (m_doc, name, id_node_image);
0097     else if (!strcasecmp (name, "trackNum"))
0098         return new DarkNode (m_doc, name, id_node_tracknum);
0099     else if (!strcasecmp (name, "duration"))
0100         return new DarkNode (m_doc, name, id_node_duration);
0101     else if (!strcasecmp (name, "link"))
0102         return new DarkNode (m_doc, name, id_node_link);
0103     else if (!strcasecmp (name, "meta"))
0104         return new DarkNode (m_doc, name, id_node_meta);
0105     else if (!strcasecmp (name, "extension"))
0106         return new DarkNode (m_doc, name, id_node_extension);
0107     return nullptr;
0108 }
0109 
0110 void XSPF::Track::closed () {
0111     Location *location = nullptr;
0112     QString title;
0113     for (Node *e = firstChild (); e; e = e->nextSibling ()) {
0114         switch (e->id) {
0115             case id_node_title:
0116                 title = e->innerText ();
0117                 break;
0118             case id_node_location:
0119                 location = static_cast <Location *> (e);
0120                 break;
0121         }
0122     }
0123     if (location && !title.isEmpty ())
0124         location->setCaption (title);
0125     Element::closed ();
0126 }
0127 
0128 void XSPF::Track::activate () {
0129     for (Node *e = firstChild (); e; e = e->nextSibling ())
0130         if (e->id == id_node_annotation) {
0131             QString inf = e->innerText ().trimmed ();
0132             document ()->message (MsgInfoString, &inf);
0133             break;
0134         }
0135     Element::activate ();
0136 }
0137 
0138 void XSPF::Location::closed () {
0139     src = innerText ().trimmed ();
0140     Mrl::closed ();
0141 }