youtube-dl

Another place where youtube-dl lives on
git clone git://git.oshgnacknak.de/youtube-dl.git
Log | Files | Refs | README | LICENSE

arnes.py (3634B)


      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         }