1
0
Fork 0
mirror of https://gitlab.com/dstftw/youtube-dl.git synced 2020-11-16 09:42:26 +00:00

[peertube] Improve generic support (closes #16733)

This commit is contained in:
Sergey M․ 2018-06-19 23:00:36 +07:00
parent e12b4b8bcc
commit 8b4b400aef
No known key found for this signature in database
GPG key ID: 2C393E0F18A9236D
2 changed files with 35 additions and 14 deletions

View file

@ -3076,7 +3076,7 @@ class GenericIE(InfoExtractor):
return self.playlist_from_matches( return self.playlist_from_matches(
cloudflarestream_urls, video_id, video_title, ie=CloudflareStreamIE.ie_key()) cloudflarestream_urls, video_id, video_title, ie=CloudflareStreamIE.ie_key())
peertube_urls = PeerTubeIE._extract_urls(webpage) peertube_urls = PeerTubeIE._extract_urls(webpage, url)
if peertube_urls: if peertube_urls:
return self.playlist_from_matches( return self.playlist_from_matches(
peertube_urls, video_id, video_title, ie=PeerTubeIE.ie_key()) peertube_urls, video_id, video_title, ie=PeerTubeIE.ie_key())

View file

@ -116,12 +116,14 @@ class PeerTubeIE(InfoExtractor):
videos\.tcit\.fr| videos\.tcit\.fr|
peertube\.cpy\.re peertube\.cpy\.re
)''' )'''
_UUID_RE = r'[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}'
_VALID_URL = r'''(?x) _VALID_URL = r'''(?x)
https?:// (?:
%s peertube:(?P<host>[^:]+):|
/(?:videos/(?:watch|embed)|api/v\d/videos)/ https?://(?P<host_2>%s)/(?:videos/(?:watch|embed)|api/v\d/videos)/
(?P<id>[^/?\#&]+) )
''' % _INSTANCES_RE (?P<id>%s)
''' % (_INSTANCES_RE, _UUID_RE)
_TESTS = [{ _TESTS = [{
'url': 'https://peertube.moe/videos/watch/2790feb0-8120-4e63-9af3-c943c69f5e6c', 'url': 'https://peertube.moe/videos/watch/2790feb0-8120-4e63-9af3-c943c69f5e6c',
'md5': '80f24ff364cc9d333529506a263e7feb', 'md5': '80f24ff364cc9d333529506a263e7feb',
@ -157,21 +159,40 @@ class PeerTubeIE(InfoExtractor):
}, { }, {
'url': 'https://tube.openalgeria.org/api/v1/videos/c1875674-97d0-4c94-a058-3f7e64c962e8', 'url': 'https://tube.openalgeria.org/api/v1/videos/c1875674-97d0-4c94-a058-3f7e64c962e8',
'only_matching': True, 'only_matching': True,
}, {
'url': 'peertube:video.blender.org:b37a5b9f-e6b5-415c-b700-04a5cd6ec205',
'only_matching': True,
}] }]
@staticmethod @staticmethod
def _extract_urls(webpage): def _extract_peertube_url(webpage, source_url):
return [ mobj = re.match(
mobj.group('url') r'https?://(?P<host>[^/]+)/videos/watch/(?P<id>%s)'
for mobj in re.finditer( % PeerTubeIE._UUID_RE, source_url)
r'''(?x)<iframe[^>]+\bsrc=(["\'])(?P<url>(?:https?:)?//%s/videos/embed/[^/?\#&]+)\1''' if mobj and any(p in webpage for p in (
% PeerTubeIE._INSTANCES_RE, webpage)] '<title>PeerTube<',
'There will be other non JS-based clients to access PeerTube',
'>We are sorry but it seems that PeerTube is not compatible with your web browser.<')):
return 'peertube:%s:%s' % mobj.group('host', 'id')
@staticmethod
def _extract_urls(webpage, source_url):
entries = re.findall(
r'''(?x)<iframe[^>]+\bsrc=["\'](?P<url>(?:https?:)?//%s/videos/embed/%s)'''
% (PeerTubeIE._INSTANCES_RE, PeerTubeIE._UUID_RE), webpage)
if not entries:
peertube_url = PeerTubeIE._extract_peertube_url(webpage, source_url)
if peertube_url:
entries = [peertube_url]
return entries
def _real_extract(self, url): def _real_extract(self, url):
video_id = self._match_id(url) mobj = re.match(self._VALID_URL, url)
host = mobj.group('host') or mobj.group('host_2')
video_id = mobj.group('id')
video = self._download_json( video = self._download_json(
urljoin(url, '/api/v1/videos/%s' % video_id), video_id) 'https://%s/api/v1/videos/%s' % (host, video_id), video_id)
title = video['name'] title = video['name']