[azmedien] Adopt to major site redesign (closes #17745)
[youtube-dl] / youtube_dl / extractor / azmedien.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 import json
5 import re
6
7 from .common import InfoExtractor
8 from .kaltura import KalturaIE
9
10
11 class AZMedienBaseIE(InfoExtractor):
12     _PARTNER_ID = '1719221'
13
14     def _kaltura_video(self, partner_id, entry_id):
15         return self.url_result(
16             'kaltura:%s:%s' % (partner_id, entry_id), ie=KalturaIE.ie_key(),
17             video_id=entry_id)
18
19
20 class AZMedienIE(AZMedienBaseIE):
21     IE_DESC = 'AZ Medien videos'
22     _VALID_URL = r'''(?x)
23                     https?://
24                         (?:www\.)?
25                         (?P<host>
26                             telezueri\.ch|
27                             telebaern\.tv|
28                             telem1\.ch
29                         )/
30                         [^/]+/
31                         (?P<id>
32                             [^/]+-(?P<article_id>\d+)
33                         )
34                         (?:
35                             \#video=
36                             (?P<kaltura_id>
37                                 [_0-9a-z]+
38                             )
39                         )?
40                     '''
41
42     _TESTS = [{
43         'url': 'https://www.telezueri.ch/sonntalk/bundesrats-vakanzen-eu-rahmenabkommen-133214569',
44         'info_dict': {
45             'id': '1_anruz3wy',
46             'ext': 'mp4',
47             'title': 'Bundesrats-Vakanzen / EU-Rahmenabkommen',
48             'description': 'md5:dd9f96751ec9c35e409a698a328402f3',
49             'uploader_id': 'TVOnline',
50             'upload_date': '20180930',
51             'timestamp': 1538328802,
52         },
53         'params': {
54             'skip_download': True,
55         },
56     }, {
57         'url': 'https://www.telebaern.tv/telebaern-news/montag-1-oktober-2018-ganze-sendung-133531189#video=0_7xjo9lf1',
58         'only_matching': True
59     }]
60
61     def _real_extract(self, url):
62         video_id = self._match_id(url)
63         mobj = re.match(self._VALID_URL, url)
64         entry_id = mobj.group('kaltura_id')
65
66         if not entry_id:
67             webpage = self._download_webpage(url, video_id)
68             api_path = self._search_regex(
69                 r'["\']apiPath["\']\s*:\s*["\']([^"^\']+)["\']',
70                 webpage, 'api path')
71             api_url = 'https://www.%s%s' % (mobj.group('host'), api_path)
72             payload = {
73                 'query': '''query VideoContext($articleId: ID!) {
74                     article: node(id: $articleId) {
75                       ... on Article {
76                         mainAssetRelation {
77                           asset {
78                             ... on VideoAsset {
79                               kalturaId
80                             }
81                           }
82                         }
83                       }
84                     }
85                   }''',
86                 'variables': {'articleId': 'Article:%s' % mobj.group('article_id')},
87             }
88             json_data = self._download_json(
89                 api_url, video_id, headers={
90                     'Content-Type': 'application/json',
91                 },
92                 data=json.dumps(payload).encode())
93             entry_id = json_data['data']['article']['mainAssetRelation']['asset']['kalturaId']
94
95         return self._kaltura_video(self._PARTNER_ID, entry_id)