Unlink the video adter sending it.
[pyTivo.git] / plugins / webvideo / webvideo.py
blob710a4d1f7c3a228e4b28c2abe0adb6168401730e
1 from plugins.video.video import Video, VideoDetails
2 import mind
3 import config
5 import xmpp
7 import threading
8 import urllib2
9 import os.path
10 import shutil
11 import os.path
12 import os
13 import urlparse
14 import urllib
15 import xml.etree.ElementTree as ElementTree
16 import Queue
18 CLASS_NAME = 'WebVideo'
21 class WebVideo(Video):
23 CONTENT_TYPE = 'x-not-for/tivo'
25 def init(self):
26 self.work_queue = Queue.Queue()
27 self.download_thread_num = 1
28 self.in_progress = {}
29 self.in_progress_lock = threading.Lock()
31 self.startXMPP()
32 self.xmpp_cdsupdate()
33 self.startWorkerThreads()
35 def startXMPP(self):
36 m = mind.getMind()
37 xmpp_info = m.getXMPPLoginInfo()
39 jid=xmpp.protocol.JID(xmpp_info['username'] + '/pyTivo')
40 cl=xmpp.Client(
41 server=xmpp_info['server'],
42 port=xmpp_info['port'],
45 cl.connect()
46 cl.RegisterHandler('message', self.processMessage)
47 cl.auth(user=jid.getNode(), password=config.getTivoPassword(), resource='pyTivo')
49 cl.sendInitPresence(requestRoster=0)
51 for user_name in xmpp_info['presence_list']:
52 jid=xmpp.protocol.JID(user_name)
53 cl.sendPresence(jid)
55 t = threading.Thread(target=self.processXMPP, args=(cl,))
56 t.setDaemon(True)
57 t.start()
59 def startWorkerThreads(self):
60 for i in range(self.download_thread_num):
61 t = threading.Thread(target=self.processDlRequest)
62 t.setDaemon(True)
63 t.start()
65 def processXMPP(self, client):
66 while client.Process():
67 pass
69 def processMessage(self, sess,mess):
70 xmpp_action = ElementTree.fromstring(mess.getBody())
72 method_name = 'xmpp_' + xmpp_action.findtext('action').lower()
73 if not hasattr(self, method_name):
74 return False
76 method = getattr(self, method_name)
77 method(xmpp_action)
79 def xmpp_cdsupdate(self, xml=None):
80 m = mind.getMind()
82 self.in_progress_lock.acquire()
83 try:
84 for request in m.getDownloadRequests():
85 if not request['bodyOfferId'] in self.in_progress:
86 self.in_progress[request['bodyOfferId']] = True
87 self.work_queue.put(request)
88 finally:
89 self.in_progress_lock.release()
91 def processDlRequest(self):
93 while True:
94 data = self.work_queue.get()
96 for share_name, settings in config.getShares():
97 if settings['type'] == 'webvideo':
98 break
101 path = settings['path']
102 file_name = os.path.join(path, '%s-%s' % (data['bodyOfferId'] ,data['url'].split('/')[-1]))
104 self.downloadFile(data['url'], file_name)
106 tsn = data['bodyId']
107 file_info = VideoDetails()
108 file_info.update(self.metadata_full(file_name, tsn))
110 import socket
111 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
112 s.connect(('tivo.com',123))
113 ip = s.getsockname()[0]
114 port = config.getPort()
116 data['url'] = 'http://%s:%s' % (ip, port) + urllib.quote('/%s/%s' % (share_name, os.path.split(file_name)[-1]))
117 data['duration'] = file_info['duration'] / 1000
118 data['size'] = file_info['size']
120 print data
122 m = mind.getMind()
123 m.completeDownloadRequest(data)
125 self.in_progress_lock.acquire()
126 try:
127 del self.in_progress[data['bodyOfferId']]
128 finally:
129 self.in_progress_lock.release()
132 def downloadFile(self, url, file_path):
133 print 'downloading %s to %s' % (url, file_path)
135 outfile = open(file_path, 'awb')
136 size = os.path.getsize(file_path)
137 r = urllib2.Request(url)
138 if size:
139 r.add_header('Range', 'bytes=%s-' % size)
140 infile = urllib2.urlopen(r)
141 shutil.copyfileobj(infile, outfile, 8192)
143 print 'done downloading %s to %s' % (url, file_path)
145 def send_file(self, handler, container, name):
146 Video.send_file(self, handler, container, name)
148 o = urlparse.urlparse("http://fake.host" + handler.path)
149 path = urllib.unquote(o[2])
150 file_path = container['path'] + path[len(name) + 1:]
151 if os.path.exists(file_path):
152 os.unlink(file_path)