From 57393a9150c9df3aaa7e763fb740a0f292d7e4d6 Mon Sep 17 00:00:00 2001 From: bjschuma Date: Sat, 4 Jul 2009 20:18:53 +0000 Subject: [PATCH] Can seek to any point of song git-svn-id: file:///home/anna/Desktop/ocarina-legacy/mithos/ocarina@44 1daee41c-8060-4895-b1f0-2197c00d777a --- trunk/Makefile | 4 +++- trunk/src/GuiObjects/button.py | 7 +++---- trunk/src/GuiObjects/check.py | 2 -- trunk/src/GuiObjects/controlPanel.py | 23 +++++++++++++++++----- trunk/src/GuiObjects/image.py | 3 +-- trunk/src/GuiObjects/infoView.py | 13 +++++-------- trunk/src/GuiObjects/libView.py | 5 +---- trunk/src/GuiObjects/menuItem.py | 3 +-- trunk/src/GuiObjects/plistView.py | 26 ++++++++++++------------- trunk/src/GuiObjects/scrobbler.py | 29 ++++++++++++++-------------- trunk/src/library.py | 12 ++++++++---- trunk/src/ocarina.py | 8 +------- trunk/src/saveddata.py | 2 -- trunk/src/song.py | 12 +++++++----- trunk/src/songInfo.py | 2 ++ trunk/src/window.py | 5 +---- 16 files changed, 79 insertions(+), 77 deletions(-) diff --git a/trunk/Makefile b/trunk/Makefile index 6911a79a..4f809284 100644 --- a/trunk/Makefile +++ b/trunk/Makefile @@ -11,7 +11,9 @@ clean: rm *~ install: - rsync src/ ~/bin/ocarina-bin/ +# mkdir ~/bin/ocarina-bin + rsync -avz src/ ~/bin/ocarina-bin/src + rsync -avs images/ ~/bin/ocarina-bin/images # rsync *.py ~/bin/ocarina-bin/ cp ocarina ~/bin/ocarina-bin/ rm ~/bin/ocarina diff --git a/trunk/src/GuiObjects/button.py b/trunk/src/GuiObjects/button.py index 6ca28563..e0b35b51 100644 --- a/trunk/src/GuiObjects/button.py +++ b/trunk/src/GuiObjects/button.py @@ -1,23 +1,22 @@ -import pygtk -pygtk.require('2.0') import gtk -from image import Image class Button(gtk.Button): def __init__(self,name,image,text,func): gtk.Button.__init__(self) self.set_relief(gtk.RELIEF_NONE) box = gtk.HBox(True,0) + # Add an image if we were given one if image!= None: box.pack_start(image,True,True,0) - #box.add(image) + # Add text if we were given some if text != None: label = gtk.Label(text) label.set_line_wrap(True) label.set_size_request(100,100) label.show() box.pack_start(label,True,True,0) + # Show and add callback function box.show() self.add(box) self.connect("clicked",func,name) diff --git a/trunk/src/GuiObjects/check.py b/trunk/src/GuiObjects/check.py index c99fb9c3..9a671bc5 100644 --- a/trunk/src/GuiObjects/check.py +++ b/trunk/src/GuiObjects/check.py @@ -1,5 +1,3 @@ -import pygtk -pygtk.require('2.0') import gtk diff --git a/trunk/src/GuiObjects/controlPanel.py b/trunk/src/GuiObjects/controlPanel.py index 7d0ad262..80a7a98e 100644 --- a/trunk/src/GuiObjects/controlPanel.py +++ b/trunk/src/GuiObjects/controlPanel.py @@ -1,7 +1,7 @@ import os import gobject -import pygtk -pygtk.require('2.0') +#import pygtk +#pygtk.require('2.0') import gtk from button import Button @@ -37,11 +37,23 @@ class ControlPanel(gtk.HBox): vbox = gtk.VBox() pbar = gtk.ProgressBar() pbar.set_fraction(0) - vbox.pack_start(pbar,True,False,0) + event = gtk.EventBox() + event.add(pbar) + vbox.pack_start(event,True,False,0) + #vbox.pack_start(pbar,True,False,0) self.pack_start(vbox,True,True,0) + event.connect("button_release_event",self.pbarclick,pbar) + event.show() vbox.show() pbar.show() - gobject.timeout_add(100,self.updatePBar,pbar) + gobject.timeout_add(1000,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 @@ -66,12 +78,13 @@ 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): + return True try: (success,time) = self.data.song.curTime() except: success = False if success == True: - #time = time/1000000000 pbar.set_fraction(float(time)/self.data.song.info.duration) pbar.set_text(self.data.song.info.fixTime(time) + " / " + self.data.song.info.length) return True diff --git a/trunk/src/GuiObjects/image.py b/trunk/src/GuiObjects/image.py index b1474462..4e38c74a 100644 --- a/trunk/src/GuiObjects/image.py +++ b/trunk/src/GuiObjects/image.py @@ -1,7 +1,6 @@ -import pygtk -pygtk.require('2.0') import gtk + class Image(gtk.Image): def __init__(self,path): gtk.Image.__init__(self) diff --git a/trunk/src/GuiObjects/infoView.py b/trunk/src/GuiObjects/infoView.py index a3debf19..58428fef 100644 --- a/trunk/src/GuiObjects/infoView.py +++ b/trunk/src/GuiObjects/infoView.py @@ -1,7 +1,4 @@ import pango -import gobject -import pygtk -pygtk.require('2.0') import gtk @@ -13,24 +10,24 @@ class InfoView(gtk.VBox): self.album = self.makeLabel("",10000,400) self.artist = self.makeLabel("",10000,400) self.changeLabels() - gobject.timeout_add(1000,self.changeLabels) self.show() + # Called when the song changes def changeLabels(self): title = "" album = "" artist = "" if self.data.song: - title = self.data.song.info.title - album = "from "+self.data.song.info.album - artist = "by "+self.data.song.info.artist + title = self.data.song.info.title.title() + album = "from "+self.data.song.info.album.title() + artist = "by "+self.data.song.info.artist.title() self.title.set_text(title) self.album.set_text(album) self.artist.set_text(artist) - return True + # Set the text, font, and weight of a label def makeLabel(self,text,size,weight): label = gtk.Label(text) align = gtk.Alignment(0,1,0,0) diff --git a/trunk/src/GuiObjects/libView.py b/trunk/src/GuiObjects/libView.py index 977a977e..f6211ca2 100644 --- a/trunk/src/GuiObjects/libView.py +++ b/trunk/src/GuiObjects/libView.py @@ -1,6 +1,4 @@ import gobject -import pygtk -pygtk.require('2.0') import gtk from menuItem import MenuItem @@ -39,10 +37,9 @@ class LibView(gtk.VBox): 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,self.data.library.files[track].id]) + 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_hover_expand(True) self.treeview.set_enable_search(True) self.treeview.connect("button_release_event",self.clicked) self.col = gtk.TreeViewColumn('Library ('+str(self.data.library.count)+')') diff --git a/trunk/src/GuiObjects/menuItem.py b/trunk/src/GuiObjects/menuItem.py index 27fa60d9..5e35422e 100644 --- a/trunk/src/GuiObjects/menuItem.py +++ b/trunk/src/GuiObjects/menuItem.py @@ -1,7 +1,6 @@ -import pygtk -pygtk.require('2.0') import gtk + class MenuItem(gtk.MenuItem): # def __init__(self,lbl,func,text,data,subs): diff --git a/trunk/src/GuiObjects/plistView.py b/trunk/src/GuiObjects/plistView.py index 86b85a68..1a92d484 100644 --- a/trunk/src/GuiObjects/plistView.py +++ b/trunk/src/GuiObjects/plistView.py @@ -1,9 +1,7 @@ import random -import gobject -import pygtk -pygtk.require('2.0') import gtk import thread +import re from menuItem import MenuItem from song import Song @@ -13,11 +11,12 @@ PAFTER = 1 # This is both the playlist and the queue class PlistView(gtk.Notebook): - def __init__(self,data): + 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 @@ -89,6 +88,7 @@ class PlistView(gtk.Notebook): 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) @@ -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,track.length,track.artist,track.album,track.count]) + dst.insert(i,[track.id,track.title.title(),track.length,track.artist.title(),track.album.title(),track.count]) time+=track.duration i+=1 return time @@ -135,7 +135,7 @@ class PlistView(gtk.Notebook): col = gtk.TreeViewColumn(cols[i],cell) col.add_attribute(cell,'text',i) col.set_resizable(True) - #col.set_sort_column_id(i) + col.set_sort_column_id(i) col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) col.set_min_width(2) col.set_max_width(700) @@ -272,6 +272,7 @@ class PlistView(gtk.Notebook): if self.data.song: 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() @@ -299,7 +300,7 @@ class PlistView(gtk.Notebook): def enqueue(self,widgit,func,data): (model,pathlist) = self.ptreesel.get_selected_rows() for path in pathlist: - q = self.plist[path] + 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 @@ -323,18 +324,17 @@ class PlistView(gtk.Notebook): def textTyped(self,entry): self.search = entry.get_text().lower() self.pfilter.refilter() + self.gotoCurSong() def hideRows(self,list,iter): if self.search != "": - title = list[iter][1].lower() - if title.find(self.search) > -1: + file = self.data.library.files[list[iter][0]] + if re.search(self.search,file.title): return True - artist = list[iter][3].lower() - if artist.find(self.search) > -1: + elif re.search(self.search,file.artist): return True - album = list[iter][4].lower() - if album.find(self.search) > -1: + elif re.search(self.search,file.album): return True return False return True diff --git a/trunk/src/GuiObjects/scrobbler.py b/trunk/src/GuiObjects/scrobbler.py index 3834c792..470fb2ea 100644 --- a/trunk/src/GuiObjects/scrobbler.py +++ b/trunk/src/GuiObjects/scrobbler.py @@ -1,14 +1,14 @@ import urllib2 -import pygtk -pygtk.require('2.0') +#import pygtk +#pygtk.require('2.0') import gtk import webbrowser -import thread +#import thread import hashlib from button import Button -import xml.dom +#import xml.dom from xml.dom import minidom @@ -58,9 +58,10 @@ class Scrobbler(gtk.VBox): # Open to authorization page def authorize(self): - url = "http://www.last.fm/api/auth/?" - (url,list) = self.addParam(url,[],"api_key",self.key) + 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) @@ -74,13 +75,13 @@ class Scrobbler(gtk.VBox): 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 + #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 @@ -113,7 +114,7 @@ class Scrobbler(gtk.VBox): def placeRequest(self,url): - print url + #print url req = urllib2.Request(url) req.add_header('User-Agent','Ocarina') return minidom.parse(urllib2.urlopen(req)).documentElement diff --git a/trunk/src/library.py b/trunk/src/library.py index 447c884c..2a467136 100644 --- a/trunk/src/library.py +++ b/trunk/src/library.py @@ -1,7 +1,7 @@ import os import re import tagpy -import cPickle as pickle +#import cPickle as pickle from songInfo import SongInfo import thread @@ -9,7 +9,7 @@ import thread class Library: #def __init__(self,prnt): def __init__(self): - self.goodTypes = ["ogg","mp3","wav","avi","flac","mid"]#,"wma"] + self.goodTypes = ["ogg","mp3","wav","flac","mid"]#,"wma"] self.reset() self.scanning = False #self.notAdded = open("/home/bjschuma/Desktop/notAdded.txt",'w') @@ -104,8 +104,12 @@ class Library: info.setTime(a.length) except: print info.filename - artist = info.artist.lower() - album = info.album.lower() + + 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: diff --git a/trunk/src/ocarina.py b/trunk/src/ocarina.py index e966faac..a4519be3 100644 --- a/trunk/src/ocarina.py +++ b/trunk/src/ocarina.py @@ -1,16 +1,10 @@ -import gobject -import os import sys -import thread - -import pygtk -pygtk.require('2.0') import gtk +import gobject from options import Options from saveddata import SavedData -from song import Song from window import Window gobject.threads_init() diff --git a/trunk/src/saveddata.py b/trunk/src/saveddata.py index 791cb5ba..99f79ba4 100644 --- a/trunk/src/saveddata.py +++ b/trunk/src/saveddata.py @@ -1,9 +1,7 @@ -import gobject import os import cPickle as pickle from library import Library -from song import Song class SavedData: def __init__(self,options): diff --git a/trunk/src/song.py b/trunk/src/song.py index cbecee33..9f45ac1f 100644 --- a/trunk/src/song.py +++ b/trunk/src/song.py @@ -1,7 +1,3 @@ -import sys -import time -import pygst -pygst.require("0.10") import gst @@ -10,6 +6,7 @@ class Song(): def __init__(self,info,next): self.next = next self.info = info + self.position = 0 self.player = gst.Pipeline("player") self.bin = gst.element_factory_make("playbin",None) self.bin.set_property("uri","file://"+self.info.filename) @@ -56,7 +53,12 @@ class Song(): self.player.set_state(gst.STATE_PAUSED) self.playing = False self.current = 0 - self.player.seek_simple(self.time_format,gst.SEEK_FLAG_FLUSH,self.current) + #self.player.seek_simple(self.time_format,gst.SEEK_FLAG_FLUSH,self.current) + self.seek(current) + + + def seek(self,time): + self.player.seek_simple(self.time_format,gst.SEEK_FLAG_FLUSH,time) # Close the song diff --git a/trunk/src/songInfo.py b/trunk/src/songInfo.py index 5bc2c8fd..c57e11af 100644 --- a/trunk/src/songInfo.py +++ b/trunk/src/songInfo.py @@ -1,3 +1,5 @@ + + class SongInfo: def __init__(self): self.id = 0 diff --git a/trunk/src/window.py b/trunk/src/window.py index 6e3404b3..09b7b73c 100644 --- a/trunk/src/window.py +++ b/trunk/src/window.py @@ -1,6 +1,3 @@ -import gobject -import pygtk -pygtk.require('2.0') import gtk import thread @@ -122,7 +119,7 @@ class Window(gtk.Window): infoview = InfoView(self.data) topRight.pack_start(infoview,False,False,0) rightPane.pack_start(topRight,False,False,0) - self.plistview = PlistView(self.data) + self.plistview = PlistView(self.data,infoview) topRight.pack_end(self.plistview.searchBar,False,False,0) rightPane.add(self.plistview) self.makeBottomRow(rightPane)