]> code.delx.au - webdl/blobdiff - brightcove.py
iView handle missing episodes in collection
[webdl] / brightcove.py
index e52e15cff1f28c21a2e82dc6568154592082f502..efb961b0022f12391cf1968bbbe38eeffd866e1c 100644 (file)
@@ -1,10 +1,11 @@
+import logging
 import re
 import sys
 
-from common import grab_json, download_hls, Node, append_to_qs
+from common import grab_json, download_hls, download_hds, Node, append_to_qs
 
 CH9_TOKEN = "ogxhPgSphIVa2hhxbi9oqtYwtg032io4B4-ImwddYliFWHqS0UfMEw.."
-CH10_TOKEN = "lWCaZyhokufjqe7H4TLpXwHSTnNXtqHxyMvoNOsmYA_GRaZ4zcwysw.."
+CH10_TOKEN = "90QPG7lQuLJAc4s82qA-T_UoDhz_VBFK6SGstWDB0jZH8eu1SZQDFA.."
 
 BRIGHTCOVE_API = "http://api.brightcove.com/services/library?"
 
@@ -17,19 +18,50 @@ class BrightcoveVideoNode(Node):
         self.video_id = video_id
 
     def download(self):
+        f = None
+        try_streams = [self.try_hds, self.try_hls]
+
+        while f is None and try_streams:
+            f = try_streams.pop()()
+
+        if f is None:
+            logging.error("No HLS or HDS stream available for: %s", self.title)
+            return False
+
+        return f()
+
+    def try_hls(self):
         desc_url = append_to_qs(BRIGHTCOVE_API, {
             "token": self.token,
             "command": "find_video_by_id",
             "video_fields": "HLSURL",
             "video_id": self.video_id,
         })
-        doc = grab_json(desc_url, 3600)
-        video_url = doc["HLSURL"]
+
+        doc = grab_json(desc_url)
+        video_url = doc and doc["HLSURL"]
         if not video_url:
-            raise Exception("No HLS stream available for: " + self.title)
+            return
 
         filename = self.title + ".ts"
-        return download_hls(filename, video_url)
+        return lambda: download_hls(filename, video_url)
+
+    def try_hds(self):
+        desc_url = append_to_qs(BRIGHTCOVE_API, {
+            "token": self.token,
+            "command": "find_video_by_id",
+            "video_fields": "hdsManifestUrl",
+            "video_id": self.video_id,
+        })
+
+        doc = grab_json(desc_url)
+        video_url = doc and doc["hdsManifestUrl"]
+        if not video_url:
+            return
+
+        filename = self.title + ".flv"
+        return lambda: download_hds(filename, video_url)
+
 
 class BrightcoveRootNode(Node):
     def __init__(self, title, parent, token):
@@ -49,19 +81,16 @@ class BrightcoveRootNode(Node):
     def fill_children(self):
         page_number = 0
         while page_number < 100:
-            sys.stdout.write(".")
-            sys.stdout.flush()
             url = self.get_all_videos_url(page_number)
             page_number += 1
 
-            page = grab_json(url, 3600)
+            page = grab_json(url)
             items = page["items"]
             if len(items) == 0:
                 break
 
             for video_desc in items:
                 self.process_video(video_desc)
-        print
 
     def process_video(self, video_desc):
         if not video_desc["customFields"]:
@@ -145,6 +174,6 @@ class Ch10RootNode(BrightcoveRootNode):
 
 
 def fill_nodes(root_node):
-    Ch9RootNode(root_node)
+    # Ch9RootNode(root_node) -- Need a new API token
     Ch10RootNode(root_node)