mirror of https://github.com/yt-dlp/yt-dlp.git
[youtube] Add Invidious list for playlists/channels (#1567)
Authored by: rhendric
This commit is contained in:
parent
e1b7c54d78
commit
d9190e4467
|
@ -259,6 +259,70 @@ class YoutubeBaseInfoExtractor(InfoExtractor):
|
||||||
# If True it will raise an error if no login info is provided
|
# If True it will raise an error if no login info is provided
|
||||||
_LOGIN_REQUIRED = False
|
_LOGIN_REQUIRED = False
|
||||||
|
|
||||||
|
_INVIDIOUS_SITES = (
|
||||||
|
# invidious-redirect websites
|
||||||
|
r'(?:www\.)?redirect\.invidious\.io',
|
||||||
|
r'(?:(?:www|dev)\.)?invidio\.us',
|
||||||
|
# Invidious instances taken from https://github.com/iv-org/documentation/blob/master/Invidious-Instances.md
|
||||||
|
r'(?:www\.)?invidious\.pussthecat\.org',
|
||||||
|
r'(?:www\.)?invidious\.zee\.li',
|
||||||
|
r'(?:www\.)?invidious\.ethibox\.fr',
|
||||||
|
r'(?:www\.)?invidious\.3o7z6yfxhbw7n3za4rss6l434kmv55cgw2vuziwuigpwegswvwzqipyd\.onion',
|
||||||
|
# youtube-dl invidious instances list
|
||||||
|
r'(?:(?:www|no)\.)?invidiou\.sh',
|
||||||
|
r'(?:(?:www|fi)\.)?invidious\.snopyta\.org',
|
||||||
|
r'(?:www\.)?invidious\.kabi\.tk',
|
||||||
|
r'(?:www\.)?invidious\.mastodon\.host',
|
||||||
|
r'(?:www\.)?invidious\.zapashcanon\.fr',
|
||||||
|
r'(?:www\.)?(?:invidious(?:-us)?|piped)\.kavin\.rocks',
|
||||||
|
r'(?:www\.)?invidious\.tinfoil-hat\.net',
|
||||||
|
r'(?:www\.)?invidious\.himiko\.cloud',
|
||||||
|
r'(?:www\.)?invidious\.reallyancient\.tech',
|
||||||
|
r'(?:www\.)?invidious\.tube',
|
||||||
|
r'(?:www\.)?invidiou\.site',
|
||||||
|
r'(?:www\.)?invidious\.site',
|
||||||
|
r'(?:www\.)?invidious\.xyz',
|
||||||
|
r'(?:www\.)?invidious\.nixnet\.xyz',
|
||||||
|
r'(?:www\.)?invidious\.048596\.xyz',
|
||||||
|
r'(?:www\.)?invidious\.drycat\.fr',
|
||||||
|
r'(?:www\.)?inv\.skyn3t\.in',
|
||||||
|
r'(?:www\.)?tube\.poal\.co',
|
||||||
|
r'(?:www\.)?tube\.connect\.cafe',
|
||||||
|
r'(?:www\.)?vid\.wxzm\.sx',
|
||||||
|
r'(?:www\.)?vid\.mint\.lgbt',
|
||||||
|
r'(?:www\.)?vid\.puffyan\.us',
|
||||||
|
r'(?:www\.)?yewtu\.be',
|
||||||
|
r'(?:www\.)?yt\.elukerio\.org',
|
||||||
|
r'(?:www\.)?yt\.lelux\.fi',
|
||||||
|
r'(?:www\.)?invidious\.ggc-project\.de',
|
||||||
|
r'(?:www\.)?yt\.maisputain\.ovh',
|
||||||
|
r'(?:www\.)?ytprivate\.com',
|
||||||
|
r'(?:www\.)?invidious\.13ad\.de',
|
||||||
|
r'(?:www\.)?invidious\.toot\.koeln',
|
||||||
|
r'(?:www\.)?invidious\.fdn\.fr',
|
||||||
|
r'(?:www\.)?watch\.nettohikari\.com',
|
||||||
|
r'(?:www\.)?invidious\.namazso\.eu',
|
||||||
|
r'(?:www\.)?invidious\.silkky\.cloud',
|
||||||
|
r'(?:www\.)?invidious\.exonip\.de',
|
||||||
|
r'(?:www\.)?invidious\.riverside\.rocks',
|
||||||
|
r'(?:www\.)?invidious\.blamefran\.net',
|
||||||
|
r'(?:www\.)?invidious\.moomoo\.de',
|
||||||
|
r'(?:www\.)?ytb\.trom\.tf',
|
||||||
|
r'(?:www\.)?yt\.cyberhost\.uk',
|
||||||
|
r'(?:www\.)?kgg2m7yk5aybusll\.onion',
|
||||||
|
r'(?:www\.)?qklhadlycap4cnod\.onion',
|
||||||
|
r'(?:www\.)?axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid\.onion',
|
||||||
|
r'(?:www\.)?c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid\.onion',
|
||||||
|
r'(?:www\.)?fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad\.onion',
|
||||||
|
r'(?:www\.)?invidious\.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd\.onion',
|
||||||
|
r'(?:www\.)?owxfohz4kjyv25fvlqilyxast7inivgiktls3th44jhk3ej3i7ya\.b32\.i2p',
|
||||||
|
r'(?:www\.)?4l2dgddgsrkf2ous66i6seeyi6etzfgrue332grh2n7madpwopotugyd\.onion',
|
||||||
|
r'(?:www\.)?w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd\.onion',
|
||||||
|
r'(?:www\.)?kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad\.onion',
|
||||||
|
r'(?:www\.)?grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad\.onion',
|
||||||
|
r'(?:www\.)?hpniueoejy4opn7bc4ftgazyqjoeqwlvh2uiku2xqku6zpoa4bf5ruid\.onion',
|
||||||
|
)
|
||||||
|
|
||||||
def _login(self):
|
def _login(self):
|
||||||
"""
|
"""
|
||||||
Attempt to log in to YouTube.
|
Attempt to log in to YouTube.
|
||||||
|
@ -697,69 +761,6 @@ class YoutubeBaseInfoExtractor(InfoExtractor):
|
||||||
|
|
||||||
class YoutubeIE(YoutubeBaseInfoExtractor):
|
class YoutubeIE(YoutubeBaseInfoExtractor):
|
||||||
IE_DESC = 'YouTube'
|
IE_DESC = 'YouTube'
|
||||||
_INVIDIOUS_SITES = (
|
|
||||||
# invidious-redirect websites
|
|
||||||
r'(?:www\.)?redirect\.invidious\.io',
|
|
||||||
r'(?:(?:www|dev)\.)?invidio\.us',
|
|
||||||
# Invidious instances taken from https://github.com/iv-org/documentation/blob/master/Invidious-Instances.md
|
|
||||||
r'(?:www\.)?invidious\.pussthecat\.org',
|
|
||||||
r'(?:www\.)?invidious\.zee\.li',
|
|
||||||
r'(?:www\.)?invidious\.ethibox\.fr',
|
|
||||||
r'(?:www\.)?invidious\.3o7z6yfxhbw7n3za4rss6l434kmv55cgw2vuziwuigpwegswvwzqipyd\.onion',
|
|
||||||
# youtube-dl invidious instances list
|
|
||||||
r'(?:(?:www|no)\.)?invidiou\.sh',
|
|
||||||
r'(?:(?:www|fi)\.)?invidious\.snopyta\.org',
|
|
||||||
r'(?:www\.)?invidious\.kabi\.tk',
|
|
||||||
r'(?:www\.)?invidious\.mastodon\.host',
|
|
||||||
r'(?:www\.)?invidious\.zapashcanon\.fr',
|
|
||||||
r'(?:www\.)?(?:invidious(?:-us)?|piped)\.kavin\.rocks',
|
|
||||||
r'(?:www\.)?invidious\.tinfoil-hat\.net',
|
|
||||||
r'(?:www\.)?invidious\.himiko\.cloud',
|
|
||||||
r'(?:www\.)?invidious\.reallyancient\.tech',
|
|
||||||
r'(?:www\.)?invidious\.tube',
|
|
||||||
r'(?:www\.)?invidiou\.site',
|
|
||||||
r'(?:www\.)?invidious\.site',
|
|
||||||
r'(?:www\.)?invidious\.xyz',
|
|
||||||
r'(?:www\.)?invidious\.nixnet\.xyz',
|
|
||||||
r'(?:www\.)?invidious\.048596\.xyz',
|
|
||||||
r'(?:www\.)?invidious\.drycat\.fr',
|
|
||||||
r'(?:www\.)?inv\.skyn3t\.in',
|
|
||||||
r'(?:www\.)?tube\.poal\.co',
|
|
||||||
r'(?:www\.)?tube\.connect\.cafe',
|
|
||||||
r'(?:www\.)?vid\.wxzm\.sx',
|
|
||||||
r'(?:www\.)?vid\.mint\.lgbt',
|
|
||||||
r'(?:www\.)?vid\.puffyan\.us',
|
|
||||||
r'(?:www\.)?yewtu\.be',
|
|
||||||
r'(?:www\.)?yt\.elukerio\.org',
|
|
||||||
r'(?:www\.)?yt\.lelux\.fi',
|
|
||||||
r'(?:www\.)?invidious\.ggc-project\.de',
|
|
||||||
r'(?:www\.)?yt\.maisputain\.ovh',
|
|
||||||
r'(?:www\.)?ytprivate\.com',
|
|
||||||
r'(?:www\.)?invidious\.13ad\.de',
|
|
||||||
r'(?:www\.)?invidious\.toot\.koeln',
|
|
||||||
r'(?:www\.)?invidious\.fdn\.fr',
|
|
||||||
r'(?:www\.)?watch\.nettohikari\.com',
|
|
||||||
r'(?:www\.)?invidious\.namazso\.eu',
|
|
||||||
r'(?:www\.)?invidious\.silkky\.cloud',
|
|
||||||
r'(?:www\.)?invidious\.exonip\.de',
|
|
||||||
r'(?:www\.)?invidious\.riverside\.rocks',
|
|
||||||
r'(?:www\.)?invidious\.blamefran\.net',
|
|
||||||
r'(?:www\.)?invidious\.moomoo\.de',
|
|
||||||
r'(?:www\.)?ytb\.trom\.tf',
|
|
||||||
r'(?:www\.)?yt\.cyberhost\.uk',
|
|
||||||
r'(?:www\.)?kgg2m7yk5aybusll\.onion',
|
|
||||||
r'(?:www\.)?qklhadlycap4cnod\.onion',
|
|
||||||
r'(?:www\.)?axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid\.onion',
|
|
||||||
r'(?:www\.)?c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid\.onion',
|
|
||||||
r'(?:www\.)?fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad\.onion',
|
|
||||||
r'(?:www\.)?invidious\.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd\.onion',
|
|
||||||
r'(?:www\.)?owxfohz4kjyv25fvlqilyxast7inivgiktls3th44jhk3ej3i7ya\.b32\.i2p',
|
|
||||||
r'(?:www\.)?4l2dgddgsrkf2ous66i6seeyi6etzfgrue332grh2n7madpwopotugyd\.onion',
|
|
||||||
r'(?:www\.)?w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd\.onion',
|
|
||||||
r'(?:www\.)?kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad\.onion',
|
|
||||||
r'(?:www\.)?grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad\.onion',
|
|
||||||
r'(?:www\.)?hpniueoejy4opn7bc4ftgazyqjoeqwlvh2uiku2xqku6zpoa4bf5ruid\.onion',
|
|
||||||
)
|
|
||||||
_VALID_URL = r"""(?x)^
|
_VALID_URL = r"""(?x)^
|
||||||
(
|
(
|
||||||
(?:https?://|//) # http(s):// or protocol-independent URL
|
(?:https?://|//) # http(s):// or protocol-independent URL
|
||||||
|
@ -793,7 +794,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
||||||
(?P<id>[0-9A-Za-z_-]{11}) # here is it! the YouTube video ID
|
(?P<id>[0-9A-Za-z_-]{11}) # here is it! the YouTube video ID
|
||||||
(?(1).+)? # if we found the ID, everything can follow
|
(?(1).+)? # if we found the ID, everything can follow
|
||||||
(?:\#|$)""" % {
|
(?:\#|$)""" % {
|
||||||
'invidious': '|'.join(_INVIDIOUS_SITES),
|
'invidious': '|'.join(YoutubeBaseInfoExtractor._INVIDIOUS_SITES),
|
||||||
}
|
}
|
||||||
_PLAYER_INFO_RE = (
|
_PLAYER_INFO_RE = (
|
||||||
r'/s/player/(?P<id>[a-zA-Z0-9_-]{8,})/player',
|
r'/s/player/(?P<id>[a-zA-Z0-9_-]{8,})/player',
|
||||||
|
@ -3064,7 +3065,7 @@ class YoutubeTabIE(YoutubeBaseInfoExtractor):
|
||||||
(?:\w+\.)?
|
(?:\w+\.)?
|
||||||
(?:
|
(?:
|
||||||
youtube(?:kids)?\.com|
|
youtube(?:kids)?\.com|
|
||||||
invidio\.us
|
%(invidious)s
|
||||||
)/
|
)/
|
||||||
(?:
|
(?:
|
||||||
(?P<channel_type>channel|c|user|browse)/|
|
(?P<channel_type>channel|c|user|browse)/|
|
||||||
|
@ -3072,10 +3073,13 @@ class YoutubeTabIE(YoutubeBaseInfoExtractor):
|
||||||
feed/|hashtag/|
|
feed/|hashtag/|
|
||||||
(?:playlist|watch)\?.*?\blist=
|
(?:playlist|watch)\?.*?\blist=
|
||||||
)|
|
)|
|
||||||
(?!(?:%s)\b) # Direct URLs
|
(?!(?:%(reserved_names)s)\b) # Direct URLs
|
||||||
)
|
)
|
||||||
(?P<id>[^/?\#&]+)
|
(?P<id>[^/?\#&]+)
|
||||||
''' % YoutubeBaseInfoExtractor._RESERVED_NAMES
|
''' % {
|
||||||
|
'reserved_names': YoutubeBaseInfoExtractor._RESERVED_NAMES,
|
||||||
|
'invidious': '|'.join(YoutubeBaseInfoExtractor._INVIDIOUS_SITES),
|
||||||
|
}
|
||||||
IE_NAME = 'youtube:tab'
|
IE_NAME = 'youtube:tab'
|
||||||
|
|
||||||
_TESTS = [{
|
_TESTS = [{
|
||||||
|
@ -4293,12 +4297,15 @@ class YoutubePlaylistIE(InfoExtractor):
|
||||||
(?:
|
(?:
|
||||||
(?:
|
(?:
|
||||||
youtube(?:kids)?\.com|
|
youtube(?:kids)?\.com|
|
||||||
invidio\.us
|
%(invidious)s
|
||||||
)
|
)
|
||||||
/.*?\?.*?\blist=
|
/.*?\?.*?\blist=
|
||||||
)?
|
)?
|
||||||
(?P<id>%(playlist_id)s)
|
(?P<id>%(playlist_id)s)
|
||||||
)''' % {'playlist_id': YoutubeBaseInfoExtractor._PLAYLIST_ID_RE}
|
)''' % {
|
||||||
|
'playlist_id': YoutubeBaseInfoExtractor._PLAYLIST_ID_RE,
|
||||||
|
'invidious': '|'.join(YoutubeBaseInfoExtractor._INVIDIOUS_SITES),
|
||||||
|
}
|
||||||
IE_NAME = 'youtube:playlist'
|
IE_NAME = 'youtube:playlist'
|
||||||
_TESTS = [{
|
_TESTS = [{
|
||||||
'note': 'issue #673',
|
'note': 'issue #673',
|
||||||
|
|
Loading…
Reference in New Issue