from __future__ import unicode_literals import json import re from .common import InfoExtractor from ..utils import int_or_none class DLiveVODIE(InfoExtractor): IE_NAME = 'dlive:vod' _VALID_URL = r'https?://(?:www\.)?dlive\.tv/p/(?P.+?)\+(?P[^/?#&]+)' _TESTS = [{ 'url': 'https://dlive.tv/p/pdp+3mTzOl4WR', 'info_dict': { 'id': '3mTzOl4WR', 'ext': 'mp4', 'title': 'Minecraft with james charles epic', 'upload_date': '20190701', 'timestamp': 1562011015, 'uploader_id': 'pdp', } }, { 'url': 'https://dlive.tv/p/pdpreplay+D-RD-xSZg', 'only_matching': True, }] def _real_extract(self, url): uploader_id, vod_id = re.match(self._VALID_URL, url).groups() broadcast = self._download_json( 'https://graphigo.prd.dlive.tv/', vod_id, data=json.dumps({'query': '''query { pastBroadcast(permlink:"%s+%s") { content createdAt length playbackUrl title thumbnailUrl viewCount } }''' % (uploader_id, vod_id)}).encode())['data']['pastBroadcast'] title = broadcast['title'] formats = self._extract_m3u8_formats( broadcast['playbackUrl'], vod_id, 'mp4', 'm3u8_native') self._sort_formats(formats) return { 'id': vod_id, 'title': title, 'uploader_id': uploader_id, 'formats': formats, 'description': broadcast.get('content'), 'thumbnail': broadcast.get('thumbnailUrl'), 'timestamp': int_or_none(broadcast.get('createdAt'), 1000), 'view_count': int_or_none(broadcast.get('viewCount')), } class DLiveStreamIE(InfoExtractor): IE_NAME = 'dlive:stream' _VALID_URL = r'https?://(?:www\.)?dlive\.tv/(?!p/)(?P[\w.-]+)' def _real_extract(self, url): display_name = self._match_id(url) user = self._download_json( 'https://graphigo.prd.dlive.tv/', display_name, data=json.dumps({'query': '''query { userByDisplayName(displayname:"%s") { livestream { content createdAt title thumbnailUrl watchingCount } username } }''' % display_name}).encode())['data']['userByDisplayName'] livestream = user['livestream'] title = livestream['title'] username = user['username'] formats = self._extract_m3u8_formats( 'https://live.prd.dlive.tv/hls/live/%s.m3u8' % username, display_name, 'mp4') self._sort_formats(formats) return { 'id': display_name, 'title': self._live_title(title), 'uploader': display_name, 'uploader_id': username, 'formats': formats, 'description': livestream.get('content'), 'thumbnail': livestream.get('thumbnailUrl'), 'is_live': True, 'timestamp': int_or_none(livestream.get('createdAt'), 1000), 'view_count': int_or_none(livestream.get('watchingCount')), }