1
0
mirror of https://github.com/yt-dlp/yt-dlp.git synced 2024-11-07 19:52:40 +01:00
pukkandan 2021-08-23 21:51:42 +05:30
parent ea81966e64
commit a181cd0c60
No known key found for this signature in database
GPG Key ID: 0F00D95A001F4698

View File

@ -20,6 +20,7 @@
int_or_none, int_or_none,
js_to_json, js_to_json,
limit_length, limit_length,
merge_dicts,
network_exceptions, network_exceptions,
parse_count, parse_count,
qualities, qualities,
@ -80,7 +81,8 @@ class FacebookIE(InfoExtractor):
'info_dict': { 'info_dict': {
'id': '274175099429670', 'id': '274175099429670',
'ext': 'mp4', 'ext': 'mp4',
'title': 're:^Asif Nawab Butt posted a video', 'title': 'Asif Nawab Butt',
'description': 'Asif Nawab Butt',
'uploader': 'Asif Nawab Butt', 'uploader': 'Asif Nawab Butt',
'upload_date': '20140506', 'upload_date': '20140506',
'timestamp': 1399398998, 'timestamp': 1399398998,
@ -135,15 +137,17 @@ class FacebookIE(InfoExtractor):
'upload_date': '20160223', 'upload_date': '20160223',
'uploader': 'Barack Obama', 'uploader': 'Barack Obama',
}, },
'skip': 'Gif on giphy.com gone',
}, { }, {
# have 1080P, but only up to 720p in swf params # have 1080P, but only up to 720p in swf params
# data.video.story.attachments[].media # data.video.story.attachments[].media
'url': 'https://www.facebook.com/cnn/videos/10155529876156509/', 'url': 'https://www.facebook.com/cnn/videos/10155529876156509/',
'md5': '9571fae53d4165bbbadb17a94651dcdc', 'md5': '3f3798adb2b73423263e59376f1f5eb7',
'info_dict': { 'info_dict': {
'id': '10155529876156509', 'id': '10155529876156509',
'ext': 'mp4', 'ext': 'mp4',
'title': 'She survived the holocaust — and years later, shes getting her citizenship s...', 'title': 'Holocaust survivor becomes US citizen',
'description': 'She survived the holocaust — and years later, shes getting her citizenship so she can vote for Hillary Clinton http://cnn.it/2eERh5f',
'timestamp': 1477818095, 'timestamp': 1477818095,
'upload_date': '20161030', 'upload_date': '20161030',
'uploader': 'CNN', 'uploader': 'CNN',
@ -157,15 +161,18 @@ class FacebookIE(InfoExtractor):
'info_dict': { 'info_dict': {
'id': '1417995061575415', 'id': '1417995061575415',
'ext': 'mp4', 'ext': 'mp4',
'title': 'md5:1db063d6a8c13faa8da727817339c857', 'title': 'Yaroslav Korpan - Довгоочікуване відео',
'timestamp': 1486648217, 'description': 'Довгоочікуване відео',
'timestamp': 1486648771,
'upload_date': '20170209', 'upload_date': '20170209',
'uploader': 'Yaroslav Korpan', 'uploader': 'Yaroslav Korpan',
'uploader_id': '100000948048708',
}, },
'params': { 'params': {
'skip_download': True, 'skip_download': True,
}, },
}, { }, {
# FIXME
'url': 'https://www.facebook.com/LaGuiaDelVaron/posts/1072691702860471', 'url': 'https://www.facebook.com/LaGuiaDelVaron/posts/1072691702860471',
'info_dict': { 'info_dict': {
'id': '1072691702860471', 'id': '1072691702860471',
@ -183,12 +190,14 @@ class FacebookIE(InfoExtractor):
# data.node.comet_sections.content.story.attachments[].style_type_renderer.attachment.media # data.node.comet_sections.content.story.attachments[].style_type_renderer.attachment.media
'url': 'https://www.facebook.com/groups/1024490957622648/permalink/1396382447100162/', 'url': 'https://www.facebook.com/groups/1024490957622648/permalink/1396382447100162/',
'info_dict': { 'info_dict': {
'id': '1396382447100162', 'id': '202882990186699',
'ext': 'mp4', 'ext': 'mp4',
'title': 'md5:19a428bbde91364e3de815383b54a235', 'title': 'Elisabeth Ahtn - Hello? Yes your uber ride is here\n* Jukin...',
'timestamp': 1486035494, 'description': 'Hello? Yes your uber ride is here\n* Jukin Media Verified *\nFind this video and others like it by visiting...',
'timestamp': 1486035513,
'upload_date': '20170202', 'upload_date': '20170202',
'uploader': 'Elisabeth Ahtn', 'uploader': 'Elisabeth Ahtn',
'uploader_id': '100013949973717',
}, },
'params': { 'params': {
'skip_download': True, 'skip_download': True,
@ -229,8 +238,12 @@ class FacebookIE(InfoExtractor):
'info_dict': { 'info_dict': {
'id': '359649331226507', 'id': '359649331226507',
'ext': 'mp4', 'ext': 'mp4',
'title': '#ESLOne VoD - Birmingham Finals Day#1 Fnatic vs. @Evil Geniuses', 'title': 'Fnatic vs. EG - Group A - Opening Match - ESL One Birmingham Day 1',
'description': '#ESLOne VoD - Birmingham Finals Day#1 Fnatic vs. @Evil Geniuses',
'timestamp': 1527084179,
'upload_date': '20180523',
'uploader': 'ESL One Dota 2', 'uploader': 'ESL One Dota 2',
'uploader_id': '234218833769558',
}, },
'params': { 'params': {
'skip_download': True, 'skip_download': True,
@ -247,6 +260,7 @@ class FacebookIE(InfoExtractor):
'url': 'https://www.facebook.com/watch/?v=647537299265662', 'url': 'https://www.facebook.com/watch/?v=647537299265662',
'only_matching': True, 'only_matching': True,
}, { }, {
# FIXME: https://github.com/yt-dlp/yt-dlp/issues/542
# data.node.comet_sections.content.story.attachments[].style_type_renderer.attachment.all_subattachments.nodes[].media # data.node.comet_sections.content.story.attachments[].style_type_renderer.attachment.all_subattachments.nodes[].media
'url': 'https://www.facebook.com/PankajShahLondon/posts/10157667649866271', 'url': 'https://www.facebook.com/PankajShahLondon/posts/10157667649866271',
'info_dict': { 'info_dict': {
@ -277,6 +291,7 @@ class FacebookIE(InfoExtractor):
'upload_date': '20161122', 'upload_date': '20161122',
'timestamp': 1479793574, 'timestamp': 1479793574,
}, },
'skip': 'No video',
}, { }, {
# data.video.creation_story.attachments[].media # data.video.creation_story.attachments[].media
'url': 'https://www.facebook.com/watch/live/?v=1823658634322275', 'url': 'https://www.facebook.com/watch/live/?v=1823658634322275',
@ -379,6 +394,56 @@ def _extract_from_url(self, url, video_id):
webpage = self._download_webpage( webpage = self._download_webpage(
url.replace('://m.facebook.com/', '://www.facebook.com/'), video_id) url.replace('://m.facebook.com/', '://www.facebook.com/'), video_id)
def extract_metadata(webpage):
video_title = self._html_search_regex(
r'<h2\s+[^>]*class="uiHeaderTitle"[^>]*>([^<]*)</h2>', webpage,
'title', default=None)
if not video_title:
video_title = self._html_search_regex(
r'(?s)<span class="fbPhotosPhotoCaption".*?id="fbPhotoPageCaption"><span class="hasCaption">(.*?)</span>',
webpage, 'alternative title', default=None)
if not video_title:
video_title = self._html_search_meta(
['og:title', 'twitter:title', 'description'],
webpage, 'title', default=None)
if video_title:
video_title = limit_length(video_title, 80)
else:
video_title = 'Facebook video #%s' % video_id
description = self._html_search_meta(
['description', 'og:description', 'twitter:description'],
webpage, 'description', default=None)
uploader = clean_html(get_element_by_id(
'fbPhotoPageAuthorName', webpage)) or self._search_regex(
r'ownerName\s*:\s*"([^"]+)"', webpage, 'uploader',
default=None) or self._og_search_title(webpage, fatal=False)
timestamp = int_or_none(self._search_regex(
r'<abbr[^>]+data-utime=["\'](\d+)', webpage,
'timestamp', default=None))
thumbnail = self._html_search_meta(
['og:image', 'twitter:image'], webpage, 'thumbnail', default=None)
# some webpages contain unretrievable thumbnail urls
# like https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=10155168902769113&get_thumbnail=1
# in https://www.facebook.com/yaroslav.korpan/videos/1417995061575415/
if thumbnail and not re.search(r'\.(?:jpg|png)', thumbnail):
thumbnail = None
view_count = parse_count(self._search_regex(
r'\bviewCount\s*:\s*["\']([\d,.]+)', webpage, 'view count',
default=None))
info_dict = {
'title': video_title,
'description': description,
'uploader': uploader,
'timestamp': timestamp,
'thumbnail': thumbnail,
'view_count': view_count,
}
info_json_ld = self._search_json_ld(webpage, video_id, default={})
if info_json_ld.get('title'):
info_json_ld['title'] = limit_length(
re.sub(r'\s*\|\s*Facebook$', '', info_json_ld['title']), 80)
return merge_dicts(info_json_ld, info_dict)
video_data = None video_data = None
def extract_video_data(instances): def extract_video_data(instances):
@ -511,8 +576,16 @@ def parse_attachment(attachment, key='media'):
if not entries: if not entries:
parse_graphql_video(video) parse_graphql_video(video)
if len(entries) > 1:
return self.playlist_result(entries, video_id) return self.playlist_result(entries, video_id)
video_info = entries[0]
webpage_info = extract_metadata(webpage)
# honor precise duration in video info
if video_info.get('duration'):
webpage_info['duration'] = video_info['duration']
return merge_dicts(webpage_info, video_info)
if not video_data: if not video_data:
m_msg = re.search(r'class="[^"]*uiInterstitialContent[^"]*"><div>(.*?)</div>', webpage) m_msg = re.search(r'class="[^"]*uiInterstitialContent[^"]*"><div>(.*?)</div>', webpage)
if m_msg is not None: if m_msg is not None:
@ -629,39 +702,12 @@ def parse_attachment(attachment, key='media'):
process_formats(formats) process_formats(formats)
description = self._html_search_meta('description', webpage, default=None)
video_title = self._html_search_regex(
(r'<h2\s+[^>]*class="uiHeaderTitle"[^>]*>([^<]*)</h2>',
r'(?s)<span class="fbPhotosPhotoCaption".*?id="fbPhotoPageCaption"><span class="hasCaption">(.*?)</span>'),
webpage, 'title', default=None) or self._og_search_title(webpage, default=None) or description
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)) or self._search_regex(
r'ownerName\s*:\s*"([^"]+)"', webpage, 'uploader',
default=None) or self._og_search_title(webpage, fatal=False)
timestamp = int_or_none(self._search_regex(
r'<abbr[^>]+data-utime=["\'](\d+)', webpage,
'timestamp', default=None))
thumbnail = self._html_search_meta(['og:image', 'twitter:image'], webpage)
view_count = parse_count(self._search_regex(
r'\bviewCount\s*:\s*["\']([\d,.]+)', webpage, 'view count',
default=None))
info_dict = { info_dict = {
'id': video_id, 'id': video_id,
'title': video_title,
'formats': formats, 'formats': formats,
'uploader': uploader,
'timestamp': timestamp,
'description': description,
'thumbnail': thumbnail,
'view_count': view_count,
'subtitles': subtitles, 'subtitles': subtitles,
} }
info_dict.update(extract_metadata(webpage))
return info_dict return info_dict