|
@@ -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,
|
|
|
)
|
|
|
|
|
|
|
|
@@ -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:
|