]> code.delx.au - webdl/blob - ten.py
fix #105 - channel 10 pulling in too many episodes
[webdl] / ten.py
1 from common import grab_json, download_hls, Node, append_to_qs
2
3 SERIES_LIST_URL = "https://vod.ten.com.au/config/android-v4"
4 SERIES_DETAIL_URL = "https://v.tenplay.com.au/api/videos/bcquery"
5
6 class TenVideoNode(Node):
7 def __init__(self, title, parent, video_url):
8 Node.__init__(self, title, parent)
9 self.can_download = True
10 self.video_url = video_url
11
12 def download(self):
13 filename = self.title + ".ts"
14 return download_hls(filename, self.video_url)
15
16 class TenSeriesNode(Node):
17 def __init__(self, title, parent, query, clean_name):
18 Node.__init__(self, title, parent)
19 self.title = title
20 self.query = query
21 self.clean_name = clean_name
22 self.video_ids = set()
23
24 def fill_children(self):
25 page_number = 0
26 while page_number < 100:
27 url = self.get_page_url(self.query, page_number)
28 page_number += 1
29
30 page = grab_json(url)
31 items = page["items"]
32 if len(items) == 0:
33 break
34
35 for video_desc in items:
36 self.process_video(video_desc)
37
38 def get_page_url(self, query, page_number):
39 return append_to_qs(SERIES_DETAIL_URL, {
40 "command": "search_videos",
41 "all": "video_type_long_form:Full+Episode",
42 "page_size": "30",
43 "page_number": str(page_number),
44 }) + query
45
46 def process_video(self, video_desc):
47 video_id = video_desc["id"]
48 video_url = video_desc["HLSURL"]
49 title = video_desc["name"]
50
51 if video_id in self.video_ids:
52 return
53 self.video_ids.add(video_id)
54
55 TenVideoNode(title, self, video_url)
56
57 class TenRootNode(Node):
58 def fill_children(self):
59 doc = grab_json(SERIES_LIST_URL)
60
61 for series in doc["Browse TV"]["Shows"]:
62 title = series["title"]
63 query = series["query"] + series["episodefilter"]
64 clean_name = series["cleanname"]
65
66 TenSeriesNode(title, self, query, clean_name)
67
68 def fill_nodes(root_node):
69 TenRootNode("Ten", root_node)