]>
code.delx.au - webdl/blob - brightcove.py
5 from common
import grab_json
, download_hls
, download_hds
, Node
, append_to_qs
7 CH9_TOKEN
= "ogxhPgSphIVa2hhxbi9oqtYwtg032io4B4-ImwddYliFWHqS0UfMEw.."
8 CH10_TOKEN
= "90QPG7lQuLJAc4s82qA-T_UoDhz_VBFK6SGstWDB0jZH8eu1SZQDFA.."
10 BRIGHTCOVE_API
= "http://api.brightcove.com/services/library?"
13 class BrightcoveVideoNode(Node
):
14 def __init__(self
, title
, parent
, token
, video_id
):
15 Node
.__init
__(self
, title
, parent
)
16 self
.can_download
= True
18 self
.video_id
= video_id
22 try_streams
= [self
.try_hds
, self
.try_hls
]
24 while f
is None and try_streams
:
25 f
= try_streams
.pop()()
28 logging
.error("No HLS or HDS stream available for: %s", self
.title
)
34 desc_url
= append_to_qs(BRIGHTCOVE_API
, {
36 "command": "find_video_by_id",
37 "video_fields": "HLSURL",
38 "video_id": self
.video_id
,
41 doc
= grab_json(desc_url
, 3600)
42 video_url
= doc
and doc
["HLSURL"]
46 filename
= self
.title
+ ".ts"
47 return lambda: download_hls(filename
, video_url
)
50 desc_url
= append_to_qs(BRIGHTCOVE_API
, {
52 "command": "find_video_by_id",
53 "video_fields": "hdsManifestUrl",
54 "video_id": self
.video_id
,
57 doc
= grab_json(desc_url
, 3600)
58 video_url
= doc
and doc
["hdsManifestUrl"]
62 filename
= self
.title
+ ".flv"
63 return lambda: download_hds(filename
, video_url
)
66 class BrightcoveRootNode(Node
):
67 def __init__(self
, title
, parent
, token
):
68 Node
.__init
__(self
, title
, parent
)
70 self
.series_nodes
= {}
72 def get_series_node(self
, series_name
):
73 series_name
= series_name
.split("-")[0].strip()
74 key
= series_name
.lower()
75 node
= self
.series_nodes
.get(key
, None)
77 node
= Node(series_name
, self
)
78 self
.series_nodes
[key
] = node
81 def fill_children(self
):
83 while page_number
< 100:
84 url
= self
.get_all_videos_url(page_number
)
87 page
= grab_json(url
, 3600)
92 for video_desc
in items
:
93 self
.process_video(video_desc
)
95 def process_video(self
, video_desc
):
96 if not video_desc
["customFields"]:
99 video_id
= video_desc
["id"]
100 title
= self
.get_video_title(video_desc
)
101 series_name
= self
.get_series_name(video_desc
)
103 parent_node
= self
.get_series_node(series_name
)
104 BrightcoveVideoNode(title
, parent_node
, self
.token
, video_id
)
106 def get_video_title(self
, video_desc
):
107 raise NotImplementedError()
109 def get_series_name(self
, video_desc
):
110 raise NotImplementedError()
112 def get_all_videos_url(self
, page_number
):
113 raise NotImplementedError()
116 class Ch9RootNode(BrightcoveRootNode
):
117 def __init__(self
, root_node
):
118 BrightcoveRootNode
.__init
__(self
, "Nine", root_node
, CH9_TOKEN
)
120 def get_video_title(self
, video_desc
):
121 title
= video_desc
["name"]
122 season
= video_desc
["customFields"].get("season", "")
123 episode
= video_desc
["customFields"].get("episode", "1").rjust(2, "0")
124 series
= self
.get_series_name(video_desc
)
126 if re
.match(R
"ep(isode)?\s*[0-9]+\s*:", title
.lower()):
127 title
= title
.split(":", 1)[1].strip()
129 title
= "%s - %sx%s - %s" % (
137 def get_series_name(self
, video_desc
):
138 series
= video_desc
["customFields"].get("series", None)
140 series
= video_desc
["name"]
143 def get_all_videos_url(self
, page_number
):
144 return append_to_qs(BRIGHTCOVE_API
, {
146 "command": "search_videos",
147 "video_fields": "id,name,customFields",
148 "custom_fields": "series,season,episode",
149 "sort_by": "PUBLISH_DATE",
150 "page_number": str(page_number
),
154 class Ch10RootNode(BrightcoveRootNode
):
155 def __init__(self
, root_node
):
156 BrightcoveRootNode
.__init
__(self
, "Ten", root_node
, CH10_TOKEN
)
158 def get_video_title(self
, video_desc
):
159 return video_desc
["name"]
161 def get_series_name(self
, video_desc
):
162 return video_desc
["customFields"]["tv_show"]
164 def get_all_videos_url(self
, page_number
):
165 return append_to_qs(BRIGHTCOVE_API
, {
167 "command": "search_videos",
168 "video_fields": "id,name,customFields",
169 "custom_fields": "tv_show",
170 "sort_by": "PUBLISH_DATE",
171 "any": "video_type_long_form:Full Episode",
172 "page_number": str(page_number
),
176 def fill_nodes(root_node
):
177 Ch9RootNode(root_node
)
178 Ch10RootNode(root_node
)