New icon (thanks Andrew), began last.fm code
git-svn-id: file:///home/anna/Desktop/ocarina-legacy/mithos/ocarina@40 1daee41c-8060-4895-b1f0-2197c00d777a
This commit is contained in:
parent
9f7dc08267
commit
0bf69cb3e3
Binary file not shown.
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 4.0 KiB |
|
@ -41,7 +41,7 @@ class ControlPanel(gtk.HBox):
|
|||
self.pack_start(vbox,True,True,0)
|
||||
vbox.show()
|
||||
pbar.show()
|
||||
gobject.timeout_add(1000,self.updatePBar,pbar)
|
||||
gobject.timeout_add(100,self.updatePBar,pbar)
|
||||
|
||||
|
||||
# Play/Pause function
|
||||
|
@ -61,6 +61,7 @@ class ControlPanel(gtk.HBox):
|
|||
self.plauseBtn.set_image(self.playImg)
|
||||
if self.data.song.playing == True:
|
||||
self.plauseBtn.set_image(self.pauseImg)
|
||||
self.plauseBtn.show()
|
||||
|
||||
|
||||
# Update time/progress of the progress bar
|
||||
|
|
|
@ -21,7 +21,7 @@ class InfoView(gtk.VBox):
|
|||
title = ""
|
||||
album = ""
|
||||
artist = ""
|
||||
if self.data.song.info:
|
||||
if self.data.song:
|
||||
title = self.data.song.info.title
|
||||
album = "from "+self.data.song.info.album
|
||||
artist = "by "+self.data.song.info.artist
|
||||
|
|
|
@ -5,6 +5,7 @@ pygtk.require('2.0')
|
|||
import gtk
|
||||
|
||||
from menuItem import MenuItem
|
||||
from song import Song
|
||||
|
||||
CONTINUE = 0
|
||||
PAFTER = 1
|
||||
|
@ -13,11 +14,18 @@ PAFTER = 1
|
|||
class PlistView(gtk.Notebook):
|
||||
def __init__(self,data):
|
||||
gtk.Notebook.__init__(self)
|
||||
self.connect("switch-page",self.changedTab)
|
||||
self.set_scrollable(True)
|
||||
self.data = data
|
||||
self.data.song.next = self.next
|
||||
|
||||
self.controls = None
|
||||
self.status = CONTINUE
|
||||
|
||||
self.ptime = 0
|
||||
self.qtime = 0
|
||||
|
||||
self.label = gtk.Label("")
|
||||
self.label.show()
|
||||
|
||||
self.ptree = None
|
||||
self.pwin = gtk.ScrolledWindow()
|
||||
|
@ -54,7 +62,7 @@ class PlistView(gtk.Notebook):
|
|||
if self.data.updateList == True:
|
||||
self.clearList(self.plist)
|
||||
self.data.updateList = False
|
||||
self.ptime = self.popList(self.data.curList,self.plist,self.plabel)
|
||||
self.ptime = self.popList(self.data.curList,self.plist)
|
||||
self.setTabText("plist")
|
||||
return True
|
||||
|
||||
|
@ -63,7 +71,6 @@ class PlistView(gtk.Notebook):
|
|||
self.plist = gtk.ListStore(int,str,str,str,str,int)
|
||||
if self.ptree:
|
||||
self.pwin.remove(self.ptree)
|
||||
self.plabel = gtk.Label("")
|
||||
self.ptree,self.ptreesel = self.list2Tree(self.plist)
|
||||
self.pwin.add(self.ptree)
|
||||
self.prcmenu = gtk.Menu()
|
||||
|
@ -71,13 +78,12 @@ class PlistView(gtk.Notebook):
|
|||
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.plabel)
|
||||
self.ptime = self.popList(self.data.curList,self.plist)
|
||||
|
||||
|
||||
# Populate a list
|
||||
def popList(self,src,dst,label):
|
||||
def popList(self,src,dst):
|
||||
time = self.generateList(src,dst)
|
||||
label = self.makeTimeLabel(time)
|
||||
return time
|
||||
|
||||
|
||||
|
@ -85,11 +91,9 @@ class PlistView(gtk.Notebook):
|
|||
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.qlabel = gtk.Label("")
|
||||
self.qtree,self.qtreesel = self.list2Tree(self.qlist)
|
||||
self.qwin.add(self.qtree)
|
||||
self.qtime = self.generateList(self.data.curQ,self.qlist)
|
||||
self.qlabel = self.makeTimeLabel(self.qtime)
|
||||
|
||||
|
||||
def generateList(self,src,dst):
|
||||
|
@ -97,7 +101,6 @@ class PlistView(gtk.Notebook):
|
|||
i = len(dst)
|
||||
for index in src:
|
||||
track = self.data.library.files[index]
|
||||
#dst.append([track.id,track.title,track.length,track.artist,track.album,track.count])
|
||||
dst.insert(i,[track.id,track.title,track.length,track.artist,track.album,track.count])
|
||||
time+=track.duration
|
||||
i+=1
|
||||
|
@ -118,7 +121,7 @@ class PlistView(gtk.Notebook):
|
|||
col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
|
||||
col.set_min_width(2)
|
||||
col.set_max_width(700)
|
||||
col.set_sort_indicator(False)
|
||||
col.set_sort_indicator(True)
|
||||
if cols[i] != "Id":
|
||||
tree.append_column(col)
|
||||
tree.set_rules_hint(True)
|
||||
|
@ -170,9 +173,7 @@ class PlistView(gtk.Notebook):
|
|||
string = ""
|
||||
string = self.toStr(day,"day")+self.toStr(hour,"hour")
|
||||
string += self.toStr(min,"minute")+self.toStr(sec,"second")
|
||||
label = gtk.Label(string)
|
||||
label.show()
|
||||
return label
|
||||
return string
|
||||
|
||||
|
||||
# Make a string for the amount of time
|
||||
|
@ -188,11 +189,9 @@ class PlistView(gtk.Notebook):
|
|||
|
||||
# User selected a song with mouse click
|
||||
def selectSong(self,widgit,iter,path,data,list):
|
||||
#self.data.curSong = self.data.curList.index(list[iter][0])
|
||||
self.data.curSong = self.plist[iter][0]
|
||||
self.loadSong(False)
|
||||
if self.data.song.playing == False:
|
||||
self.controls.plause(None,None)
|
||||
self.controls.plause(None,None)
|
||||
|
||||
|
||||
# Go to the next song in the list
|
||||
|
@ -201,6 +200,8 @@ class PlistView(gtk.Notebook):
|
|||
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")
|
||||
|
@ -208,7 +209,6 @@ class PlistView(gtk.Notebook):
|
|||
self.data.curSong = random.randint(0,len(self.data.curList))
|
||||
else:
|
||||
next = self.plist[0][0]
|
||||
#self.data.curSong = self.plist[0][0]
|
||||
for i in range(len(self.plist)-1):
|
||||
if self.plist[i][0]==self.data.curSong:
|
||||
next = self.plist[i+1][0]
|
||||
|
@ -216,9 +216,13 @@ class PlistView(gtk.Notebook):
|
|||
self.data.curSong = next
|
||||
if self.data.curSong >= len(self.data.curList):
|
||||
self.data.curSong = 0
|
||||
|
||||
self.loadSong(True)
|
||||
if not((self.data.song.playing==False) ^ (self.status==PAFTER)):
|
||||
pause = (self.status == PAFTER)
|
||||
|
||||
if pause == False:
|
||||
self.controls.plause(None,None)
|
||||
self.controls.changeImg()
|
||||
self.status = CONTINUE
|
||||
|
||||
|
||||
|
@ -228,7 +232,7 @@ class PlistView(gtk.Notebook):
|
|||
return
|
||||
if self.data.song:
|
||||
self.data.song.close()
|
||||
self.data.song.passInfo(self.data.library.files[self.data.curSong])
|
||||
self.data.song = Song(self.data.library.files[self.data.curSong],self.next)
|
||||
if scroll == True:
|
||||
self.gotoCurSong()
|
||||
|
||||
|
@ -246,17 +250,26 @@ class PlistView(gtk.Notebook):
|
|||
self.ptreesel.select_path(i)
|
||||
|
||||
|
||||
|
||||
|
||||
# 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.plist[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))
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
import urllib2
|
||||
import pygtk
|
||||
pygtk.require('2.0')
|
||||
import gtk
|
||||
import webbrowser
|
||||
import thread
|
||||
|
||||
import xml.dom
|
||||
from xml.dom import minidom
|
||||
|
||||
|
||||
class Scrobbler(gtk.VBox):
|
||||
def __init__(self,data):
|
||||
gtk.VBox.__init__(self,False,0)
|
||||
self.data = data
|
||||
self.url = "http://ws.audioscrobbler.com/2.0/"
|
||||
self.key = "api_key=2c76f85a6704efd74b5a358821284ef9"
|
||||
self.token = "token="
|
||||
|
||||
# Run these in new thread so we can keep loading other things while waiting
|
||||
thread.start_new_thread(self.setup,("setup",None))
|
||||
#self.fetchToken()
|
||||
#self.authorize()
|
||||
|
||||
#self.makeRequest()
|
||||
self.show()
|
||||
|
||||
|
||||
def setup(self,widgit,data):
|
||||
self.fetchToken()
|
||||
self.authorize()
|
||||
|
||||
|
||||
def addMethod(self,method):
|
||||
return self.url+"?method="+method
|
||||
|
||||
def authorize(self):
|
||||
url = "http://www.last.fm/api/auth/?"
|
||||
url+=self.key+"&"+self.token
|
||||
webbrowser.open(url)
|
||||
|
||||
|
||||
def fetchToken(self):
|
||||
url = self.addMethod("auth.gettoken")+"&"+self.key
|
||||
req = urllib2.Request(url)
|
||||
req.add_header('User-Agent','Ocarina')
|
||||
status = minidom.parse(urllib2.urlopen(req)).documentElement
|
||||
|
||||
attr = status.getAttributeNode("status")
|
||||
if attr.value != "ok":
|
||||
return
|
||||
self.token += status.firstChild.nextSibling.firstChild.data
|
||||
print self.token
|
|
@ -24,7 +24,8 @@ class main:
|
|||
self.options.verbose = True
|
||||
# Load saved data (or create new data)
|
||||
self.data = SavedData(self.options)
|
||||
self.data.song = Song(self.quit)
|
||||
#self.data.song = Song(self.quit)
|
||||
self.data.quit = None
|
||||
|
||||
self.window = Window(self.quit,self.options,self.data)
|
||||
gtk.main()
|
||||
|
|
|
@ -22,6 +22,7 @@ class SavedData:
|
|||
self.path = path
|
||||
self.song = None
|
||||
self.random = False
|
||||
self.quit = None
|
||||
|
||||
if os.path.exists(path):
|
||||
try:
|
||||
|
|
|
@ -7,13 +7,13 @@ import gst
|
|||
|
||||
class Song():
|
||||
#def __init__(self,info,exitFunc,prnt):
|
||||
def __init__(self,exitFunc):
|
||||
self.quit=exitFunc
|
||||
# initialize player pipeline
|
||||
self.next = None
|
||||
self.info = None
|
||||
def __init__(self,info,next):
|
||||
self.next = next
|
||||
self.info = info
|
||||
self.player = gst.Pipeline("player")
|
||||
self.bin = gst.element_factory_make("playbin",None)
|
||||
self.bin.set_property("uri","file://"+self.info.filename)
|
||||
self.bin.set_state(gst.STATE_PAUSED)
|
||||
self.player.add(self.bin)
|
||||
|
||||
# initialize bus
|
||||
|
@ -43,8 +43,6 @@ class Song():
|
|||
|
||||
# Toggle between play and pause
|
||||
def plause(self):
|
||||
if self.hasFile == False:
|
||||
return
|
||||
if self.playing == False:
|
||||
self.player.set_state(gst.STATE_PLAYING)
|
||||
self.playing = True
|
||||
|
@ -55,8 +53,6 @@ class Song():
|
|||
|
||||
# Stop playback
|
||||
def stop(self):
|
||||
if self.hasFile == False:
|
||||
return
|
||||
self.player.set_state(gst.STATE_PAUSED)
|
||||
self.playing = False
|
||||
self.current = 0
|
||||
|
@ -65,7 +61,6 @@ class Song():
|
|||
|
||||
# Close the song
|
||||
def close(self):
|
||||
self.playing = False
|
||||
self.player.set_state(gst.STATE_NULL)
|
||||
|
||||
|
||||
|
@ -74,10 +69,3 @@ class Song():
|
|||
if self.playing == False:
|
||||
return (False,False)
|
||||
return (True, self.player.query_position(self.time_format,None)[0])
|
||||
|
||||
|
||||
# Use to load a file path
|
||||
def passInfo(self,info):
|
||||
self.info = info
|
||||
self.bin.set_property("uri","file://"+self.info.filename)
|
||||
self.hasFile = True
|
||||
|
|
|
@ -9,6 +9,7 @@ from GuiObjects.libView import LibView
|
|||
from GuiObjects.plistView import PlistView
|
||||
from GuiObjects.controlPanel import ControlPanel
|
||||
from GuiObjects.infoView import InfoView
|
||||
from GuiObjects.scrobbler import Scrobbler
|
||||
|
||||
|
||||
class Window(gtk.Window):
|
||||
|
@ -96,10 +97,23 @@ class Window(gtk.Window):
|
|||
self.contentPane.add(self.divider)
|
||||
self.divider.show()
|
||||
|
||||
leftPane = gtk.Notebook()
|
||||
leftPane.show()
|
||||
leftPane.set_tab_pos(gtk.POS_LEFT)
|
||||
|
||||
self.libview = LibView(self.data)
|
||||
self.libview.show()
|
||||
self.divider.add1(self.libview)
|
||||
libLabel = gtk.Label("Library")
|
||||
libLabel.set_angle(90)
|
||||
leftPane.append_page(self.libview,libLabel)
|
||||
|
||||
scrobbler = Scrobbler(self.data)
|
||||
scrobLabel = gtk.Label("Last.fm")
|
||||
scrobLabel.set_angle(90)
|
||||
leftPane.append_page(scrobbler,scrobLabel)
|
||||
|
||||
self.divider.add1(leftPane)
|
||||
|
||||
rightPane=gtk.VBox(False,0)
|
||||
|
||||
infoview = InfoView(self.data)
|
||||
|
@ -117,12 +131,11 @@ class Window(gtk.Window):
|
|||
|
||||
def makeBottomRow(self,vbox):
|
||||
box = gtk.HBox(False,0)
|
||||
#box.pack_end(self.libview.label,False,False,10)
|
||||
box.show()
|
||||
controls = ControlPanel(self.data,self.plistview)
|
||||
self.plistview.controls = controls
|
||||
vbox.pack_start(controls,False,False,0)
|
||||
box.pack_end(self.plistview.plabel)
|
||||
box.show()
|
||||
box.pack_end(self.plistview.label)
|
||||
align = gtk.Alignment(1,1,0,0)
|
||||
align.add(box)
|
||||
align.show()
|
||||
|
|
Loading…
Reference in New Issue