[dramafever] Partially switch to API v5 (closes #16026)

master
Sergey M․ 6 years ago
parent 5d60b99717
commit 02f6ccbce3
No known key found for this signature in database
GPG Key ID: 2C393E0F18A9236D

@ -3,25 +3,26 @@ from __future__ import unicode_literals
import itertools import itertools
from .amp import AMPIE from .common import InfoExtractor
from ..compat import ( from ..compat import (
compat_HTTPError, compat_str,
compat_urlparse, compat_urlparse,
) )
from ..utils import ( from ..utils import (
ExtractorError,
clean_html, clean_html,
ExtractorError,
int_or_none, int_or_none,
remove_end, parse_age_limit,
parse_duration,
sanitized_Request, sanitized_Request,
unified_timestamp,
urlencode_postdata urlencode_postdata
) )
class DramaFeverBaseIE(AMPIE): class DramaFeverBaseIE(InfoExtractor):
_LOGIN_URL = 'https://www.dramafever.com/accounts/login/' _LOGIN_URL = 'https://www.dramafever.com/accounts/login/'
_NETRC_MACHINE = 'dramafever' _NETRC_MACHINE = 'dramafever'
_GEO_COUNTRIES = ['US', 'CA']
_CONSUMER_SECRET = 'DA59dtVXYLxajktV' _CONSUMER_SECRET = 'DA59dtVXYLxajktV'
@ -70,18 +71,20 @@ class DramaFeverIE(DramaFeverBaseIE):
IE_NAME = 'dramafever' IE_NAME = 'dramafever'
_VALID_URL = r'https?://(?:www\.)?dramafever\.com/(?:[^/]+/)?drama/(?P<id>[0-9]+/[0-9]+)(?:/|$)' _VALID_URL = r'https?://(?:www\.)?dramafever\.com/(?:[^/]+/)?drama/(?P<id>[0-9]+/[0-9]+)(?:/|$)'
_TESTS = [{ _TESTS = [{
'url': 'http://www.dramafever.com/drama/4512/1/Cooking_with_Shin/', 'url': 'https://www.dramafever.com/drama/4274/1/Heirs/',
'info_dict': { 'info_dict': {
'id': '4512.1', 'id': '4274.1',
'ext': 'flv', 'ext': 'wvm',
'title': 'Cooking with Shin', 'title': 'Heirs - Episode 1',
'description': 'md5:a8eec7942e1664a6896fcd5e1287bfd0', 'description': 'md5:362a24ba18209f6276e032a651c50bc2',
'thumbnail': r're:^https?://.*\.jpg',
'duration': 3783,
'timestamp': 1381354993,
'upload_date': '20131009',
'series': 'Heirs',
'season_number': 1,
'episode': 'Episode 1', 'episode': 'Episode 1',
'episode_number': 1, 'episode_number': 1,
'thumbnail': r're:^https?://.*\.jpg',
'timestamp': 1404336058,
'upload_date': '20140702',
'duration': 344,
}, },
'params': { 'params': {
# m3u8 download # m3u8 download
@ -110,50 +113,95 @@ class DramaFeverIE(DramaFeverBaseIE):
'only_matching': True, 'only_matching': True,
}] }]
def _call_api(self, path, video_id, note, fatal=False):
return self._download_json(
'https://www.dramafever.com/api/5/' + path,
video_id, note=note, headers={
'x-consumer-key': self._consumer_secret,
}, fatal=fatal)
def _get_subtitles(self, video_id):
subtitles = {}
subs = self._call_api(
'video/%s/subtitles/webvtt/' % video_id, video_id,
'Downloading subtitles JSON', fatal=False)
if not subs or not isinstance(subs, list):
return subtitles
for sub in subs:
if not isinstance(sub, dict):
continue
sub_url = sub.get('url')
if not sub_url or not isinstance(sub_url, compat_str):
continue
subtitles.setdefault(
sub.get('code') or sub.get('language') or 'en', []).append({
'url': sub_url
})
return subtitles
def _real_extract(self, url): def _real_extract(self, url):
video_id = self._match_id(url).replace('/', '.') video_id = self._match_id(url).replace('/', '.')
try: series_id, episode_number = video_id.split('.')
info = self._extract_feed_info(
'http://www.dramafever.com/amp/episode/feed.json?guid=%s' % video_id) video = self._call_api(
except ExtractorError as e: 'series/%s/episodes/%s/' % (series_id, episode_number), video_id,
if isinstance(e.cause, compat_HTTPError): 'Downloading video JSON')
self.raise_geo_restricted(
msg='Currently unavailable in your country',
countries=self._GEO_COUNTRIES)
raise
# title is postfixed with video id for some reason, removing formats = []
if info.get('title'): download_assets = video.get('download_assets')
info['title'] = remove_end(info['title'], video_id).strip() if download_assets and isinstance(download_assets, dict):
for format_id, format_dict in download_assets.items():
if not isinstance(format_dict, dict):
continue
format_url = format_dict.get('url')
if not format_url or not isinstance(format_url, compat_str):
continue
formats.append({
'url': format_url,
'format_id': format_id,
'filesize': int_or_none(video.get('filesize')),
})
series_id, episode_number = video_id.split('.') stream = self._call_api(
episode_info = self._download_json( 'video/%s/stream/' % video_id, video_id, 'Downloading stream JSON',
# We only need a single episode info, so restricting page size to one episode fatal=False)
# and dealing with page number as with episode number if stream:
r'http://www.dramafever.com/api/4/episode/series/?cs=%s&series_id=%s&page_number=%s&page_size=1' stream_url = stream.get('stream_url')
% (self._consumer_secret, series_id, episode_number), if stream_url:
video_id, 'Downloading episode info JSON', fatal=False) formats.extend(self._extract_m3u8_formats(
if episode_info: stream_url, video_id, 'mp4', entry_protocol='m3u8_native',
value = episode_info.get('value') m3u8_id='hls', fatal=False))
if isinstance(value, list): self._sort_formats(formats)
for v in value:
if v.get('type') == 'Episode': title = video.get('title') or 'Episode %s' % episode_number
subfile = v.get('subfile') or v.get('new_subfile') description = video.get('description')
if subfile and subfile != 'http://www.dramafever.com/st/': thumbnail = video.get('thumbnail')
info.setdefault('subtitles', {}).setdefault('English', []).append({ timestamp = unified_timestamp(video.get('release_date'))
'ext': 'srt', duration = parse_duration(video.get('duration'))
'url': subfile, age_limit = parse_age_limit(video.get('tv_rating'))
}) series = video.get('series_title')
episode_number = int_or_none(v.get('number')) season_number = int_or_none(video.get('season'))
episode_fallback = 'Episode'
if episode_number: if series:
episode_fallback += ' %d' % episode_number title = '%s - %s' % (series, title)
info['episode'] = v.get('title') or episode_fallback
info['episode_number'] = episode_number subtitles = self.extract_subtitles(video_id)
break
return {
return info 'id': video_id,
'title': title,
'description': description,
'thumbnail': thumbnail,
'duration': duration,
'timestamp': timestamp,
'age_limit': age_limit,
'series': series,
'season_number': season_number,
'episode_number': int_or_none(episode_number),
'formats': formats,
'subtitles': subtitles,
}
class DramaFeverSeriesIE(DramaFeverBaseIE): class DramaFeverSeriesIE(DramaFeverBaseIE):

Loading…
Cancel
Save