]>
code.delx.au - webdl/blob - common.py
1ce0008aa4c1d2ca3808d8dc883fb5b696e94614
1 # vim:ts=4:sts=4:sw=4:noet
3 from lxml
import etree
, html
20 autosocks
.try_autosocks()
22 CACHE_DIR
= os
.path
.expanduser("~/.cache/webdl")
25 def __init__(self
, title
, parent
=None):
28 parent
.children
.append(self
)
31 self
.can_download
= False
33 def get_children(self
):
41 root_node
= Node("Root")
44 iview
.fill_nodes(root_node
)
47 sbs
.fill_nodes(root_node
)
51 valid_chars
= frozenset("-_.() abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
52 def sanify_filename(filename
):
53 filename
= filename
.encode("ascii", "ignore")
54 filename
= "".join(c
for c
in filename
if c
in valid_chars
)
58 def urlopen(url
, max_age
):
60 if not os
.path
.isdir(CACHE_DIR
):
61 os
.makedirs(CACHE_DIR
)
64 return urllib
.urlopen(url
)
66 filename
= hashlib
.md5(url
).hexdigest()
67 filename
= os
.path
.join(CACHE_DIR
, filename
)
68 if os
.path
.exists(filename
):
69 file_age
= int(time
.time()) - os
.path
.getmtime(filename
)
70 if file_age
< max_age
:
73 src
= urllib
.urlopen(url
)
74 dst
= open(filename
, "w")
76 shutil
.copyfileobj(src
, dst
)
88 def grab_html(url
, max_age
):
89 f
= urlopen(url
, max_age
)
94 def grab_xml(url
, max_age
):
95 f
= urlopen(url
, max_age
)
100 def grab_json(url
, max_age
):
101 f
= urlopen(url
, max_age
)
106 def exec_subprocess(cmd
):
108 p
= subprocess
.Popen(cmd
)
111 print >>sys
.stderr
, cmd
[0], "exited with error code:", ret
116 print >>sys
.stderr
, "Failed to run", cmd
[0], e
117 except KeyboardInterrupt:
118 print "Cancelled", cmd
122 except KeyboardInterrupt:
123 p
.send_signal(signal
.SIGKILL
)
128 def convert_flv_mp4(orig_filename
):
129 basename
= os
.path
.splitext(orig_filename
)[0]
130 flv_filename
= basename
+ ".flv"
131 mp4_filename
= basename
+ ".mp4"
132 os
.rename(orig_filename
, flv_filename
)
133 print "Converting %s to mp4" % flv_filename
141 if not exec_subprocess(cmd
):
144 flv_size
= os
.stat(flv_filename
).st_size
145 mp4_size
= os
.stat(mp4_filename
).st_size
146 if abs(flv_size
- mp4_size
) < 0.05 * flv_size
:
147 os
.unlink(flv_filename
)
149 print >>sys
.stderr
, "The size of", mp4_filename
, "is suspicious, did ffmpeg fail?"
151 print "Conversion failed", e
153 def convert_filename(filename
):
154 if filename
.lower().endswith(".mp4"):
158 if fourcc
== "FLV\x01":
159 convert_flv_mp4(filename
)
161 def download_rtmp(filename
, vbase
, vpath
, hash_url
=None):
162 filename
= sanify_filename(filename
)
163 print "Downloading: %s" % filename
164 if vpath
.endswith(".flv"):
172 if hash_url
is not None:
173 cmd
+= ["--swfVfy", hash_url
]
174 success
= exec_subprocess(cmd
)
175 convert_filename(filename
)
178 def download_urllib(filename
, url
):
179 filename
= sanify_filename(filename
)
180 print "Downloading: %s" % filename
182 src
= urllib
.urlopen(url
)
183 dst
= open(filename
, "w")
185 buf
= src
.read(1024*1024)
189 sys
.stdout
.write(".")
191 convert_filename(filename
)
193 except KeyboardInterrupt:
194 print "\nCancelled", url