changeset 524:880bfdd5deb0

ascoltami /api endpoint next to /RPC2, returns play start time as well as song+pos Ignore-this: 9395a156cb70de6578ca4b3aa5239aaa
author drewp@bigasterisk.com
date Wed, 09 Jun 2010 05:35:06 +0000
parents 9f36a105adb3
children d3f8333bc142
files bin/ascoltami
diffstat 1 files changed, 37 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/bin/ascoltami	Tue Jun 08 07:09:57 2010 +0000
+++ b/bin/ascoltami	Wed Jun 09 05:35:06 2010 +0000
@@ -35,7 +35,7 @@
 from __future__ import division,nested_scopes
 
 from optparse import OptionParser
-import sys, os,math,time
+import sys, os,math,time, jsonlib
 from rdflib import URIRef
 import Tkinter as tk
 import logging
@@ -44,7 +44,7 @@
 
 from twisted.internet import reactor,tksupport
 from twisted.internet.error import CannotListenError
-from twisted.web import xmlrpc, server
+from twisted.web import xmlrpc, server, resource
 
 import run_local
 from light9 import networking, showconfig, wavelength
@@ -63,7 +63,17 @@
     prefixlen = all[0].rfind(os.sep)+1 
 
     return os.path.splitext(song[prefixlen:])[0]
-    
+
+class RestApi(resource.Resource):
+    isLeaf = True
+    def __init__(self, player):
+        resource.Resource.__init__(self)
+        self.player = player
+    def render_GET(self, request):
+        if request.postpath == ['position']:
+            return jsonlib.write({"song" : self.player.song_uri,
+                                  "t" : self.player.smoothCurrentTime(),
+                                  "started" : self.player.playStartTime})
 
 class XMLRPCServe(xmlrpc.XMLRPC):
     def __init__(self,player):
@@ -123,6 +133,7 @@
         self.total_time = tk.DoubleVar()
         self.filename_var = tk.StringVar()
         self.song_uri = None
+        self.playStartTime = 0
 
         self.pre_post_names = showconfig.prePostSong()
 
@@ -192,9 +203,14 @@
         p = showconfig.songOnDisk(song)
         self.total_time.set(wavelength.wavelength(p))
 
+    def mpdPlay(self):
+        """vidref wants to know when this play started"""
+        self.playStartTime = time.time()
+        self.mpd.play()
+
     def play(self, song=None):
         if song is None:
-            self.mpd.play()
+            self.mpdPlay()
             return
     
         self.mpd.clear()
@@ -231,16 +247,17 @@
         self.mpd.seek(seconds=0, song=0)
         self.mpd.stop()
         
-    def seek_to(self, time):
-        if time < 0:
+    def seek_to(self, t):
+        if t < 0:
             # seeking to anything within my 4-sec silence ogg goes
             # right to zero. maybe ogg seeking is too coarse?
-            self.mpd.seek(seconds=time - (-4), song=0)
-        elif time > self.total_time.get():
-            self.mpd.seek(seconds=time - self.total_time.get(), song=2)
+            self.mpd.seek(seconds=t - (-4), song=0)
+        elif t > self.total_time.get():
+            self.mpd.seek(seconds=t - self.total_time.get(), song=2)
         else:
-            self.mpd.seek(seconds=time, song=1)
-        self.last_autopause_time = time
+            self.mpd.seek(seconds=t, song=1)
+        self.last_autopause_time = t
+        self.playStartTime = time.time()
 
     def skip_intro(self):
         self.seek_to(0)
@@ -254,7 +271,7 @@
             if status.state == 'play':
                 self.mpd.pause()
             else:
-                self.mpd.play()
+                self.mpdPlay()
         self.mpd.status().addCallback(finish)
 
     def pause(self):
@@ -507,6 +524,8 @@
         if not options.show:
             raise ValueError("missing --show http://...")
         playList = graph.value(URIRef(options.show), L9['playList'])
+        if not playList:
+            raise ValueError("%r has no l9:playList" % options.show)
         songs = list(graph.items(playList))
     else:
         raise NotImplementedError("don't know how to make rdf song nodes from cmdline song paths")
@@ -544,8 +563,13 @@
 
     tksupport.install(root,ms=10)
 
+    rootResource = resource.Resource()
+    site = server.Site(rootResource)
+    rootResource.putChild("api", RestApi(player))
+    rootResource.putChild("RPC2", XMLRPCServe(player))
+    
     try:
-        reactor.listenTCP(networking.musicPort(),server.Site(XMLRPCServe(player)))
+        reactor.listenTCP(networking.musicPort(), site)
         print "started server on %s" % networking.musicPort()
     except CannotListenError:
         print "no server started- %s is in use" % networking.musicPort()