fix(downloads): tighten SourceAdapter resolution + neutral nfo default (review)
- resolve_adapter: identify from the yt-dlp extractor_key only, not the full webpage_url (a sibling source's name in a URL path no longer misresolves); add youtube-nocookie.com to the YouTube host match so nocookie embeds keep the POT/player-client extraction strategy. - _download: re-resolve the adapter with the post-extraction info dict so the .nfo uniqueid type and uploader_url agree on one source (dedups the inline resolve too). - MediaMeta.uniqueid_type defaults to source-neutral "generic" instead of "youtube", so an un-updated caller can never falsely label a non-YouTube download as youtube. - Tests: lock extractor-key-only resolution + nocookie host; default nfo type.
This commit is contained in:
@@ -27,6 +27,19 @@ def test_host_match_is_netloc_not_a_loose_substring():
|
||||
assert resolve_adapter("url", "https://example.com/facebook.com-mirror").key == "generic"
|
||||
|
||||
|
||||
def test_info_match_is_extractor_key_not_the_webpage_url():
|
||||
# The webpage_url path may carry a SIBLING source's name (a reddit slug about youtube); only the
|
||||
# yt-dlp extractor_key identifies the source, so this must resolve reddit, not youtube.
|
||||
info = {"extractor_key": "Reddit", "webpage_url": "https://reddit.com/r/x/comments/y/youtube_is_dead"}
|
||||
assert resolve_adapter("url", None, info).key == "reddit"
|
||||
|
||||
|
||||
def test_youtube_nocookie_host_still_gets_the_youtube_adapter():
|
||||
# An embed on youtube-nocookie.com is YouTube content and needs the POT/player-client strategy,
|
||||
# even though its host does not contain the substring "youtube.com".
|
||||
assert resolve_adapter("url", "https://www.youtube-nocookie.com/embed/abc123").key == "youtube"
|
||||
|
||||
|
||||
def test_uploader_url_youtube_uses_channel_url():
|
||||
a = YouTubeAdapter()
|
||||
assert a.uploader_url({"channel_url": "https://youtube.com/@chan"}) == "https://youtube.com/@chan"
|
||||
|
||||
@@ -145,8 +145,10 @@ def test_nfo_uniqueid_type_reflects_the_source():
|
||||
from app.downloads.storage import _nfo_xml
|
||||
|
||||
base = dict(video_id="v1", title="t", uploader="c", upload_date=None)
|
||||
assert '<uniqueid type="youtube"' in _nfo_xml(MediaMeta(**base)) # default preserved
|
||||
# An un-set caller gets the source-neutral "generic" default, never a false "youtube".
|
||||
assert '<uniqueid type="generic"' in _nfo_xml(MediaMeta(**base))
|
||||
assert '<uniqueid type="facebook"' in _nfo_xml(MediaMeta(**base, uniqueid_type="facebook"))
|
||||
assert '<uniqueid type="youtube"' in _nfo_xml(MediaMeta(**base, uniqueid_type="youtube"))
|
||||
|
||||
|
||||
def test_sidecars_keep_the_full_basename_when_the_title_has_a_dot(tmp_path: Path):
|
||||
|
||||
Reference in New Issue
Block a user