123 lines
3.0 KiB
Python
123 lines
3.0 KiB
Python
# Bryan Schumaker (11/12/2010)
|
|
|
|
import libsaria
|
|
from libsaria import path
|
|
from libsaria.sources import library
|
|
import libsaria.xm as xml
|
|
|
|
add_child = xml.add_child
|
|
add_text = xml.add_text
|
|
get_attrs = library.get_attrs
|
|
set_attr = library.set_attr
|
|
file_id = path.file_id
|
|
lib_file = "library"
|
|
vers = "%s.%s" % (libsaria.__major__, libsaria.__minor__)
|
|
if libsaria.__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)
|
|
|
|
|
|
#########################
|
|
# v1.1 Decode functions #
|
|
#########################
|
|
|
|
def decode_track_v1_1(node):
|
|
track = dict()
|
|
for child in xml_children(node):
|
|
key, value = decode_attr(child)
|
|
track[key] = value
|
|
id = file_id(track["filepath"])
|
|
set_attr(id, "count", int(track["count"]))
|
|
|
|
def decode_v1_1(node):
|
|
for track in xml_children(node):
|
|
decode_track_v1_1(track)
|
|
|
|
|
|
#########################
|
|
# v1.2 Decode functions #
|
|
#########################
|
|
|
|
def decode_sources_v1_2(node):
|
|
for child in xml_children(node):
|
|
source = xml_child(child).data.strip()
|
|
print "Scanning source: %s" % source
|
|
libsaria.sources.new_source(source)
|
|
|
|
def decode_track_v1_2(node):
|
|
for track in xml_children(node):
|
|
attrs = xml_attrs(track)
|
|
name, path = decode_attr(track)
|
|
id = file_id(path)
|
|
set_attr(id, "count", int(attrs["count"]))
|
|
|
|
def decode_v1_2(node):
|
|
children = xml_children(node)
|
|
sources = None
|
|
tracks = None
|
|
for node in children:
|
|
name = node.nodeName
|
|
if name == "sources":
|
|
sources = node
|
|
elif name == "tracks":
|
|
tracks = node
|
|
decode_sources_v1_2(sources)
|
|
decode_track_v1_2(tracks)
|
|
|
|
|
|
#############################################
|
|
# Control will enter the export module here #
|
|
#############################################
|
|
|
|
def backup():
|
|
doc = xml.new()
|
|
child = add_child(doc, doc, "library", {"version":vers})
|
|
sources = add_child(doc, child, "sources")
|
|
tracks = add_child(doc, child, "tracks")
|
|
for path in library.get_locations():
|
|
encode_attr(doc, sources, "source", path)
|
|
|
|
for id in library.walk():
|
|
encode_track(doc, tracks, id)
|
|
|
|
fout = open(lib_file, 'w')
|
|
fout.write(doc.toprettyxml())
|
|
fout.close()
|
|
print "Wrote library to: %s" % lib_file
|
|
|
|
def restore(file):
|
|
fin = open(file)
|
|
doc = xml.parse(fin)
|
|
child = xml.child(doc)
|
|
attrs = xml.attributes(child)
|
|
version = attrs.get("version", "1.1")
|
|
print "Decoding version: %s" % version
|
|
if version == "1.1":
|
|
decode_v1_1(child)
|
|
elif version == "1.2":
|
|
decode_v1_2(child)
|