|
|
@ -3,6 +3,7 @@ from __future__ import unicode_literals
|
|
|
|
import re
|
|
|
|
import re
|
|
|
|
|
|
|
|
|
|
|
|
from .common import InfoExtractor
|
|
|
|
from .common import InfoExtractor
|
|
|
|
|
|
|
|
from ..compat import compat_str
|
|
|
|
from ..utils import (
|
|
|
|
from ..utils import (
|
|
|
|
get_element_by_attribute,
|
|
|
|
get_element_by_attribute,
|
|
|
|
int_or_none,
|
|
|
|
int_or_none,
|
|
|
@ -50,6 +51,33 @@ class InstagramIE(InfoExtractor):
|
|
|
|
'params': {
|
|
|
|
'params': {
|
|
|
|
'skip_download': True,
|
|
|
|
'skip_download': True,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
}, {
|
|
|
|
|
|
|
|
# multi video post
|
|
|
|
|
|
|
|
'url': 'https://www.instagram.com/p/BQ0eAlwhDrw/',
|
|
|
|
|
|
|
|
'playlist': [{
|
|
|
|
|
|
|
|
'info_dict': {
|
|
|
|
|
|
|
|
'id': 'BQ0dSaohpPW',
|
|
|
|
|
|
|
|
'ext': 'mp4',
|
|
|
|
|
|
|
|
'title': 'Video 1',
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}, {
|
|
|
|
|
|
|
|
'info_dict': {
|
|
|
|
|
|
|
|
'id': 'BQ0dTpOhuHT',
|
|
|
|
|
|
|
|
'ext': 'mp4',
|
|
|
|
|
|
|
|
'title': 'Video 2',
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}, {
|
|
|
|
|
|
|
|
'info_dict': {
|
|
|
|
|
|
|
|
'id': 'BQ0dT7RBFeF',
|
|
|
|
|
|
|
|
'ext': 'mp4',
|
|
|
|
|
|
|
|
'title': 'Video 3',
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}],
|
|
|
|
|
|
|
|
'info_dict': {
|
|
|
|
|
|
|
|
'id': 'BQ0eAlwhDrw',
|
|
|
|
|
|
|
|
'title': 'Post by instagram',
|
|
|
|
|
|
|
|
'description': 'md5:0f9203fc6a2ce4d228da5754bcf54957',
|
|
|
|
|
|
|
|
},
|
|
|
|
}, {
|
|
|
|
}, {
|
|
|
|
'url': 'https://instagram.com/p/-Cmh1cukG2/',
|
|
|
|
'url': 'https://instagram.com/p/-Cmh1cukG2/',
|
|
|
|
'only_matching': True,
|
|
|
|
'only_matching': True,
|
|
|
@ -113,6 +141,32 @@ class InstagramIE(InfoExtractor):
|
|
|
|
'timestamp': int_or_none(comment.get('created_at')),
|
|
|
|
'timestamp': int_or_none(comment.get('created_at')),
|
|
|
|
} for comment in media.get(
|
|
|
|
} for comment in media.get(
|
|
|
|
'comments', {}).get('nodes', []) if comment.get('text')]
|
|
|
|
'comments', {}).get('nodes', []) if comment.get('text')]
|
|
|
|
|
|
|
|
if not video_url:
|
|
|
|
|
|
|
|
edges = try_get(
|
|
|
|
|
|
|
|
media, lambda x: x['edge_sidecar_to_children']['edges'],
|
|
|
|
|
|
|
|
list) or []
|
|
|
|
|
|
|
|
if edges:
|
|
|
|
|
|
|
|
entries = []
|
|
|
|
|
|
|
|
for edge_num, edge in enumerate(edges, start=1):
|
|
|
|
|
|
|
|
node = try_get(edge, lambda x: x['node'], dict)
|
|
|
|
|
|
|
|
if not node:
|
|
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
node_video_url = try_get(node, lambda x: x['video_url'], compat_str)
|
|
|
|
|
|
|
|
if not node_video_url:
|
|
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
entries.append({
|
|
|
|
|
|
|
|
'id': node.get('shortcode') or node['id'],
|
|
|
|
|
|
|
|
'title': 'Video %d' % edge_num,
|
|
|
|
|
|
|
|
'url': node_video_url,
|
|
|
|
|
|
|
|
'thumbnail': node.get('display_url'),
|
|
|
|
|
|
|
|
'width': int_or_none(try_get(node, lambda x: x['dimensions']['width'])),
|
|
|
|
|
|
|
|
'height': int_or_none(try_get(node, lambda x: x['dimensions']['height'])),
|
|
|
|
|
|
|
|
'view_count': int_or_none(node.get('video_view_count')),
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
return self.playlist_result(
|
|
|
|
|
|
|
|
entries, video_id,
|
|
|
|
|
|
|
|
'Post by %s' % uploader_id if uploader_id else None,
|
|
|
|
|
|
|
|
description)
|
|
|
|
|
|
|
|
|
|
|
|
if not video_url:
|
|
|
|
if not video_url:
|
|
|
|
video_url = self._og_search_video_url(webpage, secure=False)
|
|
|
|
video_url = self._og_search_video_url(webpage, secure=False)
|
|
|
|