From c7deaa4c745382634ac5a910cc68efa4211f7456 Mon Sep 17 00:00:00 2001 From: Philipp Hagemeister Date: Tue, 24 Dec 2013 23:32:04 +0100 Subject: [PATCH] [zdf] Use centralized sorting --- youtube_dl/YoutubeDL.py | 2 ++ youtube_dl/extractor/common.py | 10 +++++++++- youtube_dl/extractor/zdf.py | 28 +++++++--------------------- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 4910a2912..88f4b11f6 100644 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -1014,6 +1014,8 @@ def format_resolution(format, default='unknown'): def list_formats(self, info_dict): def format_note(fdict): res = u'' + if f.get('ext') in ['f4f', 'f4m']: + res += u'(unsupported) ' if fdict.get('format_note') is not None: res += fdict['format_note'] + u' ' if (fdict.get('vcodec') is not None and diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index 0a90382de..05f0cb6d5 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -9,6 +9,7 @@ from ..utils import ( compat_http_client, compat_urllib_error, + compat_urllib_parse_urlparse, compat_str, clean_html, @@ -62,6 +63,9 @@ class InfoExtractor(object): * vcodec Name of the video codec in use * filesize The number of bytes, if known in advance * player_url SWF Player URL (used for rtmpdump). + * protocol The protocol that will be used for the actual + download, lower-case. + "http", "https", "rtsp", "rtmp" or so. * preference Order number of this format. If this field is present, the formats get sorted by this field. -1 for default (order by other properties), @@ -445,7 +449,11 @@ def _formats_key(f): preference = f.get('preference') if preference is None: - preference = 0 if f.get('url', '').startswith('http') else -0.1 + proto = f.get('protocol') + if proto is None: + proto = compat_urllib_parse_urlparse(f.get('url', '')).scheme + + preference = 0 if proto in ['http', 'https'] else -0.1 if f.get('ext') in ['f4f', 'f4m']: # Not yet supported preference -= 0.5 diff --git a/youtube_dl/extractor/zdf.py b/youtube_dl/extractor/zdf.py index 35ece354a..94594c5d6 100644 --- a/youtube_dl/extractor/zdf.py +++ b/youtube_dl/extractor/zdf.py @@ -67,29 +67,13 @@ def xml_to_format(fnode): ''', format_id) ext = format_m.group('container') - is_supported = ext != 'f4f' - - PROTO_ORDER = ['http', 'rtmp', 'rtsp'] - try: - proto_pref = -PROTO_ORDER.index(format_m.group('proto')) - except ValueError: - proto_pref = -999 + proto = format_m.group('proto') quality = fnode.find('./quality').text - QUALITY_ORDER = ['veryhigh', '300', 'high', 'med', 'low'] - try: - quality_pref = -QUALITY_ORDER.index(quality) - except ValueError: - quality_pref = -999 - abr = int(fnode.find('./audioBitrate').text) // 1000 vbr = int(fnode.find('./videoBitrate').text) // 1000 - pref = (is_available, is_supported, - proto_pref, quality_pref, vbr, abr) format_note = u'' - if not is_supported: - format_note += u'(unsupported)' if not format_note: format_note = None @@ -105,14 +89,16 @@ def xml_to_format(fnode): 'height': int(fnode.find('./height').text), 'filesize': int(fnode.find('./filesize').text), 'format_note': format_note, - '_pref': pref, + 'protocol': format_m.group('proto').lower(), '_available': is_available, } format_nodes = doc.findall('.//formitaeten/formitaet') - formats = sorted(filter(lambda f: f['_available'], - map(xml_to_format, format_nodes)), - key=operator.itemgetter('_pref')) + formats = list(filter( + lambda f: f['_available'], + map(xml_to_format, format_nodes))) + + self._sort_formats(formats) return { 'id': video_id,