diff --git a/src/libtomahawk/utils/xspfloader.cpp b/src/libtomahawk/utils/xspfloader.cpp index ccdba5b9b..015eeb5d3 100644 --- a/src/libtomahawk/utils/xspfloader.cpp +++ b/src/libtomahawk/utils/xspfloader.cpp @@ -76,36 +76,57 @@ XSPFLoader::gotBody() qDebug() << Q_FUNC_INFO; QDomDocument xmldoc; - xmldoc.setContent( m_body ); + bool namespaceProcessing = true; + xmldoc.setContent( m_body, namespaceProcessing ); QDomElement docElement( xmldoc.documentElement() ); QString origTitle; - origTitle = docElement.firstChildElement( "title" ).text(); - m_info = docElement.firstChildElement( "creator" ).text(); - m_creator = docElement.firstChildElement( "info" ).text(); + QDomNodeList tracklist; + QDomElement n = docElement.firstChildElement(); + for ( ; !n.isNull(); n = n.nextSiblingElement() ) { + if (n.namespaceURI() == NS && n.localName() == "title") { + origTitle = n.text(); + } else if (n.namespaceURI() == NS && n.localName() == "creator") { + m_creator = n.text(); + } else if (n.namespaceURI() == NS && n.localName() == "info") { + m_info = n.text(); + } else if (n.namespaceURI() == NS && n.localName() == "trackList") { + tracklist = n.childNodes(); + } + } m_title = origTitle; if ( m_title.isEmpty() ) m_title = tr( "New Playlist" ); - QDomNodeList tracklist = docElement.elementsByTagName( "track" ); for ( unsigned int i = 0; i < tracklist.length(); i++ ) { QDomNode e = tracklist.at( i ); + QString artist, album, track, duration, annotation; + QDomElement n = e.firstChildElement(); + for ( ; !n.isNull(); n = n.nextSiblingElement() ) { + if (n.namespaceURI() == NS && n.localName() == "duration") { + duration = n.text(); + } else if (n.namespaceURI() == NS && n.localName() == "annotation") { + annotation = n.text(); + } else if (n.namespaceURI() == NS && n.localName() == "creator") { + artist = n.text(); + } else if (n.namespaceURI() == NS && n.localName() == "album") { + album = n.text(); + } else if (n.namespaceURI() == NS && n.localName() == "title") { + track = n.text(); + } + } + plentry_ptr p( new PlaylistEntry ); p->setGuid( uuid() ); - p->setDuration( e.firstChildElement( "duration" ).text().toInt() / 1000 ); + p->setDuration( duration.toInt() / 1000 ); p->setLastmodified( 0 ); - p->setAnnotation( e.firstChildElement( "annotation" ).text() ); - - QString artist, album, track; - artist = e.firstChildElement( "creator" ).text(); - album = e.firstChildElement( "album" ).text(); - track = e.firstChildElement( "title" ).text(); + p->setAnnotation( annotation ); p->setQuery( Tomahawk::Query::get( artist, track, album, uuid() ) ); - p->query()->setDuration( e.firstChildElement( "duration" ).text().toInt() / 1000 ); + p->query()->setDuration( duration.toInt() / 1000 ); m_entries << p; } diff --git a/src/libtomahawk/utils/xspfloader.h b/src/libtomahawk/utils/xspfloader.h index f264c62a9..2a01375fb 100644 --- a/src/libtomahawk/utils/xspfloader.h +++ b/src/libtomahawk/utils/xspfloader.h @@ -25,6 +25,7 @@ public: explicit XSPFLoader( bool autoCreate = true, QObject* parent = 0 ) : QObject( parent ) , m_autoCreate( autoCreate ) + , NS("http://xspf.org/ns/0/") {} virtual ~XSPFLoader() @@ -47,6 +48,7 @@ private slots: void networkError( QNetworkReply::NetworkError e ); private: + QString NS; void reportError(); void gotBody();