Files
project-kino/nextcloud-import/backend-nextcloud-variant/tests/test_mediathek_manifest.py
Hermes Agent 884c198783 Import remaining Nextcloud Kino-Projekt material into git
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).
2026-08-17 10:47:13 +02:00

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())