You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
435 lines
15 KiB
435 lines
15 KiB
// Author: Mattias Fliesberg (C) Copyright 2006
|
|
// Copyright: See COPYING file that comes with this distribution
|
|
//
|
|
|
|
#include "atomicstring.h"
|
|
#include "xspfplaylist.h"
|
|
#include "debug.h"
|
|
|
|
XSPFPlaylist::XSPFPlaylist( )
|
|
{
|
|
TQDomElement root = createElement( "playlist" );
|
|
|
|
root.setAttribute( "version", 1 );
|
|
root.setAttribute( "xmlns", "http://xspf.org/ns/0/" );
|
|
|
|
root.appendChild( createElement( "trackList" ) );
|
|
|
|
appendChild( root );
|
|
}
|
|
|
|
XSPFPlaylist::XSPFPlaylist( TQTextStream &stream )
|
|
{
|
|
loadXSPF( stream );
|
|
}
|
|
|
|
bool
|
|
XSPFPlaylist::loadXSPF( TQTextStream &stream )
|
|
{
|
|
TQString errorMsg;
|
|
int errorLine, errorColumn;
|
|
stream.setEncoding( TQTextStream::UnicodeUTF8 );
|
|
if (!setContent(stream.read(), &errorMsg, &errorLine, &errorColumn))
|
|
{
|
|
debug() << "[XSPFPlaylist]: Error loading xml file: " "(" << errorMsg << ")"
|
|
<< " at line " << errorLine << ", column " << errorColumn << endl;
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TQString
|
|
XSPFPlaylist::title()
|
|
{
|
|
return documentElement().namedItem( "title" ).firstChild().nodeValue();
|
|
}
|
|
|
|
TQString
|
|
XSPFPlaylist::creator()
|
|
{
|
|
return documentElement().namedItem( "creator" ).firstChild().nodeValue();
|
|
}
|
|
|
|
TQString
|
|
XSPFPlaylist::annotation()
|
|
{
|
|
return documentElement().namedItem( "annotation" ).firstChild().nodeValue();
|
|
}
|
|
|
|
KURL
|
|
XSPFPlaylist::info()
|
|
{
|
|
return KURL::fromPathOrURL( documentElement().namedItem( "info" ).firstChild().nodeValue() );
|
|
}
|
|
|
|
KURL
|
|
XSPFPlaylist::location()
|
|
{
|
|
return KURL::fromPathOrURL( documentElement().namedItem( "location" ).firstChild().nodeValue() );
|
|
}
|
|
|
|
TQString
|
|
XSPFPlaylist::identifier()
|
|
{
|
|
return documentElement().namedItem( "identifier" ).firstChild().nodeValue();
|
|
}
|
|
|
|
KURL
|
|
XSPFPlaylist::image()
|
|
{
|
|
return KURL::fromPathOrURL( documentElement().namedItem( "image" ).firstChild().nodeValue() );
|
|
}
|
|
|
|
TQDateTime
|
|
XSPFPlaylist::date()
|
|
{
|
|
return TQDateTime::fromString( documentElement().namedItem( "date" ).firstChild().nodeValue(), Qt::ISODate );
|
|
}
|
|
|
|
KURL
|
|
XSPFPlaylist::license()
|
|
{
|
|
return KURL::fromPathOrURL( documentElement().namedItem( "license" ).firstChild().nodeValue() );
|
|
}
|
|
|
|
KURL::List
|
|
XSPFPlaylist::attribution()
|
|
{
|
|
TQDomNode node = documentElement().namedItem( "attribution" );
|
|
KURL::List list;
|
|
|
|
while ( !node.isNull() )
|
|
{
|
|
if ( !node.namedItem( "location" ).firstChild().nodeValue().isNull() )
|
|
list.append( node.namedItem( "location" ).firstChild().nodeValue() );
|
|
else if ( !node.namedItem( "identifier" ).firstChild().nodeValue().isNull() )
|
|
list.append( node.namedItem( "identifier" ).firstChild().nodeValue() );
|
|
|
|
node = node.nextSibling();
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
KURL
|
|
XSPFPlaylist::link()
|
|
{
|
|
return KURL::fromPathOrURL( documentElement().namedItem( "link" ).firstChild().nodeValue() );
|
|
}
|
|
|
|
void
|
|
XSPFPlaylist::setTitle( TQString title )
|
|
{
|
|
if ( documentElement().namedItem( "title" ).isNull() )
|
|
{
|
|
TQDomNode node = createElement( "title" );
|
|
TQDomNode subNode = createTextNode( title );
|
|
node.appendChild( subNode );
|
|
documentElement().insertBefore( node, documentElement().namedItem( "trackList" ) );
|
|
}
|
|
else
|
|
documentElement().namedItem( "title" ).replaceChild( createTextNode( title ), documentElement().namedItem( "title" ).firstChild() );
|
|
}
|
|
|
|
void
|
|
XSPFPlaylist::setCreator( TQString creator )
|
|
{
|
|
if ( documentElement().namedItem( "creator" ).isNull() )
|
|
{
|
|
TQDomNode node = createElement( "creator" );
|
|
TQDomNode subNode = createTextNode( creator );
|
|
node.appendChild( subNode );
|
|
documentElement().insertBefore( node, documentElement().namedItem( "trackList" ) );
|
|
}
|
|
else
|
|
documentElement().namedItem( "creator" ).replaceChild( createTextNode( creator ), documentElement().namedItem( "creator" ).firstChild() );
|
|
}
|
|
|
|
void
|
|
XSPFPlaylist::setAnnotation( TQString annotation )
|
|
{
|
|
if ( documentElement().namedItem( "annotation" ).isNull() )
|
|
{
|
|
TQDomNode node = createElement( "annotation" );
|
|
TQDomNode subNode = createTextNode( annotation );
|
|
node.appendChild( subNode );
|
|
documentElement().insertBefore( node, documentElement().namedItem( "trackList" ) );
|
|
}
|
|
else
|
|
documentElement().namedItem( "annotation" ).replaceChild( createTextNode( annotation ), documentElement().namedItem( "annotation" ).firstChild() );
|
|
}
|
|
|
|
void
|
|
XSPFPlaylist::setInfo( KURL info )
|
|
{
|
|
if ( documentElement().namedItem( "info" ).isNull() )
|
|
{
|
|
TQDomNode node = createElement( "info" );
|
|
TQDomNode subNode = createTextNode( info.url() );
|
|
node.appendChild( subNode );
|
|
documentElement().insertBefore( node, documentElement().namedItem( "trackList" ) );
|
|
}
|
|
else
|
|
documentElement().namedItem( "info" ).replaceChild( createTextNode( info.url() ), documentElement().namedItem( "info" ).firstChild() );
|
|
}
|
|
|
|
void
|
|
XSPFPlaylist::setLocation( KURL location )
|
|
{
|
|
if ( documentElement().namedItem( "location" ).isNull() )
|
|
{
|
|
TQDomNode node = createElement( "location" );
|
|
TQDomNode subNode = createTextNode( location.url() );
|
|
node.appendChild( subNode );
|
|
documentElement().insertBefore( node, documentElement().namedItem( "trackList" ) );
|
|
}
|
|
else
|
|
documentElement().namedItem( "location" ).replaceChild( createTextNode( location.url() ), documentElement().namedItem( "location" ).firstChild() );
|
|
}
|
|
|
|
void
|
|
XSPFPlaylist::setIdentifier( TQString identifier )
|
|
{
|
|
if ( documentElement().namedItem( "identifier" ).isNull() )
|
|
{
|
|
TQDomNode node = createElement( "identifier" );
|
|
TQDomNode subNode = createTextNode( identifier );
|
|
node.appendChild( subNode );
|
|
documentElement().insertBefore( node, documentElement().namedItem( "trackList" ) );
|
|
}
|
|
else
|
|
documentElement().namedItem( "identifier" ).replaceChild( createTextNode( identifier ), documentElement().namedItem( "identifier" ).firstChild() );
|
|
}
|
|
|
|
void
|
|
XSPFPlaylist::setImage( KURL image )
|
|
{
|
|
if ( documentElement().namedItem( "image" ).isNull() )
|
|
{
|
|
TQDomNode node = createElement( "image" );
|
|
TQDomNode subNode = createTextNode( image.url() );
|
|
node.appendChild( subNode );
|
|
documentElement().insertBefore( node, documentElement().namedItem( "trackList" ) );
|
|
}
|
|
else
|
|
documentElement().namedItem( "image" ).replaceChild( createTextNode( image.url() ), documentElement().namedItem( "image" ).firstChild() );
|
|
}
|
|
|
|
void
|
|
XSPFPlaylist::setDate( TQDateTime date )
|
|
{
|
|
/* date needs timezone info to be compliant with the standard
|
|
(ex. 2005-01-08T17:10:47-05:00 ) */
|
|
|
|
if ( documentElement().namedItem( "date" ).isNull() )
|
|
{
|
|
TQDomNode node = createElement( "date" );
|
|
TQDomNode subNode = createTextNode( date.toString( "yyyy-MM-ddThh:mm:ss" ) );
|
|
node.appendChild( subNode );
|
|
documentElement().insertBefore( node, documentElement().namedItem( "trackList" ) );
|
|
}
|
|
else
|
|
documentElement().namedItem( "date" ).replaceChild( createTextNode( date.toString( "yyyy-MM-ddThh:mm:ss" ) ), documentElement().namedItem( "date" ).firstChild() );
|
|
}
|
|
|
|
void
|
|
XSPFPlaylist::setLicense( KURL license )
|
|
{
|
|
if ( documentElement().namedItem( "license" ).isNull() )
|
|
{
|
|
TQDomNode node = createElement( "license" );
|
|
TQDomNode subNode = createTextNode( license.url() );
|
|
node.appendChild( subNode );
|
|
documentElement().insertBefore( node, documentElement().namedItem( "trackList" ) );
|
|
}
|
|
else
|
|
documentElement().namedItem( "license" ).replaceChild( createTextNode( license.url() ), documentElement().namedItem( "license" ).firstChild() );
|
|
}
|
|
|
|
void
|
|
XSPFPlaylist::setAttribution( KURL attribution, bool append )
|
|
{
|
|
if ( documentElement().namedItem( "attribution" ).isNull() )
|
|
documentElement().insertBefore( createElement( "attribution" ), documentElement().namedItem( "trackList" ) );
|
|
|
|
if ( append )
|
|
{
|
|
TQDomNode subNode = createElement( "location" );
|
|
TQDomNode subSubNode = createTextNode( attribution.url() );
|
|
subNode.appendChild( subSubNode );
|
|
documentElement().namedItem( "attribution" ).insertBefore( subNode, documentElement().namedItem( "attribution" ).firstChild() );
|
|
}
|
|
else
|
|
{
|
|
TQDomNode node = createElement( "attribution" );
|
|
TQDomNode subNode = createElement( "location" );
|
|
TQDomNode subSubNode = createTextNode( attribution.url() );
|
|
subNode.appendChild( subSubNode );
|
|
node.appendChild( subNode );
|
|
documentElement().replaceChild( node, documentElement().namedItem( "attribution" ) );
|
|
}
|
|
}
|
|
|
|
void
|
|
XSPFPlaylist::setLink( KURL link )
|
|
{
|
|
if ( documentElement().namedItem( "link" ).isNull() )
|
|
{
|
|
TQDomNode node = createElement( "link" );
|
|
TQDomNode subNode = createTextNode( link.url() );
|
|
node.appendChild( subNode );
|
|
documentElement().insertBefore( node, documentElement().namedItem( "trackList" ) );
|
|
}
|
|
else
|
|
documentElement().namedItem( "link" ).replaceChild( createTextNode( link.url() ), documentElement().namedItem( "link" ).firstChild() );
|
|
}
|
|
|
|
|
|
XSPFtrackList
|
|
XSPFPlaylist::trackList()
|
|
{
|
|
XSPFtrackList list;
|
|
|
|
TQDomNode trackList = documentElement().namedItem( "trackList" );
|
|
TQDomNode subNode = trackList.firstChild();
|
|
TQDomNode subSubNode;
|
|
|
|
while ( !subNode.isNull() )
|
|
{
|
|
XSPFtrack track;
|
|
subSubNode = subNode.firstChild();
|
|
if ( subNode.nodeName() == "track" )
|
|
{
|
|
while ( !subSubNode.isNull() )
|
|
{
|
|
if ( subSubNode.nodeName() == "location" )
|
|
track.location = subSubNode.firstChild().nodeValue();
|
|
else if ( subSubNode.nodeName() == "title" )
|
|
track.title = subSubNode.firstChild().nodeValue();
|
|
else if ( subSubNode.nodeName() == "creator" )
|
|
track.creator = subSubNode.firstChild().nodeValue();
|
|
else if ( subSubNode.nodeName() == "duration" )
|
|
track.duration = subSubNode.firstChild().nodeValue().toInt();
|
|
else if ( subSubNode.nodeName() == "annotation" )
|
|
track.annotation = subSubNode.firstChild().nodeValue();
|
|
else if ( subSubNode.nodeName() == "album" )
|
|
track.album = subSubNode.firstChild().nodeValue();
|
|
else if ( subSubNode.nodeName() == "trackNum" )
|
|
track.trackNum = (uint)subSubNode.firstChild().nodeValue().toInt();
|
|
else if ( subSubNode.nodeName() == "identifier" )
|
|
track.identifier = subSubNode.firstChild().nodeValue();
|
|
else if ( subSubNode.nodeName() == "info" )
|
|
track.info = subSubNode.firstChild().nodeValue();
|
|
else if ( subSubNode.nodeName() == "image" )
|
|
track.image = subSubNode.firstChild().nodeValue();
|
|
else if ( subSubNode.nodeName() == "link" )
|
|
track.link = subSubNode.firstChild().nodeValue();
|
|
|
|
subSubNode = subSubNode.nextSibling();
|
|
}
|
|
}
|
|
list.append( track );
|
|
subNode = subNode.nextSibling();
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
void
|
|
XSPFPlaylist::setTrackList( XSPFtrackList trackList, bool append )
|
|
{
|
|
if ( documentElement().namedItem( "trackList" ).isNull() )
|
|
documentElement().appendChild( createElement( "trackList" ) );
|
|
|
|
TQDomNode node = createElement( "trackList" );
|
|
|
|
XSPFtrackList::iterator it;
|
|
|
|
for ( it = trackList.begin(); it != trackList.end(); ++it )
|
|
{
|
|
XSPFtrack track = (*it);
|
|
|
|
TQDomNode subNode = createElement( "track" );
|
|
|
|
TQDomNode location = createElement( "location" );
|
|
TQDomNode identifier = createElement( "identifier" );
|
|
TQDomNode title = createElement( "title" );
|
|
TQDomNode creator = createElement( "creator" );
|
|
TQDomNode annotation = createElement( "annotation" );
|
|
TQDomNode info = createElement( "info" );
|
|
TQDomNode image = createElement( "image" );
|
|
TQDomNode album = createElement( "album" );
|
|
TQDomNode trackNum = createElement( "trackNum" );
|
|
TQDomNode duration = createElement( "duration" );
|
|
TQDomNode link = createElement( "link" );
|
|
// TQDomNode meta
|
|
// TQDomNode extension
|
|
|
|
if ( !track.location.url().isNull() )
|
|
location.appendChild( createTextNode( track.location.url() ) );
|
|
if ( !track.identifier.isNull() )
|
|
identifier.appendChild( createTextNode( track.identifier ) );
|
|
if ( !track.title.isNull() )
|
|
title.appendChild( createTextNode( track.title ) );
|
|
if ( !track.creator.isNull() )
|
|
creator.appendChild( createTextNode( track.creator ) );
|
|
if ( !track.annotation.isNull() )
|
|
annotation.appendChild( createTextNode( track.annotation ) );
|
|
if ( !track.info.url().isNull() )
|
|
info.appendChild( createTextNode( track.info.url() ) );
|
|
if ( !track.image.url().isNull() )
|
|
image.appendChild( createTextNode( track.image.url() ) );
|
|
if ( !track.album.isNull() )
|
|
album.appendChild( createTextNode( track.album ) );
|
|
if ( track.trackNum > 0 )
|
|
trackNum.appendChild( createTextNode( TQString::number( track.trackNum ) ) );
|
|
if ( track.duration > 0 )
|
|
duration.appendChild( createTextNode( TQString::number( track.duration ) ) );
|
|
if ( !track.link.url().isNull() )
|
|
link.appendChild( createTextNode( track.link.url() ) );
|
|
|
|
|
|
if ( !location.firstChild().isNull() )
|
|
subNode.appendChild( location );
|
|
if ( !identifier.firstChild().isNull() )
|
|
subNode.appendChild( identifier );
|
|
if ( !title.firstChild().isNull() )
|
|
subNode.appendChild( title );
|
|
if ( !creator.firstChild().isNull() )
|
|
subNode.appendChild( creator );
|
|
if ( !annotation.firstChild().isNull() )
|
|
subNode.appendChild( annotation );
|
|
if ( !info.firstChild().isNull() )
|
|
subNode.appendChild( info );
|
|
if ( !image.firstChild().isNull() )
|
|
subNode.appendChild( image );
|
|
if ( !album.firstChild().isNull() )
|
|
subNode.appendChild( album );
|
|
if ( !trackNum.firstChild().isNull() )
|
|
subNode.appendChild( trackNum );
|
|
if ( !duration.firstChild().isNull() )
|
|
subNode.appendChild( duration );
|
|
if ( !link.firstChild().isNull() )
|
|
subNode.appendChild( link );
|
|
|
|
node.appendChild( subNode );
|
|
}
|
|
|
|
if ( append )
|
|
{
|
|
while ( !node.isNull() )
|
|
{
|
|
documentElement().namedItem( "trackList" ).appendChild( node.firstChild() );
|
|
node = node.nextSibling();
|
|
}
|
|
}
|
|
else
|
|
documentElement().replaceChild( node, documentElement().namedItem( "trackList" ) );
|
|
}
|
|
|
|
|
|
|
|
|
|
|