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.
amarok/amarok/src/xspfplaylist.cpp

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" ) );
}