Moves git-compatible content from Nextcloud (Botomir/Projekte/Angefangen/Kino-Projekt) into this repo per cleanup request, under nextcloud-import/ to avoid colliding with the actively maintained backend/frontend/worker layout: - status/planning docs (Botomir-Status.md, Plan-Botomir.md, Projektbeschreibung.md) - docs/ (deployment.md, provider-policy.md) - backend-nextcloud-variant/ (older app/ layout, kept for reference only) - plugin.video.xstream/, script.module.xstreamscraper/ (vendored Kodi addon source) A third-party Firefox extension folder was intentionally left in Nextcloud (unrelated vendor code, not project source).
47 lines
2.0 KiB
Python
47 lines
2.0 KiB
Python
import pytest
|
|
|
|
from app.providers.base import ProviderError
|
|
from app.providers.internet_archive import InternetArchiveProvider
|
|
|
|
|
|
def test_internet_archive_detection():
|
|
provider = InternetArchiveProvider()
|
|
assert provider.can_handle("https://archive.org/details/BigBuckBunny_328")
|
|
assert provider.can_handle("https://archive.org/download/BigBuckBunny_328/video.mp4")
|
|
assert not provider.can_handle("https://example.com/details/BigBuckBunny_328")
|
|
|
|
|
|
def test_internet_archive_identifier_parsing():
|
|
provider = InternetArchiveProvider()
|
|
assert provider._identifier_from_url("https://archive.org/details/BigBuckBunny_328") == "BigBuckBunny_328"
|
|
assert provider._identifier_from_url("https://archive.org/download/BigBuckBunny_328/video.mp4") == "BigBuckBunny_328"
|
|
assert provider._identifier_from_url("https://archive.org/metadata/BigBuckBunny_328") == "BigBuckBunny_328"
|
|
|
|
|
|
def test_select_media_file_prefers_original_mp4():
|
|
provider = InternetArchiveProvider()
|
|
selected = provider._select_media_file([
|
|
{"name": "thumb.jpg", "format": "JPEG", "source": "metadata", "size": "10"},
|
|
{"name": "movie.ogv", "format": "Ogg Video", "source": "derivative", "size": "200000000"},
|
|
{"name": "movie.mp4", "format": "MPEG4", "source": "original", "size": "100000000"},
|
|
])
|
|
assert selected is not None
|
|
assert selected["name"] == "movie.mp4"
|
|
|
|
|
|
def test_select_media_file_rejects_path_traversal():
|
|
provider = InternetArchiveProvider()
|
|
assert provider._select_media_file([{"name": "../evil.mp4", "format": "MPEG4", "source": "original"}]) is None
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_probe_requires_media_file(monkeypatch):
|
|
provider = InternetArchiveProvider()
|
|
|
|
async def fake_metadata(identifier: str) -> dict:
|
|
return {"metadata": {"title": "No media"}, "files": [{"name": "notes.txt", "format": "Text"}]}
|
|
|
|
monkeypatch.setattr(provider, "_metadata", fake_metadata)
|
|
with pytest.raises(ProviderError):
|
|
await provider.probe("https://archive.org/details/no-media")
|