2 from __future__
import unicode_literals
6 from .common
import InfoExtractor
16 class PokemonIE(InfoExtractor
):
17 _VALID_URL
= r
'https?://(?:www\.)?pokemon\.com/[a-z]{2}(?:.*?play=(?P<id>[a-z0-9]{32})|/(?:[^/]+/)+(?P<display_id>[^/?#&]+))'
19 'url': 'https://www.pokemon.com/us/pokemon-episodes/20_30-the-ol-raise-and-switch/',
20 'md5': '2fe8eaec69768b25ef898cda9c43062e',
22 'id': 'afe22e30f01c41f49d4f1d9eab5cd9a4',
24 'title': 'The Ol’ Raise and Switch!',
25 'description': 'md5:7db77f7107f98ba88401d3adc80ff7af',
27 'add_id': ['LimelightMedia'],
30 'url': 'https://www.pokemon.com/fr/episodes-pokemon/films-pokemon/pokemon-lascension-de-darkrai-2008',
32 'id': 'dfbaf830d7e54e179837c50c0c6cc0e1',
34 'title': "Pokémon : L'ascension de Darkrai",
35 'description': 'md5:d1dbc9e206070c3e14a06ff557659fb5',
37 'add_id': ['LimelightMedia'],
39 'skip_download': True,
42 'url': 'http://www.pokemon.com/uk/pokemon-episodes/?play=2e8b5c761f1d4a9286165d7748c1ece2',
43 'only_matching': True,
45 'url': 'http://www.pokemon.com/fr/episodes-pokemon/18_09-un-hiver-inattendu/',
46 'only_matching': True,
48 'url': 'http://www.pokemon.com/de/pokemon-folgen/01_20-bye-bye-smettbo/',
49 'only_matching': True,
52 def _real_extract(self
, url
):
53 video_id
, display_id
= re
.match(self
._VALID
_URL
, url
).groups()
54 webpage
= self
._download
_webpage
(url
, video_id
or display_id
)
55 video_data
= extract_attributes(self
._search
_regex
(
56 r
'(<[^>]+data-video-id="%s"[^>]*>)' % (video_id
if video_id
else '[a-z0-9]{32}'),
57 webpage
, 'video data element'))
58 video_id
= video_data
['data-video-id']
59 title
= video_data
.get('data-video-title') or self
._html
_search
_meta
(
60 'pkm-title', webpage
, ' title', default
=None) or self
._search
_regex
(
61 r
'<h1[^>]+\bclass=["\']us
-title
[^
>]+>([^
<]+)', webpage, 'title
')
63 '_type
': 'url_transparent
',
65 'url
': 'limelight
:media
:%s' % video_id,
67 'description
': video_data.get('data
-video
-summary
'),
68 'thumbnail
': video_data.get('data
-video
-poster
'),
70 'season_number
': int_or_none(video_data.get('data
-video
-season
')),
72 'episode_number
': int_or_none(video_data.get('data
-video
-episode
')),
73 'ie_key
': 'LimelightMedia
',
77 class PokemonWatchIE(InfoExtractor):
78 _VALID_URL = r'https?
://watch\
.pokemon\
.com
/[a
-z
]{2}
-[a
-z
]{2}
/player\
.html
\?id=(?P
<id>[a
-z0
-9]{32}
)'
79 _API_URL = 'https
://www
.pokemon
.com
/api
/pokemontv
/v2
/channels
/{0:}
'
81 'url
': 'https
://watch
.pokemon
.com
/en
-us
/player
.html?
id=8309a40969894a8e8d5bc1311e9c5667
',
82 'md5
': '62833938a31e61ab49ada92f524c42ff
',
84 'id': '8309a40969894a8e8d5bc1311e9c5667
',
86 'title
': 'Lillier
and the Staff
!',
87 'description
': 'md5
:338841b8c21b283d24bdc9b568849f04
',
90 'url
': 'https
://watch
.pokemon
.com
/de
-de
/player
.html?
id=b3c402e111a4459eb47e12160ab0ba07
',
94 def _extract_media(self, channel_array, video_id):
95 for channel in channel_array:
96 for media in channel.get('media
'):
97 if media.get('id') == video_id:
101 def _real_extract(self, url):
102 video_id = self._match_id(url)
107 'url
': 'limelight
:media
:%s' % video_id,
108 'ie_key
': 'LimelightMedia
',
111 # API call can be avoided entirely if we are listing formats
112 if self._downloader.params.get('listformats
', False):
115 webpage = self._download_webpage(url, video_id)
116 build_vars = self._parse_json(self._search_regex(
117 r'(?s
)buildVars\s
*=\s
*({.*?}
)', webpage, 'build
vars'),
118 video_id, transform_source=js_to_json)
119 region = build_vars.get('region
')
120 channel_array = self._download_json(self._API_URL.format(region), video_id)
121 video_data = self._extract_media(channel_array, video_id)
123 if video_data is None:
124 raise ExtractorError(
125 'Video
%s does
not exist
' % video_id, expected=True)
127 info['_type
'] = 'url_transparent
'
128 images = video_data.get('images
')
130 return merge_dicts(info, {
131 'title
': video_data.get('title
'),
132 'description
': video_data.get('description
'),
133 'thumbnail
': images.get('medium
') or images.get('small
'),
135 'season_number
': int_or_none(video_data.get('season
')),
136 'episode
': video_data.get('title
'),
137 'episode_number
': int_or_none(video_data.get('episode
')),