ocarina/trunk/src/library.py

156 lines
3.5 KiB
Python
Raw Normal View History

import os
import re
import tagpy
import cPickle as pickle
from libdata import LibData
from songInfo import SongInfo
import thread
class Library:
#def __init__(self,prnt):
def __init__(self):
self.goodTypes = ["ogg","mp3"]#,"wma"]
self.reset()
self.scanning = False
# Begin a scan on dir
def scan(self,thread,dir):
self.scanning = True
self.reset()
self.path = os.path.expanduser(dir)
if os.path.exists(self.path) == False:
#print "Directory not found: %s" % dir
return
#print "Scanning: "+self.path
self.traverse("")
self.scanning = False
#print "Found %s files!" % str(self.count)
def reset(self):
self.files = []
self.count = 0
self.artAlb = dict()
self.albTrk = dict()
self.path = ""
# Traverse directorys
def traverse(self,dir):
# List and sort contents
contents = os.listdir(os.path.join(self.path,dir))
contents.sort()
for entry in contents:
joined = os.path.join(dir,entry)
full = os.path.join(self.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.count += 1
thread.start_new_thread(self.add,(self.hash(joined),joined,self.count-1))
#self.add(self.hash(joined),joined)
# Hash a file and return list of words
def hash(self,file):
return
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):
self.files+=[SongInfo()]
info = self.files[index]
info.filename = os.path.join(self.path,file)
info.count = 0
info.id = index
split = info.filename.rsplit(os.sep)
max = 3
if len(split) < 3:
max = len(split)
for i in range(max):
if i==0:
info.title = split[len(split)-1]
elif i==1:
info.album = split[len(split)-2]
else:
info.artist = split[len(split)-3]
f = tagpy.FileRef(info.filename)
t = f.tag()
if t.title != "":
info.title = t.title
if t.album != "":
info.album = t.album
if t.artist != "":
info.artist = t.artist
a = f.audioProperties()
info.duration = a.length
info.fixTime()
artist = info.artist.lower()
album = info.album.lower()
if (artist in self.artAlb.keys()) == False:
self.artAlb[artist] = [album]
elif (album in self.artAlb[artist]) == False:
self.artAlb[artist] += [album]
if ((artist,album) in self.albTrk.keys()) == False:
self.albTrk[(artist,album)] = [index]
else:
self.albTrk[(artist,album)] += [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
def nonBanned(self):
list = []
for i in range(len(self.data.files)):
if self.data.files[i].banned == False:
list += [i]
return list
def translate(self,sid):
#file = self.data.files[sid]
return self.data.files[sid]
#print file.title, file.artist, file.album
return (sid,file.title,file.artist,file.album,file.playCount)
#return (file.artist,file.album)