This commit is contained in:
		
							parent
							
								
									c97f5e934f
								
							
						
					
					
						commit
						700265bfcf
					
				
					 1 changed files with 43 additions and 88 deletions
				
			
		| 
						 | 
					@ -6,7 +6,6 @@ import re
 | 
				
			||||||
from .common import InfoExtractor
 | 
					from .common import InfoExtractor
 | 
				
			||||||
from ..compat import (
 | 
					from ..compat import (
 | 
				
			||||||
    compat_HTTPError,
 | 
					    compat_HTTPError,
 | 
				
			||||||
    compat_str,
 | 
					 | 
				
			||||||
    compat_urlparse,
 | 
					    compat_urlparse,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
from ..utils import (
 | 
					from ..utils import (
 | 
				
			||||||
| 
						 | 
					@ -15,9 +14,7 @@ from ..utils import (
 | 
				
			||||||
    int_or_none,
 | 
					    int_or_none,
 | 
				
			||||||
    parse_iso8601,
 | 
					    parse_iso8601,
 | 
				
			||||||
    qualities,
 | 
					    qualities,
 | 
				
			||||||
    smuggle_url,
 | 
					 | 
				
			||||||
    try_get,
 | 
					    try_get,
 | 
				
			||||||
    unsmuggle_url,
 | 
					 | 
				
			||||||
    update_url_query,
 | 
					    update_url_query,
 | 
				
			||||||
    url_or_none,
 | 
					    url_or_none,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -235,11 +232,6 @@ class TVPlayIE(InfoExtractor):
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _real_extract(self, url):
 | 
					    def _real_extract(self, url):
 | 
				
			||||||
        url, smuggled_data = unsmuggle_url(url, {})
 | 
					 | 
				
			||||||
        self._initialize_geo_bypass({
 | 
					 | 
				
			||||||
            'countries': smuggled_data.get('geo_countries'),
 | 
					 | 
				
			||||||
        })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        video_id = self._match_id(url)
 | 
					        video_id = self._match_id(url)
 | 
				
			||||||
        geo_country = self._search_regex(
 | 
					        geo_country = self._search_regex(
 | 
				
			||||||
            r'https?://[^/]+\.([a-z]{2})', url,
 | 
					            r'https?://[^/]+\.([a-z]{2})', url,
 | 
				
			||||||
| 
						 | 
					@ -285,8 +277,6 @@ class TVPlayIE(InfoExtractor):
 | 
				
			||||||
                    'ext': ext,
 | 
					                    'ext': ext,
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if video_url.startswith('rtmp'):
 | 
					                if video_url.startswith('rtmp'):
 | 
				
			||||||
                    if smuggled_data.get('skip_rtmp'):
 | 
					 | 
				
			||||||
                        continue
 | 
					 | 
				
			||||||
                    m = re.search(
 | 
					                    m = re.search(
 | 
				
			||||||
                        r'^(?P<url>rtmp://[^/]+/(?P<app>[^/]+))/(?P<playpath>.+)$', video_url)
 | 
					                        r'^(?P<url>rtmp://[^/]+/(?P<app>[^/]+))/(?P<playpath>.+)$', video_url)
 | 
				
			||||||
                    if not m:
 | 
					                    if not m:
 | 
				
			||||||
| 
						 | 
					@ -347,115 +337,80 @@ class ViafreeIE(InfoExtractor):
 | 
				
			||||||
    _VALID_URL = r'''(?x)
 | 
					    _VALID_URL = r'''(?x)
 | 
				
			||||||
                    https?://
 | 
					                    https?://
 | 
				
			||||||
                        (?:www\.)?
 | 
					                        (?:www\.)?
 | 
				
			||||||
                        viafree\.
 | 
					                        viafree\.(?P<country>dk|no|se)
 | 
				
			||||||
                        (?:
 | 
					                        /(?P<id>program(?:mer)?/(?:[^/]+/)+[^/?#&]+)
 | 
				
			||||||
                            (?:dk|no)/programmer|
 | 
					 | 
				
			||||||
                            se/program
 | 
					 | 
				
			||||||
                        )
 | 
					 | 
				
			||||||
                        /(?:[^/]+/)+(?P<id>[^/?#&]+)
 | 
					 | 
				
			||||||
                    '''
 | 
					                    '''
 | 
				
			||||||
    _TESTS = [{
 | 
					    _TESTS = [{
 | 
				
			||||||
        'url': 'http://www.viafree.se/program/livsstil/husraddarna/sasong-2/avsnitt-2',
 | 
					        'url': 'http://www.viafree.no/programmer/underholdning/det-beste-vorspielet/sesong-2/episode-1',
 | 
				
			||||||
        'info_dict': {
 | 
					        'info_dict': {
 | 
				
			||||||
            'id': '395375',
 | 
					            'id': '757786',
 | 
				
			||||||
            'ext': 'mp4',
 | 
					            'ext': 'mp4',
 | 
				
			||||||
            'title': 'Husräddarna S02E02',
 | 
					            'title': 'Det beste vorspielet - Sesong 2 - Episode 1',
 | 
				
			||||||
            'description': 'md5:4db5c933e37db629b5a2f75dfb34829e',
 | 
					            'description': 'md5:b632cb848331404ccacd8cd03e83b4c3',
 | 
				
			||||||
            'series': 'Husräddarna',
 | 
					            'series': 'Det beste vorspielet',
 | 
				
			||||||
            'season': 'Säsong 2',
 | 
					 | 
				
			||||||
            'season_number': 2,
 | 
					            'season_number': 2,
 | 
				
			||||||
            'duration': 2576,
 | 
					            'duration': 1116,
 | 
				
			||||||
            'timestamp': 1400596321,
 | 
					            'timestamp': 1471200600,
 | 
				
			||||||
            'upload_date': '20140520',
 | 
					            'upload_date': '20160814',
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        'params': {
 | 
					        'params': {
 | 
				
			||||||
            'skip_download': True,
 | 
					            'skip_download': True,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        'add_ie': [TVPlayIE.ie_key()],
 | 
					 | 
				
			||||||
    }, {
 | 
					    }, {
 | 
				
			||||||
        # with relatedClips
 | 
					        # with relatedClips
 | 
				
			||||||
        'url': 'http://www.viafree.se/program/reality/sommaren-med-youtube-stjarnorna/sasong-1/avsnitt-1',
 | 
					        'url': 'http://www.viafree.se/program/reality/sommaren-med-youtube-stjarnorna/sasong-1/avsnitt-1',
 | 
				
			||||||
        'info_dict': {
 | 
					        'only_matching': True,
 | 
				
			||||||
            'id': '758770',
 | 
					 | 
				
			||||||
            'ext': 'mp4',
 | 
					 | 
				
			||||||
            'title': 'Sommaren med YouTube-stjärnorna S01E01',
 | 
					 | 
				
			||||||
            'description': 'md5:2bc69dce2c4bb48391e858539bbb0e3f',
 | 
					 | 
				
			||||||
            'series': 'Sommaren med YouTube-stjärnorna',
 | 
					 | 
				
			||||||
            'season': 'Säsong 1',
 | 
					 | 
				
			||||||
            'season_number': 1,
 | 
					 | 
				
			||||||
            'duration': 1326,
 | 
					 | 
				
			||||||
            'timestamp': 1470905572,
 | 
					 | 
				
			||||||
            'upload_date': '20160811',
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        'params': {
 | 
					 | 
				
			||||||
            'skip_download': True,
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        'add_ie': [TVPlayIE.ie_key()],
 | 
					 | 
				
			||||||
    }, {
 | 
					    }, {
 | 
				
			||||||
        # Different og:image URL schema
 | 
					        # Different og:image URL schema
 | 
				
			||||||
        'url': 'http://www.viafree.se/program/reality/sommaren-med-youtube-stjarnorna/sasong-1/avsnitt-2',
 | 
					        'url': 'http://www.viafree.se/program/reality/sommaren-med-youtube-stjarnorna/sasong-1/avsnitt-2',
 | 
				
			||||||
        'only_matching': True,
 | 
					        'only_matching': True,
 | 
				
			||||||
    }, {
 | 
					    }, {
 | 
				
			||||||
        'url': 'http://www.viafree.no/programmer/underholdning/det-beste-vorspielet/sesong-2/episode-1',
 | 
					        'url': 'http://www.viafree.se/program/livsstil/husraddarna/sasong-2/avsnitt-2',
 | 
				
			||||||
        'only_matching': True,
 | 
					        'only_matching': True,
 | 
				
			||||||
    }, {
 | 
					    }, {
 | 
				
			||||||
        'url': 'http://www.viafree.dk/programmer/reality/paradise-hotel/saeson-7/episode-5',
 | 
					        'url': 'http://www.viafree.dk/programmer/reality/paradise-hotel/saeson-7/episode-5',
 | 
				
			||||||
        'only_matching': True,
 | 
					        'only_matching': True,
 | 
				
			||||||
    }]
 | 
					    }]
 | 
				
			||||||
 | 
					    _GEO_BYPASS = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def suitable(cls, url):
 | 
					    def suitable(cls, url):
 | 
				
			||||||
        return False if TVPlayIE.suitable(url) else super(ViafreeIE, cls).suitable(url)
 | 
					        return False if TVPlayIE.suitable(url) else super(ViafreeIE, cls).suitable(url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _real_extract(self, url):
 | 
					    def _real_extract(self, url):
 | 
				
			||||||
        video_id = self._match_id(url)
 | 
					        country, path = re.match(self._VALID_URL, url).groups()
 | 
				
			||||||
 | 
					        content = self._download_json(
 | 
				
			||||||
 | 
					            'https://viafree-content.mtg-api.com/viafree-content/v1/%s/path/%s' % (country, path), path)
 | 
				
			||||||
 | 
					        program = content['_embedded']['viafreeBlocks'][0]['_embedded']['program']
 | 
				
			||||||
 | 
					        guid = program['guid']
 | 
				
			||||||
 | 
					        meta = content['meta']
 | 
				
			||||||
 | 
					        title = meta['title']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        webpage = self._download_webpage(url, video_id)
 | 
					        try:
 | 
				
			||||||
 | 
					            stream_href = self._download_json(
 | 
				
			||||||
 | 
					                program['_links']['streamLink']['href'], guid,
 | 
				
			||||||
 | 
					                headers=self.geo_verification_headers())['embedded']['prioritizedStreams'][0]['links']['stream']['href']
 | 
				
			||||||
 | 
					        except ExtractorError as e:
 | 
				
			||||||
 | 
					            if isinstance(e.cause, compat_HTTPError) and e.cause.code == 403:
 | 
				
			||||||
 | 
					                self.raise_geo_restricted(countries=[country])
 | 
				
			||||||
 | 
					            raise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        data = self._parse_json(
 | 
					        formats = self._extract_m3u8_formats(stream_href, guid, 'mp4')
 | 
				
			||||||
            self._search_regex(
 | 
					        self._sort_formats(formats)
 | 
				
			||||||
                r'(?s)window\.App\s*=\s*({.+?})\s*;\s*</script',
 | 
					        episode = program.get('episode') or {}
 | 
				
			||||||
                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
 | 
					        return {
 | 
				
			||||||
 | 
					            'id': guid,
 | 
				
			||||||
        if data:
 | 
					            'title': title,
 | 
				
			||||||
            video_id = try_get(
 | 
					            'thumbnail': meta.get('image'),
 | 
				
			||||||
                data, lambda x: x['context']['dispatcher']['stores'][
 | 
					            'description': meta.get('description'),
 | 
				
			||||||
                    'ContentPageProgramStore']['currentVideo']['id'],
 | 
					            'series': episode.get('seriesTitle'),
 | 
				
			||||||
                compat_str)
 | 
					            'episode_number': int_or_none(episode.get('episodeNumber')),
 | 
				
			||||||
 | 
					            'season_number': int_or_none(episode.get('seasonNumber')),
 | 
				
			||||||
        # Fallback #1 (extract from og:image URL schema)
 | 
					            'duration': int_or_none(try_get(program, lambda x: x['video']['duration']['milliseconds']), 1000),
 | 
				
			||||||
        if not video_id:
 | 
					            'timestamp': parse_iso8601(try_get(program, lambda x: x['availability']['start'])),
 | 
				
			||||||
            thumbnail = self._og_search_thumbnail(webpage, default=None)
 | 
					            'formats': formats,
 | 
				
			||||||
            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(
 | 
					 | 
				
			||||||
            smuggle_url(
 | 
					 | 
				
			||||||
                'mtg:%s' % video_id,
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    'geo_countries': [
 | 
					 | 
				
			||||||
                        compat_urlparse.urlparse(url).netloc.rsplit('.', 1)[-1]],
 | 
					 | 
				
			||||||
                    # rtmp host mtgfs.fplive.net for viafree is unresolvable
 | 
					 | 
				
			||||||
                    'skip_rtmp': True,
 | 
					 | 
				
			||||||
                }),
 | 
					 | 
				
			||||||
            ie=TVPlayIE.ie_key(), video_id=video_id)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TVPlayHomeIE(InfoExtractor):
 | 
					class TVPlayHomeIE(InfoExtractor):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue