- data = self._parse_json(
- self._search_regex(
- r'(?s)window\.App\s*=\s*({.+?})\s*;\s*</script',
- webpage, 'data', default='{}'),
- video_id, transform_source=lambda x: re.sub(
- r'(?s)function\s+[a-zA-Z_][\da-zA-Z_]*\s*\([^)]*\)\s*{[^}]*}\s*',
- 'null', x), fatal=False)
-
- video_id = None
-
- if data:
- video_id = try_get(
- data, lambda x: x['context']['dispatcher']['stores'][
- 'ContentPageProgramStore']['currentVideo']['id'],
- compat_str)
-
- # Fallback #1 (extract from og:image URL schema)
- if not video_id:
- thumbnail = self._og_search_thumbnail(webpage, default=None)
- if thumbnail:
- video_id = self._search_regex(
- # Patterns seen:
- # http://cdn.playapi.mtgx.tv/imagecache/600x315/cloud/content-images/inbox/765166/a2e95e5f1d735bab9f309fa345cc3f25.jpg
- # http://cdn.playapi.mtgx.tv/imagecache/600x315/cloud/content-images/seasons/15204/758770/4a5ba509ca8bc043e1ebd1a76131cdf2.jpg
- r'https?://[^/]+/imagecache/(?:[^/]+/)+(\d{6,})/',
- thumbnail, 'video id', default=None)
-
- # Fallback #2. Extract from raw JSON string.
- # May extract wrong video id if relatedClips is present.
- if not video_id:
- video_id = self._search_regex(
- r'currentVideo["\']\s*:\s*.+?["\']id["\']\s*:\s*["\'](\d{6,})',
- webpage, 'video id')
-
- return self.url_result('mtg:%s' % video_id, TVPlayIE.ie_key())
+ video_id = self._search_regex(
+ r'data-asset-id\s*=\s*["\'](\d{5,})\b', webpage, 'video id')
+
+ if len(video_id) < 8:
+ return self.url_result(
+ 'mtg:%s' % video_id, ie=TVPlayIE.ie_key(), video_id=video_id)
+
+ m3u8_url = self._search_regex(
+ r'data-file\s*=\s*(["\'])(?P<url>(?:(?!\1).)+)\1', webpage,
+ 'm3u8 url', group='url')
+
+ formats = self._extract_m3u8_formats(
+ m3u8_url, video_id, 'mp4', entry_protocol='m3u8_native',
+ m3u8_id='hls')
+ self._sort_formats(formats)
+
+ title = self._search_regex(
+ r'data-title\s*=\s*(["\'])(?P<value>(?:(?!\1).)+)\1', webpage,
+ 'title', default=None, group='value') or self._html_search_meta(
+ 'title', webpage, default=None) or self._og_search_title(
+ webpage)
+
+ description = self._html_search_meta(
+ 'description', webpage,
+ default=None) or self._og_search_description(webpage)
+
+ thumbnail = self._search_regex(
+ r'data-image\s*=\s*(["\'])(?P<url>(?:(?!\1).)+)\1', webpage,
+ 'thumbnail', default=None, group='url') or self._html_search_meta(
+ 'thumbnail', webpage, default=None) or self._og_search_thumbnail(
+ webpage)
+
+ duration = int_or_none(self._search_regex(
+ r'data-duration\s*=\s*["\'](\d+)', webpage, 'duration',
+ fatal=False))
+
+ season = self._search_regex(
+ (r'data-series-title\s*=\s*(["\'])[^/]+/(?P<value>(?:(?!\1).)+)\1',
+ r'\bseason\s*:\s*(["\'])(?P<value>(?:(?!\1).)+)\1'), webpage,
+ 'season', default=None, group='value')
+ season_number = int_or_none(self._search_regex(
+ r'(\d+)(?:[.\s]+sezona|\s+HOOAEG)', season or '', 'season number',
+ default=None))
+ episode = self._search_regex(
+ (r'\bepisode\s*:\s*(["\'])(?P<value>(?:(?!\1).)+)\1',
+ r'data-subtitle\s*=\s*(["\'])(?P<value>(?:(?!\1).)+)\1'), webpage,
+ 'episode', default=None, group='value')
+ episode_number = int_or_none(self._search_regex(
+ r'(?:S[eē]rija|Osa)\s+(\d+)', episode or '', 'episode number',
+ default=None))
+
+ return {
+ 'id': video_id,
+ 'title': title,
+ 'description': description,
+ 'thumbnail': thumbnail,
+ 'duration': duration,
+ 'season': season,
+ 'season_number': season_number,
+ 'episode': episode,
+ 'episode_number': episode_number,
+ 'formats': formats,
+ }