From 8586fa1f471e23e1253d5158a95de6228ea7ed2f Mon Sep 17 00:00:00 2001 From: bjschuma Date: Sun, 2 Aug 2009 19:27:24 +0000 Subject: [PATCH] Save the queue in a seperate file git-svn-id: file:///home/anna/Desktop/ocarina-legacy/mithos/ocarina@54 1daee41c-8060-4895-b1f0-2197c00d777a --- trunk/src/data.py | 21 ++- trunk/src/libView.py | 158 ------------------ trunk/src/list.py | 9 +- trunk/src/plistView.py | 357 ----------------------------------------- trunk/src/window.py | 6 +- 5 files changed, 26 insertions(+), 525 deletions(-) delete mode 100644 trunk/src/libView.py delete mode 100644 trunk/src/plistView.py diff --git a/trunk/src/data.py b/trunk/src/data.py index f11bdd9a..4a2ccb82 100644 --- a/trunk/src/data.py +++ b/trunk/src/data.py @@ -24,11 +24,13 @@ class Data: self.library.libview = None self.save(self.library,"library") self.library.libview = libview - self.save([self.curList,self.curQ,self.curSong],"playlist") + self.save([self.curList,self.curSong],"playlist") + self.save([self.curQ],"queue") self.save([self.size,self.divider,self.colSizes,self.sortedCol,self.random],"preferences") self.save([self.lfm,self.lfmuser,self.lfmpass],"last.fm") + # Pickle out an object to file def save(self,obj,file): out = open(os.path.join(self.path,file),'w') p = pickle.Pickler(out,1) @@ -43,18 +45,23 @@ class Data: if self.library == None: self.library = Library() + # Load saved playlist plist = self.load2("playlist") if plist == None: self.curList = [] - self.curQ = [] self.curSong = 0 - #self.playingQ = False else: self.curList = plist[0] - self.curQ = plist[1] - self.curSong = plist[2] - #self.playingQ = plist[3] + self.curSong = plist[1] + # Load saved queue + queue = self.load2("queue") + if queue == None: + self.curQ = [] + else: + self.curQ = queue[0] + + # Load user preferences prefs = self.load2("preferences") if prefs == None: self.size = (800,600) @@ -69,6 +76,7 @@ class Data: self.sortedCol = prefs[3] self.random = prefs[4] + # Load last.fm data lfm = self.load2("last.fm") if lfm == None: self.lfm = "" @@ -80,6 +88,7 @@ class Data: self.lfmpass = lfm[2] + # Read in a pickled saved data file def load2(self,file): path = os.path.join(self.path,file) if os.path.exists(path): diff --git a/trunk/src/libView.py b/trunk/src/libView.py deleted file mode 100644 index 8865bc07..00000000 --- a/trunk/src/libView.py +++ /dev/null @@ -1,158 +0,0 @@ -import gobject -import gtk - -from menuItem import MenuItem - - -#class LibView(gtk.ScrolledWindow): -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() - self.pack_start(self.win) - self.pack_start(self.pbar,False,False,0) - self.makeRCMenu() - self.makeLabel() - self.update() - self.win.show() - - - # Use to update the library pane - def update(self): - #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.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) - for file in self.data.library.files: - self.insertSong(file) - #self.updateLabel() - - - def makeLabel(self): - self.label = gtk.Label("") - self.updateLabel() - - - def updateLabel(self): - self.label.set_text(str(self.data.library.count)+" collected") - self.label.show() - - - # Begin updating the library - def updates(self): - self.pbar.show() - 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 - def makeRCMenu(self): - self.rcmenu = gtk.Menu() - add = MenuItem("Add to Playlist",self.populatePlaylist,None,None,None) - self.rcmenu.append(add) - - - # Show the right click menu on a right click - def clicked(self,widget,data): - if data.button == 3: - 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 = [] - #self.data.curList = [] - for path in pathlist: - iter = model.get_iter(path) - self.popHelper(model,iter,model.iter_n_children(iter),list) - #self.data.updateList = True - self.plist.addToList(list,self.plist.plist) - - - def popHelper(self,model,iter,count,list): - if count == 0: - row = model[iter][1] - self.data.curList+=[row] - list += [row] - return - - child = model.iter_children(iter) - for i in range(count): - self.popHelper(model,child,model.iter_n_children(child),list) - child = model.iter_next(child) diff --git a/trunk/src/list.py b/trunk/src/list.py index cb859fa8..bd606af2 100644 --- a/trunk/src/list.py +++ b/trunk/src/list.py @@ -42,6 +42,7 @@ class List(gtk.ScrolledWindow): def makeList(self): self.list = gtk.ListStore(int,str,str,str,str,int) self.tree = gtk.TreeView(self.list) + self.tree.set_reorderable(True) cell = gtk.CellRendererText() cols = ["Id","Title","Length","Artist","Album","#"] for i in range(len(cols)): @@ -70,7 +71,6 @@ class List(gtk.ScrolledWindow): # Select a song by double clicking on its row def selectSong(self,widgit,iter,path,data,list): - #self.loadSong(self.data.library.files[self.filter[iter][0]]) self.loadSong(self.data.library.files[self.sort[iter][0]]) self.plause(None,None) self.data.scrobbler.nowPlaying(self.data.song.info) @@ -78,6 +78,13 @@ class List(gtk.ScrolledWindow): # Opens a menu on a right click def clicked(self,widgit,data): + end = self.tree.get_path_at_pos(int(data.x),int(data.y)) + # end will be None if no rows are selected. + if end != None: + end = end[0][0] + begin = self.sel.get_selected_rows()[1][0][0] + # This function likes ints for some reason... + self.sel.select_range(int(begin),int(end)) if data.button == 3: self.rcmenu.popup(None,None,None,data.button,data.time) diff --git a/trunk/src/plistView.py b/trunk/src/plistView.py deleted file mode 100644 index 1b7a80b7..00000000 --- a/trunk/src/plistView.py +++ /dev/null @@ -1,357 +0,0 @@ -import random -import gtk -import thread -import re - -from menuItem import MenuItem -from song import Song - -from list import List - -CONTINUE = 0 -PAFTER = 1 - -# This is both the playlist and the queue -class PlistView(gtk.Notebook): - def __init__(self,data,info): - gtk.Notebook.__init__(self) - self.connect("switch-page",self.changedTab) - self.set_scrollable(True) - self.data = data - self.info = info - - self.controls = None - self.status = CONTINUE - - self.ptime = 0 - self.qtime = 0 - self.search = "" - - self.label = gtk.Label("") - self.label.show() - - self.ptree = None - self.pwin = gtk.ScrolledWindow() - self.pwin.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC) - self.pwin.show() - - self.qtree = None - self.makePList() - self.makeQList() - self.makeSearch() - self.qwin.show() - self.loadSong(True) - #gobject.timeout_add(1000,self.checkUpdate) - self.append_page(self.pwin,gtk.Label("")) - self.append_page(self.qwin,gtk.Label("")) - self.setTabText("plist") - self.setTabText("queue") - self.show() - - - def setStatus(self,status): - if status == "pafter": - self.status = PAFTER - - - def setTabText(self,tab): - if tab == "plist": - self.set_tab_label_text(self.pwin,"Playlist ("+str(len(self.data.curList))+")") - else: - self.set_tab_label_text(self.qwin,"Queue ("+str(len(self.data.curQ))+")") - - - # Check if the playlist has been updated - def checkUpdate(self): - if self.data.updateList == True: - self.clearList(self.plist) - self.data.updateList = False - self.ptime = self.popList(self.data.curList,self.plist) - self.setTabText("plist") - return True - - - def makePList(self): - self.plist = gtk.ListStore(int,str,str,str,str,int) - if self.ptree: - self.pwin.remove(self.ptree) - self.ptree,self.ptreesel = self.list2Tree(self.plist) - self.pwin.add(self.ptree) - - self.prcmenu = gtk.Menu() - queue = MenuItem("Queue Song",self.enqueue,None,None,None,) - self.prcmenu.append(queue) - - self.plist.set_sort_column_id(self.data.sortedCol,gtk.SORT_ASCENDING) - self.ptree.connect("button_release_event",self.clicked) - self.ptime = self.popList(self.data.curList,self.plist) - - self.pfilter = self.plist.filter_new() - self.pfilter.set_visible_func(self.hideRows) - self.psort = gtk.TreeModelSort(self.pfilter) - self.ptree.set_model(self.psort) - - #self.pfilter.set_child(self.ptreesel) - - - # Populate a list - def popList(self,src,dst): - time = self.generateList(src,dst) - return time - - - def makeQList(self): - self.qwin = gtk.ScrolledWindow() - self.qwin.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC) - self.qlist = gtk.ListStore(int,str,str,str,str,int) - self.qtree,self.qtreesel = self.list2Tree(self.qlist) - self.qwin.add(self.qtree) - self.qtime = self.generateList(self.data.curQ,self.qlist) - - - def generateList(self,src,dst): - time = 0 - i = len(dst) - for index in src: - track = self.data.library.files[index] - dst.insert(i,[track.id,track.title,track.length,track.artist,track.album,track.count]) - time+=track.duration - i+=1 - return time - - - # Called by libview to add rows to list - def addToList(self,src,dest): - self.ptime+=self.generateList(src,dest) - self.updatePTime() - self.setTabText("plist") - - - # Make the playlist and show it - def list2Tree(self,list): - tree = gtk.TreeView(list) - cell = gtk.CellRendererText() - cols = ["Id","Title","Length","Artist","Album","#"] - lenSaved = len(self.data.colSizes) - for i in range(len(cols)): - col = gtk.TreeViewColumn(cols[i],cell) - col.add_attribute(cell,'text',i) - col.set_resizable(True) - col.set_sort_column_id(i) - col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) - col.set_min_width(2) - col.set_max_width(700) - col.set_sort_indicator(False) - if cols[i] != "Id": - tree.append_column(col) - tree.set_rules_hint(True) - tree.set_enable_search(True) - tree.connect("row-activated",self.selectSong,"clicked",list) - treesel = tree.get_selection() - tree.show() - self.resizeCols(tree) - return tree,treesel - - - # Use to save column widths - def saveCols(self): - cols = self.ptree.get_columns() - self.data.colSizes = [] - for col in cols: - self.data.colSizes +=[col.get_width()] - - - # Uses saved column settings - def resizeCols(self,tree): - cols = tree.get_columns() - for i in range(len(self.data.colSizes)): - cols[i].set_fixed_width(self.data.colSizes[i]) - - - # Erase the entire list - def clearList(self,list,time): - max = len(list) - if max == 0: - return - if max > 0: - iter = list.get_iter(0) - for i in range(0,max): - list.remove(iter) - self.ptime = 0 - self.setTabText("plist") - self.updatePTime() - - - # Update the playlist time label - def updatePTime(self): - page = self.get_current_page() - if page==0: - self.label.set_text(self.makeTimeLabel(self.ptime)) - - - # Shows total running time of the playlist - def makeTimeLabel(self,sec): - day = 0 - hour = 0 - min = 0 - day = sec/86500 - sec = sec-(day*86500) - hour = sec/3600 - sec = sec-(hour*3600) - min = sec/60 - sec = sec-(min*60) - string = "" - string = self.toStr(day,"day")+self.toStr(hour,"hour") - string += self.toStr(min,"minute")+self.toStr(sec,"second") - return string - - - # Make a string for the amount of time - def toStr(self,time,label): - if time > 0: - string=str(time) + " "+label - if time > 1: - string+="s" - string += " " - return string - return "" - - - # User selected a song with mouse click - def selectSong(self,widgit,iter,path,data,list): - 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 - def next(self,widgit,data): - self.data.playingQ = False - #print self.pfilter[0][1] - #print self.pfilter[1][1] - #print float(self.data.song.position)/float(self.data.song.info.duration) - if (float(self.data.song.position)/float(self.data.song.info.duration)) >= 0.75: - for row in self.plist: - if row[0]==self.data.curSong: - row[5]+=1 - break - self.data.library.files[self.data.curSong].count+=1 - #if self.plist[self.data.curSong][0]==self.data.curSong: - # self.plist[self.data.curSong][5]+=1 - if len(self.data.curQ) > 0: - self.data.curSong = self.qlist[0][0] - self.data.curQ.pop(self.data.curQ.index(self.data.curSong)) - self.qtime -= self.data.library.files[self.data.curSong].duration - self.changedTab(None,None,1) - self.qlist.remove(self.qlist.get_iter(0)) - self.data.playingQ = True - self.setTabText("queue") - elif self.data.random == True: - 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): - if self.pfilter[i][0]==self.data.curSong: - next = self.pfilter[i+1][0] - break - self.data.curSong = next - #if self.data.curSong >= len(self.data.curList): - # self.data.curSong = 0 - - self.loadSong(True) - pause = (self.status == PAFTER) - - 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 - - - # Load a song and begin playback - def loadSong(self,scroll): - 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() - if scroll == True: - self.gotoCurSong() - - - # Scroll window and select row with current song - def gotoCurSong(self): - if len(self.pfilter) == 0: - return - for i in range(len(self.pfilter)): - if self.pfilter[i][0] == self.data.song.info.id: - if i > 10: - self.ptree.scroll_to_cell(i-10,None,True,0,0) - else: - self.ptree.scroll_to_cell(0,None,True,0,0) - self.ptree.set_cursor_on_cell(i,None,None,False) - - - # A callback to show the right click menu - def clicked(self,widget,data): - if data.button == 3: - self.prcmenu.popup(None,None,None,data.button,data.time) - - - # Called when songs are queued - def enqueue(self,widgit,func,data): - (model,pathlist) = self.ptreesel.get_selected_rows() - for path in pathlist: - q = self.pfilter[path] - self.data.curQ+=[q[0]] - self.qlist.append([q[0],q[1],q[2],q[3],q[4],q[5]]) - self.qtime+=self.data.library.files[q[0]].duration - self.setTabText("queue") - - - # Update the total time label when a tab is changed - def changedTab(self,widgit,page,pagenum): - if pagenum == 0: - self.label.set_text(self.makeTimeLabel(self.ptime)) - else: - self.label.set_text(self.makeTimeLabel(self.qtime)) - - - def makeSearch(self): - self.searchBar = gtk.Entry() - self.searchBar.connect("changed",self.textTyped) - self.searchBar.show() - - - def textTyped(self,entry): - self.search = entry.get_text().lower() - self.pfilter.refilter() - self.gotoCurSong() - - - def hideRows(self,list,iter): - if self.search == "": - return True - elif len(self.search) == 1: - try: - self.data.library.files[list[iter][0]].single[self.search] - return True - except: - return False - elif len(self.search) == 2: - try: - self.data.library.files[list[iter][0]].double[self.search] - return True - except: - return False - 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/window.py b/trunk/src/window.py index f0c8f285..073d4445 100644 --- a/trunk/src/window.py +++ b/trunk/src/window.py @@ -48,11 +48,11 @@ class Window(gtk.Window): plist = MenuItem("Playlist",None,None,None,[clear]) bar.append(plist) - # Replace first 'None' with after track functions pafter = MenuItem("Pause After Current Track",self.setPlayStatus,"pafter",None,None) - qafter = MenuItem("Quit After Current Track",None,"qafter",None,None) + #qafter = MenuItem("Quit After Current Track",None,"qafter",None,None) curSong = MenuItem("Go to Current Song",self.gotoCurSong,"cursng",None,None) - playback = MenuItem("Playback",None,None,None,[pafter,qafter,curSong]) + #playback = MenuItem("Playback",None,None,None,[pafter,qafter,curSong]) + playback = MenuItem("Playback",None,None,None,[pafter,curSong]) bar.append(playback) bar.show()