Improve URL extraction
This commit is contained in:
		
							parent
							
								
									4ecf300d13
								
							
						
					
					
						commit
						3052a30d42
					
				
					 47 changed files with 166 additions and 139 deletions
				
			
		| 
						 | 
				
			
			@ -7,6 +7,7 @@ from .turner import TurnerBaseIE
 | 
			
		|||
from ..utils import (
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    strip_or_none,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +99,7 @@ class AdultSwimIE(TurnerBaseIE):
 | 
			
		|||
            if not video_id:
 | 
			
		||||
                entries = []
 | 
			
		||||
                for episode in video_data.get('archiveEpisodes', []):
 | 
			
		||||
                    episode_url = episode.get('url')
 | 
			
		||||
                    episode_url = url_or_none(episode.get('url'))
 | 
			
		||||
                    if not episode_url:
 | 
			
		||||
                        continue
 | 
			
		||||
                    entries.append(self.url_result(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,7 @@ from ..utils import (
 | 
			
		|||
    determine_ext,
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    urlencode_postdata,
 | 
			
		||||
    xpath_text,
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -304,7 +305,7 @@ class AfreecaTVIE(InfoExtractor):
 | 
			
		|||
            file_elements = video_element.findall(compat_xpath('./file'))
 | 
			
		||||
            one = len(file_elements) == 1
 | 
			
		||||
            for file_num, file_element in enumerate(file_elements, start=1):
 | 
			
		||||
                file_url = file_element.text
 | 
			
		||||
                file_url = url_or_none(file_element.text)
 | 
			
		||||
                if not file_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                key = file_element.get('key', '')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,11 +3,12 @@ from __future__ import unicode_literals
 | 
			
		|||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    parse_iso8601,
 | 
			
		||||
    mimetype2ext,
 | 
			
		||||
    determine_ext,
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    mimetype2ext,
 | 
			
		||||
    parse_iso8601,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +36,7 @@ class AMPIE(InfoExtractor):
 | 
			
		|||
                media_thumbnail = [media_thumbnail]
 | 
			
		||||
            for thumbnail_data in media_thumbnail:
 | 
			
		||||
                thumbnail = thumbnail_data.get('@attributes', {})
 | 
			
		||||
                thumbnail_url = thumbnail.get('url')
 | 
			
		||||
                thumbnail_url = url_or_none(thumbnail.get('url'))
 | 
			
		||||
                if not thumbnail_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                thumbnails.append({
 | 
			
		||||
| 
						 | 
				
			
			@ -51,7 +52,7 @@ class AMPIE(InfoExtractor):
 | 
			
		|||
                media_subtitle = [media_subtitle]
 | 
			
		||||
            for subtitle_data in media_subtitle:
 | 
			
		||||
                subtitle = subtitle_data.get('@attributes', {})
 | 
			
		||||
                subtitle_href = subtitle.get('href')
 | 
			
		||||
                subtitle_href = url_or_none(subtitle.get('href'))
 | 
			
		||||
                if not subtitle_href:
 | 
			
		||||
                    continue
 | 
			
		||||
                subtitles.setdefault(subtitle.get('lang') or 'en', []).append({
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +66,7 @@ class AMPIE(InfoExtractor):
 | 
			
		|||
            media_content = [media_content]
 | 
			
		||||
        for media_data in media_content:
 | 
			
		||||
            media = media_data.get('@attributes', {})
 | 
			
		||||
            media_url = media.get('url')
 | 
			
		||||
            media_url = url_or_none(media.get('url'))
 | 
			
		||||
            if not media_url:
 | 
			
		||||
                continue
 | 
			
		||||
            ext = mimetype2ext(media.get('type')) or determine_ext(media_url)
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +80,7 @@ class AMPIE(InfoExtractor):
 | 
			
		|||
            else:
 | 
			
		||||
                formats.append({
 | 
			
		||||
                    'format_id': media_data.get('media-category', {}).get('@attributes', {}).get('label'),
 | 
			
		||||
                    'url': media['url'],
 | 
			
		||||
                    'url': media_url,
 | 
			
		||||
                    'tbr': int_or_none(media.get('bitrate')),
 | 
			
		||||
                    'filesize': int_or_none(media.get('fileSize')),
 | 
			
		||||
                    'ext': ext,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,7 @@ from ..utils import (
 | 
			
		|||
    determine_ext,
 | 
			
		||||
    extract_attributes,
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    urlencode_postdata,
 | 
			
		||||
    urljoin,
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -165,7 +166,7 @@ class AnimeOnDemandIE(InfoExtractor):
 | 
			
		|||
                        }, fatal=False)
 | 
			
		||||
                    if not playlist:
 | 
			
		||||
                        continue
 | 
			
		||||
                    stream_url = playlist.get('streamurl')
 | 
			
		||||
                    stream_url = url_or_none(playlist.get('streamurl'))
 | 
			
		||||
                    if stream_url:
 | 
			
		||||
                        rtmp = re.search(
 | 
			
		||||
                            r'^(?P<url>rtmpe?://(?P<host>[^/]+)/(?P<app>.+/))(?P<playpath>mp[34]:.+)',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,7 @@ from .common import InfoExtractor
 | 
			
		|||
from ..utils import (
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -77,7 +78,7 @@ class AolIE(InfoExtractor):
 | 
			
		|||
            formats.extend(self._extract_m3u8_formats(
 | 
			
		||||
                m3u8_url, video_id, 'mp4', m3u8_id='hls', fatal=False))
 | 
			
		||||
        for rendition in video_data.get('renditions', []):
 | 
			
		||||
            video_url = rendition.get('url')
 | 
			
		||||
            video_url = url_or_none(rendition.get('url'))
 | 
			
		||||
            if not video_url:
 | 
			
		||||
                continue
 | 
			
		||||
            ext = rendition.get('format')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,10 +4,10 @@ from __future__ import unicode_literals
 | 
			
		|||
import re
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    determine_ext,
 | 
			
		||||
    js_to_json,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -68,8 +68,8 @@ class APAIE(InfoExtractor):
 | 
			
		|||
        for source in sources:
 | 
			
		||||
            if not isinstance(source, dict):
 | 
			
		||||
                continue
 | 
			
		||||
            source_url = source.get('file')
 | 
			
		||||
            if not source_url or not isinstance(source_url, compat_str):
 | 
			
		||||
            source_url = url_or_none(source.get('file'))
 | 
			
		||||
            if not source_url:
 | 
			
		||||
                continue
 | 
			
		||||
            ext = determine_ext(source_url)
 | 
			
		||||
            if ext == 'm3u8':
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,7 @@ from .common import InfoExtractor
 | 
			
		|||
from ..utils import (
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    mimetype2ext,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -43,7 +44,7 @@ class AparatIE(InfoExtractor):
 | 
			
		|||
 | 
			
		||||
        formats = []
 | 
			
		||||
        for item in file_list[0]:
 | 
			
		||||
            file_url = item.get('file')
 | 
			
		||||
            file_url = url_or_none(item.get('file'))
 | 
			
		||||
            if not file_url:
 | 
			
		||||
                continue
 | 
			
		||||
            ext = mimetype2ext(item.get('type'))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,6 @@ import re
 | 
			
		|||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from .generic import GenericIE
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    determine_ext,
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
| 
						 | 
				
			
			@ -15,6 +14,7 @@ from ..utils import (
 | 
			
		|||
    unified_strdate,
 | 
			
		||||
    xpath_text,
 | 
			
		||||
    update_url_query,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
from ..compat import compat_etree_fromstring
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -100,7 +100,7 @@ class ARDMediathekIE(InfoExtractor):
 | 
			
		|||
                quality = stream.get('_quality')
 | 
			
		||||
                server = stream.get('_server')
 | 
			
		||||
                for stream_url in stream_urls:
 | 
			
		||||
                    if not isinstance(stream_url, compat_str) or '//' not in stream_url:
 | 
			
		||||
                    if not url_or_none(stream_url):
 | 
			
		||||
                        continue
 | 
			
		||||
                    ext = determine_ext(stream_url)
 | 
			
		||||
                    if quality != 'auto' and ext in ('f4m', 'm3u8'):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@ from ..utils import (
 | 
			
		|||
    unescapeHTML,
 | 
			
		||||
    update_url_query,
 | 
			
		||||
    unified_strdate,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -131,8 +132,8 @@ class BandcampIE(InfoExtractor):
 | 
			
		|||
                fatal=False)
 | 
			
		||||
            if not stat:
 | 
			
		||||
                continue
 | 
			
		||||
            retry_url = stat.get('retry_url')
 | 
			
		||||
            if not isinstance(retry_url, compat_str):
 | 
			
		||||
            retry_url = url_or_none(stat.get('retry_url'))
 | 
			
		||||
            if not retry_url:
 | 
			
		||||
                continue
 | 
			
		||||
            formats.append({
 | 
			
		||||
                'url': self._proto_relative_url(retry_url, 'http:'),
 | 
			
		||||
| 
						 | 
				
			
			@ -306,7 +307,7 @@ class BandcampWeeklyIE(InfoExtractor):
 | 
			
		|||
 | 
			
		||||
        formats = []
 | 
			
		||||
        for format_id, format_url in show['audio_stream'].items():
 | 
			
		||||
            if not isinstance(format_url, compat_str):
 | 
			
		||||
            if not url_or_none(format_url):
 | 
			
		||||
                continue
 | 
			
		||||
            for known_ext in KNOWN_EXTENSIONS:
 | 
			
		||||
                if known_ext in format_id:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,8 +4,10 @@ import re
 | 
			
		|||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from .youtube import YoutubeIE
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import int_or_none
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BreakIE(InfoExtractor):
 | 
			
		||||
| 
						 | 
				
			
			@ -55,8 +57,8 @@ class BreakIE(InfoExtractor):
 | 
			
		|||
 | 
			
		||||
        formats = []
 | 
			
		||||
        for video in content:
 | 
			
		||||
            video_url = video.get('url')
 | 
			
		||||
            if not video_url or not isinstance(video_url, compat_str):
 | 
			
		||||
            video_url = url_or_none(video.get('url'))
 | 
			
		||||
            if not video_url:
 | 
			
		||||
                continue
 | 
			
		||||
            bitrate = int_or_none(self._search_regex(
 | 
			
		||||
                r'(\d+)_kbps', video_url, 'tbr', default=None))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,10 +2,10 @@
 | 
			
		|||
from __future__ import unicode_literals
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -56,8 +56,8 @@ class CamModelsIE(InfoExtractor):
 | 
			
		|||
            for media in encodings:
 | 
			
		||||
                if not isinstance(media, dict):
 | 
			
		||||
                    continue
 | 
			
		||||
                media_url = media.get('location')
 | 
			
		||||
                if not media_url or not isinstance(media_url, compat_str):
 | 
			
		||||
                media_url = url_or_none(media.get('location'))
 | 
			
		||||
                if not media_url:
 | 
			
		||||
                    continue
 | 
			
		||||
 | 
			
		||||
                format_id_list = [format_id]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,13 +4,13 @@ from __future__ import unicode_literals
 | 
			
		|||
import re
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    clean_html,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    parse_duration,
 | 
			
		||||
    parse_iso8601,
 | 
			
		||||
    parse_resolution,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -53,8 +53,8 @@ class CCMAIE(InfoExtractor):
 | 
			
		|||
        media_url = media['media']['url']
 | 
			
		||||
        if isinstance(media_url, list):
 | 
			
		||||
            for format_ in media_url:
 | 
			
		||||
                format_url = format_.get('file')
 | 
			
		||||
                if not format_url or not isinstance(format_url, compat_str):
 | 
			
		||||
                format_url = url_or_none(format_.get('file'))
 | 
			
		||||
                if not format_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                label = format_.get('label')
 | 
			
		||||
                f = parse_resolution(label)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,16 +4,14 @@ from __future__ import unicode_literals, division
 | 
			
		|||
import re
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import (
 | 
			
		||||
    compat_str,
 | 
			
		||||
    compat_HTTPError,
 | 
			
		||||
)
 | 
			
		||||
from ..compat import compat_HTTPError
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    determine_ext,
 | 
			
		||||
    float_or_none,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    parse_age_limit,
 | 
			
		||||
    parse_duration,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    ExtractorError
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -86,8 +84,8 @@ class CrackleIE(InfoExtractor):
 | 
			
		|||
            for e in media['MediaURLs']:
 | 
			
		||||
                if e.get('UseDRM') is True:
 | 
			
		||||
                    continue
 | 
			
		||||
                format_url = e.get('Path')
 | 
			
		||||
                if not format_url or not isinstance(format_url, compat_str):
 | 
			
		||||
                format_url = url_or_none(e.get('Path'))
 | 
			
		||||
                if not format_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                ext = determine_ext(format_url)
 | 
			
		||||
                if ext == 'm3u8':
 | 
			
		||||
| 
						 | 
				
			
			@ -124,8 +122,8 @@ class CrackleIE(InfoExtractor):
 | 
			
		|||
                for cc_file in cc_files:
 | 
			
		||||
                    if not isinstance(cc_file, dict):
 | 
			
		||||
                        continue
 | 
			
		||||
                    cc_url = cc_file.get('Path')
 | 
			
		||||
                    if not cc_url or not isinstance(cc_url, compat_str):
 | 
			
		||||
                    cc_url = url_or_none(cc_file.get('Path'))
 | 
			
		||||
                    if not cc_url:
 | 
			
		||||
                        continue
 | 
			
		||||
                    lang = cc_file.get('Locale') or 'en'
 | 
			
		||||
                    subtitles.setdefault(lang, []).append({'url': cc_url})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,7 @@ from ..utils import (
 | 
			
		|||
    float_or_none,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    unified_timestamp,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -69,7 +70,7 @@ class DctpTvIE(InfoExtractor):
 | 
			
		|||
            endpoint = next(
 | 
			
		||||
                server['endpoint']
 | 
			
		||||
                for server in servers
 | 
			
		||||
                if isinstance(server.get('endpoint'), compat_str) and
 | 
			
		||||
                if url_or_none(server.get('endpoint')) and
 | 
			
		||||
                'cloudfront' in server['endpoint'])
 | 
			
		||||
        else:
 | 
			
		||||
            endpoint = 'rtmpe://s2pqqn4u96e4j8.cloudfront.net/cfx/st/'
 | 
			
		||||
| 
						 | 
				
			
			@ -92,8 +93,8 @@ class DctpTvIE(InfoExtractor):
 | 
			
		|||
            for image in images:
 | 
			
		||||
                if not isinstance(image, dict):
 | 
			
		||||
                    continue
 | 
			
		||||
                image_url = image.get('url')
 | 
			
		||||
                if not image_url or not isinstance(image_url, compat_str):
 | 
			
		||||
                image_url = url_or_none(image.get('url'))
 | 
			
		||||
                if not image_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                thumbnails.append({
 | 
			
		||||
                    'url': image_url,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,6 @@ from __future__ import unicode_literals
 | 
			
		|||
import re
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    determine_ext,
 | 
			
		||||
    extract_attributes,
 | 
			
		||||
| 
						 | 
				
			
			@ -12,6 +11,7 @@ from ..utils import (
 | 
			
		|||
    parse_age_limit,
 | 
			
		||||
    remove_end,
 | 
			
		||||
    unescapeHTML,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -69,9 +69,8 @@ class DiscoveryGoBaseIE(InfoExtractor):
 | 
			
		|||
        captions = stream.get('captions')
 | 
			
		||||
        if isinstance(captions, list):
 | 
			
		||||
            for caption in captions:
 | 
			
		||||
                subtitle_url = caption.get('fileUrl')
 | 
			
		||||
                if (not subtitle_url or not isinstance(subtitle_url, compat_str) or
 | 
			
		||||
                        not subtitle_url.startswith('http')):
 | 
			
		||||
                subtitle_url = url_or_none(caption.get('fileUrl'))
 | 
			
		||||
                if not subtitle_url or not subtitle_url.startswith('http'):
 | 
			
		||||
                    continue
 | 
			
		||||
                lang = caption.get('fileLang', 'en')
 | 
			
		||||
                ext = determine_ext(subtitle_url)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,6 @@ import json
 | 
			
		|||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import (
 | 
			
		||||
    compat_HTTPError,
 | 
			
		||||
    compat_str,
 | 
			
		||||
    compat_urlparse,
 | 
			
		||||
)
 | 
			
		||||
from ..utils import (
 | 
			
		||||
| 
						 | 
				
			
			@ -17,6 +16,7 @@ from ..utils import (
 | 
			
		|||
    parse_age_limit,
 | 
			
		||||
    parse_duration,
 | 
			
		||||
    unified_timestamp,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -139,8 +139,8 @@ class DramaFeverIE(DramaFeverBaseIE):
 | 
			
		|||
        for sub in subs:
 | 
			
		||||
            if not isinstance(sub, dict):
 | 
			
		||||
                continue
 | 
			
		||||
            sub_url = sub.get('url')
 | 
			
		||||
            if not sub_url or not isinstance(sub_url, compat_str):
 | 
			
		||||
            sub_url = url_or_none(sub.get('url'))
 | 
			
		||||
            if not sub_url:
 | 
			
		||||
                continue
 | 
			
		||||
            subtitles.setdefault(
 | 
			
		||||
                sub.get('code') or sub.get('language') or 'en', []).append({
 | 
			
		||||
| 
						 | 
				
			
			@ -163,8 +163,8 @@ class DramaFeverIE(DramaFeverBaseIE):
 | 
			
		|||
            for format_id, format_dict in download_assets.items():
 | 
			
		||||
                if not isinstance(format_dict, dict):
 | 
			
		||||
                    continue
 | 
			
		||||
                format_url = format_dict.get('url')
 | 
			
		||||
                if not format_url or not isinstance(format_url, compat_str):
 | 
			
		||||
                format_url = url_or_none(format_dict.get('url'))
 | 
			
		||||
                if not format_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                formats.append({
 | 
			
		||||
                    'url': format_url,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,14 +4,12 @@ from __future__ import unicode_literals
 | 
			
		|||
import re
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import (
 | 
			
		||||
    compat_HTTPError,
 | 
			
		||||
    compat_str,
 | 
			
		||||
)
 | 
			
		||||
from ..compat import compat_HTTPError
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    unsmuggle_url,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -177,7 +175,7 @@ class EaglePlatformIE(InfoExtractor):
 | 
			
		|||
            video_id, 'Downloading mp4 JSON', fatal=False)
 | 
			
		||||
        if mp4_data:
 | 
			
		||||
            for format_id, format_url in mp4_data.get('data', {}).items():
 | 
			
		||||
                if not isinstance(format_url, compat_str):
 | 
			
		||||
                if not url_or_none(format_url):
 | 
			
		||||
                    continue
 | 
			
		||||
                height = int_or_none(format_id)
 | 
			
		||||
                if height is not None and m3u8_formats_dict.get(height):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,7 @@ from ..utils import (
 | 
			
		|||
    int_or_none,
 | 
			
		||||
    try_get,
 | 
			
		||||
    unified_timestamp,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -34,8 +35,8 @@ class EggheadCourseIE(InfoExtractor):
 | 
			
		|||
 | 
			
		||||
        entries = []
 | 
			
		||||
        for lesson in lessons:
 | 
			
		||||
            lesson_url = lesson.get('http_url')
 | 
			
		||||
            if not lesson_url or not isinstance(lesson_url, compat_str):
 | 
			
		||||
            lesson_url = url_or_none(lesson.get('http_url'))
 | 
			
		||||
            if not lesson_url:
 | 
			
		||||
                continue
 | 
			
		||||
            lesson_id = lesson.get('id')
 | 
			
		||||
            if lesson_id:
 | 
			
		||||
| 
						 | 
				
			
			@ -95,7 +96,8 @@ class EggheadLessonIE(InfoExtractor):
 | 
			
		|||
 | 
			
		||||
        formats = []
 | 
			
		||||
        for _, format_url in lesson['media_urls'].items():
 | 
			
		||||
            if not format_url or not isinstance(format_url, compat_str):
 | 
			
		||||
            format_url = url_or_none(format_url)
 | 
			
		||||
            if not format_url:
 | 
			
		||||
                continue
 | 
			
		||||
            ext = determine_ext(format_url)
 | 
			
		||||
            if ext == 'm3u8':
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,7 @@ from ..utils import (
 | 
			
		|||
    int_or_none,
 | 
			
		||||
    parse_duration,
 | 
			
		||||
    str_to_int,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -82,8 +83,8 @@ class EpornerIE(InfoExtractor):
 | 
			
		|||
            for format_id, format_dict in formats_dict.items():
 | 
			
		||||
                if not isinstance(format_dict, dict):
 | 
			
		||||
                    continue
 | 
			
		||||
                src = format_dict.get('src')
 | 
			
		||||
                if not isinstance(src, compat_str) or not src.startswith('http'):
 | 
			
		||||
                src = url_or_none(format_dict.get('src'))
 | 
			
		||||
                if not src or not src.startswith('http'):
 | 
			
		||||
                    continue
 | 
			
		||||
                if kind == 'hls':
 | 
			
		||||
                    formats.extend(self._extract_m3u8_formats(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ from ..utils import (
 | 
			
		|||
    int_or_none,
 | 
			
		||||
    qualities,
 | 
			
		||||
    unified_strdate,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -88,8 +89,8 @@ class FirstTVIE(InfoExtractor):
 | 
			
		|||
            formats = []
 | 
			
		||||
            path = None
 | 
			
		||||
            for f in item.get('mbr', []):
 | 
			
		||||
                src = f.get('src')
 | 
			
		||||
                if not src or not isinstance(src, compat_str):
 | 
			
		||||
                src = url_or_none(f.get('src'))
 | 
			
		||||
                if not src:
 | 
			
		||||
                    continue
 | 
			
		||||
                tbr = int_or_none(self._search_regex(
 | 
			
		||||
                    r'_(\d{3,})\.mp4', src, 'tbr', default=None))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,7 @@ from ..utils import (
 | 
			
		|||
    int_or_none,
 | 
			
		||||
    parse_duration,
 | 
			
		||||
    try_get,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
from .dailymotion import DailymotionIE
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -115,14 +116,13 @@ class FranceTVIE(InfoExtractor):
 | 
			
		|||
 | 
			
		||||
        def sign(manifest_url, manifest_id):
 | 
			
		||||
            for host in ('hdfauthftv-a.akamaihd.net', 'hdfauth.francetv.fr'):
 | 
			
		||||
                signed_url = self._download_webpage(
 | 
			
		||||
                signed_url = url_or_none(self._download_webpage(
 | 
			
		||||
                    'https://%s/esi/TA' % host, video_id,
 | 
			
		||||
                    'Downloading signed %s manifest URL' % manifest_id,
 | 
			
		||||
                    fatal=False, query={
 | 
			
		||||
                        'url': manifest_url,
 | 
			
		||||
                    })
 | 
			
		||||
                if (signed_url and isinstance(signed_url, compat_str) and
 | 
			
		||||
                        re.search(r'^(?:https?:)?//', signed_url)):
 | 
			
		||||
                    }))
 | 
			
		||||
                if signed_url:
 | 
			
		||||
                    return signed_url
 | 
			
		||||
            return manifest_url
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,7 @@ from ..compat import (
 | 
			
		|||
from ..utils import (
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    parse_duration,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    urlencode_postdata,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +81,7 @@ class FrontendMastersPageBaseIE(FrontendMastersBaseIE):
 | 
			
		|||
        chapters = []
 | 
			
		||||
        lesson_elements = course.get('lessonElements')
 | 
			
		||||
        if isinstance(lesson_elements, list):
 | 
			
		||||
            chapters = [e for e in lesson_elements if isinstance(e, compat_str)]
 | 
			
		||||
            chapters = [url_or_none(e) for e in lesson_elements if url_or_none(e)]
 | 
			
		||||
        return chapters
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,7 @@ from ..utils import (
 | 
			
		|||
    unified_strdate,
 | 
			
		||||
    unsmuggle_url,
 | 
			
		||||
    UnsupportedError,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    xpath_text,
 | 
			
		||||
)
 | 
			
		||||
from .commonprotocols import RtmpIE
 | 
			
		||||
| 
						 | 
				
			
			@ -3130,8 +3131,8 @@ class GenericIE(InfoExtractor):
 | 
			
		|||
                sources = [sources]
 | 
			
		||||
            formats = []
 | 
			
		||||
            for source in sources:
 | 
			
		||||
                src = source.get('src')
 | 
			
		||||
                if not src or not isinstance(src, compat_str):
 | 
			
		||||
                src = url_or_none(source.get('src'))
 | 
			
		||||
                if not src:
 | 
			
		||||
                    continue
 | 
			
		||||
                src = compat_urlparse.urljoin(url, src)
 | 
			
		||||
                src_type = source.get('type')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,7 @@ from ..compat import compat_str
 | 
			
		|||
from ..utils import (
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    urlencode_postdata,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -80,8 +81,8 @@ class HiDiveIE(InfoExtractor):
 | 
			
		|||
            bitrates = rendition.get('bitrates')
 | 
			
		||||
            if not isinstance(bitrates, dict):
 | 
			
		||||
                continue
 | 
			
		||||
            m3u8_url = bitrates.get('hls')
 | 
			
		||||
            if not isinstance(m3u8_url, compat_str):
 | 
			
		||||
            m3u8_url = url_or_none(bitrates.get('hls'))
 | 
			
		||||
            if not m3u8_url:
 | 
			
		||||
                continue
 | 
			
		||||
            formats.extend(self._extract_m3u8_formats(
 | 
			
		||||
                m3u8_url, video_id, 'mp4', entry_protocol='m3u8_native',
 | 
			
		||||
| 
						 | 
				
			
			@ -93,9 +94,8 @@ class HiDiveIE(InfoExtractor):
 | 
			
		|||
                if not isinstance(cc_file, list) or len(cc_file) < 3:
 | 
			
		||||
                    continue
 | 
			
		||||
                cc_lang = cc_file[0]
 | 
			
		||||
                cc_url = cc_file[2]
 | 
			
		||||
                if not isinstance(cc_lang, compat_str) or not isinstance(
 | 
			
		||||
                        cc_url, compat_str):
 | 
			
		||||
                cc_url = url_or_none(cc_file[2])
 | 
			
		||||
                if not isinstance(cc_lang, compat_str) or not cc_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                subtitles.setdefault(cc_lang, []).append({
 | 
			
		||||
                    'url': cc_url,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,12 +3,12 @@ from __future__ import unicode_literals
 | 
			
		|||
import re
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    determine_ext,
 | 
			
		||||
    mimetype2ext,
 | 
			
		||||
    parse_duration,
 | 
			
		||||
    qualities,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -61,8 +61,8 @@ class ImdbIE(InfoExtractor):
 | 
			
		|||
        for encoding in video_metadata.get('encodings', []):
 | 
			
		||||
            if not encoding or not isinstance(encoding, dict):
 | 
			
		||||
                continue
 | 
			
		||||
            video_url = encoding.get('videoUrl')
 | 
			
		||||
            if not video_url or not isinstance(video_url, compat_str):
 | 
			
		||||
            video_url = url_or_none(encoding.get('videoUrl'))
 | 
			
		||||
            if not video_url:
 | 
			
		||||
                continue
 | 
			
		||||
            ext = determine_ext(video_url, mimetype2ext(encoding.get('mimeType')))
 | 
			
		||||
            if ext == 'm3u8':
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,6 +17,7 @@ from ..utils import (
 | 
			
		|||
    lowercase_escape,
 | 
			
		||||
    std_headers,
 | 
			
		||||
    try_get,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -170,7 +171,7 @@ class InstagramIE(InfoExtractor):
 | 
			
		|||
                            node = try_get(edge, lambda x: x['node'], dict)
 | 
			
		||||
                            if not node:
 | 
			
		||||
                                continue
 | 
			
		||||
                            node_video_url = try_get(node, lambda x: x['video_url'], compat_str)
 | 
			
		||||
                            node_video_url = url_or_none(node.get('video_url'))
 | 
			
		||||
                            if not node_video_url:
 | 
			
		||||
                                continue
 | 
			
		||||
                            entries.append({
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ from ..utils import (
 | 
			
		|||
    merge_dicts,
 | 
			
		||||
    parse_duration,
 | 
			
		||||
    smuggle_url,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    xpath_with_ns,
 | 
			
		||||
    xpath_element,
 | 
			
		||||
    xpath_text,
 | 
			
		||||
| 
						 | 
				
			
			@ -250,8 +251,8 @@ class ITVIE(InfoExtractor):
 | 
			
		|||
                    for sub in subs:
 | 
			
		||||
                        if not isinstance(sub, dict):
 | 
			
		||||
                            continue
 | 
			
		||||
                        href = sub.get('Href')
 | 
			
		||||
                        if isinstance(href, compat_str):
 | 
			
		||||
                        href = url_or_none(sub.get('Href'))
 | 
			
		||||
                        if href:
 | 
			
		||||
                            extract_subtitle(href)
 | 
			
		||||
                if not info.get('duration'):
 | 
			
		||||
                    info['duration'] = parse_duration(video_data.get('Duration'))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,16 +4,14 @@ import re
 | 
			
		|||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..aes import aes_decrypt_text
 | 
			
		||||
from ..compat import (
 | 
			
		||||
    compat_str,
 | 
			
		||||
    compat_urllib_parse_unquote,
 | 
			
		||||
)
 | 
			
		||||
from ..compat import compat_urllib_parse_unquote
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    determine_ext,
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    str_to_int,
 | 
			
		||||
    strip_or_none,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +53,8 @@ class KeezMoviesIE(InfoExtractor):
 | 
			
		|||
        encrypted = False
 | 
			
		||||
 | 
			
		||||
        def extract_format(format_url, height=None):
 | 
			
		||||
            if not isinstance(format_url, compat_str) or not format_url.startswith(('http', '//')):
 | 
			
		||||
            format_url = url_or_none(format_url)
 | 
			
		||||
            if not format_url or not format_url.startswith(('http', '//')):
 | 
			
		||||
                return
 | 
			
		||||
            if format_url in format_urls:
 | 
			
		||||
                return
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,11 +2,11 @@
 | 
			
		|||
from __future__ import unicode_literals
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    determine_ext,
 | 
			
		||||
    float_or_none,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -109,7 +109,8 @@ class KonserthusetPlayIE(InfoExtractor):
 | 
			
		|||
        captions = source.get('captionsAvailableLanguages')
 | 
			
		||||
        if isinstance(captions, dict):
 | 
			
		||||
            for lang, subtitle_url in captions.items():
 | 
			
		||||
                if lang != 'none' and isinstance(subtitle_url, compat_str):
 | 
			
		||||
                subtitle_url = url_or_none(subtitle_url)
 | 
			
		||||
                if lang != 'none' and subtitle_url:
 | 
			
		||||
                    subtitles.setdefault(lang, []).append({'url': subtitle_url})
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,6 +15,7 @@ from ..utils import (
 | 
			
		|||
    mimetype2ext,
 | 
			
		||||
    unescapeHTML,
 | 
			
		||||
    unsmuggle_url,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    urljoin,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -156,8 +157,8 @@ class MediasiteIE(InfoExtractor):
 | 
			
		|||
 | 
			
		||||
            stream_formats = []
 | 
			
		||||
            for unum, VideoUrl in enumerate(video_urls):
 | 
			
		||||
                video_url = VideoUrl.get('Location')
 | 
			
		||||
                if not video_url or not isinstance(video_url, compat_str):
 | 
			
		||||
                video_url = url_or_none(VideoUrl.get('Location'))
 | 
			
		||||
                if not video_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                # XXX: if Stream.get('CanChangeScheme', False), switch scheme to HTTP/HTTPS
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ from ..utils import (
 | 
			
		|||
    parse_resolution,
 | 
			
		||||
    try_get,
 | 
			
		||||
    unified_timestamp,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    urljoin,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -200,8 +201,8 @@ class PeerTubeIE(InfoExtractor):
 | 
			
		|||
        for file_ in video['files']:
 | 
			
		||||
            if not isinstance(file_, dict):
 | 
			
		||||
                continue
 | 
			
		||||
            file_url = file_.get('fileUrl')
 | 
			
		||||
            if not file_url or not isinstance(file_url, compat_str):
 | 
			
		||||
            file_url = url_or_none(file_.get('fileUrl'))
 | 
			
		||||
            if not file_url:
 | 
			
		||||
                continue
 | 
			
		||||
            file_size = int_or_none(file_.get('size'))
 | 
			
		||||
            format_id = try_get(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,12 +3,12 @@ from __future__ import unicode_literals
 | 
			
		|||
import re
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    str_to_int,
 | 
			
		||||
    unified_strdate,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -71,8 +71,8 @@ class RedTubeIE(InfoExtractor):
 | 
			
		|||
            video_id, fatal=False)
 | 
			
		||||
        if medias and isinstance(medias, list):
 | 
			
		||||
            for media in medias:
 | 
			
		||||
                format_url = media.get('videoUrl')
 | 
			
		||||
                if not format_url or not isinstance(format_url, compat_str):
 | 
			
		||||
                format_url = url_or_none(media.get('videoUrl'))
 | 
			
		||||
                if not format_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                format_id = media.get('quality')
 | 
			
		||||
                formats.append({
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ from ..compat import compat_str
 | 
			
		|||
from ..utils import (
 | 
			
		||||
    determine_ext,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -37,8 +38,8 @@ class RENTVIE(InfoExtractor):
 | 
			
		|||
        title = config['title']
 | 
			
		||||
        formats = []
 | 
			
		||||
        for video in config['src']:
 | 
			
		||||
            src = video.get('src')
 | 
			
		||||
            if not src or not isinstance(src, compat_str):
 | 
			
		||||
            src = url_or_none(video.get('src'))
 | 
			
		||||
            if not src:
 | 
			
		||||
                continue
 | 
			
		||||
            ext = determine_ext(src)
 | 
			
		||||
            if ext == 'm3u8':
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,7 @@ from ..utils import (
 | 
			
		|||
    int_or_none,
 | 
			
		||||
    try_get,
 | 
			
		||||
    unified_timestamp,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -176,8 +177,8 @@ class RutubePlaylistBaseIE(RutubeBaseIE):
 | 
			
		|||
                break
 | 
			
		||||
 | 
			
		||||
            for result in results:
 | 
			
		||||
                video_url = result.get('video_url')
 | 
			
		||||
                if not video_url or not isinstance(video_url, compat_str):
 | 
			
		||||
                video_url = url_or_none(result.get('video_url'))
 | 
			
		||||
                if not video_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                entry = self._extract_video(result, require_title=False)
 | 
			
		||||
                entry.update({
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,6 +15,7 @@ from ..utils import (
 | 
			
		|||
    update_url_query,
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    strip_or_none,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -154,8 +155,8 @@ class TurnerBaseIE(AdobePassIE):
 | 
			
		|||
        subtitles = {}
 | 
			
		||||
        for source in video_data.findall('closedCaptions/source'):
 | 
			
		||||
            for track in source.findall('track'):
 | 
			
		||||
                track_url = track.get('url')
 | 
			
		||||
                if not isinstance(track_url, compat_str) or track_url.endswith('/big'):
 | 
			
		||||
                track_url = url_or_none(track.get('url'))
 | 
			
		||||
                if not track_url or track_url.endswith('/big'):
 | 
			
		||||
                    continue
 | 
			
		||||
                lang = track.get('lang') or track.get('label') or 'en'
 | 
			
		||||
                subtitles.setdefault(lang, []).append({
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,10 +4,10 @@ from __future__ import unicode_literals
 | 
			
		|||
import re
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    unescapeHTML,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -106,9 +106,8 @@ class TVNetIE(InfoExtractor):
 | 
			
		|||
        for stream in self._download_json(data_file, video_id):
 | 
			
		||||
            if not isinstance(stream, dict):
 | 
			
		||||
                continue
 | 
			
		||||
            stream_url = stream.get('url')
 | 
			
		||||
            if (stream_url in stream_urls or not stream_url or
 | 
			
		||||
                    not isinstance(stream_url, compat_str)):
 | 
			
		||||
            stream_url = url_or_none(stream.get('url'))
 | 
			
		||||
            if stream_url in stream_urls or not stream_url:
 | 
			
		||||
                continue
 | 
			
		||||
            stream_urls.add(stream_url)
 | 
			
		||||
            formats.extend(self._extract_m3u8_formats(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@ from ..utils import (
 | 
			
		|||
    try_get,
 | 
			
		||||
    unsmuggle_url,
 | 
			
		||||
    update_url_query,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -255,7 +256,8 @@ class TVPlayIE(InfoExtractor):
 | 
			
		|||
        quality = qualities(['hls', 'medium', 'high'])
 | 
			
		||||
        formats = []
 | 
			
		||||
        for format_id, video_url in streams.get('streams', {}).items():
 | 
			
		||||
            if not video_url or not isinstance(video_url, compat_str):
 | 
			
		||||
            video_url = url_or_none(video_url)
 | 
			
		||||
            if not video_url:
 | 
			
		||||
                continue
 | 
			
		||||
            ext = determine_ext(video_url)
 | 
			
		||||
            if ext == 'f4m':
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,7 @@ from ..utils import (
 | 
			
		|||
    unified_timestamp,
 | 
			
		||||
    update_url_query,
 | 
			
		||||
    urlencode_postdata,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    urljoin,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -663,8 +664,8 @@ class TwitchClipsIE(TwitchBaseIE):
 | 
			
		|||
        for option in status['quality_options']:
 | 
			
		||||
            if not isinstance(option, dict):
 | 
			
		||||
                continue
 | 
			
		||||
            source = option.get('source')
 | 
			
		||||
            if not source or not isinstance(source, compat_str):
 | 
			
		||||
            source = url_or_none(option.get('source'))
 | 
			
		||||
            if not source:
 | 
			
		||||
                continue
 | 
			
		||||
            formats.append({
 | 
			
		||||
                'url': source,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ from ..utils import (
 | 
			
		|||
    sanitized_Request,
 | 
			
		||||
    try_get,
 | 
			
		||||
    unescapeHTML,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    urlencode_postdata,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -265,8 +266,8 @@ class UdemyIE(InfoExtractor):
 | 
			
		|||
            if not isinstance(source_list, list):
 | 
			
		||||
                return
 | 
			
		||||
            for source in source_list:
 | 
			
		||||
                video_url = source.get('file') or source.get('src')
 | 
			
		||||
                if not video_url or not isinstance(video_url, compat_str):
 | 
			
		||||
                video_url = url_or_none(source.get('file') or source.get('src'))
 | 
			
		||||
                if not video_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                if source.get('type') == 'application/x-mpegURL' or determine_ext(video_url) == 'm3u8':
 | 
			
		||||
                    formats.extend(self._extract_m3u8_formats(
 | 
			
		||||
| 
						 | 
				
			
			@ -293,8 +294,8 @@ class UdemyIE(InfoExtractor):
 | 
			
		|||
                    continue
 | 
			
		||||
                if track.get('kind') != 'captions':
 | 
			
		||||
                    continue
 | 
			
		||||
                src = track.get('src')
 | 
			
		||||
                if not src or not isinstance(src, compat_str):
 | 
			
		||||
                src = url_or_none(track.get('src'))
 | 
			
		||||
                if not src:
 | 
			
		||||
                    continue
 | 
			
		||||
                lang = track.get('language') or track.get(
 | 
			
		||||
                    'srclang') or track.get('label')
 | 
			
		||||
| 
						 | 
				
			
			@ -314,8 +315,8 @@ class UdemyIE(InfoExtractor):
 | 
			
		|||
            for cc in captions:
 | 
			
		||||
                if not isinstance(cc, dict):
 | 
			
		||||
                    continue
 | 
			
		||||
                cc_url = cc.get('url')
 | 
			
		||||
                if not cc_url or not isinstance(cc_url, compat_str):
 | 
			
		||||
                cc_url = url_or_none(cc.get('url'))
 | 
			
		||||
                if not cc_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                lang = try_get(cc, lambda x: x['locale']['locale'], compat_str)
 | 
			
		||||
                sub_dict = (automatic_captions if cc.get('source') == 'auto'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,15 +3,13 @@ from __future__ import unicode_literals
 | 
			
		|||
import itertools
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import (
 | 
			
		||||
    compat_HTTPError,
 | 
			
		||||
    compat_str,
 | 
			
		||||
)
 | 
			
		||||
from ..compat import compat_HTTPError
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    float_or_none,
 | 
			
		||||
    parse_iso8601,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -166,8 +164,8 @@ class VidmeIE(InfoExtractor):
 | 
			
		|||
 | 
			
		||||
        formats = []
 | 
			
		||||
        for f in video.get('formats', []):
 | 
			
		||||
            format_url = f.get('uri')
 | 
			
		||||
            if not format_url or not isinstance(format_url, compat_str):
 | 
			
		||||
            format_url = url_or_none(f.get('uri'))
 | 
			
		||||
            if not format_url:
 | 
			
		||||
                continue
 | 
			
		||||
            format_type = f.get('type')
 | 
			
		||||
            if format_type == 'dash':
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ from ..utils import (
 | 
			
		|||
    str_to_int,
 | 
			
		||||
    unescapeHTML,
 | 
			
		||||
    unified_timestamp,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    urlencode_postdata,
 | 
			
		||||
)
 | 
			
		||||
from .dailymotion import DailymotionIE
 | 
			
		||||
| 
						 | 
				
			
			@ -423,7 +424,8 @@ class VKIE(VKBaseIE):
 | 
			
		|||
 | 
			
		||||
        formats = []
 | 
			
		||||
        for format_id, format_url in data.items():
 | 
			
		||||
            if not isinstance(format_url, compat_str) or not format_url.startswith(('http', '//', 'rtmp')):
 | 
			
		||||
            format_url = url_or_none(format_url)
 | 
			
		||||
            if not format_url or not format_url.startswith(('http', '//', 'rtmp')):
 | 
			
		||||
                continue
 | 
			
		||||
            if (format_id.startswith(('url', 'cache')) or
 | 
			
		||||
                    format_id in ('extra_data', 'live_mp4', 'postlive_mp4')):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,7 @@ from ..utils import (
 | 
			
		|||
    parse_duration,
 | 
			
		||||
    try_get,
 | 
			
		||||
    unified_strdate,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -137,7 +138,8 @@ class XHamsterIE(InfoExtractor):
 | 
			
		|||
                    else:
 | 
			
		||||
                        format_url = format_item
 | 
			
		||||
                        filesize = None
 | 
			
		||||
                    if not isinstance(format_url, compat_str):
 | 
			
		||||
                    format_url = url_or_none(format_url)
 | 
			
		||||
                    if not format_url:
 | 
			
		||||
                        continue
 | 
			
		||||
                    formats.append({
 | 
			
		||||
                        'format_id': '%s-%s' % (format_id, quality),
 | 
			
		||||
| 
						 | 
				
			
			@ -198,7 +200,8 @@ class XHamsterIE(InfoExtractor):
 | 
			
		|||
                default='{}'),
 | 
			
		||||
            video_id, fatal=False)
 | 
			
		||||
        for format_id, format_url in sources.items():
 | 
			
		||||
            if not isinstance(format_url, compat_str):
 | 
			
		||||
            format_url = url_or_none(format_url)
 | 
			
		||||
            if not format_url:
 | 
			
		||||
                continue
 | 
			
		||||
            if format_url in format_urls:
 | 
			
		||||
                continue
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,12 +4,12 @@ from __future__ import unicode_literals
 | 
			
		|||
import re
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    qualities,
 | 
			
		||||
    unescapeHTML,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -80,9 +80,9 @@ class YapFilesIE(InfoExtractor):
 | 
			
		|||
        formats = []
 | 
			
		||||
        for format_id in QUALITIES:
 | 
			
		||||
            is_hd = format_id == 'hd'
 | 
			
		||||
            format_url = playlist.get(
 | 
			
		||||
                'file%s' % ('_hd' if is_hd else ''))
 | 
			
		||||
            if not format_url or not isinstance(format_url, compat_str):
 | 
			
		||||
            format_url = url_or_none(playlist.get(
 | 
			
		||||
                'file%s' % ('_hd' if is_hd else '')))
 | 
			
		||||
            if not format_url:
 | 
			
		||||
                continue
 | 
			
		||||
            formats.append({
 | 
			
		||||
                'url': format_url,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,11 +3,11 @@ from __future__ import unicode_literals
 | 
			
		|||
import re
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    determine_ext,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    parse_duration,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -50,8 +50,8 @@ class YouJizzIE(InfoExtractor):
 | 
			
		|||
        for encoding in encodings:
 | 
			
		||||
            if not isinstance(encoding, dict):
 | 
			
		||||
                continue
 | 
			
		||||
            format_url = encoding.get('filename')
 | 
			
		||||
            if not isinstance(format_url, compat_str):
 | 
			
		||||
            format_url = url_or_none(encoding.get('filename'))
 | 
			
		||||
            if not format_url:
 | 
			
		||||
                continue
 | 
			
		||||
            if determine_ext(format_url) == 'm3u8':
 | 
			
		||||
                formats.extend(self._extract_m3u8_formats(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,13 +3,13 @@ from __future__ import unicode_literals
 | 
			
		|||
import re
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    sanitized_Request,
 | 
			
		||||
    str_to_int,
 | 
			
		||||
    unescapeHTML,
 | 
			
		||||
    unified_strdate,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
)
 | 
			
		||||
from ..aes import aes_decrypt_text
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -88,8 +88,8 @@ class YouPornIE(InfoExtractor):
 | 
			
		|||
            for definition in definitions:
 | 
			
		||||
                if not isinstance(definition, dict):
 | 
			
		||||
                    continue
 | 
			
		||||
                video_url = definition.get('videoUrl')
 | 
			
		||||
                if isinstance(video_url, compat_str) and video_url:
 | 
			
		||||
                video_url = url_or_none(definition.get('videoUrl'))
 | 
			
		||||
                if video_url:
 | 
			
		||||
                    links.append(video_url)
 | 
			
		||||
 | 
			
		||||
        # Fallback #1, this also contains extra low quality 180p format
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,7 @@ from ..utils import (
 | 
			
		|||
    ExtractorError,
 | 
			
		||||
    int_or_none,
 | 
			
		||||
    try_get,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    urlencode_postdata,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -150,8 +151,8 @@ class ZattooBaseIE(InfoExtractor):
 | 
			
		|||
            for watch in watch_urls:
 | 
			
		||||
                if not isinstance(watch, dict):
 | 
			
		||||
                    continue
 | 
			
		||||
                watch_url = watch.get('url')
 | 
			
		||||
                if not watch_url or not isinstance(watch_url, compat_str):
 | 
			
		||||
                watch_url = url_or_none(watch.get('url'))
 | 
			
		||||
                if not watch_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                format_id_list = [stream_type]
 | 
			
		||||
                maxrate = watch.get('maxrate')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,6 +15,7 @@ from ..utils import (
 | 
			
		|||
    try_get,
 | 
			
		||||
    unified_timestamp,
 | 
			
		||||
    update_url_query,
 | 
			
		||||
    url_or_none,
 | 
			
		||||
    urljoin,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -67,8 +68,8 @@ class ZDFIE(ZDFBaseIE):
 | 
			
		|||
    def _extract_subtitles(src):
 | 
			
		||||
        subtitles = {}
 | 
			
		||||
        for caption in try_get(src, lambda x: x['captions'], list) or []:
 | 
			
		||||
            subtitle_url = caption.get('uri')
 | 
			
		||||
            if subtitle_url and isinstance(subtitle_url, compat_str):
 | 
			
		||||
            subtitle_url = url_or_none(caption.get('uri'))
 | 
			
		||||
            if subtitle_url:
 | 
			
		||||
                lang = caption.get('language', 'deu')
 | 
			
		||||
                subtitles.setdefault(lang, []).append({
 | 
			
		||||
                    'url': subtitle_url,
 | 
			
		||||
| 
						 | 
				
			
			@ -76,8 +77,8 @@ class ZDFIE(ZDFBaseIE):
 | 
			
		|||
        return subtitles
 | 
			
		||||
 | 
			
		||||
    def _extract_format(self, video_id, formats, format_urls, meta):
 | 
			
		||||
        format_url = meta.get('url')
 | 
			
		||||
        if not format_url or not isinstance(format_url, compat_str):
 | 
			
		||||
        format_url = url_or_none(meta.get('url'))
 | 
			
		||||
        if not format_url:
 | 
			
		||||
            return
 | 
			
		||||
        if format_url in format_urls:
 | 
			
		||||
            return
 | 
			
		||||
| 
						 | 
				
			
			@ -152,7 +153,8 @@ class ZDFIE(ZDFBaseIE):
 | 
			
		|||
            content, lambda x: x['teaserImageRef']['layouts'], dict)
 | 
			
		||||
        if layouts:
 | 
			
		||||
            for layout_key, layout_url in layouts.items():
 | 
			
		||||
                if not isinstance(layout_url, compat_str):
 | 
			
		||||
                layout_url = url_or_none(layout_url)
 | 
			
		||||
                if not layout_url:
 | 
			
		||||
                    continue
 | 
			
		||||
                thumbnail = {
 | 
			
		||||
                    'url': layout_url,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue