]> code.delx.au - webdl/blob - common.py
f286333dbccbbfe8807b601e6456e96904ffde84
[webdl] / common.py
1 # vim:ts=4:sts=4:sw=4:noet
2
3 from lxml import etree
4 import json
5 import md5
6 import os
7 import shutil
8 import signal
9 import subprocess
10 import sys
11 import tempfile
12 import time
13 import urllib
14
15
16 import autosocks
17 autosocks.try_autosocks()
18
19 CACHE_DIR = os.path.expanduser("~/.cache/webdl")
20
21 class Node(object):
22 def __init__(self, title, parent=None):
23 self.title = title
24 if parent:
25 parent.children.append(self)
26 self.parent = parent
27 self.children = []
28 self.can_download = False
29
30 def download(self):
31 raise NotImplemented
32
33
34 def load_root_node():
35 root_node = Node("Root")
36
37 import iview
38 iview_node = Node("ABC iView", root_node)
39 iview.fill_nodes(iview_node)
40
41 import sbs
42 sbs_node = Node("SBS", root_node)
43 sbs.fill_nodes(sbs_node)
44
45 return root_node
46
47
48 def urlopen(url):
49 try:
50 os.mkdir(CACHE_DIR)
51 except OSError:
52 pass
53
54 filename = md5.new(url).hexdigest()
55 filename = os.path.join(CACHE_DIR, filename)
56 if os.path.exists(filename):
57 if int(time.time()) - os.path.getmtime(filename) < 24*3600:
58 return open(filename)
59
60 src = urllib.urlopen(url)
61 dst = open(filename, "w")
62 shutil.copyfileobj(src, dst)
63 src.close()
64 dst.close()
65
66 return open(filename)
67
68 def grab_xml(url):
69 f = urlopen(url)
70 doc = etree.parse(f)
71 f.close()
72 return doc
73
74 def grab_json(url):
75 f = urlopen(url)
76 doc = json.load(f)
77 f.close()
78 return doc
79
80 def download_rtmp(filename, vbase, vpath):
81 if vpath.endswith(".flv"):
82 vpath = vpath[:-4]
83 cmd = [
84 "rtmpdump",
85 "-o", filename,
86 "-r", vbase,
87 "-y", vpath,
88 ]
89 try:
90 p = subprocess.Popen(cmd)
91 ret = p.wait()
92 if ret != 0:
93 print >>sys.stderr, "rtmpdump exited with error code:", ret
94 return False
95 except OSError, e:
96 print >>sys.stderr, "Failed to run rtmpdump!", e
97 return False
98 except KeyboardInterrupt:
99 print "Cancelled", cmd
100 try:
101 p.terminate()
102 p.wait()
103 except KeyboardInterrupt:
104 p.send_signal(signal.SIGKILL)
105 p.wait()
106
107 def download_urllib(filename, url):
108 print "Downloading: %s -> %s" % (url, filename)
109 try:
110 src = urllib.urlopen(url)
111 dst = open(filename, "w")
112 shutil.copyfileobj(src, dst)
113 return True
114 except KeyboardInterrupt:
115 print "\nCancelled", url
116 finally:
117 src.close()
118 dst.close()
119 return False
120