Adding the webvideo plugin.
[pyTivo.git] / plugins / webvideo / webvideo.py
blobe07f009cc8ad0b84bec802b25fa7215aa77f0bb3
1 from plugins.video.video import Video, VideoDetails
2 import mind
3 import config
5 import pyxmpp.jabber.client
6 from pyxmpp.all import *
7 from pyxmpp.streamtls import TLSSettings
9 import threading
10 import xml.etree.ElementTree as ElementTree
12 CLASS_NAME = 'WebVideo'
14 sem = threading.Semaphore(1)
18 class WebVideo(Video):
20 CONTENT_TYPE = 'x-not-for/tivo'
22 def init(self):
23 c = XmppListener(self)
24 c.connect()
26 t = threading.Thread(target=c.loop)
27 t.setDaemon(True)
28 t.start()
29 self.xmppCdsupdate()
32 def xmppCdsupdate(self):
33 m = mind.getMind()
34 for request in m.getDownloadRequests():
35 t = threading.Thread(target=self.processDlRequest, args=(request,))
36 t.setDaemon(True)
37 t.start()
39 def processDlRequest(self, data):
40 import shutil
41 import os.path
42 import urllib2
43 import urllib
45 sem.acquire()
47 path = '/home/armooo/Videos/web'
49 file_name = os.path.join(path, '%s-%s' % (data['bodyOfferId'] ,data['url'].split('/')[-1]))
51 print 'downloading %s to %s' % (data['url'], file_name)
53 outfile = open(file_name, 'wb')
55 infile = urllib2.urlopen(data['url'])
56 shutil.copyfileobj(infile, outfile)
58 print 'done downloading %s to %s' % (data['url'], file_name)
60 tsn = data['bodyId']
61 file_info = VideoDetails()
62 file_info.update(self.metadata_full(file_name, tsn))
64 data['url'] = 'http://10.0.1.51:9032' + urllib.quote('/WebVideo/%s' % os.path.split(file_name)[-1])
65 data['duration'] = file_info['duration'] / 1000
66 data['size'] = file_info['size']
68 print data
70 m = mind.getMind()
71 m.completeDownloadRequest(data)
73 sem.release()
76 class XmppListener(Client):
77 def __init__(self, web_video):
78 m = mind.getMind()
79 xmpp_info = m.getXMPPLoginInfo()
81 Client.__init__(self,
82 jid=JID(xmpp_info['username'] + '/pyTivo'),
83 password=config.getTivoPassword(),
84 server=xmpp_info['server'],
85 port=xmpp_info['port'],
86 tls_settings=TLSSettings(verify_peer=False),
87 auth_methods = ('sasl:plain',),
90 self.web_video = web_video
91 self.presence_list = xmpp_info['presence_list']
93 def session_started(self):
94 self.stream.set_message_handler(None, self.message)
96 p = Presence()
97 self.stream.send(p)
98 for p in self.presence_list:
99 print p
100 p = Presence(to_jid=JID(p))
101 self.stream.send(p)
103 def message(self,stanza):
104 xmpp_action = ElementTree.fromstring(stanza.get_body())
106 method_name = 'xmpp_' + xmpp_action.findtext('action').lower()
107 if not hasattr(self, method_name):
108 return False
110 method = getattr(self, method_name)
111 method(xmpp_action)
112 return True
114 def xmpp_cdsupdate(self, xml):
115 self.web_video.xmppCdsupdate()