diff options
Diffstat (limited to 'youtube_dl/extractor/facebook.py')
| -rw-r--r-- | youtube_dl/extractor/facebook.py | 48 | 
1 files changed, 36 insertions, 12 deletions
| diff --git a/youtube_dl/extractor/facebook.py b/youtube_dl/extractor/facebook.py index c0a7fc7d8..b325c8200 100644 --- a/youtube_dl/extractor/facebook.py +++ b/youtube_dl/extractor/facebook.py @@ -12,14 +12,16 @@ from ..compat import (      compat_urllib_parse_unquote_plus,  )  from ..utils import ( +    clean_html,      error_to_compat_str,      ExtractorError, +    get_element_by_id,      int_or_none, +    js_to_json,      limit_length,      sanitized_Request, +    try_get,      urlencode_postdata, -    get_element_by_id, -    clean_html,  ) @@ -71,7 +73,7 @@ class FacebookIE(InfoExtractor):          'info_dict': {              'id': '274175099429670',              'ext': 'mp4', -            'title': 'Facebook video #274175099429670', +            'title': 'Asif Nawab Butt posted a video to his Timeline.',              'uploader': 'Asif Nawab Butt',              'upload_date': '20140506',              'timestamp': 1399398998, @@ -243,14 +245,30 @@ class FacebookIE(InfoExtractor):          video_data = None +        def extract_video_data(instances): +            for item in instances: +                if item[1][0] == 'VideoConfig': +                    video_item = item[2][0] +                    if video_item.get('video_id') == video_id: +                        return video_item['videoData'] +          server_js_data = self._parse_json(self._search_regex( -            r'handleServerJS\(({.+})(?:\);|,")', webpage, 'server js data', default='{}'), video_id) -        for item in server_js_data.get('instances', []): -            if item[1][0] == 'VideoConfig': -                video_item = item[2][0] -                if video_item.get('video_id') == video_id: -                    video_data = video_item['videoData'] -                    break +            r'handleServerJS\(({.+})(?:\);|,")', webpage, +            'server js data', default='{}'), video_id, fatal=False) + +        if server_js_data: +            video_data = extract_video_data(server_js_data.get('instances', [])) + +        if not video_data: +            server_js_data = self._parse_json( +                self._search_regex( +                    r'bigPipe\.onPageletArrive\(({.+?})\)\s*;\s*}\s*\)\s*,\s*["\']onPageletArrive\s+stream_pagelet', +                    webpage, 'js data', default='{}'), +                video_id, transform_source=js_to_json, fatal=False) +            if server_js_data: +                video_data = extract_video_data(try_get( +                    server_js_data, lambda x: x['jsmods']['instances'], +                    list) or [])          if not video_data:              if not fatal_if_no_video: @@ -300,10 +318,16 @@ class FacebookIE(InfoExtractor):              video_title = self._html_search_regex(                  r'(?s)<span class="fbPhotosPhotoCaption".*?id="fbPhotoPageCaption"><span class="hasCaption">(.*?)</span>',                  webpage, 'alternative title', default=None) -            video_title = limit_length(video_title, 80)          if not video_title: +            video_title = self._html_search_meta( +                'description', webpage, 'title') +        if video_title: +            video_title = limit_length(video_title, 80) +        else:              video_title = 'Facebook video #%s' % video_id -        uploader = clean_html(get_element_by_id('fbPhotoPageAuthorName', webpage)) +        uploader = clean_html(get_element_by_id( +            'fbPhotoPageAuthorName', webpage)) or self._search_regex( +            r'ownerName\s*:\s*"([^"]+)"', webpage, 'uploader', fatal=False)          timestamp = int_or_none(self._search_regex(              r'<abbr[^>]+data-utime=["\'](\d+)', webpage,              'timestamp', default=None)) | 
