summaryrefslogtreecommitdiff
path: root/youtube_dl/extractor/dlive.py
blob: d95c67a5be529c05b723011017561aee21a3927c (plain)
    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         }

Generated by cgit