]> code.delx.au - webdl/commitdiff
Reimplemented Channel 10
authorJames Bunton <jamesbunton@delx.net.au>
Sat, 24 Feb 2018 05:15:53 +0000 (16:15 +1100)
committerJames Bunton <jamesbunton@delx.net.au>
Sat, 24 Feb 2018 05:15:53 +0000 (16:15 +1100)
common.py
ten.py [new file with mode: 0644]

index 838cf945bd95d3c2669ef8111dc9d6e2551a13a7..5905a628c6796a3aebe1dc95adbaf10f557ff69f 100644 (file)
--- a/common.py
+++ b/common.py
@@ -68,8 +68,8 @@ def load_root_node():
     import sbs
     sbs.fill_nodes(root_node)
 
-    import brightcove
-    brightcove.fill_nodes(root_node)
+    import ten
+    ten.fill_nodes(root_node)
 
     return root_node
 
diff --git a/ten.py b/ten.py
new file mode 100644 (file)
index 0000000..8a56a0c
--- /dev/null
+++ b/ten.py
@@ -0,0 +1,77 @@
+from common import grab_json, download_hls, Node, append_to_qs
+
+SERIES_LIST_URL = "http://vod.ten.com.au/config/android-v2"
+SERIES_DETAIL_URL = "https://v.tenplay.com.au/api/videos/bcquery"
+
+class TenVideoNode(Node):
+    def __init__(self, title, parent, video_url):
+        Node.__init__(self, title, parent)
+        self.can_download = True
+        self.video_url = video_url
+
+    def download(self):
+        filename = self.title + ".ts"
+        return download_hls(filename, self.video_url)
+
+class TenSeriesNode(Node):
+    def __init__(self, title, parent, query, clean_name):
+        Node.__init__(self, title, parent)
+        self.title = title
+        self.query = query
+        self.clean_name = clean_name
+        self.video_ids = set()
+
+    def fill_children(self):
+        self.fill_children_with_query(self.query)
+
+        if "&none" not in self.query:
+            # Some videos are not categorised correctly, so try looking up by the cleanname as well.
+            # Only do this if they haven't tried to filter out similarly named shows.
+            self.fill_children_with_query("&all=tv_show_group:" + self.clean_name)
+
+    def fill_children_with_query(self, query):
+        page_number = 0
+        while page_number < 100:
+            url = self.get_page_url(query, page_number)
+            page_number += 1
+
+            page = grab_json(url)
+            items = page["items"]
+            if len(items) == 0:
+                break
+
+            for video_desc in items:
+                self.process_video(video_desc)
+
+    def get_page_url(self, query, page_number):
+        return append_to_qs(SERIES_DETAIL_URL, {
+            "command": "search_videos",
+            "all": "video_type_long_form:Full+Episode",
+            "page_size": "30",
+            "page_number": str(page_number),
+        }) + query
+
+    def process_video(self, video_desc):
+        video_id = video_desc["id"]
+        video_url = video_desc["HLSURL"]
+        title = video_desc["name"]
+
+        if video_id in self.video_ids:
+            return
+        self.video_ids.add(video_id)
+
+        TenVideoNode(title, self, video_url)
+
+class TenRootNode(Node):
+    def fill_children(self):
+        doc = grab_json(SERIES_LIST_URL)
+
+        for series in doc["Browse TV"]["Shows"]:
+            title = series["title"]
+            query = series["query"]
+            clean_name = series["cleanname"]
+
+            TenSeriesNode(title, self, query, clean_name)
+
+def fill_nodes(root_node):
+    TenRootNode("Ten", root_node)