mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-09-22 18:31:25 +02:00
Compare commits
No commits in common. "834a5907c1e6e12430c145681c23c48f3c6eb557" and "4cc9137f11932887be7452d33c856d697da594fc" have entirely different histories.
834a5907c1
...
4cc9137f11
|
@ -1,24 +1,19 @@
|
||||||
from .common import InfoExtractor
|
from .common import InfoExtractor
|
||||||
from ..utils import (
|
from ..utils import (
|
||||||
extract_attributes,
|
traverse_obj,
|
||||||
get_element_text_and_html_by_tag,
|
|
||||||
int_or_none,
|
|
||||||
join_nonempty,
|
|
||||||
str_or_none,
|
|
||||||
try_call,
|
|
||||||
unified_timestamp,
|
unified_timestamp,
|
||||||
|
strip_or_none,
|
||||||
)
|
)
|
||||||
from ..utils.traversal import traverse_obj
|
|
||||||
|
|
||||||
|
|
||||||
class DuoplayIE(InfoExtractor):
|
class DuoplayIE(InfoExtractor):
|
||||||
_VALID_URL = r'https://duoplay\.ee/(?P<id>\d+)/[\w-]+/?(?:\?(?:[^#]+&)?ep=(?P<ep>\d+))?'
|
_VALID_URL = r'https://duoplay\.ee/(?P<id>\d+)/'
|
||||||
_TESTS = [{
|
_TESTS = [{
|
||||||
'note': 'Siberi võmm S02E12',
|
'note': 'Siberi võmm S02E12',
|
||||||
'url': 'https://duoplay.ee/4312/siberi-vomm?ep=24',
|
'url': 'https://duoplay.ee/4312/siberi-vomm?ep=24',
|
||||||
'md5': '1ff59d535310ac9c5cf5f287d8f91b2d',
|
'md5': '1ff59d535310ac9c5cf5f287d8f91b2d',
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
'id': '4312_24',
|
'id': '4312',
|
||||||
'ext': 'mp4',
|
'ext': 'mp4',
|
||||||
'title': 'Operatsioon "Öö"',
|
'title': 'Operatsioon "Öö"',
|
||||||
'thumbnail': r're:https://.+\.jpg(?:\?c=\d+)?$',
|
'thumbnail': r're:https://.+\.jpg(?:\?c=\d+)?$',
|
||||||
|
@ -26,18 +21,19 @@ class DuoplayIE(InfoExtractor):
|
||||||
'upload_date': '20170523',
|
'upload_date': '20170523',
|
||||||
'timestamp': 1495567800,
|
'timestamp': 1495567800,
|
||||||
'series': 'Siberi võmm',
|
'series': 'Siberi võmm',
|
||||||
'series_id': '4312',
|
'series_id': 4312,
|
||||||
'season': 'Season 2',
|
'season': 'Season 2',
|
||||||
'season_number': 2,
|
'season_number': 2,
|
||||||
'episode': 'Operatsioon "Öö"',
|
'episode': 'Operatsioon "Öö"',
|
||||||
'episode_number': 12,
|
'episode_number': 12,
|
||||||
|
'episode_id': 24,
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
'note': 'Empty title',
|
'note': 'Empty title',
|
||||||
'url': 'https://duoplay.ee/17/uhikarotid?ep=14',
|
'url': 'https://duoplay.ee/17/uhikarotid?ep=14',
|
||||||
'md5': '6aca68be71112314738dd17cced7f8bf',
|
'md5': '6aca68be71112314738dd17cced7f8bf',
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
'id': '17_14',
|
'id': '17',
|
||||||
'ext': 'mp4',
|
'ext': 'mp4',
|
||||||
'title': 'Episode 14',
|
'title': 'Episode 14',
|
||||||
'thumbnail': r're:https://.+\.jpg(?:\?c=\d+)?$',
|
'thumbnail': r're:https://.+\.jpg(?:\?c=\d+)?$',
|
||||||
|
@ -45,37 +41,36 @@ class DuoplayIE(InfoExtractor):
|
||||||
'upload_date': '20100916',
|
'upload_date': '20100916',
|
||||||
'timestamp': 1284661800,
|
'timestamp': 1284661800,
|
||||||
'series': 'Ühikarotid',
|
'series': 'Ühikarotid',
|
||||||
'series_id': '17',
|
'series_id': 17,
|
||||||
'season': 'Season 2',
|
'season': 'Season 2',
|
||||||
'season_number': 2,
|
'season_number': 2,
|
||||||
'episode': 'Episode 14',
|
'episode_id': 14,
|
||||||
'episode_number': 14,
|
|
||||||
},
|
},
|
||||||
}]
|
}]
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
telecast_id, episode = self._match_valid_url(url).groups()
|
def decode_quot(s: str):
|
||||||
video_id = join_nonempty(telecast_id, episode, delim='_')
|
return s.replace(""", '"')
|
||||||
webpage = self._download_webpage(url, video_id)
|
|
||||||
video_player = try_call(lambda: extract_attributes(
|
|
||||||
get_element_text_and_html_by_tag('video-player', webpage)[1]))
|
|
||||||
if not video_player or not video_player.get('manifest-url'):
|
|
||||||
self.raise_no_formats('No video found', expected=True)
|
|
||||||
|
|
||||||
episode_attr = self._parse_json(video_player.get(':episode') or '', video_id, fatal=False) or {}
|
video_id = self._match_id(url)
|
||||||
|
webpage = self._download_webpage(url, video_id)
|
||||||
|
manifest_url = self._search_regex(r'<video-player[^>]+manifest-url="([^"]+)"', webpage, 'video-player')
|
||||||
|
episode_attr = self._search_regex(r'<video-player[^>]+:episode="([^"]+)"', webpage, 'episode data')
|
||||||
|
ep = self._parse_json(episode_attr, video_id, decode_quot)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'id': video_id,
|
'id': video_id,
|
||||||
'formats': self._extract_m3u8_formats(video_player['manifest-url'], video_id, 'mp4'),
|
# fallback to absolute "episode_id" value
|
||||||
**traverse_obj(episode_attr, {
|
'title': traverse_obj(ep, 'subtitle') or f"Episode {traverse_obj(ep, 'episode_id')}",
|
||||||
'title': (None, ('subtitle', ('episode_id', {lambda x: f'Episode {x}'}))),
|
'description': strip_or_none(traverse_obj(ep, 'synopsis')),
|
||||||
'description': 'synopsis',
|
'thumbnail': traverse_obj(ep, ('images', 'original')),
|
||||||
'thumbnail': ('images', 'original'),
|
'formats': self._extract_m3u8_formats(manifest_url, video_id, 'mp4'),
|
||||||
'timestamp': ('airtime', {lambda x: unified_timestamp(x + ' +0200')}),
|
'timestamp': unified_timestamp(traverse_obj(ep, 'airtime') + ' +0200'),
|
||||||
'series': 'title',
|
'series': traverse_obj(ep, 'title'),
|
||||||
'series_id': ('telecast_id', {str_or_none}),
|
'series_id': traverse_obj(ep, 'telecast_id'),
|
||||||
'season_number': ('season_id', {int_or_none}),
|
'season_number': traverse_obj(ep, 'season_id'),
|
||||||
'episode': 'subtitle',
|
'episode': traverse_obj(ep, 'subtitle'),
|
||||||
'episode_number': (None, ('episode_nr', 'episode_id'), {int_or_none}),
|
# fallback to absolute "episode_id" value
|
||||||
}, get_all=False),
|
'episode_number': traverse_obj(ep, 'episode_nr') or traverse_obj(ep, 'episode_id'),
|
||||||
|
'episode_id': traverse_obj(ep, 'episode_id'),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user