mirror of
https://github.com/unshackle-dl/unshackle.git
synced 2026-06-22 17:07:23 +00:00
test(export): pin DRM-free export round-trip through ImportService
This commit is contained in:
@@ -10,12 +10,14 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from types import SimpleNamespace
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
from unshackle.commands.dl import dl
|
from unshackle.commands.dl import dl
|
||||||
from unshackle.core.drm.clearkey import ClearKey
|
from unshackle.core.drm.clearkey import ClearKey
|
||||||
|
from unshackle.core.import_service import ImportService
|
||||||
from unshackle.core.titles import Movie
|
from unshackle.core.titles import Movie
|
||||||
from unshackle.core.tracks import Audio, Subtitle, Video
|
from unshackle.core.tracks import Audio, Chapter, Subtitle, Video
|
||||||
|
|
||||||
KID = UUID(hex="00000000000000000000000000000001")
|
KID = UUID(hex="00000000000000000000000000000001")
|
||||||
|
|
||||||
@@ -126,6 +128,40 @@ def test_post_download_write_keeps_licensed_keys(tmp_path: Path) -> None:
|
|||||||
assert track["keys"] == {KID.hex: "aa" * 16}
|
assert track["keys"] == {KID.hex: "aa" * 16}
|
||||||
|
|
||||||
|
|
||||||
|
def test_drm_free_export_roundtrips_through_import_service(tmp_path: Path) -> None:
|
||||||
|
"""A DRM-free export must rebuild via ImportService: titles, tracks (no DRM),
|
||||||
|
empty key pool (resolve_server_keys no-op) and chapters."""
|
||||||
|
export = tmp_path / "export.json"
|
||||||
|
title = make_title()
|
||||||
|
title.tracks.chapters.add(Chapter("00:00:10.000", "Intro"))
|
||||||
|
runner = make_dl()
|
||||||
|
for track in [*title.tracks.videos, *title.tracks.audio, *title.tracks.subtitles]:
|
||||||
|
runner.write_export(export, title, track)
|
||||||
|
|
||||||
|
# ImportService only touches ctx.parent.params (proxy flags) when building its session.
|
||||||
|
ctx = SimpleNamespace(parent=None, params={})
|
||||||
|
svc = ImportService(ctx, "EXAMPLE", "movie-1", str(export))
|
||||||
|
|
||||||
|
titles = list(svc.get_titles())
|
||||||
|
assert len(titles) == 1
|
||||||
|
movie = titles[0]
|
||||||
|
assert isinstance(movie, Movie)
|
||||||
|
assert movie.name == "Example Movie"
|
||||||
|
assert movie.year == 2024
|
||||||
|
|
||||||
|
tracks = svc.get_tracks(movie)
|
||||||
|
assert {t.id for t in tracks} == {"v1", "a1", "s1"}
|
||||||
|
assert all(not t.drm for t in tracks)
|
||||||
|
|
||||||
|
assert svc.key_pool() == {}
|
||||||
|
movie.tracks = tracks
|
||||||
|
svc.resolve_server_keys(movie)
|
||||||
|
assert all(not t.drm for t in movie.tracks)
|
||||||
|
|
||||||
|
# Chapters.add auto-inserts a nameless 00:00:00 baseline chapter; it round-trips too.
|
||||||
|
assert [c.name for c in svc.get_chapters(movie)] == [None, "Intro"]
|
||||||
|
|
||||||
|
|
||||||
def test_keyless_content_keys_writes_no_keys_entry(tmp_path: Path) -> None:
|
def test_keyless_content_keys_writes_no_keys_entry(tmp_path: Path) -> None:
|
||||||
"""A DRM object with empty content_keys must not create an empty keys map."""
|
"""A DRM object with empty content_keys must not create an empty keys map."""
|
||||||
export = tmp_path / "export.json"
|
export = tmp_path / "export.json"
|
||||||
|
|||||||
Reference in New Issue
Block a user