]> code.delx.au - monosys/blob - scripts/sbs-downloader
Added SBS downloader
[monosys] / scripts / sbs-downloader
1 #!/usr/bin/env python
2
3 from lxml import etree
4 import signal
5 import subprocess
6 import urllib
7
8
9 BASE_URL = "http://player.sbs.com.au"
10
11 def grab_xml(path):
12 f = urllib.urlopen(BASE_URL + path)
13 doc = etree.parse(f)
14 f.close()
15 return doc
16
17 def choose(options):
18 skeys = sorted(options.keys())
19 for i, key in enumerate(skeys):
20 print " %d) %s" % (i+1, key)
21 print " 0) Back"
22 while True:
23 try:
24 value = int(raw_input("Choose> "))
25 if value == 0:
26 return
27 if value > 0 and value <= len(skeys):
28 return options[skeys[value-1]]
29 except ValueError:
30 pass
31
32 def get_menu_list():
33 settings = grab_xml("/playerassets/programs/config/standalone_settings.xml")
34 menu_url = settings.xpath("/settings/setting[@name='menuURL']/@value")[0]
35
36 root_menu = grab_xml(menu_url)
37 menu_list = {}
38 for menu in root_menu.xpath("//menu"):
39 try:
40 title = menu.xpath("title/text()")[0]
41 playlist_url = menu.xpath("playlist/@xmlSrc")[0]
42 if title in menu_list:
43 i = 2
44 while True:
45 if (title+str(i)) not in menu_list:
46 title += str(i)
47 break
48 i += 1
49 menu_list[title] = playlist_url
50 except IndexError:
51 continue
52
53 return menu_list
54
55 def get_video_list(playlist_url):
56 video_list = {}
57 playlist = grab_xml(playlist_url)
58 for video_desc in playlist.xpath("//video"):
59 video_desc_url = video_desc.xpath("@src")[0]
60 title = video_desc.xpath("title/text()")[0]
61 video_list[title] = (title, video_desc_url)
62 return video_list
63
64 def download_video((title, video_desc_url)):
65 video = grab_xml(video_desc_url)
66 vbase = video.xpath("//meta/@base")[0]
67 bestrate = 0
68 bestvpath = None
69 for vpath in video.xpath("//switch/video"):
70 rate = float(vpath.xpath("@system-bitrate")[0])
71 if rate > bestrate:
72 bestrate = rate
73 bestvpath = vpath.xpath("@src")[0]
74 title += "." + bestvpath.rsplit(".", 1)[1]
75 if bestvpath.endswith(".flv"):
76 bestvpath = bestvpath[:-4]
77 cmd = [
78 "rtmpdump",
79 "-o", title,
80 "-r", vbase,
81 "-y", bestvpath,
82 ]
83 try:
84 p = subprocess.Popen(cmd)
85 p.wait()
86 except KeyboardInterrupt:
87 print "Cancelled", cmd
88 try:
89 p.terminate()
90 p.wait()
91 except KeyboardInterrupt:
92 p.send_signal(signal.SIGKILL)
93 p.wait()
94
95 def main():
96 while True:
97 menu_list = get_menu_list()
98 playlist_url = choose(menu_list)
99 if playlist_url is None:
100 continue
101 video_list = get_video_list(playlist_url)
102 while True:
103 video_desc_url = choose(video_list)
104 if video_desc_url is None:
105 break
106 download_video(video_desc_url)
107
108 if __name__ == "__main__":
109 main()
110