diff options
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/PlaylistFormats/xspf/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | src/plugins/PlaylistFormats/xspf/xspf.pro | 2 | ||||
| -rw-r--r-- | src/plugins/PlaylistFormats/xspf/xspfplaylistformat.cpp | 160 |
3 files changed, 98 insertions, 69 deletions
diff --git a/src/plugins/PlaylistFormats/xspf/CMakeLists.txt b/src/plugins/PlaylistFormats/xspf/CMakeLists.txt index 9b97589e8..f4a27ac22 100644 --- a/src/plugins/PlaylistFormats/xspf/CMakeLists.txt +++ b/src/plugins/PlaylistFormats/xspf/CMakeLists.txt @@ -6,6 +6,11 @@ if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) endif(COMMAND cmake_policy) +SET(QT_USE_QTXML TRUE) + +INCLUDE(FindQt4) +INCLUDE(${QT_USE_FILE}) + # qt plugin ADD_DEFINITIONS( -Wall ) ADD_DEFINITIONS(${QT_DEFINITIONS}) diff --git a/src/plugins/PlaylistFormats/xspf/xspf.pro b/src/plugins/PlaylistFormats/xspf/xspf.pro index 221293d1b..28a50ca44 100644 --- a/src/plugins/PlaylistFormats/xspf/xspf.pro +++ b/src/plugins/PlaylistFormats/xspf/xspf.pro @@ -13,6 +13,8 @@ QMAKE_LIBDIR += ../../../../lib INCLUDEPATH += ../../../../src +QT += xml + SOURCES += xspfplaylistformat.cpp HEADERS += xspfplaylistformat.h diff --git a/src/plugins/PlaylistFormats/xspf/xspfplaylistformat.cpp b/src/plugins/PlaylistFormats/xspf/xspfplaylistformat.cpp index b672bd586..ad6c8f2a6 100644 --- a/src/plugins/PlaylistFormats/xspf/xspfplaylistformat.cpp +++ b/src/plugins/PlaylistFormats/xspf/xspfplaylistformat.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2012 by Ilya Kotov * + * Copyright (C) 2008-2009 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -18,8 +18,8 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include <QXmlStreamReader> -#include <QXmlStreamWriter> +#include <QDomDocument> +#include <QDomElement> #include <QFileInfo> #include <QUrl> #include <QtPlugin> @@ -30,89 +30,112 @@ // Needs more work - it's better use libSpiff there and put it as plugin. -QStringList XSPFPlaylistFormat::decode(const QString &contents) +QStringList XSPFPlaylistFormat::decode(const QString & contents) { QStringList out; - QString currentTag; + QDomDocument doc; + QString errorMsg; + int errorCol; + int errorRow; + bool ok = doc.setContent(contents, &errorMsg, &errorRow, &errorCol); - QXmlStreamReader xml(contents); - while(!xml.atEnd()) - { - xml.readNext(); - if (xml.isStartElement()) - { - currentTag = xml.name().toString(); - - } - else if (xml.isCharacters() && !xml.isWhitespace()) - { - if (currentTag == "location") - { - - QUrl url(xml.text().toString()); - if (url.scheme() == "file") //remove scheme for local files only - out << QUrl::fromPercentEncoding(url.toString(QUrl::RemoveScheme).toAscii()); - else - out << url.toString(); - } - } - } + if (!ok) + qDebug("Parse Error: %s\tRow:%d\tCol%d", + qPrintable(errorMsg), errorRow, errorCol ); + + QDomElement rootElement = doc.firstChildElement("playlist"); + if (rootElement.isNull()) + qWarning("Error parsing XSPF: can't find 'playlist' element"); + + QDomElement tracklistElement = rootElement.firstChildElement("trackList"); + if (tracklistElement.isNull()) + qWarning("Error parsing XSPF: can't find 'trackList' element"); - if(xml.hasError()) + QDomElement child = tracklistElement.firstChildElement("track"); + + while (!child.isNull()) { - qDebug("XSPFPlaylistFormat: parse error: %s (row:%lld, col:%lld", - qPrintable(xml.errorString()), xml.lineNumber(), xml.columnNumber()); - out.clear(); + QUrl url (child.firstChildElement("location").text()); + if (url.scheme() == "file") //remove scheme for local files only + out << QUrl::fromPercentEncoding(url.toString(QUrl::RemoveScheme).toAscii()); + else + out << url.toString(); + child = child.nextSiblingElement(); } + return out; } // Needs more work - it's better use libSpiff there and put it as plugin. -QString XSPFPlaylistFormat::encode(const QList<PlayListItem*> &files) +QString XSPFPlaylistFormat::encode(const QList<PlayListItem*> & files) { - QString out; - QXmlStreamWriter xml(&out); - xml.setCodec("UTF-8"); - xml.setAutoFormatting(true); - xml.writeStartDocument(); - xml.writeStartElement("playlist"); - xml.writeAttribute("version", "1"); - xml.writeAttribute("xmlns", "http://xspf.org/ns/0/"); - xml.writeTextElement("creator", "qmmp-" + Qmmp::strVersion()); - xml.writeStartElement("trackList"); + QDomDocument doc; + QDomElement root = doc.createElement("playlist"); + root.setAttribute("version",QString("1")); + root.setAttribute("xmlns",QString("http://xspf.org/ns/0/")); + + QDomElement creator = doc.createElement("creator"); + QDomText text = doc.createTextNode("qmmp-" + Qmmp::strVersion()); + creator.appendChild(text); + root.appendChild(creator); + + QDomElement tracklist = doc.createElement("trackList"); int counter = 1; foreach(PlayListItem* f,files) { - xml.writeStartElement("track"); + QDomElement track = doc.createElement("track"); - QString url; + QDomElement ch = doc.createElement("location"); + QDomText text; if (f->url().contains("://")) - url = QUrl::toPercentEncoding(f->url(), ":/"); + text = doc.createTextNode(QUrl::toPercentEncoding(f->url(), ":/")); else //append protocol - url = QUrl::toPercentEncoding(QString("file://") + - QFileInfo(f->url()).absoluteFilePath(), ":/"); - - xml.writeTextElement("location", url); - xml.writeTextElement("title", f->value(Qmmp::TITLE)); - xml.writeTextElement("creator", f->value(Qmmp::ARTIST)); - xml.writeTextElement("annotation", f->value(Qmmp::COMMENT)); - xml.writeTextElement("album", f->value(Qmmp::ALBUM)); - xml.writeTextElement("trackNum", QString::number(counter)); - - xml.writeStartElement("meta"); - xml.writeAttribute("rel", "year"); - xml.writeCharacters(f->value(Qmmp::YEAR)); - xml.writeEndElement(); // meta - xml.writeEndElement(); // track - + text = doc.createTextNode(QUrl::toPercentEncoding(QString("file://") + + QFileInfo(f->url()).absoluteFilePath(), ":/")); + ch.appendChild(text); + track.appendChild(ch); + + ch = doc.createElement("title"); + text = doc.createTextNode(f->value(Qmmp::TITLE)); + ch.appendChild(text); + track.appendChild(ch); + + ch = doc.createElement("creator"); + text = doc.createTextNode(f->value(Qmmp::ARTIST)); + ch.appendChild(text); + track.appendChild(ch); + + ch = doc.createElement("annotation"); + text = doc.createTextNode(f->value(Qmmp::COMMENT)); + ch.appendChild(text); + track.appendChild(ch); + + ch = doc.createElement("album"); + text = doc.createTextNode(f->value(Qmmp::ALBUM)); + ch.appendChild(text); + track.appendChild(ch); + + ch = doc.createElement("trackNum"); + text = doc.createTextNode(QString::number(counter)); + ch.appendChild(text); + track.appendChild(ch); + + ch = doc.createElement("meta"); + ch.setAttribute("rel", "year"); + text = doc.createTextNode(f->value(Qmmp::YEAR)); + ch.appendChild(text); + track.appendChild(ch); + + tracklist.appendChild(track); counter ++; } - xml.writeEndElement(); //trackList - xml.writeEndElement(); //playlist - xml.writeEndDocument(); - return out; + + root.appendChild(tracklist); + doc.appendChild( root ); + QString xml_header("<?xml version='1.0' encoding='UTF-8'?>\n"); + return doc.toString().prepend(xml_header); } XSPFPlaylistFormat::XSPFPlaylistFormat() @@ -123,10 +146,9 @@ XSPFPlaylistFormat::XSPFPlaylistFormat() bool XSPFPlaylistFormat::hasFormat(const QString & f) { foreach(QString s,m_supported_formats) - { - if (f == s) - return true; - } + if (f == s) + return true; + return false; } |
