aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUnknown <blackjack4494@web.de>2020-09-03 04:40:15 +0200
committerUnknown <blackjack4494@web.de>2020-09-03 04:40:15 +0200
commit12cd8e8f55b6d4f3e27ec7d0dbbc02317a42bfab (patch)
tree13cb58d5d1f3c945d57abf169dc2e05df5d3c6fe
parent53d26f24069590f47985dfd1eb3f4c90642e676a (diff)
parent22f9b078fd6588ec5fcbb1cfe7d0778b4fab0b49 (diff)
downloadhypervideo-pre-12cd8e8f55b6d4f3e27ec7d0dbbc02317a42bfab.tar.lz
hypervideo-pre-12cd8e8f55b6d4f3e27ec7d0dbbc02317a42bfab.tar.xz
hypervideo-pre-12cd8e8f55b6d4f3e27ec7d0dbbc02317a42bfab.zip
Merge branch 'ssaqua-master'
-rw-r--r--youtube_dlc/extractor/extractors.py5
-rw-r--r--youtube_dlc/extractor/pokemon.py67
2 files changed, 71 insertions, 1 deletions
diff --git a/youtube_dlc/extractor/extractors.py b/youtube_dlc/extractor/extractors.py
index 6c281ef26..fa5330b60 100644
--- a/youtube_dlc/extractor/extractors.py
+++ b/youtube_dlc/extractor/extractors.py
@@ -859,7 +859,10 @@ from .pluralsight import (
PluralsightCourseIE,
)
from .podomatic import PodomaticIE
-from .pokemon import PokemonIE
+from .pokemon import (
+ PokemonIE,
+ PokemonWatchIE,
+)
from .polskieradio import (
PolskieRadioIE,
PolskieRadioCategoryIE,
diff --git a/youtube_dlc/extractor/pokemon.py b/youtube_dlc/extractor/pokemon.py
index 80222d428..14ee1a72e 100644
--- a/youtube_dlc/extractor/pokemon.py
+++ b/youtube_dlc/extractor/pokemon.py
@@ -5,8 +5,11 @@ import re
from .common import InfoExtractor
from ..utils import (
+ ExtractorError,
extract_attributes,
int_or_none,
+ js_to_json,
+ merge_dicts,
)
@@ -69,3 +72,67 @@ class PokemonIE(InfoExtractor):
'episode_number': int_or_none(video_data.get('data-video-episode')),
'ie_key': 'LimelightMedia',
}
+
+
+class PokemonWatchIE(InfoExtractor):
+ _VALID_URL = r'https?://watch\.pokemon\.com/[a-z]{2}-[a-z]{2}/player\.html\?id=(?P<id>[a-z0-9]{32})'
+ _API_URL = 'https://www.pokemon.com/api/pokemontv/v2/channels/{0:}'
+ _TESTS = [{
+ 'url': 'https://watch.pokemon.com/en-us/player.html?id=8309a40969894a8e8d5bc1311e9c5667',
+ 'md5': '62833938a31e61ab49ada92f524c42ff',
+ 'info_dict': {
+ 'id': '8309a40969894a8e8d5bc1311e9c5667',
+ 'ext': 'mp4',
+ 'title': 'Lillier and the Staff!',
+ 'description': 'md5:338841b8c21b283d24bdc9b568849f04',
+ }
+ }, {
+ 'url': 'https://watch.pokemon.com/de-de/player.html?id=b3c402e111a4459eb47e12160ab0ba07',
+ 'only_matching': True
+ }]
+
+ def _extract_media(self, channel_array, video_id):
+ for channel in channel_array:
+ for media in channel.get('media'):
+ if media.get('id') == video_id:
+ return media
+ return None
+
+ def _real_extract(self, url):
+ video_id = self._match_id(url)
+
+ info = {
+ '_type': 'url',
+ 'id': video_id,
+ 'url': 'limelight:media:%s' % video_id,
+ 'ie_key': 'LimelightMedia',
+ }
+
+ # API call can be avoided entirely if we are listing formats
+ if self._downloader.params.get('listformats', False):
+ return info
+
+ webpage = self._download_webpage(url, video_id)
+ build_vars = self._parse_json(self._search_regex(
+ r'(?s)buildVars\s*=\s*({.*?})', webpage, 'build vars'),
+ video_id, transform_source=js_to_json)
+ region = build_vars.get('region')
+ channel_array = self._download_json(self._API_URL.format(region), video_id)
+ video_data = self._extract_media(channel_array, video_id)
+
+ if video_data is None:
+ raise ExtractorError(
+ 'Video %s does not exist' % video_id, expected=True)
+
+ info['_type'] = 'url_transparent'
+ images = video_data.get('images')
+
+ return merge_dicts(info, {
+ 'title': video_data.get('title'),
+ 'description': video_data.get('description'),
+ 'thumbnail': images.get('medium') or images.get('small'),
+ 'series': 'Pokémon',
+ 'season_number': int_or_none(video_data.get('season')),
+ 'episode': video_data.get('title'),
+ 'episode_number': int_or_none(video_data.get('episode')),
+ })