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).
54 lines
2.2 KiB
Python
54 lines
2.2 KiB
Python
import pytest
|
|
|
|
from app.providers.base import DownloadOptions, ProviderError
|
|
from app.providers.mediathek import MediathekProvider
|
|
|
|
|
|
def test_hls_and_dash_manifests_are_detected_by_extension_and_content_type():
|
|
provider = MediathekProvider()
|
|
|
|
assert provider._is_manifest("https://example.test/master.m3u8")
|
|
assert provider._is_manifest("https://example.test/manifest.mpd")
|
|
assert provider._is_manifest("https://example.test/stream", "application/vnd.apple.mpegurl")
|
|
assert provider._is_manifest("https://example.test/stream", "application/dash+xml")
|
|
assert not provider._is_manifest("https://example.test/movie.mp4", "video/mp4")
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_manifest_download_path_requires_ytdlp_and_never_raw_copies(monkeypatch, tmp_path):
|
|
provider = MediathekProvider()
|
|
|
|
async def fake_probe(url: str):
|
|
from app.providers.base import MediaMetadata
|
|
return MediaMetadata(provider="mediathek", title="manifest", external_id="https://example.test/master.m3u8")
|
|
|
|
async def fail_if_called(*args, **kwargs):
|
|
raise AssertionError("manifest downloads must not use raw HTTP streaming")
|
|
|
|
monkeypatch.setattr(provider, "probe", fake_probe)
|
|
monkeypatch.setattr(provider, "_download_manifest_with_ytdlp", fail_if_called)
|
|
|
|
with pytest.raises(AssertionError, match="manifest downloads must not use raw HTTP streaming"):
|
|
await provider.download("https://example.test/master.m3u8", tmp_path, DownloadOptions())
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_manifest_ytdlp_result_rejects_missing_media(monkeypatch, tmp_path):
|
|
provider = MediathekProvider()
|
|
monkeypatch.setattr("app.providers.mediathek.shutil.which", lambda binary: f"/usr/bin/{binary}")
|
|
|
|
class FakeProcess:
|
|
returncode = 0
|
|
stdout = None
|
|
stderr = None
|
|
async def wait(self):
|
|
return 0
|
|
|
|
async def fake_exec(*args, **kwargs):
|
|
return FakeProcess()
|
|
|
|
monkeypatch.setattr("app.providers.mediathek.asyncio.create_subprocess_exec", fake_exec)
|
|
|
|
with pytest.raises(ProviderError, match="without producing a media file"):
|
|
await provider._download_manifest_with_ytdlp("https://example.test/master.m3u8", tmp_path, DownloadOptions())
|