100 lines
2.4 KiB
Python
100 lines
2.4 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])
|
|
if len(indices) == 1:
|
|
return indices.pop()
|
|
return -1
|