]> jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/arnes.py
[bitchute] Fix test (#758)
[yt-dlp.git] / yt_dlp / extractor / arnes.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 from .common import InfoExtractor
5 from ..compat import (
6 compat_parse_qs,
7 compat_urllib_parse_urlparse,
8 )
9 from ..utils import (
10 float_or_none,
11 int_or_none,
12 parse_iso8601,
13 remove_start,
14 )
15
16
17 class ArnesIE(InfoExtractor):
18 IE_NAME = 'video.arnes.si'
19 IE_DESC = 'Arnes Video'
20 _VALID_URL = r'https?://video\.arnes\.si/(?:[a-z]{2}/)?(?:watch|embed|api/(?:asset|public/video))/(?P<id>[0-9a-zA-Z]{12})'
21 _TESTS = [{
22 'url': 'https://video.arnes.si/watch/a1qrWTOQfVoU?t=10',
23 'md5': '4d0f4d0a03571b33e1efac25fd4a065d',
24 'info_dict': {
25 'id': 'a1qrWTOQfVoU',
26 'ext': 'mp4',
27 'title': 'Linearna neodvisnost, definicija',
28 'description': 'Linearna neodvisnost, definicija',
29 'license': 'PRIVATE',
30 'creator': 'Polona Oblak',
31 'timestamp': 1585063725,
32 'upload_date': '20200324',
33 'channel': 'Polona Oblak',
34 'channel_id': 'q6pc04hw24cj',
35 'channel_url': 'https://video.arnes.si/?channel=q6pc04hw24cj',
36 'duration': 596.75,
37 'view_count': int,
38 'tags': ['linearna_algebra'],
39 'start_time': 10,
40 }
41 }, {
42 'url': 'https://video.arnes.si/api/asset/s1YjnV7hadlC/play.mp4',
43 'only_matching': True,
44 }, {
45 'url': 'https://video.arnes.si/embed/s1YjnV7hadlC',
46 'only_matching': True,
47 }, {
48 'url': 'https://video.arnes.si/en/watch/s1YjnV7hadlC',
49 'only_matching': True,
50 }, {
51 'url': 'https://video.arnes.si/embed/s1YjnV7hadlC?t=123&hideRelated=1',
52 'only_matching': True,
53 }, {
54 'url': 'https://video.arnes.si/api/public/video/s1YjnV7hadlC',
55 'only_matching': True,
56 }]
57 _BASE_URL = 'https://video.arnes.si'
58
59 def _real_extract(self, url):
60 video_id = self._match_id(url)
61
62 video = self._download_json(
63 self._BASE_URL + '/api/public/video/' + video_id, video_id)['data']
64 title = video['title']
65
66 formats = []
67 for media in (video.get('media') or []):
68 media_url = media.get('url')
69 if not media_url:
70 continue
71 formats.append({
72 'url': self._BASE_URL + media_url,
73 'format_id': remove_start(media.get('format'), 'FORMAT_'),
74 'format_note': media.get('formatTranslation'),
75 'width': int_or_none(media.get('width')),
76 'height': int_or_none(media.get('height')),
77 })
78 self._sort_formats(formats)
79
80 channel = video.get('channel') or {}
81 channel_id = channel.get('url')
82 thumbnail = video.get('thumbnailUrl')
83
84 return {
85 'id': video_id,
86 'title': title,
87 'formats': formats,
88 'thumbnail': self._BASE_URL + thumbnail,
89 'description': video.get('description'),
90 'license': video.get('license'),
91 'creator': video.get('author'),
92 'timestamp': parse_iso8601(video.get('creationTime')),
93 'channel': channel.get('name'),
94 'channel_id': channel_id,
95 'channel_url': self._BASE_URL + '/?channel=' + channel_id if channel_id else None,
96 'duration': float_or_none(video.get('duration'), 1000),
97 'view_count': int_or_none(video.get('views')),
98 'tags': video.get('hashtags'),
99 'start_time': int_or_none(compat_parse_qs(
100 compat_urllib_parse_urlparse(url).query).get('t', [None])[0]),
101 }