diff options
| -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, 69 insertions, 98 deletions
diff --git a/src/plugins/PlaylistFormats/xspf/CMakeLists.txt b/src/plugins/PlaylistFormats/xspf/CMakeLists.txt index f4a27ac22..9b97589e8 100644 --- a/src/plugins/PlaylistFormats/xspf/CMakeLists.txt +++ b/src/plugins/PlaylistFormats/xspf/CMakeLists.txt @@ -6,11 +6,6 @@ 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 28a50ca44..221293d1b 100644 --- a/src/plugins/PlaylistFormats/xspf/xspf.pro +++ b/src/plugins/PlaylistFormats/xspf/xspf.pro @@ -13,8 +13,6 @@ 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 ad6c8f2a6..b672bd586 100644 --- a/src/plugins/PlaylistFormats/xspf/xspfplaylistformat.cpp +++ b/src/plugins/PlaylistFormats/xspf/xspfplaylistformat.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2009 by Ilya Kotov * + * Copyright (C) 2008-2012 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 <QDomDocument> -#include <QDomElement> +#include <QXmlStreamReader> +#include <QXmlStreamWriter> #include <QFileInfo> #include <QUrl> #include <QtPlugin> @@ -30,112 +30,89 @@ // 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; - QDomDocument doc; - QString errorMsg; - int errorCol; - int errorRow; - bool ok = doc.setContent(contents, &errorMsg, &errorRow, &errorCol); + QString currentTag; - 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"); - - QDomElement child = tracklistElement.firstChildElement("track"); - - while (!child.isNull()) + QXmlStreamReader xml(contents); + while(!xml.atEnd()) { - 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(); + 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(xml.hasError()) + { + qDebug("XSPFPlaylistFormat: parse error: %s (row:%lld, col:%lld", + qPrintable(xml.errorString()), xml.lineNumber(), xml.columnNumber()); + out.clear(); + } 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) { - 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"); + 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"); int counter = 1; foreach(PlayListItem* f,files) { - QDomElement track = doc.createElement("track"); + xml.writeStartElement("track"); - QDomElement ch = doc.createElement("location"); - QDomText text; + QString url; if (f->url().contains("://")) - text = doc.createTextNode(QUrl::toPercentEncoding(f->url(), ":/")); + url = QUrl::toPercentEncoding(f->url(), ":/"); else //append protocol - 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); + 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 + counter ++; } - - root.appendChild(tracklist); - doc.appendChild( root ); - QString xml_header("<?xml version='1.0' encoding='UTF-8'?>\n"); - return doc.toString().prepend(xml_header); + xml.writeEndElement(); //trackList + xml.writeEndElement(); //playlist + xml.writeEndDocument(); + return out; } XSPFPlaylistFormat::XSPFPlaylistFormat() @@ -146,9 +123,10 @@ 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; } |
