Made library class, store using pickle
git-svn-id: file:///home/anna/Desktop/ocarina-legacy/mithos/ocarina@4 1daee41c-8060-4895-b1f0-2197c00d777a
This commit is contained in:
parent
ee38160d8c
commit
8f322fc343
|
@ -64,11 +64,17 @@ class CLine(threading.Thread):
|
||||||
# Enter key pressed
|
# Enter key pressed
|
||||||
# Returns true if we keep going
|
# Returns true if we keep going
|
||||||
def enter(self):
|
def enter(self):
|
||||||
self.input = self.input.strip().lower()
|
args = self.input.strip().split(' ',1)
|
||||||
|
self.input = args[0].lower()
|
||||||
|
input = ""
|
||||||
|
if len(args) > 1:
|
||||||
|
input = args[1].strip()
|
||||||
|
#self.printLine(self.input+"\t"+input)
|
||||||
|
#self.input = self.input.strip().lower()
|
||||||
if self.input=="":
|
if self.input=="":
|
||||||
return
|
return
|
||||||
elif self.input in self.cmnds.keys():
|
elif self.input in self.cmnds.keys():
|
||||||
self.cmnds[self.input][0]()
|
self.cmnds[self.input][0](input)
|
||||||
self.advanceLine()
|
self.advanceLine()
|
||||||
self.prompt()
|
self.prompt()
|
||||||
self.input = ""
|
self.input = ""
|
||||||
|
@ -120,7 +126,11 @@ class CLine(threading.Thread):
|
||||||
(y,x) = self.stdscr.getyx()
|
(y,x) = self.stdscr.getyx()
|
||||||
self.advanceLine()
|
self.advanceLine()
|
||||||
(y,x) = self.stdscr.getyx()
|
(y,x) = self.stdscr.getyx()
|
||||||
self.stdscr.addstr(line)
|
if len(line) > (self.maxSize[1]-1):
|
||||||
|
self.stdscr.addstr(line[0:(self.maxSize[1]-1)])
|
||||||
|
self.printLine(line[self.maxSize[1]-1:len(line)])
|
||||||
|
else:
|
||||||
|
self.stdscr.addstr(line)
|
||||||
#self.stdscr.move(y+1,x)
|
#self.stdscr.move(y+1,x)
|
||||||
self.stdscr.refresh()
|
self.stdscr.refresh()
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
# This class is used to store all library data
|
||||||
|
class LibData:
|
||||||
|
def __init__(self):
|
||||||
|
self.path = ""
|
||||||
|
self.files = []
|
||||||
|
self.map = dict()
|
|
@ -0,0 +1,73 @@
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import cPickle as pickle
|
||||||
|
from libdata import LibData
|
||||||
|
#from song import Song
|
||||||
|
|
||||||
|
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)
|
||||||
|
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.hash(joined)
|
||||||
|
|
||||||
|
|
||||||
|
# Hash a file and add to library
|
||||||
|
def hash(self,file):
|
||||||
|
index = len(self.data.files)
|
||||||
|
self.data.files+=[file]
|
||||||
|
file = file.lower()
|
||||||
|
# Only keep letters and numbers
|
||||||
|
words = re.sub('[^a-z0-9]',' ',file).split()
|
||||||
|
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()
|
|
@ -5,20 +5,21 @@ import thread
|
||||||
from song import Song
|
from song import Song
|
||||||
from cline import CLine
|
from cline import CLine
|
||||||
from duration import Duration
|
from duration import Duration
|
||||||
|
from library import Library
|
||||||
#import cmnds
|
#import cmnds
|
||||||
|
|
||||||
class main:
|
class main:
|
||||||
def __init__(self,argv):
|
def __init__(self,argv):
|
||||||
if len(argv) == 0:
|
if len(argv) == 0:
|
||||||
print "python ocarina.py /path/to/song/"
|
print "python ocarina.py /path/to/song/"
|
||||||
|
return
|
||||||
self.commands = CLine()
|
self.commands = CLine()
|
||||||
self.registerCmnds()
|
self.registerCmnds()
|
||||||
|
|
||||||
lines = ["test","testing","final test"]
|
|
||||||
self.commands.printLines(lines)
|
|
||||||
|
|
||||||
self.song = Song(argv[0],self.quit,self.commands.printLines)
|
self.song = Song(argv[0],self.quit,self.commands.printLines)
|
||||||
#self.song.play()
|
self.song.play()
|
||||||
|
|
||||||
|
self.library = Library(self.commands.printLines)
|
||||||
|
|
||||||
# Start main loop as a thread so we can get bus calls and use command line
|
# Start main loop as a thread so we can get bus calls and use command line
|
||||||
gobject.threads_init()
|
gobject.threads_init()
|
||||||
|
@ -26,13 +27,6 @@ class main:
|
||||||
thread.start_new_thread(mainloop.run,())
|
thread.start_new_thread(mainloop.run,())
|
||||||
|
|
||||||
|
|
||||||
# Quit program
|
|
||||||
def quit(self):
|
|
||||||
self.commands.quit()
|
|
||||||
print "Quitting..."
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
|
|
||||||
# Register commands for use in command line
|
# Register commands for use in command line
|
||||||
def registerCmnds(self):
|
def registerCmnds(self):
|
||||||
self.commands.register("quit",self.quit,"Exit ocarina")
|
self.commands.register("quit",self.quit,"Exit ocarina")
|
||||||
|
@ -42,24 +36,31 @@ class main:
|
||||||
self.commands.register("time",self.time,"Display running time")
|
self.commands.register("time",self.time,"Display running time")
|
||||||
self.commands.register("info",self.info,"Display detailed info about current song")
|
self.commands.register("info",self.info,"Display detailed info about current song")
|
||||||
self.commands.register("this",self.this,"Display basic info about current song")
|
self.commands.register("this",self.this,"Display basic info about current song")
|
||||||
|
self.commands.register("lib",self.scanLib,"Create a library based on the directory passed in")
|
||||||
|
|
||||||
|
# Quit program
|
||||||
|
def quit(self,unused):
|
||||||
|
self.commands.quit()
|
||||||
|
self.library.dump()
|
||||||
|
print "Quitting..."
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
# Begin playback
|
# Begin playback
|
||||||
def play(self):
|
def play(self,unused):
|
||||||
self.song.play()
|
self.song.play()
|
||||||
|
|
||||||
# Pause music
|
# Pause music
|
||||||
def pause(self):
|
def pause(self,unused):
|
||||||
self.song.pause()
|
self.song.pause()
|
||||||
|
|
||||||
# Show running time info
|
# Show running time info
|
||||||
def time(self):
|
def time(self,unused):
|
||||||
cur = self.song.curTime()
|
cur = self.song.curTime()
|
||||||
tot = self.song.length
|
tot = self.song.length
|
||||||
self.commands.printLine(cur.toStr()+" / "+tot.toStr())
|
self.commands.printLine(cur.toStr()+" / "+tot.toStr())
|
||||||
|
|
||||||
# Show detailed song info
|
# Show detailed song info
|
||||||
def info(self):
|
def info(self,unused):
|
||||||
# Return if no tags found
|
# Return if no tags found
|
||||||
if self.song.taglist == None:
|
if self.song.taglist == None:
|
||||||
self.commands.printLine("Could not find any tags")
|
self.commands.printLine("Could not find any tags")
|
||||||
|
@ -68,7 +69,7 @@ class main:
|
||||||
self.commands.printLine(tag+": "+str(self.song.taglist[tag]))
|
self.commands.printLine(tag+": "+str(self.song.taglist[tag]))
|
||||||
|
|
||||||
# Show basic song info
|
# Show basic song info
|
||||||
def this(self):
|
def this(self,unused):
|
||||||
# Return if no tags found
|
# Return if no tags found
|
||||||
if self.song.taglist == None:
|
if self.song.taglist == None:
|
||||||
self.commands.printLine("Could not find any tags")
|
self.commands.printLine("Could not find any tags")
|
||||||
|
@ -79,4 +80,10 @@ class main:
|
||||||
self.commands.printLine(field+": "+str(self.song.taglist[field]))
|
self.commands.printLine(field+": "+str(self.song.taglist[field]))
|
||||||
|
|
||||||
|
|
||||||
|
def scanLib(self,dir):
|
||||||
|
if dir == "":
|
||||||
|
self.commands.printLine("Please include a library directory")
|
||||||
|
return
|
||||||
|
self.library.scan(dir)
|
||||||
|
|
||||||
if __name__=='__main__':main(sys.argv[1:])
|
if __name__=='__main__':main(sys.argv[1:])
|
||||||
|
|
|
@ -35,13 +35,16 @@ class Song():
|
||||||
t = message.type
|
t = message.type
|
||||||
if t == gst.MESSAGE_EOS:
|
if t == gst.MESSAGE_EOS:
|
||||||
#print "End of stream"
|
#print "End of stream"
|
||||||
self.prnt("End of stream")
|
self.prnt(["End of stream"])
|
||||||
self.quit()
|
if self.quit != None:
|
||||||
|
self.quit("")
|
||||||
elif t == gst.MESSAGE_ERROR:
|
elif t == gst.MESSAGE_ERROR:
|
||||||
err, debug = message.parse_error()
|
err, debug = message.parse_error()
|
||||||
self.prnt("Error: %s" % err,debug)
|
if self.prnt != None:
|
||||||
|
self.prnt(["Error: "+ str(err) + " " +str(debug)])
|
||||||
#print "Error: %s" % err, debug
|
#print "Error: %s" % err, debug
|
||||||
self.quit()
|
if self.quit != None:
|
||||||
|
self.quit("")
|
||||||
elif t == gst.MESSAGE_TAG:
|
elif t == gst.MESSAGE_TAG:
|
||||||
self.taglist = message.parse_tag()
|
self.taglist = message.parse_tag()
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in New Issue