]>
code.delx.au - webdl/blob - sbs.py
4f39ff55ae8344db954c0dca978325e54ea41b27
2 # vim:ts=4:sts=4:sw=4:noet
4 from common
import grab_html
, grab_json
, grab_xml
, download_rtmp
, download_urllib
, Node
, append_to_qs
9 BASE
= "http://www.sbs.com.au"
10 VIDEO_MENU
= BASE
+ "/ondemand/js/video-menu"
11 VIDEO_URL
= BASE
+ "/ondemand/video/single/%s"
14 "fp": "MAC 11,1,102,55",
18 SWF_URL
= "http://resources.sbs.com.au/vod/theplatform/core/current/swf/flvPlayer.swf"
21 "smil": "http://www.w3.org/2005/SMIL21/Language",
26 def __init__(self
, title
, parent
, video_id
):
27 Node
.__init
__(self
, title
, parent
)
29 self
.video_id
= video_id
.split("/")[-1]
30 self
.can_download
= True
33 doc
= grab_html(VIDEO_URL
% self
.video_id
, 0)
35 for script
in doc
.xpath("//script", namespaces
=NS
):
38 for line
in script
.text
.split("\n"):
39 if line
.find("player.releaseUrl") < 0:
41 desc_url
= line
[line
.find("\"")+1 : line
.rfind("\"")]
43 if desc_url
is not None:
46 raise Exception("Failed to get JSON URL for " + self
.title
)
48 desc_url
= append_to_qs(desc_url
, {"manifest": None})
49 doc
= grab_xml(desc_url
, 0)
50 video
= doc
.xpath("//smil:video", namespaces
=NS
)[0]
51 video_url
= video
.attrib
["src"]
52 ext
= urlparse
.urlsplit(video_url
).path
.rsplit(".", 1)[1]
53 filename
= self
.title
+ "." + ext
54 video_url
= append_to_qs(video_url
, VIDEO_MAGIC
)
55 return download_urllib(filename
, video_url
, referrer
=SWF_URL
)
57 class SbsNavNode(Node
):
58 def __init__(self
, title
, parent
, url
):
59 Node
.__init
__(self
, title
, parent
)
61 self
.sort_children
= True
63 def fill_children(self
):
65 doc
= grab_json(BASE
+ self
.url
, 3600)
67 # SBS sends XML as an error message :\
69 if len(doc
.get("entries", [])) == 0:
71 for entry
in doc
["entries"]:
72 self
.fill_entry(entry
)
74 def fill_entry(self
, entry
):
75 title
= entry
["title"]
76 video_id
= entry
["id"]
77 SbsNode(title
, self
, video_id
)
79 class SbsRootNode(Node
):
80 def __init__(self
, parent
=None):
81 Node
.__init
__(self
, "SBS", parent
)
83 def fill_children(self
):
84 menu
= grab_json(VIDEO_MENU
, 3600, skip_assignment
=True)
85 for name
in menu
.keys():
86 self
.fill_category(self
, menu
[name
])
88 def create_nav_node(self
, name
, parent
, cat_data
, url_key
):
90 url
= cat_data
[url_key
]
94 SbsNavNode(name
, parent
, url
)
96 def fill_category(self
, parent
, cat_data
):
97 if not cat_data
.has_key("children"):
98 name
= cat_data
["name"]
99 self
.create_nav_node(name
, parent
, cat_data
, "url")
102 node
= Node(cat_data
["name"], parent
)
103 self
.create_nav_node("Featured", node
, cat_data
, "furl")
104 self
.create_nav_node("Latest", node
, cat_data
, "url")
105 self
.create_nav_node("Most Popular", node
, cat_data
, "purl")
107 children
= cat_data
.get("children", [])
108 if isinstance(children
, dict):
109 children
= [children
[k
] for k
in sorted(children
.keys())]
110 for child_cat
in children
:
111 self
.fill_category(node
, child_cat
)
113 def fill_nodes(root_node
):
114 SbsRootNode(root_node
)