From 5b752c95e8ab74f143190012ff92bae020ad4694 Mon Sep 17 00:00:00 2001 From: bjschuma Date: Mon, 13 Jul 2009 03:42:43 +0000 Subject: [PATCH] Last.fm stuff, insert rows in library view git-svn-id: file:///home/anna/Desktop/ocarina-legacy/mithos/ocarina@45 1daee41c-8060-4895-b1f0-2197c00d777a --- trunk/Makefile | 13 +- trunk/src/GuiObjects/controlPanel.py | 21 +-- trunk/src/GuiObjects/infoView.py | 6 +- trunk/src/GuiObjects/libView.py | 90 ++++++++--- trunk/src/GuiObjects/plistView.py | 37 +++-- trunk/src/GuiObjects/scrobbler.py | 225 ++++++++++++++++++++------- trunk/src/library.py | 49 ++++-- trunk/src/saveddata.py | 14 +- trunk/src/song.py | 14 +- trunk/src/songInfo.py | 6 + trunk/src/window.py | 2 + 11 files changed, 352 insertions(+), 125 deletions(-) diff --git a/trunk/Makefile b/trunk/Makefile index 4f809284..33e8d7be 100644 --- a/trunk/Makefile +++ b/trunk/Makefile @@ -1,15 +1,26 @@ open: - geany src/GuiObjects/*.py & + geany & + geany src/GuiObjects/*.py geany src/*.py clean: rm -rf src/*.pyo rm -rf src/*~ + rm -rf src/*.c + rm -rf src/*.o + rm -rf src/*.so rm -rf src/GuiObjects/*.pyo rm -rf src/GuiObjects/*~ + rm -rf src/GuiObjects/*.c + rm -rf src/GuiObjects/*.o + rm -rf src/GuiObjects/*.so rm *~ +compile: + cd src && ./cythonize + cd src/GuiObjects && ./cythonize + install: # mkdir ~/bin/ocarina-bin rsync -avz src/ ~/bin/ocarina-bin/src diff --git a/trunk/src/GuiObjects/controlPanel.py b/trunk/src/GuiObjects/controlPanel.py index 80a7a98e..2a8cf97f 100644 --- a/trunk/src/GuiObjects/controlPanel.py +++ b/trunk/src/GuiObjects/controlPanel.py @@ -16,9 +16,9 @@ class ControlPanel(gtk.HBox): self.next = plist.next self.pack_start(CheckButton("Random",self.toggleRand,self.data.random),False,False,0) self.makeProgressBar() - (self.nextImg,self.nextBtn) = self.makeButton("next","next.png",None,self.next) - (self.stopImg,self.stopBtn) = self.makeButton("stop","stop.png",None,self.stop) (self.playImg,self.plauseBtn) = self.makeButton("plause","play.png",None,self.plause) + (self.stopImg,self.stopBtn) = self.makeButton("stop","stop.png",None,self.stop) + (self.nextImg,self.nextBtn) = self.makeButton("next","next.png",None,self.next) self.show() @@ -28,7 +28,8 @@ class ControlPanel(gtk.HBox): if img: image = Image(os.path.join("images",img)) button = Button(name,image,text,func) - self.pack_end(button,False,False,0) + #self.pack_end(button,False,False,0) + self.pack_start(button,False,False,0) return (image,button) @@ -46,14 +47,13 @@ class ControlPanel(gtk.HBox): event.show() vbox.show() pbar.show() - gobject.timeout_add(1000,self.updatePBar,pbar) + gobject.timeout_add(500,self.updatePBar,pbar) def pbarclick(self,widgit,data,pbar): if data.button == 1: prcnt = float(data.x) / float(pbar.get_allocation()[2]) self.data.song.seek(int(prcnt * self.data.song.info.duration * 1000000000)) - #print float(data.x)/float(pbar.get_allocation()[0]) # Play/Pause function @@ -78,15 +78,16 @@ class ControlPanel(gtk.HBox): # Update time/progress of the progress bar def updatePBar(self,pbar): - if self.data.song and (self.data.song.playing == False): + time = 0 + if not self.data.song: return True try: - (success,time) = self.data.song.curTime() + time = self.data.song.curTime() except: - success = False - if success == True: + time = 0 + if self.data.song.info.duration > 0: pbar.set_fraction(float(time)/self.data.song.info.duration) - pbar.set_text(self.data.song.info.fixTime(time) + " / " + self.data.song.info.length) + pbar.set_text(self.data.song.info.fixTime(time) + " / " + self.data.song.info.length) return True diff --git a/trunk/src/GuiObjects/infoView.py b/trunk/src/GuiObjects/infoView.py index 58428fef..060f5d80 100644 --- a/trunk/src/GuiObjects/infoView.py +++ b/trunk/src/GuiObjects/infoView.py @@ -19,9 +19,9 @@ class InfoView(gtk.VBox): album = "" artist = "" if self.data.song: - title = self.data.song.info.title.title() - album = "from "+self.data.song.info.album.title() - artist = "by "+self.data.song.info.artist.title() + title = self.data.song.info.title + album = "from "+self.data.song.info.album + artist = "by "+self.data.song.info.artist self.title.set_text(title) self.album.set_text(album) self.artist.set_text(artist) diff --git a/trunk/src/GuiObjects/libView.py b/trunk/src/GuiObjects/libView.py index f6211ca2..8865bc07 100644 --- a/trunk/src/GuiObjects/libView.py +++ b/trunk/src/GuiObjects/libView.py @@ -8,10 +8,12 @@ from menuItem import MenuItem class LibView(gtk.VBox): def __init__(self,data): gtk.VBox.__init__(self,False,0) + data.library.libview = self self.win = gtk.ScrolledWindow() self.win.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC) self.data = data self.treeview = None + self.tree = gtk.TreeStore(str,int) self.col = None self.plist = None self.pbar = gtk.ProgressBar() @@ -25,38 +27,36 @@ class LibView(gtk.VBox): # Use to update the library pane def update(self): - rval = self.data.library.scanning - if self.treeview: - self.win.remove(self.treeview) - self.treeview.remove_column(self.col) - self.pbar.pulse() - self.pbar.set_text("Found "+str(self.data.library.count)+" files.") - tree = gtk.TreeStore(str,int) - for artist in self.data.library.artAlb.keys(): - ariter = tree.append(None,[artist.title(),-1]) - for album in self.data.library.artAlb[artist]: - aliter = tree.append(ariter,[album.title(),-1]) - for track in self.data.library.albTrk[(artist,album)]: - tree.append(aliter,[self.data.library.files[track].title.title(),self.data.library.files[track].id]) - tree.set_sort_column_id(0,gtk.SORT_ASCENDING) - self.treeview = gtk.TreeView(tree) - self.treeview.set_enable_search(True) + #if self.treeview: + #self.win.remove(self.treeview) + #self.treeview.remove_column(self.col) + #self.tree = gtk.TreeStore(str,int) + #self.pbar.pulse() + #self.pbar.set_text("Found "+str(self.data.library.count)+" files.") + #for artist in self.data.library.artAlb.keys(): + # ariter = self.tree.append(None,[artist,-1]) + # for album in self.data.library.artAlb[artist]: + # aliter = self.tree.append(ariter,[album,-1]) + # for track in self.data.library.albTrk[(artist,album)]: + # self.tree.append(aliter,[self.data.library.files[track].title,self.data.library.files[track].id]) + self.tree.set_sort_column_id(0,gtk.SORT_ASCENDING) + self.treeview = gtk.TreeView(self.tree) + #self.treeview.set_enable_search(True) self.treeview.connect("button_release_event",self.clicked) self.col = gtk.TreeViewColumn('Library ('+str(self.data.library.count)+')') self.treeview.append_column(self.col) cell = gtk.CellRendererText() self.col.pack_start(cell,True) self.col.add_attribute(cell,'text',0) - self.col.set_sort_column_id(0) + #self.col.set_sort_column_id(0) self.treeview.set_rules_hint(True) self.treeview.show() self.selection = self.treeview.get_selection() self.selection.set_mode(gtk.SELECTION_MULTIPLE) self.win.add(self.treeview) - self.updateLabel() - if rval==False: - self.pbar.hide() - return rval + for file in self.data.library.files: + self.insertSong(file) + #self.updateLabel() def makeLabel(self): @@ -72,7 +72,22 @@ class LibView(gtk.VBox): # Begin updating the library def updates(self): self.pbar.show() - gobject.timeout_add(1000,self.update) + self.updating = True + gobject.timeout_add(500,self.updateLibview) + + + def updateLibview(self): + self.pbar.set_text("Found "+str(self.data.library.count)+" files.") + self.pbar.pulse() + #self.updateLabel() + self.col.set_title('Library ('+str(self.data.library.count)+')') + return self.updating + + + def stopUpdates(self): + self.updating = False + self.pbar.hide() + self.data.dump() # Right click menu @@ -88,6 +103,37 @@ class LibView(gtk.VBox): self.rcmenu.popup(None,None,None,data.button,data.time) + def insertSong(self,song): + foundArt = False + foundAlb = False + + artist = song.artist + album = song.album + track = song.title + + ariter = self.tree.get_iter_root() + while ariter: + if self.tree[ariter][0]==artist: + foundArt = True + break + else: + ariter = self.tree.iter_next(ariter) + + aliter = self.tree.iter_children(ariter) + while aliter: + if self.tree[aliter][0]==album: + foundAlb = True + break + else: + aliter = self.tree.iter_next(aliter) + + if foundArt == False: + ariter = self.tree.insert(None,0,[artist,-1]) + if foundAlb == False: + aliter = self.tree.insert(ariter,0,[album,-1]) + self.tree.insert(aliter,0,[song.title.title(),song.id]) + + def populatePlaylist(self,widgit,func,data): (model,pathlist) = self.selection.get_selected_rows() list = [] diff --git a/trunk/src/GuiObjects/plistView.py b/trunk/src/GuiObjects/plistView.py index 1a92d484..22dfd3e2 100644 --- a/trunk/src/GuiObjects/plistView.py +++ b/trunk/src/GuiObjects/plistView.py @@ -112,7 +112,7 @@ class PlistView(gtk.Notebook): i = len(dst) for index in src: track = self.data.library.files[index] - dst.insert(i,[track.id,track.title.title(),track.length,track.artist.title(),track.album.title(),track.count]) + dst.insert(i,[track.id,track.title,track.length,track.artist,track.album,track.count]) time+=track.duration i+=1 return time @@ -220,6 +220,7 @@ class PlistView(gtk.Notebook): self.data.curSong = self.pfilter[iter][0] self.loadSong(False) self.controls.plause(None,None) + self.data.scrobbler.nowPlaying(self.data.library.files[self.data.curSong]) # Go to the next song in the list @@ -245,7 +246,7 @@ class PlistView(gtk.Notebook): self.data.playingQ = True self.setTabText("queue") elif self.data.random == True: - self.data.curSong = self.pfilter[random.randint(0,len(self.pfilter))][0] + self.data.curSong = self.pfilter[random.randint(0,len(self.pfilter)-1)][0] else: next = self.pfilter[0][0] for i in range(len(self.pfilter)-1): @@ -261,6 +262,7 @@ class PlistView(gtk.Notebook): if pause == False: self.controls.plause(None,None) + self.data.scrobbler.nowPlaying(self.data.library.files[self.data.curSong]) self.controls.changeImg() self.status = CONTINUE @@ -270,6 +272,7 @@ class PlistView(gtk.Notebook): if len(self.data.curList) == 0: return if self.data.song: + self.data.scrobbler.submit(self.data.song.timestamp) self.data.song.close() self.data.song = Song(self.data.library.files[self.data.curSong],self.next) self.info.changeLabels() @@ -328,13 +331,27 @@ class PlistView(gtk.Notebook): def hideRows(self,list,iter): - if self.search != "": - file = self.data.library.files[list[iter][0]] - if re.search(self.search,file.title): + if self.search == "": + return True + elif len(self.search) == 1: + try: + self.data.library.files[list[iter][0]].single[self.search] return True - elif re.search(self.search,file.artist): + except: + return False + elif len(self.search) == 2: + try: + self.data.library.files[list[iter][0]].double[self.search] return True - elif re.search(self.search,file.album): - return True - return False - return True + except: + return False + #if self.search in self.data.library.files[list[iter][0]].letters == True: + # return True + file = self.data.library.files[list[iter][0]] + if re.search(self.search,file.titlel): + return True + elif re.search(self.search,file.artistl): + return True + elif re.search(self.search,file.albuml): + return True + return False diff --git a/trunk/src/GuiObjects/scrobbler.py b/trunk/src/GuiObjects/scrobbler.py index 470fb2ea..4c6bfafc 100644 --- a/trunk/src/GuiObjects/scrobbler.py +++ b/trunk/src/GuiObjects/scrobbler.py @@ -1,10 +1,12 @@ +import urllib import urllib2 #import pygtk #pygtk.require('2.0') import gtk import webbrowser -#import thread import hashlib +import datetime +import time from button import Button @@ -20,6 +22,12 @@ class Scrobbler(gtk.VBox): self.key = "2c76f85a6704efd74b5a358821284ef9" self.secret = "3a6012bfb627b60a884cf33fc044885c" self.token = "" + # Session ID + self.session = "" + # Now playing URL + self.npurl = "" + # Submission URL + self.suburl = "" # Run these in new thread so we can keep loading other things while waiting self.makegui() @@ -30,66 +38,165 @@ class Scrobbler(gtk.VBox): def makegui(self): if self.data.lfm == "": - self.nosession = Button("lfm",None,"Click here to configure Ocarina for submitting songs to last.fm",self.setup) - self.nosession.set_size_request(100,100) - self.pack_start(self.nosession,False,False,0) + uname = gtk.Label("Username:") + username = gtk.Entry() + passwd = gtk.Label("Password:") + password = gtk.Entry() + password.set_visibility(False) + + username.connect("activate",self.fetchSession,username,uname,password,passwd) + password.connect("activate",self.fetchSession,username,uname,password,passwd) + + uname.show() + username.show() + passwd.show() + password.show() + + self.pack_start(uname,False,False,0) + self.pack_start(username,False,False,0) + self.pack_start(passwd,False,False,0) + self.pack_start(password,False,False,0) + else: + self.handshake() + #self.labels = [gtk.Label("")]*10 + self.similar = [] + for i in range(10): + label = gtk.Label(" ") + label.show() + self.pack_start(label,False,False,0) + self.similar+=[label] - # One time setup (in theory) - def setup(self,widgit,data): - self.nosession.hide() - self.remove(self.nosession) - self.contBtn = Button("lfm",None,"Click to continue",self.fetchSession) - self.pack_start(self.contBtn,False,False,0) - self.fetchToken() - self.authorize() - - - # Fetch the authentication token - def fetchToken(self): - (url,list) = self.addMethod("auth.gettoken") - (url,list) = self.addParam(url,list,"api_key",self.key) - status = self.placeRequest(url) - attr = status.getAttributeNode("status") - if attr.value != "ok": + def fetchSession(self,widgit,username,uname,password,passwd): + self.data.lfmuser = username.get_text().lower() + self.data.lfmpass = self.md5(password.get_text()) + if self.data.lfmuser=="" or self.data.lfmpass=="": return - self.token += hashlib.md5(status.firstChild.nextSibling.firstChild.data).hexdigest() + else: + self.token = self.md5(self.data.lfmuser+self.data.lfmpass) + (url,list) = self.addMethod(self.url,"auth.getMobileSession") + (url,list) = self.addParam(url,list,"username",self.data.lfmuser) + (url,list) = self.addParam(url,list,"authToken",self.token) + (url,list) = self.addParam(url,list,"api_key",self.key) + (url,list) = self.addParam(url,list,"api_sig",self.getSig(list)) + status = self.parseRequest(url) + attr = status.getAttributeNode("status") + if attr.value != "ok": + return + self.data.lfm = status.firstChild.nextSibling.firstChild.nextSibling.nextSibling.nextSibling.firstChild.data + username.hide() + uname.hide() + password.hide() + passwd.hide() + self.makegui() -# Open to authorization page - def authorize(self): - url = "http://www.last.fm/api/auth/?api_key="+self.key - #(url,list) = self.addParam(url,[],"api_key",self.key) - (url,list) = self.addParam(url,[],"token",self.token) - print url - #url+="&"+self.token - webbrowser.open(url) - - - def fetchSession(self,widgit,data): - (url,list) = self.addMethod("auth.getSession") + def handshake(self): + print "shaking hands" + url = "http://post.audioscrobbler.com/?hs=true" + list = [("hs","true")] + (url,list) = self.addParam(url,list,"p","1.2.1") + (url,list) = self.addParam(url,list,"c","tst") + (url,list) = self.addParam(url,list,"v","1.0") + (url,list) = self.addParam(url,list,"u",self.data.lfmuser) + tstp = self.timestamp() + (url,list) = self.addParam(url,list,"t",tstp) + (url,list) = self.addParam(url,list,"a",self.authToken(tstp)) (url,list) = self.addParam(url,list,"api_key",self.key) - (url,list) = self.addParam(url,list,"token",self.token) - sig = self.getSig(list) - (url,list) = self.addParam(url,None,"api_sig",sig) - print url - #status = self.placeRequest(url) - return - #attr = status.getAttributeNode("status") - #if attr.value != "ok": - # return - #node = status.firstChild.firstChild - #user = node.data - #key = node.nextSibling.data - #subscriber = node.nextSibling.nextSibling.data - #print user,key,subscriber + status = self.placeRequest(url).readlines() + if status[0].strip() != "OK": + return + self.session = status[1].strip() + self.npurl = status[2].strip()#+"/?" + self.suburl = status[3].strip()#+"/?" + #for line in status: + # print line.strip() + + def nowPlaying(self,info): + vals = {"s":self.session, + "a":info.artist.title(), + "t":info.title.title(), + "b":info.album.title(), + "l":str(info.duration), + "n":info.tnum, + "m":""} + + data = urllib.urlencode(vals) + #status = self.placeRequest(url).readlines() + req = urllib2.Request(self.npurl,data) + req.add_header("User-Agent","Ocarina") + status = urllib2.urlopen(req) + self.fetchSimilar(info.artist) + #if status[0].strip() == "OK": + # print "Submission successful" - def addMethod(self,method): + def submit(self,timestp): + info = self.data.song.info + if info.duration < 30: + return + exit = True + if (self.data.song.position > 240): + exit = False + if self.data.song.position > (self.data.song.info.duration/2): + exit = False + + if exit == True: + return + + vals = {"s":self.session, + "a[0]":info.artist.title(), + "t[0]":info.title.title(), + "i[0]":timestp, + "o[0]":"P", + "r[0]":"", + "l[0]":str(info.duration), + "b[0]":info.album.title(), + "n[0]":info.tnum, + "m[0]":""} + data = urllib.urlencode(vals) + req = urllib2.Request(self.suburl,data) + req.add_header("User-Agent","Ocarina") + status = urllib2.urlopen(req) + for line in status: + print line + #print status + + + def fetchSimilar(self,artist): + (url,list) = self.addMethod(self.url,"artist.getsimilar") + (url,list) = self.addParam(url,list,"artist",artist) + (url,list) = self.addParam(url,list,"limit","10") + (url,list) = self.addParam(url,list,"api_key",self.key) + status = self.parseRequest(url) + list = status.firstChild.nextSibling.childNodes + for i in range(list.length): + node = list.item(i) + if node.hasChildNodes()==True: + nameNode = node.firstChild.nextSibling.firstChild + self.similar[i/2].set_text(nameNode.data) + #for node in status.firstChild.childNodes: + # print node + + def authToken(self,t): + return self.md5(self.data.lfmpass+t) + + + def md5(self,string): + return hashlib.md5(string).hexdigest() + + + def timestamp(self): + now = datetime.datetime.now() + return str(int(time.mktime(now.timetuple()))) + + + def addMethod(self,url,method): return (self.url+"?method="+method,[("method",method)]) def addParam(self,url,list,param,val): + val = val.replace(" ","%20") url+="&"+param+"="+val if list: list += [(param,val)] @@ -102,19 +209,19 @@ class Scrobbler(gtk.VBox): string = "" for entry in list: string+=entry[0]+entry[1] - string = string + self.secret - m = hashlib.md5(string) - return m.hexdigest() - - - def sendReq(self,req): - req+=self.secret - #hash = md5.new(req).digest() - #return self.placeRequest(self.url+"?"+hash) + #string = string + self.secret + return self.md5(string+self.secret) + #m = hashlib.md5(string) + #return m.hexdigest() def placeRequest(self,url): #print url req = urllib2.Request(url) req.add_header('User-Agent','Ocarina') - return minidom.parse(urllib2.urlopen(req)).documentElement + #return minidom.parse(urllib2.urlopen(req)).documentElement + return urllib2.urlopen(req) + + + def parseRequest(self,url): + return minidom.parse(self.placeRequest(url)).documentElement diff --git a/trunk/src/library.py b/trunk/src/library.py index 2a467136..4dbc7a43 100644 --- a/trunk/src/library.py +++ b/trunk/src/library.py @@ -9,24 +9,26 @@ import thread class Library: #def __init__(self,prnt): def __init__(self): - self.goodTypes = ["ogg","mp3","wav","flac","mid"]#,"wma"] + self.goodTypes = ["ogg","mp3","flac"]#,"wma"] self.reset() - self.scanning = False + #self.scanning = False + self.libview = None #self.notAdded = open("/home/bjschuma/Desktop/notAdded.txt",'w') # Begin a scan on dir def scan(self,thread,dir): - self.scanning = True + #self.scanning = True self.reset() - + self.libview.updates() 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 + self.libview.stopUpdates() + #self.scanning = False #print "Found %s files!" % str(self.count) @@ -58,6 +60,7 @@ class Library: song.filename = os.path.join(self.path,joined) self.files+=[song] thread.start_new_thread(self.add,(self.hash(joined),self.count)) + #self.add(self.hash(joined),self.count) self.count += 1 #self.add(self.hash(joined),joined) #else: @@ -99,18 +102,22 @@ class Library: info.album = t.album if t.artist != "": info.artist = t.artist - + #info.tnum = str(t.track) a = f.audioProperties() info.setTime(a.length) except: print info.filename + #print "here" - info.title = info.title.lower() - info.album = info.album.lower() - info.artist = info.artist.lower() - artist = info.artist - album = info.album - + #info.title = info.title.lower() + #info.album = info.album.lower() + #info.artist = info.artist.lower() + artist = info.artist.lower() + info.artistl = artist + album = info.album.lower() + info.albuml = album + title = info.title.lower() + info.titlel = title if (artist in self.artAlb.keys()) == False: self.artAlb[artist] = [album] @@ -121,6 +128,24 @@ class Library: self.albTrk[(artist,album)] = [index] else: self.albTrk[(artist,album)] += [index] + + for letter in title: + info.single[letter] = True + for letter in artist: + info.single[letter] = True + for letter in album: + info.single[letter] = True + + for i in range(len(title)-1): + str = title[i]+title[i+1] + info.double[str] = True + for i in range(len(artist)-1): + str = artist[i]+artist[i+1] + info.double[str] = True + for i in range(len(album)-1): + str = album[i]+album[i+1] + info.double[str] = True + self.libview.insertSong(info) # Return true if file is in the library diff --git a/trunk/src/saveddata.py b/trunk/src/saveddata.py index 99f79ba4..71bd4d00 100644 --- a/trunk/src/saveddata.py +++ b/trunk/src/saveddata.py @@ -11,6 +11,7 @@ class SavedData: self.path = path self.song = None self.quit = None + self.scrobbler = None if os.path.exists(self.path) == False: os.mkdir(self.path) self.load(path,options) @@ -19,10 +20,11 @@ class SavedData: # Dump user data to a file def dump(self): + self.library.libview = None self.save(self.library,"library") self.save([self.curList,self.curQ,self.curSong,self.playingQ],"playlist") self.save([self.size,self.divider,self.colSizes,self.sortedCol,self.random],"preferences") - self.save(self.lfm,"last.fm") + self.save([self.lfm,self.lfmuser,self.lfmpass],"last.fm") def save(self,obj,file): @@ -65,9 +67,15 @@ class SavedData: self.sortedCol = prefs[3] self.random = prefs[4] - self.lfm = self.load2("last.fm") - if self.lfm == None: + lfm = self.load2("last.fm") + if lfm == None: self.lfm = "" + self.lfmuser = "" + self.lfmpass = "" + else: + self.lfm = lfm[0] + self.lfmuser = lfm[1] + self.lfmpass = lfm[2] def load2(self,file): diff --git a/trunk/src/song.py b/trunk/src/song.py index 9f45ac1f..27809287 100644 --- a/trunk/src/song.py +++ b/trunk/src/song.py @@ -1,3 +1,5 @@ +import datetime +import time import gst @@ -12,6 +14,7 @@ class Song(): self.bin.set_property("uri","file://"+self.info.filename) self.bin.set_state(gst.STATE_PAUSED) self.player.add(self.bin) + self.timestamp = str(int(time.mktime(datetime.datetime.now().timetuple()))) # initialize bus bus = self.player.get_bus() @@ -52,9 +55,9 @@ class Song(): def stop(self): self.player.set_state(gst.STATE_PAUSED) self.playing = False - self.current = 0 + self.position = 0 #self.player.seek_simple(self.time_format,gst.SEEK_FLAG_FLUSH,self.current) - self.seek(current) + self.seek(self.position) def seek(self,time): @@ -68,7 +71,8 @@ class Song(): # Print out current running time def curTime(self): - if self.playing == False: - return (False,False) + #if self.playing == False: + # return (True,self.position) self.position = self.player.query_position(self.time_format,None)[0]/1000000000 - return (True, self.position) + #return (True, self.position) + return self.position diff --git a/trunk/src/songInfo.py b/trunk/src/songInfo.py index c57e11af..1b5385b5 100644 --- a/trunk/src/songInfo.py +++ b/trunk/src/songInfo.py @@ -4,13 +4,19 @@ class SongInfo: def __init__(self): self.id = 0 self.filename = "" + self.tnum = "" self.count = 0 # Length is a string, duration is an int self.length = "" self.duration = 0 self.title = "" + self.titlel = "" self.album = "" + self.albuml = "" self.artist = "" + self.artistl = "" + self.single = dict() + self.double = dict() def setTime(self,time): diff --git a/trunk/src/window.py b/trunk/src/window.py index 09b7b73c..0ad7327a 100644 --- a/trunk/src/window.py +++ b/trunk/src/window.py @@ -74,6 +74,7 @@ class Window(gtk.Window): # Used to select a directory def selectDir(self,widgit,data,func): + self.deleteLib(None,None) dirsel = gtk.FileChooserDialog(None,action=gtk.FILE_CHOOSER_ACTION_OPEN,buttons =(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) dirsel.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) response = None @@ -109,6 +110,7 @@ class Window(gtk.Window): scrobLabel = gtk.Label("Last.fm") scrobLabel.set_angle(90) leftPane.append_page(scrobbler,scrobLabel) + self.data.scrobbler = scrobbler self.divider.add1(leftPane)