]> code.delx.au - webdl/blob - sbs.py
Work on OSX
[webdl] / sbs.py
1 #!/usr/bin/env python
2 # vim:ts=4:sts=4:sw=4:noet
3
4 from common import grab_xml as _grab_xml, download_rtmp, download_urllib, Node
5
6
7 BASE_URL = "http://player.sbs.com.au"
8
9 def grab_xml(path, max_age):
10 return _grab_xml(BASE_URL + path, max_age)
11
12 class SbsNode(Node):
13 def __init__(self, title, parent, video_desc_url):
14 Node.__init__(self, title, parent)
15 self.video_desc_url = video_desc_url
16 self.can_download = True
17
18 def download(self):
19 video = grab_xml(self.video_desc_url, 0)
20 vbase = video.xpath("//meta/@base")[0]
21 bestrate = 0
22 bestvpath = None
23 for vpath in video.xpath("//switch/video"):
24 rate = float(vpath.xpath("@system-bitrate")[0])
25 if rate > bestrate:
26 bestrate = rate
27 bestvpath = vpath.xpath("@src")[0]
28 filename = self.title + "." + bestvpath.rsplit(".", 1)[1]
29 if vbase.startswith("rtmp://"):
30 return download_rtmp(filename, vbase, bestvpath)
31 else:
32 return download_urllib(filename, vbase + bestvpath)
33
34
35 def fill_nodes(root_node):
36 settings = grab_xml("/playerassets/programs/config/standalone_settings.xml", 24*3600)
37 menu_url = settings.xpath("/settings/setting[@name='menuURL']/@value")[0]
38
39 root_menu = grab_xml(menu_url, 3600)
40 seen_category_titles = set()
41 for menu in root_menu.xpath("//menu"):
42 try:
43 category_title = menu.xpath("title/text()")[0]
44 playlist_url = menu.xpath("playlist/@xmlSrc")[0]
45 if category_title in seen_category_titles:
46 # append a number to the name
47 i = 2
48 while True:
49 if (category_title+str(i)) not in seen_category_titles:
50 category_title += str(i)
51 break
52 i += 1
53 seen_category_titles.add(category_title)
54 category_node = Node(category_title, root_node)
55 playlist = grab_xml(playlist_url, 3600)
56 for video_desc in playlist.xpath("//video"):
57 video_desc_url = video_desc.xpath("@src")[0]
58 video_title = video_desc.xpath("title/text()")[0].strip()
59 SbsNode(video_title, category_node, video_desc_url)
60 except IndexError:
61 continue
62