ocarina/trunk/src/library.py

131 lines
3.0 KiB
Python

import os
import re
import tagpy
import cPickle as pickle
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()]
self.files.insert(index,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.setTime(a.length)
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]
# 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