]>
Commit | Line | Data |
---|---|---|
29f7c58a | 1 | from .common import InfoExtractor |
2 | from ..utils import ( | |
3 | int_or_none, | |
4 | parse_age_limit, | |
5 | smuggle_url, | |
6 | try_get, | |
7 | ) | |
8 | ||
9 | ||
10 | class TV5UnisBaseIE(InfoExtractor): | |
11 | _GEO_COUNTRIES = ['CA'] | |
12 | ||
13 | def _real_extract(self, url): | |
5ad28e7f | 14 | groups = self._match_valid_url(url).groups() |
29f7c58a | 15 | product = self._download_json( |
16 | 'https://api.tv5unis.ca/graphql', groups[0], query={ | |
17 | 'query': '''{ | |
18 | %s(%s) { | |
19 | collection { | |
20 | title | |
21 | } | |
22 | episodeNumber | |
23 | rating { | |
24 | name | |
25 | } | |
26 | seasonNumber | |
27 | tags | |
28 | title | |
29 | videoElement { | |
30 | ... on Video { | |
31 | mediaId | |
32 | } | |
33 | } | |
34 | } | |
35 | }''' % (self._GQL_QUERY_NAME, self._gql_args(groups)), | |
36 | })['data'][self._GQL_QUERY_NAME] | |
37 | media_id = product['videoElement']['mediaId'] | |
38 | ||
39 | return { | |
40 | '_type': 'url_transparent', | |
41 | 'id': media_id, | |
42 | 'title': product.get('title'), | |
43 | 'url': smuggle_url('limelight:media:' + media_id, {'geo_countries': self._GEO_COUNTRIES}), | |
44 | 'age_limit': parse_age_limit(try_get(product, lambda x: x['rating']['name'])), | |
45 | 'tags': product.get('tags'), | |
46 | 'series': try_get(product, lambda x: x['collection']['title']), | |
47 | 'season_number': int_or_none(product.get('seasonNumber')), | |
48 | 'episode_number': int_or_none(product.get('episodeNumber')), | |
49 | 'ie_key': 'LimelightMedia', | |
50 | } | |
51 | ||
52 | ||
53 | class TV5UnisVideoIE(TV5UnisBaseIE): | |
54 | IE_NAME = 'tv5unis:video' | |
55 | _VALID_URL = r'https?://(?:www\.)?tv5unis\.ca/videos/[^/]+/(?P<id>\d+)' | |
56 | _TEST = { | |
57 | 'url': 'https://www.tv5unis.ca/videos/bande-annonces/71843', | |
58 | 'md5': '3d794164928bda97fb87a17e89923d9b', | |
59 | 'info_dict': { | |
60 | 'id': 'a883684aecb2486cad9bdc7bbe17f861', | |
61 | 'ext': 'mp4', | |
62 | 'title': 'Watatatow', | |
63 | 'duration': 10.01, | |
64 | } | |
65 | } | |
66 | _GQL_QUERY_NAME = 'productById' | |
67 | ||
68 | @staticmethod | |
69 | def _gql_args(groups): | |
70 | return 'id: %s' % groups | |
71 | ||
72 | ||
73 | class TV5UnisIE(TV5UnisBaseIE): | |
74 | IE_NAME = 'tv5unis' | |
75 | _VALID_URL = r'https?://(?:www\.)?tv5unis\.ca/videos/(?P<id>[^/]+)(?:/saisons/(?P<season_number>\d+)/episodes/(?P<episode_number>\d+))?/?(?:[?#&]|$)' | |
76 | _TESTS = [{ | |
77 | 'url': 'https://www.tv5unis.ca/videos/watatatow/saisons/6/episodes/1', | |
78 | 'md5': 'a479907d2e531a73e1f8dc48d6388d02', | |
79 | 'info_dict': { | |
80 | 'id': 'e5ee23a586c44612a56aad61accf16ef', | |
81 | 'ext': 'mp4', | |
82 | 'title': 'Je ne peux pas lui résister', | |
83 | 'description': "Atys, le nouveau concierge de l'école, a réussi à ébranler la confiance de Mado en affirmant qu\'une médaille, ce n'est que du métal. Comme Mado essaie de lui prouver que ses valeurs sont solides, il veut la mettre à l'épreuve...", | |
84 | 'subtitles': { | |
85 | 'fr': 'count:1', | |
86 | }, | |
87 | 'duration': 1370, | |
88 | 'age_limit': 8, | |
89 | 'tags': 'count:3', | |
90 | 'series': 'Watatatow', | |
91 | 'season_number': 6, | |
92 | 'episode_number': 1, | |
93 | }, | |
94 | }, { | |
95 | 'url': 'https://www.tv5unis.ca/videos/le-voyage-de-fanny', | |
96 | 'md5': '9ca80ebb575c681d10cae1adff3d4774', | |
97 | 'info_dict': { | |
98 | 'id': '726188eefe094d8faefb13381d42bc06', | |
99 | 'ext': 'mp4', | |
100 | 'title': 'Le voyage de Fanny', | |
101 | 'description': "Fanny, 12 ans, cachée dans un foyer loin de ses parents, s'occupe de ses deux soeurs. Devant fuir, Fanny prend la tête d'un groupe de huit enfants et s'engage dans un dangereux périple à travers la France occupée pour rejoindre la frontière suisse.", | |
102 | 'subtitles': { | |
103 | 'fr': 'count:1', | |
104 | }, | |
105 | 'duration': 5587.034, | |
106 | 'tags': 'count:4', | |
107 | }, | |
108 | }] | |
109 | _GQL_QUERY_NAME = 'productByRootProductSlug' | |
110 | ||
111 | @staticmethod | |
112 | def _gql_args(groups): | |
113 | args = 'rootProductSlug: "%s"' % groups[0] | |
114 | if groups[1]: | |
115 | args += ', seasonNumber: %s, episodeNumber: %s' % groups[1:] | |
116 | return args |