|  | @@ -12,11 +12,13 @@ from ..utils import (
 | 
	
		
			
				|  |  |      determine_ext,
 | 
	
		
			
				|  |  |      ExtractorError,
 | 
	
		
			
				|  |  |      int_or_none,
 | 
	
		
			
				|  |  | +    parse_duration,
 | 
	
		
			
				|  |  |      parse_iso8601,
 | 
	
		
			
				|  |  |      qualities,
 | 
	
		
			
				|  |  |      try_get,
 | 
	
		
			
				|  |  |      update_url_query,
 | 
	
		
			
				|  |  |      url_or_none,
 | 
	
		
			
				|  |  | +    urljoin,
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -414,7 +416,7 @@ class ViafreeIE(InfoExtractor):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class TVPlayHomeIE(InfoExtractor):
 | 
	
		
			
				|  |  | -    _VALID_URL = r'https?://tvplay\.(?:tv3\.lt|skaties\.lv|tv3\.ee)/[^/]+/[^/?#&]+-(?P<id>\d+)'
 | 
	
		
			
				|  |  | +    _VALID_URL = r'https?://(?:tv3?)?play\.(?:tv3\.lt|skaties\.lv|tv3\.ee)/(?:[^/]+/)*[^/?#&]+-(?P<id>\d+)'
 | 
	
		
			
				|  |  |      _TESTS = [{
 | 
	
		
			
				|  |  |          'url': 'https://tvplay.tv3.lt/aferistai-n-7/aferistai-10047125/',
 | 
	
		
			
				|  |  |          'info_dict': {
 | 
	
	
		
			
				|  | @@ -433,80 +435,58 @@ class TVPlayHomeIE(InfoExtractor):
 | 
	
		
			
				|  |  |          'params': {
 | 
	
		
			
				|  |  |              'skip_download': True,
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  | -        'add_ie': [TVPlayIE.ie_key()],
 | 
	
		
			
				|  |  |      }, {
 | 
	
		
			
				|  |  |          'url': 'https://tvplay.skaties.lv/vinas-melo-labak/vinas-melo-labak-10280317/',
 | 
	
		
			
				|  |  |          'only_matching': True,
 | 
	
		
			
				|  |  |      }, {
 | 
	
		
			
				|  |  |          'url': 'https://tvplay.tv3.ee/cool-d-ga-mehhikosse/cool-d-ga-mehhikosse-10044354/',
 | 
	
		
			
				|  |  |          'only_matching': True,
 | 
	
		
			
				|  |  | +    }, {
 | 
	
		
			
				|  |  | +        'url': 'https://play.tv3.lt/aferistai-10047125',
 | 
	
		
			
				|  |  | +        'only_matching': True,
 | 
	
		
			
				|  |  | +    }, {
 | 
	
		
			
				|  |  | +        'url': 'https://tv3play.skaties.lv/vinas-melo-labak-10280317',
 | 
	
		
			
				|  |  | +        'only_matching': True,
 | 
	
		
			
				|  |  | +    }, {
 | 
	
		
			
				|  |  | +        'url': 'https://play.tv3.ee/cool-d-ga-mehhikosse-10044354',
 | 
	
		
			
				|  |  | +        'only_matching': True,
 | 
	
		
			
				|  |  |      }]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def _real_extract(self, url):
 | 
	
		
			
				|  |  |          video_id = self._match_id(url)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        webpage = self._download_webpage(url, video_id)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        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)
 | 
	
		
			
				|  |  | +        asset = self._download_json(
 | 
	
		
			
				|  |  | +            urljoin(url, '/sb/public/asset/' + video_id), video_id)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        m3u8_url = self._search_regex(
 | 
	
		
			
				|  |  | -            r'data-file\s*=\s*(["\'])(?P<url>(?:(?!\1).)+)\1', webpage,
 | 
	
		
			
				|  |  | -            'm3u8 url', group='url')
 | 
	
		
			
				|  |  | +        m3u8_url = asset['movie']['contentUrl']
 | 
	
		
			
				|  |  | +        video_id = asset['assetId']
 | 
	
		
			
				|  |  | +        asset_title = asset['title']
 | 
	
		
			
				|  |  | +        title = asset_title['title']
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          formats = self._extract_m3u8_formats(
 | 
	
		
			
				|  |  | -            m3u8_url, video_id, 'mp4', entry_protocol='m3u8_native',
 | 
	
		
			
				|  |  | -            m3u8_id='hls')
 | 
	
		
			
				|  |  | +            m3u8_url, video_id, 'mp4', '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))
 | 
	
		
			
				|  |  | +        thumbnails = None
 | 
	
		
			
				|  |  | +        image_url = asset.get('imageUrl')
 | 
	
		
			
				|  |  | +        if image_url:
 | 
	
		
			
				|  |  | +            thumbnails = [{
 | 
	
		
			
				|  |  | +                'url': urljoin(url, image_url),
 | 
	
		
			
				|  |  | +                'ext': 'jpg',
 | 
	
		
			
				|  |  | +            }]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        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))
 | 
	
		
			
				|  |  | +        metadata = asset.get('metadata') or {}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          return {
 | 
	
		
			
				|  |  |              'id': video_id,
 | 
	
		
			
				|  |  |              'title': title,
 | 
	
		
			
				|  |  | -            'description': description,
 | 
	
		
			
				|  |  | -            'thumbnail': thumbnail,
 | 
	
		
			
				|  |  | -            'duration': duration,
 | 
	
		
			
				|  |  | -            'season': season,
 | 
	
		
			
				|  |  | -            'season_number': season_number,
 | 
	
		
			
				|  |  | -            'episode': episode,
 | 
	
		
			
				|  |  | -            'episode_number': episode_number,
 | 
	
		
			
				|  |  | +            'description': asset_title.get('summaryLong') or asset_title.get('summaryShort'),
 | 
	
		
			
				|  |  | +            'thumbnails': thumbnails,
 | 
	
		
			
				|  |  | +            'duration': parse_duration(asset_title.get('runTime')),
 | 
	
		
			
				|  |  | +            'series': asset.get('tvSeriesTitle'),
 | 
	
		
			
				|  |  | +            'season': asset.get('tvSeasonTitle'),
 | 
	
		
			
				|  |  | +            'season_number': int_or_none(metadata.get('seasonNumber')),
 | 
	
		
			
				|  |  | +            'episode': asset_title.get('titleBrief'),
 | 
	
		
			
				|  |  | +            'episode_number': int_or_none(metadata.get('episodeNumber')),
 | 
	
		
			
				|  |  |              'formats': formats,
 | 
	
		
			
				|  |  |          }
 |