ocarina/trunk/src/library.py

140 lines
3.2 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","wav","flac","mid"]#,"wma"]
self.reset()
self.scanning = False
#self.notAdded = open("/home/bjschuma/Desktop/notAdded.txt",'w')
# 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:
song = SongInfo()
song.filename = os.path.join(self.path,joined)
self.files+=[song]
thread.start_new_thread(self.add,(self.hash(joined),self.count))
self.count += 1
#self.add(self.hash(joined),joined)
#else:
# self.notAdded.write(os.path.join(self.path,joined)+"\n")
# 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,index):
info = self.files[index]
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]
try:
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)
except:
print info.filename
info.title = info.title.lower()
info.album = info.album.lower()
info.artist = info.artist.lower()
artist = info.artist
album = info.album
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