X-Git-Url: https://code.delx.au/webdl/blobdiff_plain/1e187809bf3e16a098cd31f4bf572a5e674cc9a7..bfaf019987c47406335b61c5825cabe21cafa107:/sbs.py diff --git a/sbs.py b/sbs.py index e2e1699..1b6af3a 100644 --- a/sbs.py +++ b/sbs.py @@ -1,10 +1,11 @@ import requests_cache -from common import grab_html, grab_json, grab_xml, download_hls, Node, append_to_qs +from common import grab_html, grab_json, grab_xml, download_hls, download_mpd, Node, append_to_qs import json +import sys -BASE = "http://www.sbs.com.au" -FULL_VIDEO_LIST = BASE + "/api/video_search/v2/?m=1&filters={section}{Programs}" +BASE = "https://www.sbs.com.au" +FULL_VIDEO_LIST = BASE + "/api/video_feed/f/Bgtm9B/sbs-section-programs/" VIDEO_URL = BASE + "/ondemand/video/single/%s" NS = { @@ -22,13 +23,20 @@ class SbsVideoNode(Node): with requests_cache.disabled(): doc = grab_html(VIDEO_URL % self.video_id) player_params = self.get_player_params(doc) - release_url = player_params["releaseUrls"]["html"] - video_url = self.get_video_url(release_url) - if not video_url: - raise Exception("Unsupported video %s: %s" % (self.video_id, self.title)) + error = player_params.get("error", None) + if error: + print("Cannot download:", error) + return False + + release_url = player_params["releaseUrls"]["html"] filename = self.title + ".ts" - return download_hls(filename, video_url) + + hls_url = self.get_hls_url(release_url) + if hls_url: + return download_hls(filename, hls_url) + else: + return download_mpd(filename, release_url) def get_player_params(self, doc): for script in doc.xpath("//script"): @@ -43,9 +51,9 @@ class SbsVideoNode(Node): return json.loads(line[p1:p2]) raise Exception("Unable to find player params for %s: %s" % (self.video_id, self.title)) - def get_video_url(self, release_url): + def get_hls_url(self, release_url): with requests_cache.disabled(): - doc = grab_xml(release_url if not release_url.startswith("//") else "http:" + release_url) + doc = grab_xml("https:" + release_url.replace("http:", "").replace("https:", "")) video = doc.xpath("//smil:video", namespaces=NS) if not video: return @@ -74,18 +82,24 @@ class SbsRootNode(SbsNavNode): def load_all_video_entries(self): offset = 1 - amount = 500 + amount = 1000 + uniq = set() while True: - url = append_to_qs(FULL_VIDEO_LIST, {"range": "%s-%s" % (offset, offset+amount)}) + url = append_to_qs(FULL_VIDEO_LIST, {"range": "%s-%s" % (offset, offset+amount-1)}) data = grab_json(url) if "entries" not in data: raise Exception("Missing data in SBS response", data) entries = data["entries"] if len(entries) == 0: break - for entry in entries: - yield entry + for i, entry in enumerate(entries): + if entry["guid"] not in uniq: + uniq.add(entry["guid"]) + yield entry offset += amount + sys.stdout.write(".") + sys.stdout.flush() + print() def explode_videos_to_unique_categories(self, all_video_entries): for entry_data in all_video_entries: