youtube-dl

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

dlive.py (3121B)


      1 from __future__ import unicode_literals
      2 
      3 import json
      4 import re
      5 
      6 from .common import InfoExtractor
      7 from ..utils import int_or_none
      8 
      9 
     10 class DLiveVODIE(InfoExtractor):
     11     IE_NAME = 'dlive:vod'
     12     _VALID_URL = r'https?://(?:www\.)?dlive\.tv/p/(?P<uploader_id>.+?)\+(?P<id>[^/?#&]+)'
     13     _TESTS = [{
     14         'url': 'https://dlive.tv/p/pdp+3mTzOl4WR',
     15         'info_dict': {
     16             'id': '3mTzOl4WR',
     17             'ext': 'mp4',
     18             'title': 'Minecraft with james charles epic',
     19             'upload_date': '20190701',
     20             'timestamp': 1562011015,
     21             'uploader_id': 'pdp',
     22         }
     23     }, {
     24         'url': 'https://dlive.tv/p/pdpreplay+D-RD-xSZg',
     25         'only_matching': True,
     26     }]
     27 
     28     def _real_extract(self, url):
     29         uploader_id, vod_id = re.match(self._VALID_URL, url).groups()
     30         broadcast = self._download_json(
     31             'https://graphigo.prd.dlive.tv/', vod_id,
     32             data=json.dumps({'query': '''query {
     33   pastBroadcast(permlink:"%s+%s") {
     34     content
     35     createdAt
     36     length
     37     playbackUrl
     38     title
     39     thumbnailUrl
     40     viewCount
     41   }
     42 }''' % (uploader_id, vod_id)}).encode())['data']['pastBroadcast']
     43         title = broadcast['title']
     44         formats = self._extract_m3u8_formats(
     45             broadcast['playbackUrl'], vod_id, 'mp4', 'm3u8_native')
     46         self._sort_formats(formats)
     47         return {
     48             'id': vod_id,
     49             'title': title,
     50             'uploader_id': uploader_id,
     51             'formats': formats,
     52             'description': broadcast.get('content'),
     53             'thumbnail': broadcast.get('thumbnailUrl'),
     54             'timestamp': int_or_none(broadcast.get('createdAt'), 1000),
     55             'view_count': int_or_none(broadcast.get('viewCount')),
     56         }
     57 
     58 
     59 class DLiveStreamIE(InfoExtractor):
     60     IE_NAME = 'dlive:stream'
     61     _VALID_URL = r'https?://(?:www\.)?dlive\.tv/(?!p/)(?P<id>[\w.-]+)'
     62 
     63     def _real_extract(self, url):
     64         display_name = self._match_id(url)
     65         user = self._download_json(
     66             'https://graphigo.prd.dlive.tv/', display_name,
     67             data=json.dumps({'query': '''query {
     68   userByDisplayName(displayname:"%s") {
     69     livestream {
     70       content
     71       createdAt
     72       title
     73       thumbnailUrl
     74       watchingCount
     75     }
     76     username
     77   }
     78 }''' % display_name}).encode())['data']['userByDisplayName']
     79         livestream = user['livestream']
     80         title = livestream['title']
     81         username = user['username']
     82         formats = self._extract_m3u8_formats(
     83             'https://live.prd.dlive.tv/hls/live/%s.m3u8' % username,
     84             display_name, 'mp4')
     85         self._sort_formats(formats)
     86         return {
     87             'id': display_name,
     88             'title': self._live_title(title),
     89             'uploader': display_name,
     90             'uploader_id': username,
     91             'formats': formats,
     92             'description': livestream.get('content'),
     93             'thumbnail': livestream.get('thumbnailUrl'),
     94             'is_live': True,
     95             'timestamp': int_or_none(livestream.get('createdAt'), 1000),
     96             'view_count': int_or_none(livestream.get('watchingCount')),
     97         }