ocarina/libsaria/collection/collection.py

158 lines
3.2 KiB
Python

# Bryan Schumaker (8/8/2010)
import libsaria
tag = None
audio = None
ins_table = None
ins_index = None
ins_tree = None
class Collection:
def __init__(self):
self.tree = None
def __iter__(self):
if not self.tree:
self.load()
for track in self.tree.walk():
yield track
def get_attr(self, id, attr):
node = self.tree
tags = self.table[id]
for tag in tags:
node = node[tag]
return node[attr]
def scan(self, path):
print "Scanning path:", path
global ins_table
global ins_index
global ins_tree
self.reset()
ins_table = self.table.insert
ins_index = self.index.insert
ins_tree = self.tree. insert
self.update(path)
self.save()
def reset(self):
print "Resetting collection ... "
from table import Table
from index import Index
from tree import Tree
self.table = Table()
self.index = Index()
self.tree = Tree()
def save(self):
from libsaria import data
data.save((self.table, self.index, self.tree), "library", "")
def load(self):
from libsaria import data
objects = data.load("library", "")
if objects == None:
self.reset()
return
(self.table, self.index, self.tree) = objects
def insert(self, file, filepath):
global tag
global audio
global ins_table
global ins_index
global ins_tree
tags = tag(file)
audio_prop = audio(file)
if tags.artist == u"":
tags.artist = "Unknown Artist"
if tags.album == u"":
tags.album = "Unknown Album"
if tags.title == u"":
tags.title = "Unknown Title"
list = [tags.artist, tags.album, tags.title]
id = ins_table(list)
ins_index(id, list)
list.append(id)
ins_tree(list, tags, audio_prop, filepath)
def update(self, path):
global tag
global audio
FileRef = libsaria.collection.FileRef
join = libsaria.path.join
insert = self.insert
tag = FileRef.tag
audio = FileRef.audioProperties
for root,dirs,files in libsaria.path.walk(path):
for file in files:
file = join(root,file)
try:
insert(FileRef(file), file)
except Exception,e:
pass
class TrackRecord:
def __init__(self, year, length):
self.length = 0
self.count = 0
self.year = 0
#self.like = None
self.fs = None
self.tags = None
class Collection2:
def __init__(self):
self.fs_tree = None
self.tag_tree = None
self.records = None
self.next_record = 0
def save(self, file):
libsaria.data.save(
[self.fs_tree, self.tag_tree, self.records, self.next_record],
file, "")
def reset(self):
from tree import DLTree
self.fs_tree = DLTree()
self.tag_tree = DLTree()
self.records = dict()
def disp(self):
pass
#self.fs_tree.disp()
#print
#print
#self.tag_tree.disp()
def insert_allocate(self, components, ref):
t = ref.tag()
artist = str(t.artist)
album = str(t.album)
title = str(t.title)
audio = ref.audioProperties()
if artist == "":
artist = "Unknown Artist"
if album == "":
album = "Unknown Album"
if title == "":
title = "Unknown Title"
record = TrackRecord(t.year, audio.length)
id = self.next_record
self.next_record += 1
fs = self.fs_tree.insert(components + [id])
tags = self.tag_tree.insert([artist, album, title, id])
record.fs = fs
record.tags = tags
self.records[id] = record