summaryrefslogtreecommitdiff
path: root/youtube_dl/extractor/tv2dk.py
blob: ec5cbdf03537ee7d83ca6b3e94e34bc1aba138be (plain)
    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 ..utils import (
    9     determine_ext,
   10     extract_attributes,
   11     js_to_json,
   12     url_or_none,
   13 )
   14 
   15 
   16 class TV2DKIE(InfoExtractor):
   17     _VALID_URL = r'''(?x)
   18                     https?://
   19                         (?:www\.)?
   20                         (?:
   21                             tvsyd|
   22                             tv2ostjylland|
   23                             tvmidtvest|
   24                             tv2fyn|
   25                             tv2east|
   26                             tv2lorry|
   27                             tv2nord
   28                         )\.dk/
   29                         (:[^/]+/)*
   30                         (?P<id>[^/?\#&]+)
   31                     '''
   32     _TESTS = [{
   33         'url': 'https://www.tvsyd.dk/nyheder/28-10-2019/1930/1930-28-okt-2019?autoplay=1#player',
   34         'info_dict': {
   35             'id': '0_52jmwa0p',
   36             'ext': 'mp4',
   37             'title': '19:30 - 28. okt. 2019',
   38             'timestamp': 1572290248,
   39             'upload_date': '20191028',
   40             'uploader_id': 'tvsyd',
   41             'duration': 1347,
   42             'view_count': int,
   43         },
   44         'add_ie': ['Kaltura'],
   45     }, {
   46         'url': 'https://www.tv2lorry.dk/gadekamp/gadekamp-6-hoejhuse-i-koebenhavn',
   47         'info_dict': {
   48             'id': '1_7iwll9n0',
   49             'ext': 'mp4',
   50             'upload_date': '20211027',
   51             'title': 'Gadekamp #6 - Højhuse i København',
   52             'uploader_id': 'tv2lorry',
   53             'timestamp': 1635345229,
   54         },
   55         'add_ie': ['Kaltura'],
   56     }, {
   57         'url': 'https://www.tv2ostjylland.dk/artikel/minister-gaar-ind-i-sag-om-diabetes-teknologi',
   58         'only_matching': True,
   59     }, {
   60         'url': 'https://www.tv2ostjylland.dk/nyheder/28-10-2019/22/2200-nyhederne-mandag-d-28-oktober-2019?autoplay=1#player',
   61         'only_matching': True,
   62     }, {
   63         'url': 'https://www.tvmidtvest.dk/nyheder/27-10-2019/1930/1930-27-okt-2019',
   64         'only_matching': True,
   65     }, {
   66         'url': 'https://www.tv2fyn.dk/artikel/fyn-kan-faa-landets-foerste-fabrik-til-groent-jetbraendstof',
   67         'only_matching': True,
   68     }, {
   69         'url': 'https://www.tv2east.dk/artikel/gods-faar-indleveret-tonsvis-af-aebler-100-kilo-aebler-gaar-til-en-aeblebrandy',
   70         'only_matching': True,
   71     }, {
   72         'url': 'https://www.tv2lorry.dk/koebenhavn/rasmus-paludan-evakueret-til-egen-demonstration#player',
   73         'only_matching': True,
   74     }, {
   75         'url': 'https://www.tv2nord.dk/artikel/dybt-uacceptabelt',
   76         'only_matching': True,
   77     }]
   78 
   79     def _real_extract(self, url):
   80         video_id = self._match_id(url)
   81 
   82         webpage = self._download_webpage(url, video_id)
   83 
   84         entries = []
   85 
   86         def add_entry(partner_id, kaltura_id):
   87             entries.append(self.url_result(
   88                 'kaltura:%s:%s' % (partner_id, kaltura_id), 'Kaltura',
   89                 video_id=kaltura_id))
   90 
   91         for video_el in re.findall(r'(?s)<[^>]+\bdata-entryid\s*=[^>]*>', webpage):
   92             video = extract_attributes(video_el)
   93             kaltura_id = video.get('data-entryid')
   94             if not kaltura_id:
   95                 continue
   96             partner_id = video.get('data-partnerid')
   97             if not partner_id:
   98                 continue
   99             add_entry(partner_id, kaltura_id)
  100         if not entries:
  101             kaltura_id = self._search_regex(
  102                 (r'entry_id\s*:\s*["\']([0-9a-z_]+)',
  103                  r'\\u002FentryId\\u002F(\w+)\\u002F'), webpage, 'kaltura id')
  104             partner_id = self._search_regex(
  105                 (r'\\u002Fp\\u002F(\d+)\\u002F', r'/p/(\d+)/'), webpage,
  106                 'partner id')
  107             add_entry(partner_id, kaltura_id)
  108         if len(entries) == 1:
  109             return entries[0]
  110         return self.playlist_result(entries)
  111 
  112 
  113 class TV2DKBornholmPlayIE(InfoExtractor):
  114     _VALID_URL = r'https?://play\.tv2bornholm\.dk/\?.*?\bid=(?P<id>\d+)'
  115     _TEST = {
  116         'url': 'http://play.tv2bornholm.dk/?area=specifikTV&id=781021',
  117         'info_dict': {
  118             'id': '781021',
  119             'ext': 'mp4',
  120             'title': '12Nyheder-27.11.19',
  121         },
  122         'params': {
  123             'skip_download': True,
  124         },
  125     }
  126 
  127     def _real_extract(self, url):
  128         video_id = self._match_id(url)
  129 
  130         video = self._download_json(
  131             'https://play.tv2bornholm.dk/controls/AJAX.aspx/specifikVideo', video_id,
  132             data=json.dumps({
  133                 'playlist_id': video_id,
  134                 'serienavn': '',
  135             }).encode(), headers={
  136                 'X-Requested-With': 'XMLHttpRequest',
  137                 'Content-Type': 'application/json; charset=UTF-8',
  138             })['d']
  139 
  140         # TODO: generalize flowplayer
  141         title = self._search_regex(
  142             r'title\s*:\s*(["\'])(?P<value>(?:(?!\1).)+)\1', video, 'title',
  143             group='value')
  144         sources = self._parse_json(self._search_regex(
  145             r'(?s)sources:\s*(\[.+?\]),', video, 'sources'),
  146             video_id, js_to_json)
  147 
  148         formats = []
  149         srcs = set()
  150         for source in sources:
  151             src = url_or_none(source.get('src'))
  152             if not src:
  153                 continue
  154             if src in srcs:
  155                 continue
  156             srcs.add(src)
  157             ext = determine_ext(src)
  158             src_type = source.get('type')
  159             if src_type == 'application/x-mpegurl' or ext == 'm3u8':
  160                 formats.extend(self._extract_m3u8_formats(
  161                     src, video_id, ext='mp4', entry_protocol='m3u8_native',
  162                     m3u8_id='hls', fatal=False))
  163             elif src_type == 'application/dash+xml' or ext == 'mpd':
  164                 formats.extend(self._extract_mpd_formats(
  165                     src, video_id, mpd_id='dash', fatal=False))
  166             else:
  167                 formats.append({
  168                     'url': src,
  169                 })
  170         self._sort_formats(formats)
  171 
  172         return {
  173             'id': video_id,
  174             'title': title,
  175             'formats': formats,
  176         }

Generated by cgit