Added song info class, checks if command line input is in library before playing
git-svn-id: file:///home/anna/Desktop/ocarina-legacy/mithos/ocarina@5 1daee41c-8060-4895-b1f0-2197c00d777a
This commit is contained in:
parent
8f322fc343
commit
068de4a7ee
|
@ -1,3 +1,4 @@
|
||||||
|
from songInfo import SongInfo
|
||||||
|
|
||||||
# This class is used to store all library data
|
# This class is used to store all library data
|
||||||
class LibData:
|
class LibData:
|
||||||
|
|
|
@ -2,7 +2,8 @@ import os
|
||||||
import re
|
import re
|
||||||
import cPickle as pickle
|
import cPickle as pickle
|
||||||
from libdata import LibData
|
from libdata import LibData
|
||||||
#from song import Song
|
from songInfo import SongInfo
|
||||||
|
|
||||||
|
|
||||||
class Library():
|
class Library():
|
||||||
def __init__(self,prnt):
|
def __init__(self,prnt):
|
||||||
|
@ -25,6 +26,9 @@ class Library():
|
||||||
def scan(self,dir):
|
def scan(self,dir):
|
||||||
self.data = LibData()
|
self.data = LibData()
|
||||||
self.data.path = os.path.expanduser(dir)
|
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.prnt(["Scanning: "+self.data.path])
|
||||||
self.traverse("")
|
self.traverse("")
|
||||||
num = len(self.data.files)
|
num = len(self.data.files)
|
||||||
|
@ -48,16 +52,23 @@ class Library():
|
||||||
tSplit = entry.rsplit('.')
|
tSplit = entry.rsplit('.')
|
||||||
type = tSplit[len(tSplit)-1].lower()
|
type = tSplit[len(tSplit)-1].lower()
|
||||||
if (type in self.goodTypes) == True:
|
if (type in self.goodTypes) == True:
|
||||||
self.hash(joined)
|
self.add(self.hash(joined),joined)
|
||||||
|
|
||||||
|
|
||||||
# Hash a file and add to library
|
# Hash a file and return list of words
|
||||||
def hash(self,file):
|
def hash(self,file):
|
||||||
index = len(self.data.files)
|
|
||||||
self.data.files+=[file]
|
|
||||||
file = file.lower()
|
file = file.lower()
|
||||||
# Only keep letters and numbers
|
# Only keep letters and numbers
|
||||||
words = re.sub('[^a-z0-9]',' ',file).split()
|
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:
|
for word in words:
|
||||||
if (word in self.data.map.keys()) == True:
|
if (word in self.data.map.keys()) == True:
|
||||||
self.data.map[word]+=[index]
|
self.data.map[word]+=[index]
|
||||||
|
@ -71,3 +82,18 @@ class Library():
|
||||||
p = pickle.Pickler(out,2)
|
p = pickle.Pickler(out,2)
|
||||||
p.dump(self.data)
|
p.dump(self.data)
|
||||||
out.close()
|
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
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import gobject
|
import gobject
|
||||||
|
import os
|
||||||
import sys
|
import sys
|
||||||
import thread
|
import thread
|
||||||
|
|
||||||
|
@ -6,21 +7,38 @@ from song import Song
|
||||||
from cline import CLine
|
from cline import CLine
|
||||||
from duration import Duration
|
from duration import Duration
|
||||||
from library import Library
|
from library import Library
|
||||||
|
from songInfo import SongInfo
|
||||||
#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
|
# return
|
||||||
self.commands = CLine()
|
self.commands = CLine()
|
||||||
self.registerCmnds()
|
self.registerCmnds()
|
||||||
|
|
||||||
self.song = Song(argv[0],self.quit,self.commands.printLines)
|
|
||||||
self.song.play()
|
|
||||||
|
|
||||||
self.library = Library(self.commands.printLines)
|
self.library = Library(self.commands.printLines)
|
||||||
|
|
||||||
|
self.song = None
|
||||||
|
# If we were given a song as input, check that it exists and begin playback
|
||||||
|
if len(argv) > 0:
|
||||||
|
file = os.path.expanduser(argv[0])
|
||||||
|
if os.path.exists(file) == True:
|
||||||
|
split = file.split(self.library.data.path)
|
||||||
|
file = split[len(split)-1]
|
||||||
|
index = self.library.has(file)
|
||||||
|
info = None
|
||||||
|
if index != -1:
|
||||||
|
info = self.library.data.files[index]
|
||||||
|
else:
|
||||||
|
info = SongInfo()
|
||||||
|
info.filename = file
|
||||||
|
#se
|
||||||
|
self.song = Song(info,self.quit,self.commands.printLines)
|
||||||
|
self.song.play()
|
||||||
|
|
||||||
|
|
||||||
# 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()
|
||||||
mainloop = gobject.MainLoop()
|
mainloop = gobject.MainLoop()
|
||||||
|
@ -47,37 +65,49 @@ class main:
|
||||||
|
|
||||||
# Begin playback
|
# Begin playback
|
||||||
def play(self,unused):
|
def play(self,unused):
|
||||||
|
if self.song == None:
|
||||||
|
return
|
||||||
self.song.play()
|
self.song.play()
|
||||||
|
|
||||||
# Pause music
|
# Pause music
|
||||||
def pause(self,unused):
|
def pause(self,unused):
|
||||||
|
if self.song == None:
|
||||||
|
return
|
||||||
self.song.pause()
|
self.song.pause()
|
||||||
|
|
||||||
# Show running time info
|
# Show running time info
|
||||||
def time(self,unused):
|
def time(self,unused):
|
||||||
|
if self.song == None:
|
||||||
|
return
|
||||||
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,unused):
|
def info(self,unused):
|
||||||
|
# Return if no song found
|
||||||
|
if self.song == None:
|
||||||
|
return
|
||||||
# Return if no tags found
|
# Return if no tags found
|
||||||
if self.song.taglist == None:
|
if self.song.info.tags == None:
|
||||||
self.commands.printLine("Could not find any tags")
|
self.commands.printLine("Could not find any tags")
|
||||||
return
|
return
|
||||||
for tag in self.song.taglist.keys():
|
for tag in self.song.info.tags.keys():
|
||||||
self.commands.printLine(tag+": "+str(self.song.taglist[tag]))
|
self.commands.printLine(tag+": "+str(self.song.info.tags[tag]))
|
||||||
|
|
||||||
# Show basic song info
|
# Show basic song info
|
||||||
def this(self,unused):
|
def this(self,unused):
|
||||||
|
# Return if no song found
|
||||||
|
if self.song == None:
|
||||||
|
return
|
||||||
# Return if no tags found
|
# Return if no tags found
|
||||||
if self.song.taglist == None:
|
if self.song.info.tags == None:
|
||||||
self.commands.printLine("Could not find any tags")
|
self.commands.printLine("Could not find any tags")
|
||||||
return
|
return
|
||||||
fields = ["title","artist","track-number","track-count","album"]
|
fields = ["title","artist","track-number","track-count","album"]
|
||||||
for field in fields:
|
for field in fields:
|
||||||
if (field in self.song.taglist.keys()) == True:
|
if (field in self.song.info.tags.keys()) == True:
|
||||||
self.commands.printLine(field+": "+str(self.song.taglist[field]))
|
self.commands.printLine(field+": "+str(self.song.info.tags[field]))
|
||||||
|
|
||||||
|
|
||||||
def scanLib(self,dir):
|
def scanLib(self,dir):
|
||||||
|
|
|
@ -7,13 +7,14 @@ import gst
|
||||||
from duration import Duration
|
from duration import Duration
|
||||||
|
|
||||||
class Song():
|
class Song():
|
||||||
def __init__(self,file,exitFunc,prnt):
|
def __init__(self,info,exitFunc,prnt):
|
||||||
self.quit=exitFunc
|
self.quit=exitFunc
|
||||||
self.prnt=prnt
|
self.prnt=prnt
|
||||||
|
self.info = info
|
||||||
# initialize player pipeline
|
# initialize player pipeline
|
||||||
self.player = gst.Pipeline("player")
|
self.player = gst.Pipeline("player")
|
||||||
bin = gst.element_factory_make("playbin",None)
|
bin = gst.element_factory_make("playbin",None)
|
||||||
bin.set_property("uri","file://"+file)
|
bin.set_property("uri","file://"+self.info.filename)
|
||||||
self.player.add(bin)
|
self.player.add(bin)
|
||||||
|
|
||||||
# initialize bus
|
# initialize bus
|
||||||
|
@ -26,8 +27,8 @@ class Song():
|
||||||
|
|
||||||
# Initialize stuff for finding duration
|
# Initialize stuff for finding duration
|
||||||
self.time_format = gst.Format(gst.FORMAT_TIME)
|
self.time_format = gst.Format(gst.FORMAT_TIME)
|
||||||
self.length = None
|
#self.length = None
|
||||||
self.taglist = None
|
#self.taglist = None
|
||||||
|
|
||||||
|
|
||||||
# Called on bus messages
|
# Called on bus messages
|
||||||
|
@ -43,10 +44,11 @@ class Song():
|
||||||
if self.prnt != None:
|
if self.prnt != None:
|
||||||
self.prnt(["Error: "+ str(err) + " " +str(debug)])
|
self.prnt(["Error: "+ str(err) + " " +str(debug)])
|
||||||
#print "Error: %s" % err, debug
|
#print "Error: %s" % err, debug
|
||||||
if self.quit != None:
|
#if self.quit != None:
|
||||||
self.quit("")
|
# self.quit("")
|
||||||
elif t == gst.MESSAGE_TAG:
|
elif t == gst.MESSAGE_TAG:
|
||||||
self.taglist = message.parse_tag()
|
self.info.tags = message.parse_tag()
|
||||||
|
#self.taglist = message.parse_tag()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
@ -54,9 +56,9 @@ class Song():
|
||||||
def play(self):
|
def play(self):
|
||||||
self.player.set_state(gst.STATE_PLAYING)
|
self.player.set_state(gst.STATE_PLAYING)
|
||||||
# Start main loop and find duration (if this hasn't been done yet)
|
# Start main loop and find duration (if this hasn't been done yet)
|
||||||
if self.length == None:
|
#if self.info.length == None:
|
||||||
time.sleep(0.5)
|
# time.sleep(0.5)
|
||||||
self.duration()
|
# self.duration()
|
||||||
|
|
||||||
|
|
||||||
# Change state to "paused"
|
# Change state to "paused"
|
||||||
|
@ -66,9 +68,9 @@ class Song():
|
||||||
|
|
||||||
# Find the duration of the pipeline
|
# Find the duration of the pipeline
|
||||||
def duration(self):
|
def duration(self):
|
||||||
self.length = Duration()
|
self.info.length = Duration()
|
||||||
length = self.player.query_duration(self.time_format,None)[0]
|
length = self.player.query_duration(self.time_format,None)[0]
|
||||||
self.length.setTime(length)
|
self.info.length.setTime(length)
|
||||||
#self.length.disp(self.prnt)
|
#self.length.disp(self.prnt)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
from duration import Duration
|
||||||
|
|
||||||
|
class SongInfo:
|
||||||
|
def __init__(self):
|
||||||
|
self.filename = ""
|
||||||
|
self.tags = None
|
||||||
|
self.playCount = 0
|
||||||
|
self.banned = False
|
||||||
|
self.length = None
|
Loading…
Reference in New Issue