diff options
| author | Sergey M․ <dstftw@gmail.com> | 2015-05-05 02:50:58 +0600 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2015-05-05 02:50:58 +0600 | 
| commit | bbe718c97fb63405afebade6ed38fcf36272ce9d (patch) | |
| tree | bb478bc37649d6e8e75517679c44dc793dd8bed9 | |
| parent | 1aa43d77c084bc2dd735fcd3d03b8b2fc3407c51 (diff) | |
| parent | 01e4b1ee14a3e9dedcb6a156c6eaf1603a8a0592 (diff) | |
Merge branch 'Tassatux-noco'
| -rw-r--r-- | youtube_dl/extractor/noco.py | 137 | 
1 files changed, 86 insertions, 51 deletions
diff --git a/youtube_dl/extractor/noco.py b/youtube_dl/extractor/noco.py index 251e6da07..5674ee2a4 100644 --- a/youtube_dl/extractor/noco.py +++ b/youtube_dl/extractor/noco.py @@ -14,6 +14,9 @@ from ..compat import (  from ..utils import (      clean_html,      ExtractorError, +    int_or_none, +    float_or_none, +    parse_iso8601,      unified_strdate,  ) @@ -25,21 +28,38 @@ class NocoIE(InfoExtractor):      _SUB_LANG_TEMPLATE = '&sub_lang=%s'      _NETRC_MACHINE = 'noco' -    _TEST = { -        'url': 'http://noco.tv/emission/11538/nolife/ami-ami-idol-hello-france/', -        'md5': '0a993f0058ddbcd902630b2047ef710e', -        'info_dict': { -            'id': '11538', -            'ext': 'mp4', -            'title': 'Ami Ami Idol - Hello! France', -            'description': 'md5:4eaab46ab68fa4197a317a88a53d3b86', -            'upload_date': '20140412', -            'uploader': 'Nolife', -            'uploader_id': 'NOL', -            'duration': 2851.2, +    _TESTS = [ +        { +            'url': 'http://noco.tv/emission/11538/nolife/ami-ami-idol-hello-france/', +            'md5': '0a993f0058ddbcd902630b2047ef710e', +            'info_dict': { +                'id': '11538', +                'ext': 'mp4', +                'title': 'Ami Ami Idol - Hello! France', +                'description': 'md5:4eaab46ab68fa4197a317a88a53d3b86', +                'upload_date': '20140412', +                'uploader': 'Nolife', +                'uploader_id': 'NOL', +                'duration': 2851.2, +            }, +            'skip': 'Requires noco account',          }, -        'skip': 'Requires noco account', -    } +        { +            'url': 'http://noco.tv/emission/12610/lbl42/the-guild/s01e01-wake-up-call', +            'md5': 'c190f1f48e313c55838f1f412225934d', +            'info_dict': { +                'id': '12610', +                'ext': 'mp4', +                'title': 'The Guild #1 - Wake-Up Call', +                'timestamp': 1403863200, +                'upload_date': '20140627', +                'uploader': 'LBL42', +                'uploader_id': 'LBL', +                'duration': 233.023, +            }, +            'skip': 'Requires noco account', +        } +    ]      def _real_initialize(self):          self._login() @@ -90,51 +110,66 @@ class NocoIE(InfoExtractor):              'shows/%s/medias' % video_id,              video_id, 'Downloading video JSON') +        show = self._call_api( +            'shows/by_id/%s' % video_id, +            video_id, 'Downloading show JSON')[0] + +        options = self._call_api( +            'users/init', video_id, +            'Downloading user options JSON')['options'] +        audio_lang_pref = options.get('audio_language') or options.get('language', 'fr') + +        if audio_lang_pref == 'original': +            audio_lang_pref = show['original_lang'] +        if len(medias) == 1: +            audio_lang_pref = list(medias.keys())[0] +        elif audio_lang_pref not in medias: +            audio_lang_pref = 'fr' +          qualities = self._call_api(              'qualities',              video_id, 'Downloading qualities JSON')          formats = [] -        for lang, lang_dict in medias['fr']['video_list'].items(): -            for format_id, fmt in lang_dict['quality_list'].items(): -                format_id_extended = '%s-%s' % (lang, format_id) if lang != 'none' else format_id - -                video = self._call_api( -                    'shows/%s/video/%s/fr' % (video_id, format_id.lower()), -                    video_id, 'Downloading %s video JSON' % format_id_extended, -                    lang if lang != 'none' else None) - -                file_url = video['file'] -                if not file_url: -                    continue - -                if file_url in ['forbidden', 'not found']: -                    popmessage = video['popmessage'] -                    self._raise_error(popmessage['title'], popmessage['message']) - -                formats.append({ -                    'url': file_url, -                    'format_id': format_id_extended, -                    'width': fmt['res_width'], -                    'height': fmt['res_lines'], -                    'abr': fmt['audiobitrate'], -                    'vbr': fmt['videobitrate'], -                    'filesize': fmt['filesize'], -                    'format_note': qualities[format_id]['quality_name'], -                    'preference': qualities[format_id]['priority'], -                }) +        for audio_lang, audio_lang_dict in medias.items(): +            preference = 1 if audio_lang == audio_lang_pref else 0 +            for sub_lang, lang_dict in audio_lang_dict['video_list'].items(): +                for format_id, fmt in lang_dict['quality_list'].items(): +                    format_id_extended = 'audio-%s_sub-%s_%s' % (audio_lang, sub_lang, format_id) + +                    video = self._call_api( +                        'shows/%s/video/%s/%s' % (video_id, format_id.lower(), audio_lang), +                        video_id, 'Downloading %s video JSON' % format_id_extended, +                        sub_lang if sub_lang != 'none' else None) + +                    file_url = video['file'] +                    if not file_url: +                        continue + +                    if file_url in ['forbidden', 'not found']: +                        popmessage = video['popmessage'] +                        self._raise_error(popmessage['title'], popmessage['message']) + +                    formats.append({ +                        'url': file_url, +                        'format_id': format_id_extended, +                        'width': int_or_none(fmt.get('res_width')), +                        'height': int_or_none(fmt.get('res_lines')), +                        'abr': int_or_none(fmt.get('audiobitrate')), +                        'vbr': int_or_none(fmt.get('videobitrate')), +                        'filesize': int_or_none(fmt.get('filesize')), +                        'format_note': qualities[format_id].get('quality_name'), +                        'quality': qualities[format_id].get('priority'), +                        'preference': preference, +                    })          self._sort_formats(formats) -        show = self._call_api( -            'shows/by_id/%s' % video_id, -            video_id, 'Downloading show JSON')[0] - -        upload_date = unified_strdate(show['online_date_start_utc']) -        uploader = show['partner_name'] -        uploader_id = show['partner_key'] -        duration = show['duration_ms'] / 1000.0 +        timestamp = parse_iso8601(show.get('online_date_start_utc'), ' ') +        uploader = show.get('partner_name') +        uploader_id = show.get('partner_key') +        duration = float_or_none(show.get('duration_ms'), 1000)          thumbnails = []          for thumbnail_key, thumbnail_url in show.items(): @@ -166,7 +201,7 @@ class NocoIE(InfoExtractor):              'title': title,              'description': description,              'thumbnails': thumbnails, -            'upload_date': upload_date, +            'timestamp': timestamp,              'uploader': uploader,              'uploader_id': uploader_id,              'duration': duration,  | 
