add support for m.youtube.com as a netloc when validating source urls, resolves #264
This commit is contained in:
parent
8426c7309a
commit
05d50c958e
|
@ -36,6 +36,9 @@ class FrontEndTestCase(TestCase):
|
||||||
test_sources = {
|
test_sources = {
|
||||||
'youtube-channel': {
|
'youtube-channel': {
|
||||||
'valid': (
|
'valid': (
|
||||||
|
'https://m.youtube.com/testchannel',
|
||||||
|
'https://m.youtube.com/c/testchannel',
|
||||||
|
'https://m.youtube.com/c/testchannel/videos',
|
||||||
'https://www.youtube.com/testchannel',
|
'https://www.youtube.com/testchannel',
|
||||||
'https://www.youtube.com/c/testchannel',
|
'https://www.youtube.com/c/testchannel',
|
||||||
'https://www.youtube.com/c/testchannel/videos',
|
'https://www.youtube.com/c/testchannel/videos',
|
||||||
|
@ -47,6 +50,7 @@ class FrontEndTestCase(TestCase):
|
||||||
'invalid_domain': (
|
'invalid_domain': (
|
||||||
'https://www.test.com/c/testchannel',
|
'https://www.test.com/c/testchannel',
|
||||||
'https://www.example.com/c/testchannel',
|
'https://www.example.com/c/testchannel',
|
||||||
|
'https://n.youtube.com/c/testchannel',
|
||||||
),
|
),
|
||||||
'invalid_path': (
|
'invalid_path': (
|
||||||
'https://www.youtube.com/test/invalid',
|
'https://www.youtube.com/test/invalid',
|
||||||
|
@ -62,6 +66,8 @@ class FrontEndTestCase(TestCase):
|
||||||
},
|
},
|
||||||
'youtube-channel-id': {
|
'youtube-channel-id': {
|
||||||
'valid': (
|
'valid': (
|
||||||
|
'https://m.youtube.com/channel/channelid',
|
||||||
|
'https://m.youtube.com/channel/channelid/videos',
|
||||||
'https://www.youtube.com/channel/channelid',
|
'https://www.youtube.com/channel/channelid',
|
||||||
'https://www.youtube.com/channel/channelid/videos',
|
'https://www.youtube.com/channel/channelid/videos',
|
||||||
),
|
),
|
||||||
|
@ -72,6 +78,7 @@ class FrontEndTestCase(TestCase):
|
||||||
'invalid_domain': (
|
'invalid_domain': (
|
||||||
'https://www.test.com/channel/channelid',
|
'https://www.test.com/channel/channelid',
|
||||||
'https://www.example.com/channel/channelid',
|
'https://www.example.com/channel/channelid',
|
||||||
|
'https://n.youtube.com/channel/channelid',
|
||||||
),
|
),
|
||||||
'invalid_path': (
|
'invalid_path': (
|
||||||
'https://www.youtube.com/test/invalid',
|
'https://www.youtube.com/test/invalid',
|
||||||
|
@ -83,6 +90,8 @@ class FrontEndTestCase(TestCase):
|
||||||
},
|
},
|
||||||
'youtube-playlist': {
|
'youtube-playlist': {
|
||||||
'valid': (
|
'valid': (
|
||||||
|
'https://m.youtube.com/playlist?list=testplaylist',
|
||||||
|
'https://m.youtube.com/watch?v=testvideo&list=testplaylist',
|
||||||
'https://www.youtube.com/playlist?list=testplaylist',
|
'https://www.youtube.com/playlist?list=testplaylist',
|
||||||
'https://www.youtube.com/watch?v=testvideo&list=testplaylist',
|
'https://www.youtube.com/watch?v=testvideo&list=testplaylist',
|
||||||
),
|
),
|
||||||
|
@ -93,6 +102,7 @@ class FrontEndTestCase(TestCase):
|
||||||
'invalid_domain': (
|
'invalid_domain': (
|
||||||
'https://www.test.com/playlist?list=testplaylist',
|
'https://www.test.com/playlist?list=testplaylist',
|
||||||
'https://www.example.com/playlist?list=testplaylist',
|
'https://www.example.com/playlist?list=testplaylist',
|
||||||
|
'https://n.youtube.com/playlist?list=testplaylist',
|
||||||
),
|
),
|
||||||
'invalid_path': (
|
'invalid_path': (
|
||||||
'https://www.youtube.com/notplaylist?list=testplaylist',
|
'https://www.youtube.com/notplaylist?list=testplaylist',
|
||||||
|
|
|
@ -14,9 +14,9 @@ def validate_url(url, validator):
|
||||||
Validate a URL against a dict of validation requirements. Returns an extracted
|
Validate a URL against a dict of validation requirements. Returns an extracted
|
||||||
part of the URL if the URL is valid, if invalid raises a ValidationError.
|
part of the URL if the URL is valid, if invalid raises a ValidationError.
|
||||||
'''
|
'''
|
||||||
valid_scheme, valid_netloc, valid_path, invalid_paths, valid_query, \
|
valid_scheme, valid_netlocs, valid_path, invalid_paths, valid_query, \
|
||||||
extract_parts = (
|
extract_parts = (
|
||||||
validator['scheme'], validator['domain'], validator['path_regex'],
|
validator['scheme'], validator['domains'], validator['path_regex'],
|
||||||
validator['path_must_not_match'], validator['qs_args'],
|
validator['path_must_not_match'], validator['qs_args'],
|
||||||
validator['extract_key']
|
validator['extract_key']
|
||||||
)
|
)
|
||||||
|
@ -25,8 +25,8 @@ def validate_url(url, validator):
|
||||||
if url_scheme != valid_scheme:
|
if url_scheme != valid_scheme:
|
||||||
raise ValidationError(f'invalid scheme "{url_scheme}" must be "{valid_scheme}"')
|
raise ValidationError(f'invalid scheme "{url_scheme}" must be "{valid_scheme}"')
|
||||||
url_netloc = str(url_parts.netloc).strip().lower()
|
url_netloc = str(url_parts.netloc).strip().lower()
|
||||||
if url_netloc != valid_netloc:
|
if url_netloc not in valid_netlocs:
|
||||||
raise ValidationError(f'invalid domain "{url_netloc}" must be "{valid_netloc}"')
|
raise ValidationError(f'invalid domain "{url_netloc}" must be one of "{valid_netlocs}"')
|
||||||
url_path = str(url_parts.path).strip()
|
url_path = str(url_parts.path).strip()
|
||||||
matches = re.findall(valid_path, url_path)
|
matches = re.findall(valid_path, url_path)
|
||||||
if not matches:
|
if not matches:
|
||||||
|
|
|
@ -171,7 +171,7 @@ class ValidateSourceView(FormView):
|
||||||
validation_urls = {
|
validation_urls = {
|
||||||
Source.SOURCE_TYPE_YOUTUBE_CHANNEL: {
|
Source.SOURCE_TYPE_YOUTUBE_CHANNEL: {
|
||||||
'scheme': 'https',
|
'scheme': 'https',
|
||||||
'domain': 'www.youtube.com',
|
'domains': ('m.youtube.com', 'www.youtube.com'),
|
||||||
'path_regex': '^\/(c\/)?([^\/]+)(\/videos)?$',
|
'path_regex': '^\/(c\/)?([^\/]+)(\/videos)?$',
|
||||||
'path_must_not_match': ('/playlist', '/c/playlist'),
|
'path_must_not_match': ('/playlist', '/c/playlist'),
|
||||||
'qs_args': [],
|
'qs_args': [],
|
||||||
|
@ -180,7 +180,7 @@ class ValidateSourceView(FormView):
|
||||||
},
|
},
|
||||||
Source.SOURCE_TYPE_YOUTUBE_CHANNEL_ID: {
|
Source.SOURCE_TYPE_YOUTUBE_CHANNEL_ID: {
|
||||||
'scheme': 'https',
|
'scheme': 'https',
|
||||||
'domain': 'www.youtube.com',
|
'domains': ('m.youtube.com', 'www.youtube.com'),
|
||||||
'path_regex': '^\/channel\/([^\/]+)(\/videos)?$',
|
'path_regex': '^\/channel\/([^\/]+)(\/videos)?$',
|
||||||
'path_must_not_match': ('/playlist', '/c/playlist'),
|
'path_must_not_match': ('/playlist', '/c/playlist'),
|
||||||
'qs_args': [],
|
'qs_args': [],
|
||||||
|
@ -189,7 +189,7 @@ class ValidateSourceView(FormView):
|
||||||
},
|
},
|
||||||
Source.SOURCE_TYPE_YOUTUBE_PLAYLIST: {
|
Source.SOURCE_TYPE_YOUTUBE_PLAYLIST: {
|
||||||
'scheme': 'https',
|
'scheme': 'https',
|
||||||
'domain': 'www.youtube.com',
|
'domains': ('m.youtube.com', 'www.youtube.com'),
|
||||||
'path_regex': '^\/(playlist|watch)$',
|
'path_regex': '^\/(playlist|watch)$',
|
||||||
'path_must_not_match': (),
|
'path_must_not_match': (),
|
||||||
'qs_args': ('list',),
|
'qs_args': ('list',),
|
||||||
|
|
Loading…
Reference in New Issue