ocarina/trunk/library.py

101 lines
2.5 KiB
Python

import os
import re
import cPickle as pickle
from libdata import LibData
from songInfo import SongInfo
class Library():
def __init__(self,prnt):
#def __init__(self):
self.prnt = prnt
self.data = LibData()
self.goodTypes = ["ogg","mp3","wma"]
# Build up directory if library save
self.save = os.path.expanduser("~")
self.save = os.path.join(self.save,".ocarina")
self.save = os.path.join(self.save,"library.pickle")
# Load existing library
if os.path.exists(self.save):
self.prnt(["Library found, loading..."])
p = pickle.Unpickler(open(self.save))
self.data = p.load()
# Begin a scan on dir
def scan(self,dir):
self.data = LibData()
self.data.path = os.path.expanduser(dir)
if os.path.exists(self.data.path) == False:
self.prnt(["Directory not found: "+dir])
return
self.prnt(["Scanning: "+self.data.path])
self.traverse("")
num = len(self.data.files)
self.prnt(["Found "+str(num)+" files!"])
self.dump()
# Traverse directorys
def traverse(self,dir):
# List and sort contents
contents = os.listdir(os.path.join(self.data.path,dir))
contents.sort()
for entry in contents:
joined = os.path.join(dir,entry)
full = os.path.join(self.data.path,joined)
# Call traverse on directorys
if os.path.isdir(full):
self.traverse(joined)
# Add music to library
else:
tSplit = entry.rsplit('.')
type = tSplit[len(tSplit)-1].lower()
if (type in self.goodTypes) == True:
self.add(self.hash(joined),joined)
# Hash a file and return list of words
def hash(self,file):
file = file.lower()
# Only keep letters and numbers
words = re.sub('[^a-z0-9]',' ',file).split()
return words
# Add song to library
def add(self,words,file):
index = len(self.data.files)
info = SongInfo()
info.filename = os.path.join(self.data.path,file)
self.data.files+=[info]
for word in words:
if (word in self.data.map.keys()) == True:
self.data.map[word]+=[index]
else:
self.data.map[word] = [index]
# Dump to file
def dump(self):
out = open(self.save,'w')
p = pickle.Pickler(out,2)
p.dump(self.data)
out.close()
# Return true if file is in the library
def has(self,file):
words = self.hash(file)
if len(words) == 0:
return -1
if (words[0] in self.data.map.keys()) == False:
return -1
indices = set(self.data.map[words[0]])
for word in words[1:]:
indices = indices & set(self.data.map[word])
# Return first instance
if len(indices) > 0:
return indices.pop()
return -1