ocarina/libsaria/path/export.py

100 lines
2.6 KiB
Python

# Bryan Schumaker (11/12/2010)
import libsaria
from libsaria import path
from libsaria.sources import playlist
from libsaria import version
from libsaria import callbacks
import libsaria.xm as xml
add_child = xml.add_child
add_text = xml.add_text
get_attrs = libsaria.sources.get_attrs_id
file_id = path.file_id
lib_file = "library"
vers = "%s.%s" % (version.__major__, version.__minor__)
if version.__dev__ == True:
lib_file = lib_file + "-dev"
lib_file += ".xml"
lib_file = path.join(path.saria_dir(), lib_file)
xml_children = xml.children
xml_child = xml.child
xml_attrs = xml.attributes
#######################################
# Generic encode and decode functions #
#######################################
def decode_attr(attr):
child = xml.child(attr)
return (attr.nodeName, child.data.strip())
def encode_attr(doc, node, attr, value):
child = add_child(doc, node, attr)
add_text(doc, child, value)
def encode_track(doc, node, id):
filepath, like, count = get_attrs(id, "filepath", "like", "count")
if (like == None) and (count == 0):
return
child = add_child(doc, node, "track", {"like":like, "count":count})
add_text(doc, child, filepath)
##################################
# xspf encode / decode functions #
##################################
def decode_xspf_track(location):
file = xml.child(location).data.strip()
if file[:7] == "file://":
id = path.file_id(file[7:])
playlist.add_ids([id])
def decode_xspf(child):
tlist = xml.child(child)
playlist.reset()
for node in xml.children(tlist):
try:
loc = xml.get_elements(node, "location")[0]
decode_xspf_track(loc)
except:
pass
playlist.save()
callbacks.load_playlist()
def encode_xspf(doc, node, id):
filepath = get_attrs(id, "filepath")[0]
track = add_child(doc, node, "track")
location = add_child(doc, track, "location")
add_text(doc, location, "file://%s" % filepath)
#############################################
# Control will enter the export module here #
#############################################
def save_playlist(filepath):
file, ext = path.splitext(filepath)
if ext != ".xml":
filepath+=".xml"
doc = xml.new()
child = add_child(doc, doc, "playlist", {"version":1, "xmlns":"http://xspf.org/ns/0/"})
tlist = add_child(doc, child, "trackList")
for id in playlist.list_ids():
encode_xspf(doc, tlist, id)
fout = open(filepath, 'w')
fout.write(doc.toprettyxml())
fout.close()
print "Wrote playlist to: %s" % filepath
def import_xml(file):
fin = open(file)
doc = xml.parse(fin)
child = xml.child(doc)
if child.nodeName == "playlist":
decode_xspf(child)