diff --git a/bdpl/analyze/__init__.py b/bdpl/analyze/__init__.py
index b90bcc0..dabdd34 100644
--- a/bdpl/analyze/__init__.py
+++ b/bdpl/analyze/__init__.py
@@ -85,6 +85,7 @@ def _parse_disc_hints(bdmv_path: Path, clips: dict[str, ClipInfo] | None = None)
# Build title → playlist mapping via index titles → movie objects
obj_playlists: dict[int, list[int]] = {}
obj_play_marks: dict[int, list[tuple[int, int]]] = {}
+ obj_jump_titles: dict[int, list[int]] = {}
for obj in mo.objects:
if obj.referenced_playlists:
obj_playlists[obj.object_id] = obj.referenced_playlists
@@ -96,10 +97,14 @@ def _parse_disc_hints(bdmv_path: Path, clips: dict[str, ClipInfo] | None = None)
]
if marks:
obj_play_marks[obj.object_id] = marks
+ jts = obj.referenced_titles
+ if jts:
+ obj_jump_titles[obj.object_id] = jts
hints["movie_objects"] = {
"count": len(mo.objects),
"obj_playlists": obj_playlists,
"obj_play_marks": obj_play_marks,
+ "obj_jump_titles": obj_jump_titles,
}
except Exception:
log.debug("Failed to parse MovieObject.bdmv", exc_info=True)
@@ -289,6 +294,16 @@ def _detect_special_features(
# All buttons on this page target the same title — this is
# either the main-play page or a chapter-selection page.
chapter_selection_jt.update(jts)
+ continue
+ # A page where every button targets an episode playlist is an
+ # episode-selection page (e.g. per-episode CHAPTER menu).
+ all_episode = all(
+ title_to_mpls.get(jt_val - 1) in ep_playlists
+ for jt_val in jts
+ if title_to_mpls.get(jt_val - 1) is not None
+ )
+ if all_episode:
+ chapter_selection_jt.update(jts)
# --- Walk IG hints and build features -----------------------------------
seen: set[tuple[str, int | None]] = set()
@@ -373,9 +388,12 @@ def _detect_special_features(
# Supplement with title-hint specials not already covered by IG buttons.
title_hint_entries = _title_hint_non_episode_entries(hints, classifications, episodes)
existing_keys = {(feature.playlist, feature.chapter_start) for feature in features}
+ nav_playlists = _nav_playlists_from_hints(hints)
for mpls, chapter_starts in title_hint_entries:
if mpls in variant_mpls:
continue
+ if mpls in nav_playlists:
+ continue
pl = pl_by_name.get(mpls)
if pl is None:
continue
@@ -477,15 +495,35 @@ def _nav_playlists_from_hints(hints: dict) -> set[str]:
These are navigation playlists (disc intro, menu background) and should
not be treated as special features.
+
+ Follows one level of JumpTitle indirection: if the first_playback MO
+ jumps to a title whose MO plays a playlist, that playlist is included.
"""
index_hints = hints.get("index", {})
- obj_pl = hints.get("movie_objects", {}).get("obj_playlists", {})
+ mo_hints = hints.get("movie_objects", {})
+ obj_pl = mo_hints.get("obj_playlists", {})
+ obj_jt = mo_hints.get("obj_jump_titles", {})
nav: set[str] = set()
+
+ # Build title → movie_object map for JumpTitle resolution.
+ title_to_obj: dict[int, int] = {
+ entry["title"]: entry["movie_object"] for entry in index_hints.get("titles", [])
+ }
+
for key in ("first_playback_obj", "top_menu_obj"):
obj_id = index_hints.get(key)
- if obj_id is not None:
- for pl_num in obj_pl.get(obj_id, []):
- nav.add(f"{pl_num:05d}.mpls")
+ if obj_id is None:
+ continue
+ # Direct PlayPl commands.
+ for pl_num in obj_pl.get(obj_id, []):
+ nav.add(f"{pl_num:05d}.mpls")
+ # Follow JumpTitle → title → MO → PlayPl (one level).
+ for jt_num in obj_jt.get(obj_id, []):
+ title_idx = jt_num - 1 # JumpTitle operand is 1-based
+ target_obj = title_to_obj.get(title_idx)
+ if target_obj is not None:
+ for pl_num in obj_pl.get(target_obj, []):
+ nav.add(f"{pl_num:05d}.mpls")
return nav
diff --git a/tests/conftest.py b/tests/conftest.py
index 49b1e06..39fea66 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -340,6 +340,54 @@ def disc25_analysis(disc25_path):
return _analyze_fixture(disc25_path)
+@pytest.fixture(scope="session")
+def disc26_path() -> Path:
+ """Return path to bundled disc26 fixture."""
+ return _fixture_path("disc26")
+
+
+@pytest.fixture(scope="session")
+def disc26_analysis(disc26_path):
+ """Run and cache full analysis for the bundled disc26 fixture."""
+ return _analyze_fixture(disc26_path)
+
+
+@pytest.fixture(scope="session")
+def disc27_path() -> Path:
+ """Return path to bundled disc27 fixture."""
+ return _fixture_path("disc27")
+
+
+@pytest.fixture(scope="session")
+def disc27_analysis(disc27_path):
+ """Run and cache full analysis for the bundled disc27 fixture."""
+ return _analyze_fixture(disc27_path)
+
+
+@pytest.fixture(scope="session")
+def disc28_path() -> Path:
+ """Return path to bundled disc28 fixture."""
+ return _fixture_path("disc28")
+
+
+@pytest.fixture(scope="session")
+def disc28_analysis(disc28_path):
+ """Run and cache full analysis for the bundled disc28 fixture."""
+ return _analyze_fixture(disc28_path)
+
+
+@pytest.fixture(scope="session")
+def disc29_path() -> Path:
+ """Return path to bundled disc29 fixture."""
+ return _fixture_path("disc29")
+
+
+@pytest.fixture(scope="session")
+def disc29_analysis(disc29_path):
+ """Run and cache full analysis for the bundled disc29 fixture."""
+ return _analyze_fixture(disc29_path)
+
+
@pytest.fixture
def cli_runner() -> Callable[..., subprocess.CompletedProcess[str]]:
"""Return helper to invoke `python -m bdpl.cli` consistently in tests."""
diff --git a/tests/fixtures/disc26/CLIPINF/00000.clpi b/tests/fixtures/disc26/CLIPINF/00000.clpi
new file mode 100644
index 0000000..6b0e656
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00000.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00001.clpi b/tests/fixtures/disc26/CLIPINF/00001.clpi
new file mode 100644
index 0000000..0134763
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00001.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00002.clpi b/tests/fixtures/disc26/CLIPINF/00002.clpi
new file mode 100644
index 0000000..850fc27
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00002.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00003.clpi b/tests/fixtures/disc26/CLIPINF/00003.clpi
new file mode 100644
index 0000000..1c7d8f6
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00003.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00004.clpi b/tests/fixtures/disc26/CLIPINF/00004.clpi
new file mode 100644
index 0000000..21b1bcf
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00004.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00005.clpi b/tests/fixtures/disc26/CLIPINF/00005.clpi
new file mode 100644
index 0000000..9521eb9
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00005.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00006.clpi b/tests/fixtures/disc26/CLIPINF/00006.clpi
new file mode 100644
index 0000000..1f61d66
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00006.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00007.clpi b/tests/fixtures/disc26/CLIPINF/00007.clpi
new file mode 100644
index 0000000..7d718ce
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00007.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00008.clpi b/tests/fixtures/disc26/CLIPINF/00008.clpi
new file mode 100644
index 0000000..2ac20c0
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00008.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00009.clpi b/tests/fixtures/disc26/CLIPINF/00009.clpi
new file mode 100644
index 0000000..0fc2e8f
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00009.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00010.clpi b/tests/fixtures/disc26/CLIPINF/00010.clpi
new file mode 100644
index 0000000..30095da
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00010.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00011.clpi b/tests/fixtures/disc26/CLIPINF/00011.clpi
new file mode 100644
index 0000000..e81da94
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00011.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00012.clpi b/tests/fixtures/disc26/CLIPINF/00012.clpi
new file mode 100644
index 0000000..80cd7e7
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00012.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00013.clpi b/tests/fixtures/disc26/CLIPINF/00013.clpi
new file mode 100644
index 0000000..65e1135
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00013.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00014.clpi b/tests/fixtures/disc26/CLIPINF/00014.clpi
new file mode 100644
index 0000000..5a95770
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00014.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00015.clpi b/tests/fixtures/disc26/CLIPINF/00015.clpi
new file mode 100644
index 0000000..73baa33
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00015.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00016.clpi b/tests/fixtures/disc26/CLIPINF/00016.clpi
new file mode 100644
index 0000000..9a9e83b
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00016.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00017.clpi b/tests/fixtures/disc26/CLIPINF/00017.clpi
new file mode 100644
index 0000000..f453407
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00017.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00018.clpi b/tests/fixtures/disc26/CLIPINF/00018.clpi
new file mode 100644
index 0000000..345ec93
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00018.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00019.clpi b/tests/fixtures/disc26/CLIPINF/00019.clpi
new file mode 100644
index 0000000..5cb266d
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00019.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00020.clpi b/tests/fixtures/disc26/CLIPINF/00020.clpi
new file mode 100644
index 0000000..4f93f5c
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00020.clpi differ
diff --git a/tests/fixtures/disc26/CLIPINF/00021.clpi b/tests/fixtures/disc26/CLIPINF/00021.clpi
new file mode 100644
index 0000000..10a34d9
Binary files /dev/null and b/tests/fixtures/disc26/CLIPINF/00021.clpi differ
diff --git a/tests/fixtures/disc26/META/DL/bdmt_eng.xml b/tests/fixtures/disc26/META/DL/bdmt_eng.xml
new file mode 100644
index 0000000..44b1cbd
--- /dev/null
+++ b/tests/fixtures/disc26/META/DL/bdmt_eng.xml
@@ -0,0 +1,6 @@
+
+
+
+TEST DISC 26
+
+
diff --git a/tests/fixtures/disc26/MovieObject.bdmv b/tests/fixtures/disc26/MovieObject.bdmv
new file mode 100644
index 0000000..2f19a15
Binary files /dev/null and b/tests/fixtures/disc26/MovieObject.bdmv differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00000.mpls b/tests/fixtures/disc26/PLAYLIST/00000.mpls
new file mode 100644
index 0000000..4c9199e
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00000.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00001.mpls b/tests/fixtures/disc26/PLAYLIST/00001.mpls
new file mode 100644
index 0000000..5174a54
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00001.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00002.mpls b/tests/fixtures/disc26/PLAYLIST/00002.mpls
new file mode 100644
index 0000000..821cff9
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00002.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00003.mpls b/tests/fixtures/disc26/PLAYLIST/00003.mpls
new file mode 100644
index 0000000..a0d062e
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00003.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00004.mpls b/tests/fixtures/disc26/PLAYLIST/00004.mpls
new file mode 100644
index 0000000..17edc51
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00004.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00005.mpls b/tests/fixtures/disc26/PLAYLIST/00005.mpls
new file mode 100644
index 0000000..0fcf9d0
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00005.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00006.mpls b/tests/fixtures/disc26/PLAYLIST/00006.mpls
new file mode 100644
index 0000000..b1f4d73
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00006.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00007.mpls b/tests/fixtures/disc26/PLAYLIST/00007.mpls
new file mode 100644
index 0000000..1806c1b
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00007.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00008.mpls b/tests/fixtures/disc26/PLAYLIST/00008.mpls
new file mode 100644
index 0000000..efdcc56
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00008.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00009.mpls b/tests/fixtures/disc26/PLAYLIST/00009.mpls
new file mode 100644
index 0000000..0afe7c6
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00009.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00010.mpls b/tests/fixtures/disc26/PLAYLIST/00010.mpls
new file mode 100644
index 0000000..17e83b1
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00010.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00011.mpls b/tests/fixtures/disc26/PLAYLIST/00011.mpls
new file mode 100644
index 0000000..4d4e0a1
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00011.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00012.mpls b/tests/fixtures/disc26/PLAYLIST/00012.mpls
new file mode 100644
index 0000000..bf42dab
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00012.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00013.mpls b/tests/fixtures/disc26/PLAYLIST/00013.mpls
new file mode 100644
index 0000000..8e1f744
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00013.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00014.mpls b/tests/fixtures/disc26/PLAYLIST/00014.mpls
new file mode 100644
index 0000000..b319c5e
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00014.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00015.mpls b/tests/fixtures/disc26/PLAYLIST/00015.mpls
new file mode 100644
index 0000000..673f60e
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00015.mpls differ
diff --git a/tests/fixtures/disc26/PLAYLIST/00016.mpls b/tests/fixtures/disc26/PLAYLIST/00016.mpls
new file mode 100644
index 0000000..12de839
Binary files /dev/null and b/tests/fixtures/disc26/PLAYLIST/00016.mpls differ
diff --git a/tests/fixtures/disc26/ics_menu.bin b/tests/fixtures/disc26/ics_menu.bin
new file mode 100644
index 0000000..9ef685b
Binary files /dev/null and b/tests/fixtures/disc26/ics_menu.bin differ
diff --git a/tests/fixtures/disc26/index.bdmv b/tests/fixtures/disc26/index.bdmv
new file mode 100644
index 0000000..392fde8
Binary files /dev/null and b/tests/fixtures/disc26/index.bdmv differ
diff --git a/tests/fixtures/disc27/CLIPINF/00000.clpi b/tests/fixtures/disc27/CLIPINF/00000.clpi
new file mode 100644
index 0000000..6b0e656
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00000.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00001.clpi b/tests/fixtures/disc27/CLIPINF/00001.clpi
new file mode 100644
index 0000000..9e025ef
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00001.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00002.clpi b/tests/fixtures/disc27/CLIPINF/00002.clpi
new file mode 100644
index 0000000..850fc27
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00002.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00003.clpi b/tests/fixtures/disc27/CLIPINF/00003.clpi
new file mode 100644
index 0000000..1c7d8f6
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00003.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00004.clpi b/tests/fixtures/disc27/CLIPINF/00004.clpi
new file mode 100644
index 0000000..6fad777
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00004.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00005.clpi b/tests/fixtures/disc27/CLIPINF/00005.clpi
new file mode 100644
index 0000000..bcb45a6
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00005.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00006.clpi b/tests/fixtures/disc27/CLIPINF/00006.clpi
new file mode 100644
index 0000000..51c3219
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00006.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00007.clpi b/tests/fixtures/disc27/CLIPINF/00007.clpi
new file mode 100644
index 0000000..1798245
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00007.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00008.clpi b/tests/fixtures/disc27/CLIPINF/00008.clpi
new file mode 100644
index 0000000..2ac20c0
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00008.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00009.clpi b/tests/fixtures/disc27/CLIPINF/00009.clpi
new file mode 100644
index 0000000..0fc2e8f
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00009.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00010.clpi b/tests/fixtures/disc27/CLIPINF/00010.clpi
new file mode 100644
index 0000000..7e136fc
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00010.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00011.clpi b/tests/fixtures/disc27/CLIPINF/00011.clpi
new file mode 100644
index 0000000..d316e43
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00011.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00012.clpi b/tests/fixtures/disc27/CLIPINF/00012.clpi
new file mode 100644
index 0000000..7c4fcda
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00012.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00013.clpi b/tests/fixtures/disc27/CLIPINF/00013.clpi
new file mode 100644
index 0000000..6b624a8
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00013.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00014.clpi b/tests/fixtures/disc27/CLIPINF/00014.clpi
new file mode 100644
index 0000000..87ab022
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00014.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00015.clpi b/tests/fixtures/disc27/CLIPINF/00015.clpi
new file mode 100644
index 0000000..f440a70
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00015.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00016.clpi b/tests/fixtures/disc27/CLIPINF/00016.clpi
new file mode 100644
index 0000000..8f4dedd
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00016.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00017.clpi b/tests/fixtures/disc27/CLIPINF/00017.clpi
new file mode 100644
index 0000000..d5fc082
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00017.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00018.clpi b/tests/fixtures/disc27/CLIPINF/00018.clpi
new file mode 100644
index 0000000..3128c53
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00018.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00019.clpi b/tests/fixtures/disc27/CLIPINF/00019.clpi
new file mode 100644
index 0000000..421bdc7
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00019.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00020.clpi b/tests/fixtures/disc27/CLIPINF/00020.clpi
new file mode 100644
index 0000000..0d364e9
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00020.clpi differ
diff --git a/tests/fixtures/disc27/CLIPINF/00021.clpi b/tests/fixtures/disc27/CLIPINF/00021.clpi
new file mode 100644
index 0000000..603c4f1
Binary files /dev/null and b/tests/fixtures/disc27/CLIPINF/00021.clpi differ
diff --git a/tests/fixtures/disc27/META/DL/bdmt_eng.xml b/tests/fixtures/disc27/META/DL/bdmt_eng.xml
new file mode 100644
index 0000000..07cbebd
--- /dev/null
+++ b/tests/fixtures/disc27/META/DL/bdmt_eng.xml
@@ -0,0 +1,6 @@
+
+
+
+TEST DISC 27
+
+
diff --git a/tests/fixtures/disc27/MovieObject.bdmv b/tests/fixtures/disc27/MovieObject.bdmv
new file mode 100644
index 0000000..b285a37
Binary files /dev/null and b/tests/fixtures/disc27/MovieObject.bdmv differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00000.mpls b/tests/fixtures/disc27/PLAYLIST/00000.mpls
new file mode 100644
index 0000000..4c9199e
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00000.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00001.mpls b/tests/fixtures/disc27/PLAYLIST/00001.mpls
new file mode 100644
index 0000000..5174a54
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00001.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00002.mpls b/tests/fixtures/disc27/PLAYLIST/00002.mpls
new file mode 100644
index 0000000..68a270c
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00002.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00003.mpls b/tests/fixtures/disc27/PLAYLIST/00003.mpls
new file mode 100644
index 0000000..feeb628
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00003.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00004.mpls b/tests/fixtures/disc27/PLAYLIST/00004.mpls
new file mode 100644
index 0000000..bd609b0
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00004.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00005.mpls b/tests/fixtures/disc27/PLAYLIST/00005.mpls
new file mode 100644
index 0000000..c2cda22
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00005.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00006.mpls b/tests/fixtures/disc27/PLAYLIST/00006.mpls
new file mode 100644
index 0000000..8f907da
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00006.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00007.mpls b/tests/fixtures/disc27/PLAYLIST/00007.mpls
new file mode 100644
index 0000000..9b9582a
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00007.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00008.mpls b/tests/fixtures/disc27/PLAYLIST/00008.mpls
new file mode 100644
index 0000000..ef207dd
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00008.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00009.mpls b/tests/fixtures/disc27/PLAYLIST/00009.mpls
new file mode 100644
index 0000000..3210072
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00009.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00010.mpls b/tests/fixtures/disc27/PLAYLIST/00010.mpls
new file mode 100644
index 0000000..029fcc5
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00010.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00011.mpls b/tests/fixtures/disc27/PLAYLIST/00011.mpls
new file mode 100644
index 0000000..0a7f5f5
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00011.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00012.mpls b/tests/fixtures/disc27/PLAYLIST/00012.mpls
new file mode 100644
index 0000000..626f7f8
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00012.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00013.mpls b/tests/fixtures/disc27/PLAYLIST/00013.mpls
new file mode 100644
index 0000000..0673eda
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00013.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00014.mpls b/tests/fixtures/disc27/PLAYLIST/00014.mpls
new file mode 100644
index 0000000..e789b86
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00014.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00015.mpls b/tests/fixtures/disc27/PLAYLIST/00015.mpls
new file mode 100644
index 0000000..f36124c
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00015.mpls differ
diff --git a/tests/fixtures/disc27/PLAYLIST/00016.mpls b/tests/fixtures/disc27/PLAYLIST/00016.mpls
new file mode 100644
index 0000000..45f32a6
Binary files /dev/null and b/tests/fixtures/disc27/PLAYLIST/00016.mpls differ
diff --git a/tests/fixtures/disc27/ics_menu.bin b/tests/fixtures/disc27/ics_menu.bin
new file mode 100644
index 0000000..9ac2fdb
Binary files /dev/null and b/tests/fixtures/disc27/ics_menu.bin differ
diff --git a/tests/fixtures/disc27/index.bdmv b/tests/fixtures/disc27/index.bdmv
new file mode 100644
index 0000000..392fde8
Binary files /dev/null and b/tests/fixtures/disc27/index.bdmv differ
diff --git a/tests/fixtures/disc28/CLIPINF/00000.clpi b/tests/fixtures/disc28/CLIPINF/00000.clpi
new file mode 100644
index 0000000..d3508d6
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00000.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00001.clpi b/tests/fixtures/disc28/CLIPINF/00001.clpi
new file mode 100644
index 0000000..f2000df
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00001.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00002.clpi b/tests/fixtures/disc28/CLIPINF/00002.clpi
new file mode 100644
index 0000000..3a29180
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00002.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00003.clpi b/tests/fixtures/disc28/CLIPINF/00003.clpi
new file mode 100644
index 0000000..6116922
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00003.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00004.clpi b/tests/fixtures/disc28/CLIPINF/00004.clpi
new file mode 100644
index 0000000..b64f185
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00004.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00005.clpi b/tests/fixtures/disc28/CLIPINF/00005.clpi
new file mode 100644
index 0000000..a680a06
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00005.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00006.clpi b/tests/fixtures/disc28/CLIPINF/00006.clpi
new file mode 100644
index 0000000..9341afd
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00006.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00007.clpi b/tests/fixtures/disc28/CLIPINF/00007.clpi
new file mode 100644
index 0000000..f10e96f
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00007.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00008.clpi b/tests/fixtures/disc28/CLIPINF/00008.clpi
new file mode 100644
index 0000000..0796705
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00008.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00009.clpi b/tests/fixtures/disc28/CLIPINF/00009.clpi
new file mode 100644
index 0000000..31500ba
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00009.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00010.clpi b/tests/fixtures/disc28/CLIPINF/00010.clpi
new file mode 100644
index 0000000..0d510aa
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00010.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00011.clpi b/tests/fixtures/disc28/CLIPINF/00011.clpi
new file mode 100644
index 0000000..1cc618b
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00011.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00012.clpi b/tests/fixtures/disc28/CLIPINF/00012.clpi
new file mode 100644
index 0000000..aaa56e9
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00012.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00013.clpi b/tests/fixtures/disc28/CLIPINF/00013.clpi
new file mode 100644
index 0000000..b04da12
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00013.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00014.clpi b/tests/fixtures/disc28/CLIPINF/00014.clpi
new file mode 100644
index 0000000..03500c4
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00014.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00015.clpi b/tests/fixtures/disc28/CLIPINF/00015.clpi
new file mode 100644
index 0000000..216f1cb
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00015.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00016.clpi b/tests/fixtures/disc28/CLIPINF/00016.clpi
new file mode 100644
index 0000000..32feaeb
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00016.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00017.clpi b/tests/fixtures/disc28/CLIPINF/00017.clpi
new file mode 100644
index 0000000..760fcd6
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00017.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00018.clpi b/tests/fixtures/disc28/CLIPINF/00018.clpi
new file mode 100644
index 0000000..c089a06
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00018.clpi differ
diff --git a/tests/fixtures/disc28/CLIPINF/00019.clpi b/tests/fixtures/disc28/CLIPINF/00019.clpi
new file mode 100644
index 0000000..7252dfc
Binary files /dev/null and b/tests/fixtures/disc28/CLIPINF/00019.clpi differ
diff --git a/tests/fixtures/disc28/META/DL/bdmt_eng.xml b/tests/fixtures/disc28/META/DL/bdmt_eng.xml
new file mode 100644
index 0000000..0a83ea8
--- /dev/null
+++ b/tests/fixtures/disc28/META/DL/bdmt_eng.xml
@@ -0,0 +1,6 @@
+
+
+
+TEST DISC 28
+
+
diff --git a/tests/fixtures/disc28/MovieObject.bdmv b/tests/fixtures/disc28/MovieObject.bdmv
new file mode 100644
index 0000000..2d0f5c8
Binary files /dev/null and b/tests/fixtures/disc28/MovieObject.bdmv differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00000.mpls b/tests/fixtures/disc28/PLAYLIST/00000.mpls
new file mode 100644
index 0000000..708c217
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00000.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00001.mpls b/tests/fixtures/disc28/PLAYLIST/00001.mpls
new file mode 100644
index 0000000..4da3789
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00001.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00002.mpls b/tests/fixtures/disc28/PLAYLIST/00002.mpls
new file mode 100644
index 0000000..36eb190
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00002.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00003.mpls b/tests/fixtures/disc28/PLAYLIST/00003.mpls
new file mode 100644
index 0000000..bec8948
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00003.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00004.mpls b/tests/fixtures/disc28/PLAYLIST/00004.mpls
new file mode 100644
index 0000000..78f3f27
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00004.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00005.mpls b/tests/fixtures/disc28/PLAYLIST/00005.mpls
new file mode 100644
index 0000000..cdb6709
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00005.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00006.mpls b/tests/fixtures/disc28/PLAYLIST/00006.mpls
new file mode 100644
index 0000000..95f27e6
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00006.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00007.mpls b/tests/fixtures/disc28/PLAYLIST/00007.mpls
new file mode 100644
index 0000000..ed41571
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00007.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00008.mpls b/tests/fixtures/disc28/PLAYLIST/00008.mpls
new file mode 100644
index 0000000..9b11c91
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00008.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00009.mpls b/tests/fixtures/disc28/PLAYLIST/00009.mpls
new file mode 100644
index 0000000..e775bb2
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00009.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00010.mpls b/tests/fixtures/disc28/PLAYLIST/00010.mpls
new file mode 100644
index 0000000..6b84c1f
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00010.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00011.mpls b/tests/fixtures/disc28/PLAYLIST/00011.mpls
new file mode 100644
index 0000000..ddbb948
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00011.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00012.mpls b/tests/fixtures/disc28/PLAYLIST/00012.mpls
new file mode 100644
index 0000000..d9873e8
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00012.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00013.mpls b/tests/fixtures/disc28/PLAYLIST/00013.mpls
new file mode 100644
index 0000000..b293737
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00013.mpls differ
diff --git a/tests/fixtures/disc28/PLAYLIST/00014.mpls b/tests/fixtures/disc28/PLAYLIST/00014.mpls
new file mode 100644
index 0000000..28224cb
Binary files /dev/null and b/tests/fixtures/disc28/PLAYLIST/00014.mpls differ
diff --git a/tests/fixtures/disc28/ics_menu.bin b/tests/fixtures/disc28/ics_menu.bin
new file mode 100644
index 0000000..d0ef234
Binary files /dev/null and b/tests/fixtures/disc28/ics_menu.bin differ
diff --git a/tests/fixtures/disc28/index.bdmv b/tests/fixtures/disc28/index.bdmv
new file mode 100644
index 0000000..8da7d4b
Binary files /dev/null and b/tests/fixtures/disc28/index.bdmv differ
diff --git a/tests/fixtures/disc29/CLIPINF/00000.clpi b/tests/fixtures/disc29/CLIPINF/00000.clpi
new file mode 100644
index 0000000..12b474d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00000.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00001.clpi b/tests/fixtures/disc29/CLIPINF/00001.clpi
new file mode 100644
index 0000000..a90358d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00001.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00002.clpi b/tests/fixtures/disc29/CLIPINF/00002.clpi
new file mode 100644
index 0000000..e411d8f
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00002.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00003.clpi b/tests/fixtures/disc29/CLIPINF/00003.clpi
new file mode 100644
index 0000000..f0c7d58
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00003.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00004.clpi b/tests/fixtures/disc29/CLIPINF/00004.clpi
new file mode 100644
index 0000000..1898dda
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00004.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00005.clpi b/tests/fixtures/disc29/CLIPINF/00005.clpi
new file mode 100644
index 0000000..50041ef
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00005.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00006.clpi b/tests/fixtures/disc29/CLIPINF/00006.clpi
new file mode 100644
index 0000000..6d63c68
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00006.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00007.clpi b/tests/fixtures/disc29/CLIPINF/00007.clpi
new file mode 100644
index 0000000..d3dc0a4
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00007.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00008.clpi b/tests/fixtures/disc29/CLIPINF/00008.clpi
new file mode 100644
index 0000000..5418fa7
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00008.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00009.clpi b/tests/fixtures/disc29/CLIPINF/00009.clpi
new file mode 100644
index 0000000..d49899f
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00009.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00010.clpi b/tests/fixtures/disc29/CLIPINF/00010.clpi
new file mode 100644
index 0000000..902cb8e
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00010.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00011.clpi b/tests/fixtures/disc29/CLIPINF/00011.clpi
new file mode 100644
index 0000000..3310360
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00011.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00012.clpi b/tests/fixtures/disc29/CLIPINF/00012.clpi
new file mode 100644
index 0000000..c9e9ddf
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00012.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00013.clpi b/tests/fixtures/disc29/CLIPINF/00013.clpi
new file mode 100644
index 0000000..cbfb318
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00013.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00014.clpi b/tests/fixtures/disc29/CLIPINF/00014.clpi
new file mode 100644
index 0000000..6b033b3
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00014.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00015.clpi b/tests/fixtures/disc29/CLIPINF/00015.clpi
new file mode 100644
index 0000000..d130141
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00015.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00016.clpi b/tests/fixtures/disc29/CLIPINF/00016.clpi
new file mode 100644
index 0000000..3310360
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00016.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00017.clpi b/tests/fixtures/disc29/CLIPINF/00017.clpi
new file mode 100644
index 0000000..d49899f
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00017.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00018.clpi b/tests/fixtures/disc29/CLIPINF/00018.clpi
new file mode 100644
index 0000000..ef74f30
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00018.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00019.clpi b/tests/fixtures/disc29/CLIPINF/00019.clpi
new file mode 100644
index 0000000..111ade7
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00019.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00020.clpi b/tests/fixtures/disc29/CLIPINF/00020.clpi
new file mode 100644
index 0000000..d3dc0a4
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00020.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00021.clpi b/tests/fixtures/disc29/CLIPINF/00021.clpi
new file mode 100644
index 0000000..807ab6d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00021.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00022.clpi b/tests/fixtures/disc29/CLIPINF/00022.clpi
new file mode 100644
index 0000000..cda1227
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00022.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00023.clpi b/tests/fixtures/disc29/CLIPINF/00023.clpi
new file mode 100644
index 0000000..d49899f
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00023.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00024.clpi b/tests/fixtures/disc29/CLIPINF/00024.clpi
new file mode 100644
index 0000000..111ade7
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00024.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00025.clpi b/tests/fixtures/disc29/CLIPINF/00025.clpi
new file mode 100644
index 0000000..cbfb318
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00025.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00026.clpi b/tests/fixtures/disc29/CLIPINF/00026.clpi
new file mode 100644
index 0000000..cbfb318
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00026.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00027.clpi b/tests/fixtures/disc29/CLIPINF/00027.clpi
new file mode 100644
index 0000000..d130141
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00027.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00028.clpi b/tests/fixtures/disc29/CLIPINF/00028.clpi
new file mode 100644
index 0000000..111ade7
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00028.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00029.clpi b/tests/fixtures/disc29/CLIPINF/00029.clpi
new file mode 100644
index 0000000..97c72c1
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00029.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00030.clpi b/tests/fixtures/disc29/CLIPINF/00030.clpi
new file mode 100644
index 0000000..26b0c36
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00030.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00031.clpi b/tests/fixtures/disc29/CLIPINF/00031.clpi
new file mode 100644
index 0000000..963d2fd
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00031.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00032.clpi b/tests/fixtures/disc29/CLIPINF/00032.clpi
new file mode 100644
index 0000000..cbfb318
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00032.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00033.clpi b/tests/fixtures/disc29/CLIPINF/00033.clpi
new file mode 100644
index 0000000..807ab6d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00033.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00034.clpi b/tests/fixtures/disc29/CLIPINF/00034.clpi
new file mode 100644
index 0000000..807ab6d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00034.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00035.clpi b/tests/fixtures/disc29/CLIPINF/00035.clpi
new file mode 100644
index 0000000..d130141
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00035.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00036.clpi b/tests/fixtures/disc29/CLIPINF/00036.clpi
new file mode 100644
index 0000000..3310360
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00036.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00037.clpi b/tests/fixtures/disc29/CLIPINF/00037.clpi
new file mode 100644
index 0000000..d3dc0a4
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00037.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00038.clpi b/tests/fixtures/disc29/CLIPINF/00038.clpi
new file mode 100644
index 0000000..963d2fd
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00038.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00039.clpi b/tests/fixtures/disc29/CLIPINF/00039.clpi
new file mode 100644
index 0000000..c9e9ddf
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00039.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00040.clpi b/tests/fixtures/disc29/CLIPINF/00040.clpi
new file mode 100644
index 0000000..b1c4415
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00040.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00041.clpi b/tests/fixtures/disc29/CLIPINF/00041.clpi
new file mode 100644
index 0000000..97c72c1
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00041.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00042.clpi b/tests/fixtures/disc29/CLIPINF/00042.clpi
new file mode 100644
index 0000000..cbfb318
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00042.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00043.clpi b/tests/fixtures/disc29/CLIPINF/00043.clpi
new file mode 100644
index 0000000..26b0c36
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00043.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00044.clpi b/tests/fixtures/disc29/CLIPINF/00044.clpi
new file mode 100644
index 0000000..5ef4805
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00044.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00045.clpi b/tests/fixtures/disc29/CLIPINF/00045.clpi
new file mode 100644
index 0000000..f36af7c
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00045.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00046.clpi b/tests/fixtures/disc29/CLIPINF/00046.clpi
new file mode 100644
index 0000000..d3dc0a4
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00046.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00047.clpi b/tests/fixtures/disc29/CLIPINF/00047.clpi
new file mode 100644
index 0000000..5743f2e
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00047.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00048.clpi b/tests/fixtures/disc29/CLIPINF/00048.clpi
new file mode 100644
index 0000000..ef74f30
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00048.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00049.clpi b/tests/fixtures/disc29/CLIPINF/00049.clpi
new file mode 100644
index 0000000..cda1227
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00049.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00050.clpi b/tests/fixtures/disc29/CLIPINF/00050.clpi
new file mode 100644
index 0000000..5ef4805
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00050.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00051.clpi b/tests/fixtures/disc29/CLIPINF/00051.clpi
new file mode 100644
index 0000000..3310360
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00051.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00052.clpi b/tests/fixtures/disc29/CLIPINF/00052.clpi
new file mode 100644
index 0000000..b1c4415
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00052.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00053.clpi b/tests/fixtures/disc29/CLIPINF/00053.clpi
new file mode 100644
index 0000000..d49899f
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00053.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00054.clpi b/tests/fixtures/disc29/CLIPINF/00054.clpi
new file mode 100644
index 0000000..902cb8e
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00054.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00055.clpi b/tests/fixtures/disc29/CLIPINF/00055.clpi
new file mode 100644
index 0000000..6b033b3
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00055.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00056.clpi b/tests/fixtures/disc29/CLIPINF/00056.clpi
new file mode 100644
index 0000000..c9e9ddf
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00056.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00057.clpi b/tests/fixtures/disc29/CLIPINF/00057.clpi
new file mode 100644
index 0000000..d2930c3
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00057.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00058.clpi b/tests/fixtures/disc29/CLIPINF/00058.clpi
new file mode 100644
index 0000000..d3dc0a4
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00058.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00059.clpi b/tests/fixtures/disc29/CLIPINF/00059.clpi
new file mode 100644
index 0000000..5418fa7
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00059.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00060.clpi b/tests/fixtures/disc29/CLIPINF/00060.clpi
new file mode 100644
index 0000000..26b0c36
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00060.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00061.clpi b/tests/fixtures/disc29/CLIPINF/00061.clpi
new file mode 100644
index 0000000..902cb8e
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00061.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00062.clpi b/tests/fixtures/disc29/CLIPINF/00062.clpi
new file mode 100644
index 0000000..807ab6d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00062.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00063.clpi b/tests/fixtures/disc29/CLIPINF/00063.clpi
new file mode 100644
index 0000000..807ab6d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00063.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00064.clpi b/tests/fixtures/disc29/CLIPINF/00064.clpi
new file mode 100644
index 0000000..4bd594e
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00064.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00065.clpi b/tests/fixtures/disc29/CLIPINF/00065.clpi
new file mode 100644
index 0000000..42ada5e
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00065.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00066.clpi b/tests/fixtures/disc29/CLIPINF/00066.clpi
new file mode 100644
index 0000000..d49899f
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00066.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00067.clpi b/tests/fixtures/disc29/CLIPINF/00067.clpi
new file mode 100644
index 0000000..d130141
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00067.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00068.clpi b/tests/fixtures/disc29/CLIPINF/00068.clpi
new file mode 100644
index 0000000..5ef4805
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00068.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00069.clpi b/tests/fixtures/disc29/CLIPINF/00069.clpi
new file mode 100644
index 0000000..902cb8e
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00069.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00070.clpi b/tests/fixtures/disc29/CLIPINF/00070.clpi
new file mode 100644
index 0000000..c4bf598
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00070.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00071.clpi b/tests/fixtures/disc29/CLIPINF/00071.clpi
new file mode 100644
index 0000000..95e0816
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00071.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00072.clpi b/tests/fixtures/disc29/CLIPINF/00072.clpi
new file mode 100644
index 0000000..d130141
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00072.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00073.clpi b/tests/fixtures/disc29/CLIPINF/00073.clpi
new file mode 100644
index 0000000..3310360
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00073.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00074.clpi b/tests/fixtures/disc29/CLIPINF/00074.clpi
new file mode 100644
index 0000000..902cb8e
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00074.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00075.clpi b/tests/fixtures/disc29/CLIPINF/00075.clpi
new file mode 100644
index 0000000..4bd594e
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00075.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00076.clpi b/tests/fixtures/disc29/CLIPINF/00076.clpi
new file mode 100644
index 0000000..807ab6d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00076.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00077.clpi b/tests/fixtures/disc29/CLIPINF/00077.clpi
new file mode 100644
index 0000000..807ab6d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00077.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00078.clpi b/tests/fixtures/disc29/CLIPINF/00078.clpi
new file mode 100644
index 0000000..807ab6d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00078.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00079.clpi b/tests/fixtures/disc29/CLIPINF/00079.clpi
new file mode 100644
index 0000000..5418fa7
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00079.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00080.clpi b/tests/fixtures/disc29/CLIPINF/00080.clpi
new file mode 100644
index 0000000..807ab6d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00080.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00081.clpi b/tests/fixtures/disc29/CLIPINF/00081.clpi
new file mode 100644
index 0000000..6b033b3
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00081.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00082.clpi b/tests/fixtures/disc29/CLIPINF/00082.clpi
new file mode 100644
index 0000000..6b033b3
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00082.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00083.clpi b/tests/fixtures/disc29/CLIPINF/00083.clpi
new file mode 100644
index 0000000..cda1227
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00083.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00084.clpi b/tests/fixtures/disc29/CLIPINF/00084.clpi
new file mode 100644
index 0000000..3310360
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00084.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00085.clpi b/tests/fixtures/disc29/CLIPINF/00085.clpi
new file mode 100644
index 0000000..5418fa7
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00085.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00086.clpi b/tests/fixtures/disc29/CLIPINF/00086.clpi
new file mode 100644
index 0000000..1514c97
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00086.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00087.clpi b/tests/fixtures/disc29/CLIPINF/00087.clpi
new file mode 100644
index 0000000..d130141
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00087.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00088.clpi b/tests/fixtures/disc29/CLIPINF/00088.clpi
new file mode 100644
index 0000000..97c72c1
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00088.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00089.clpi b/tests/fixtures/disc29/CLIPINF/00089.clpi
new file mode 100644
index 0000000..6b033b3
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00089.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00090.clpi b/tests/fixtures/disc29/CLIPINF/00090.clpi
new file mode 100644
index 0000000..902cb8e
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00090.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00091.clpi b/tests/fixtures/disc29/CLIPINF/00091.clpi
new file mode 100644
index 0000000..b1c4415
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00091.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00092.clpi b/tests/fixtures/disc29/CLIPINF/00092.clpi
new file mode 100644
index 0000000..26b0c36
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00092.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00093.clpi b/tests/fixtures/disc29/CLIPINF/00093.clpi
new file mode 100644
index 0000000..e2bd391
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00093.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00094.clpi b/tests/fixtures/disc29/CLIPINF/00094.clpi
new file mode 100644
index 0000000..6b033b3
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00094.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00095.clpi b/tests/fixtures/disc29/CLIPINF/00095.clpi
new file mode 100644
index 0000000..807ab6d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00095.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00096.clpi b/tests/fixtures/disc29/CLIPINF/00096.clpi
new file mode 100644
index 0000000..0edfb9f
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00096.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00097.clpi b/tests/fixtures/disc29/CLIPINF/00097.clpi
new file mode 100644
index 0000000..111ade7
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00097.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00098.clpi b/tests/fixtures/disc29/CLIPINF/00098.clpi
new file mode 100644
index 0000000..b1c4415
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00098.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00099.clpi b/tests/fixtures/disc29/CLIPINF/00099.clpi
new file mode 100644
index 0000000..902cb8e
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00099.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00100.clpi b/tests/fixtures/disc29/CLIPINF/00100.clpi
new file mode 100644
index 0000000..6b033b3
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00100.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00101.clpi b/tests/fixtures/disc29/CLIPINF/00101.clpi
new file mode 100644
index 0000000..6b033b3
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00101.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00102.clpi b/tests/fixtures/disc29/CLIPINF/00102.clpi
new file mode 100644
index 0000000..902cb8e
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00102.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00103.clpi b/tests/fixtures/disc29/CLIPINF/00103.clpi
new file mode 100644
index 0000000..6b033b3
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00103.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00104.clpi b/tests/fixtures/disc29/CLIPINF/00104.clpi
new file mode 100644
index 0000000..807ab6d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00104.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00105.clpi b/tests/fixtures/disc29/CLIPINF/00105.clpi
new file mode 100644
index 0000000..24f1096
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00105.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00106.clpi b/tests/fixtures/disc29/CLIPINF/00106.clpi
new file mode 100644
index 0000000..e2bd391
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00106.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00107.clpi b/tests/fixtures/disc29/CLIPINF/00107.clpi
new file mode 100644
index 0000000..b1c4415
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00107.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00108.clpi b/tests/fixtures/disc29/CLIPINF/00108.clpi
new file mode 100644
index 0000000..b1c4415
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00108.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00109.clpi b/tests/fixtures/disc29/CLIPINF/00109.clpi
new file mode 100644
index 0000000..d20821d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00109.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00110.clpi b/tests/fixtures/disc29/CLIPINF/00110.clpi
new file mode 100644
index 0000000..67792e2
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00110.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00111.clpi b/tests/fixtures/disc29/CLIPINF/00111.clpi
new file mode 100644
index 0000000..1514c97
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00111.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00112.clpi b/tests/fixtures/disc29/CLIPINF/00112.clpi
new file mode 100644
index 0000000..d20821d
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00112.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00113.clpi b/tests/fixtures/disc29/CLIPINF/00113.clpi
new file mode 100644
index 0000000..d130141
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00113.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00114.clpi b/tests/fixtures/disc29/CLIPINF/00114.clpi
new file mode 100644
index 0000000..6b033b3
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00114.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00115.clpi b/tests/fixtures/disc29/CLIPINF/00115.clpi
new file mode 100644
index 0000000..6b033b3
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00115.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00116.clpi b/tests/fixtures/disc29/CLIPINF/00116.clpi
new file mode 100644
index 0000000..cda1227
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00116.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00117.clpi b/tests/fixtures/disc29/CLIPINF/00117.clpi
new file mode 100644
index 0000000..3310360
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00117.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00118.clpi b/tests/fixtures/disc29/CLIPINF/00118.clpi
new file mode 100644
index 0000000..b1c4415
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00118.clpi differ
diff --git a/tests/fixtures/disc29/CLIPINF/00119.clpi b/tests/fixtures/disc29/CLIPINF/00119.clpi
new file mode 100644
index 0000000..26b0c36
Binary files /dev/null and b/tests/fixtures/disc29/CLIPINF/00119.clpi differ
diff --git a/tests/fixtures/disc29/META/DL/bdmt_eng.xml b/tests/fixtures/disc29/META/DL/bdmt_eng.xml
new file mode 100644
index 0000000..e93c9e8
--- /dev/null
+++ b/tests/fixtures/disc29/META/DL/bdmt_eng.xml
@@ -0,0 +1,6 @@
+
+
+
+TEST DISC 29
+
+
diff --git a/tests/fixtures/disc29/MovieObject.bdmv b/tests/fixtures/disc29/MovieObject.bdmv
new file mode 100644
index 0000000..148164c
Binary files /dev/null and b/tests/fixtures/disc29/MovieObject.bdmv differ
diff --git a/tests/fixtures/disc29/PLAYLIST/00000.mpls b/tests/fixtures/disc29/PLAYLIST/00000.mpls
new file mode 100644
index 0000000..9541ca8
Binary files /dev/null and b/tests/fixtures/disc29/PLAYLIST/00000.mpls differ
diff --git a/tests/fixtures/disc29/PLAYLIST/00001.mpls b/tests/fixtures/disc29/PLAYLIST/00001.mpls
new file mode 100644
index 0000000..92bc632
Binary files /dev/null and b/tests/fixtures/disc29/PLAYLIST/00001.mpls differ
diff --git a/tests/fixtures/disc29/PLAYLIST/00002.mpls b/tests/fixtures/disc29/PLAYLIST/00002.mpls
new file mode 100644
index 0000000..aa48c08
Binary files /dev/null and b/tests/fixtures/disc29/PLAYLIST/00002.mpls differ
diff --git a/tests/fixtures/disc29/PLAYLIST/00003.mpls b/tests/fixtures/disc29/PLAYLIST/00003.mpls
new file mode 100644
index 0000000..cf3540c
Binary files /dev/null and b/tests/fixtures/disc29/PLAYLIST/00003.mpls differ
diff --git a/tests/fixtures/disc29/PLAYLIST/00004.mpls b/tests/fixtures/disc29/PLAYLIST/00004.mpls
new file mode 100644
index 0000000..7f479a5
Binary files /dev/null and b/tests/fixtures/disc29/PLAYLIST/00004.mpls differ
diff --git a/tests/fixtures/disc29/PLAYLIST/00005.mpls b/tests/fixtures/disc29/PLAYLIST/00005.mpls
new file mode 100644
index 0000000..cc29046
Binary files /dev/null and b/tests/fixtures/disc29/PLAYLIST/00005.mpls differ
diff --git a/tests/fixtures/disc29/ics_menu.bin b/tests/fixtures/disc29/ics_menu.bin
new file mode 100644
index 0000000..6e6e1e2
Binary files /dev/null and b/tests/fixtures/disc29/ics_menu.bin differ
diff --git a/tests/fixtures/disc29/index.bdmv b/tests/fixtures/disc29/index.bdmv
new file mode 100644
index 0000000..5796e01
Binary files /dev/null and b/tests/fixtures/disc29/index.bdmv differ
diff --git a/tests/test_disc26_scan.py b/tests/test_disc26_scan.py
new file mode 100644
index 0000000..b51fcbe
--- /dev/null
+++ b/tests/test_disc26_scan.py
@@ -0,0 +1,49 @@
+"""Integration tests for the disc26 fixture — 3-episode OVA disc with commentary + extras."""
+
+from __future__ import annotations
+
+import pytest
+
+from bdpl.model import DiscAnalysis
+
+pytestmark = pytest.mark.integration
+
+
+class TestDisc26Episodes:
+ def test_episode_count(self, disc26_analysis: DiscAnalysis) -> None:
+ assert len(disc26_analysis.episodes) == 3
+
+ def test_episodes_are_ordered(self, disc26_analysis: DiscAnalysis) -> None:
+ assert [ep.episode for ep in disc26_analysis.episodes] == list(range(1, 4))
+
+ def test_episode_playlists(self, disc26_analysis: DiscAnalysis) -> None:
+ assert [ep.playlist for ep in disc26_analysis.episodes] == [
+ "00002.mpls",
+ "00003.mpls",
+ "00004.mpls",
+ ]
+
+ def test_episode_durations(self, disc26_analysis: DiscAnalysis) -> None:
+ for ep in disc26_analysis.episodes:
+ dur_min = ep.duration_ms / 60000
+ assert 25 < dur_min < 30, f"ep{ep.episode} duration {dur_min:.1f}min out of range"
+
+
+class TestDisc26Specials:
+ def test_special_count(self, disc26_analysis: DiscAnalysis) -> None:
+ assert len(disc26_analysis.special_features) == 12
+
+ def test_no_commentary(self, disc26_analysis: DiscAnalysis) -> None:
+ commentary = [sf for sf in disc26_analysis.special_features if sf.category == "commentary"]
+ assert len(commentary) == 0
+
+ def test_has_creditless_ed(self, disc26_analysis: DiscAnalysis) -> None:
+ creditless = [
+ sf for sf in disc26_analysis.special_features if sf.category == "creditless_ed"
+ ]
+ assert len(creditless) == 4
+
+
+class TestDisc26Metadata:
+ def test_disc_title(self, disc26_analysis: DiscAnalysis) -> None:
+ assert disc26_analysis.disc_title == "TEST DISC 26"
diff --git a/tests/test_disc27_scan.py b/tests/test_disc27_scan.py
new file mode 100644
index 0000000..7ec0db4
--- /dev/null
+++ b/tests/test_disc27_scan.py
@@ -0,0 +1,49 @@
+"""Integration tests for the disc27 fixture — 3-episode OVA disc with commentary + extras."""
+
+from __future__ import annotations
+
+import pytest
+
+from bdpl.model import DiscAnalysis
+
+pytestmark = pytest.mark.integration
+
+
+class TestDisc27Episodes:
+ def test_episode_count(self, disc27_analysis: DiscAnalysis) -> None:
+ assert len(disc27_analysis.episodes) == 3
+
+ def test_episodes_are_ordered(self, disc27_analysis: DiscAnalysis) -> None:
+ assert [ep.episode for ep in disc27_analysis.episodes] == list(range(1, 4))
+
+ def test_episode_playlists(self, disc27_analysis: DiscAnalysis) -> None:
+ assert [ep.playlist for ep in disc27_analysis.episodes] == [
+ "00002.mpls",
+ "00003.mpls",
+ "00004.mpls",
+ ]
+
+ def test_episode_durations(self, disc27_analysis: DiscAnalysis) -> None:
+ for ep in disc27_analysis.episodes:
+ dur_min = ep.duration_ms / 60000
+ assert 26 < dur_min < 31, f"ep{ep.episode} duration {dur_min:.1f}min out of range"
+
+
+class TestDisc27Specials:
+ def test_special_count(self, disc27_analysis: DiscAnalysis) -> None:
+ assert len(disc27_analysis.special_features) == 12
+
+ def test_no_commentary(self, disc27_analysis: DiscAnalysis) -> None:
+ commentary = [sf for sf in disc27_analysis.special_features if sf.category == "commentary"]
+ assert len(commentary) == 0
+
+ def test_has_creditless_ed(self, disc27_analysis: DiscAnalysis) -> None:
+ creditless = [
+ sf for sf in disc27_analysis.special_features if sf.category == "creditless_ed"
+ ]
+ assert len(creditless) == 6
+
+
+class TestDisc27Metadata:
+ def test_disc_title(self, disc27_analysis: DiscAnalysis) -> None:
+ assert disc27_analysis.disc_title == "TEST DISC 27"
diff --git a/tests/test_disc28_scan.py b/tests/test_disc28_scan.py
new file mode 100644
index 0000000..eae2719
--- /dev/null
+++ b/tests/test_disc28_scan.py
@@ -0,0 +1,49 @@
+"""Integration tests for the disc28 fixture — 3-episode OVA disc with creditless + extras."""
+
+from __future__ import annotations
+
+import pytest
+
+from bdpl.model import DiscAnalysis
+
+pytestmark = pytest.mark.integration
+
+
+class TestDisc28Episodes:
+ def test_episode_count(self, disc28_analysis: DiscAnalysis) -> None:
+ assert len(disc28_analysis.episodes) == 3
+
+ def test_episodes_are_ordered(self, disc28_analysis: DiscAnalysis) -> None:
+ assert [ep.episode for ep in disc28_analysis.episodes] == list(range(1, 4))
+
+ def test_episode_playlists(self, disc28_analysis: DiscAnalysis) -> None:
+ assert [ep.playlist for ep in disc28_analysis.episodes] == [
+ "00002.mpls",
+ "00003.mpls",
+ "00004.mpls",
+ ]
+
+ def test_episode_durations(self, disc28_analysis: DiscAnalysis) -> None:
+ for ep in disc28_analysis.episodes:
+ dur_min = ep.duration_ms / 60000
+ assert 25 < dur_min < 33, f"ep{ep.episode} duration {dur_min:.1f}min out of range"
+
+
+class TestDisc28Specials:
+ def test_special_count(self, disc28_analysis: DiscAnalysis) -> None:
+ assert len(disc28_analysis.special_features) == 10
+
+ def test_no_commentary(self, disc28_analysis: DiscAnalysis) -> None:
+ commentary = [sf for sf in disc28_analysis.special_features if sf.category == "commentary"]
+ assert len(commentary) == 0
+
+ def test_has_creditless_ed(self, disc28_analysis: DiscAnalysis) -> None:
+ creditless = [
+ sf for sf in disc28_analysis.special_features if sf.category == "creditless_ed"
+ ]
+ assert len(creditless) == 7
+
+
+class TestDisc28Metadata:
+ def test_disc_title(self, disc28_analysis: DiscAnalysis) -> None:
+ assert disc28_analysis.disc_title == "TEST DISC 28"
diff --git a/tests/test_disc29_scan.py b/tests/test_disc29_scan.py
new file mode 100644
index 0000000..b604577
--- /dev/null
+++ b/tests/test_disc29_scan.py
@@ -0,0 +1,35 @@
+"""Integration tests for the disc29 fixture — special disc with OVA + digital archives."""
+
+from __future__ import annotations
+
+import pytest
+
+from bdpl.model import DiscAnalysis
+
+pytestmark = pytest.mark.integration
+
+
+class TestDisc29Episodes:
+ def test_episode_count(self, disc29_analysis: DiscAnalysis) -> None:
+ assert len(disc29_analysis.episodes) == 1
+
+ def test_episode_playlist(self, disc29_analysis: DiscAnalysis) -> None:
+ assert disc29_analysis.episodes[0].playlist == "00002.mpls"
+
+ def test_episode_duration(self, disc29_analysis: DiscAnalysis) -> None:
+ dur_min = disc29_analysis.episodes[0].duration_ms / 60000
+ assert 43 < dur_min < 45, f"OVA duration {dur_min:.1f}min, expected ~44min"
+
+
+class TestDisc29Specials:
+ def test_special_feature_count(self, disc29_analysis: DiscAnalysis) -> None:
+ assert len(disc29_analysis.special_features) == 3
+
+ def test_all_digital_archives(self, disc29_analysis: DiscAnalysis) -> None:
+ for sf in disc29_analysis.special_features:
+ assert sf.category == "digital_archive"
+
+
+class TestDisc29Metadata:
+ def test_disc_title(self, disc29_analysis: DiscAnalysis) -> None:
+ assert disc29_analysis.disc_title == "TEST DISC 29"
diff --git a/tests/test_disc8_scan.py b/tests/test_disc8_scan.py
index 6d0b3c3..cede59e 100644
--- a/tests/test_disc8_scan.py
+++ b/tests/test_disc8_scan.py
@@ -5,10 +5,12 @@
- Episode 1 (00003.mpls, clip 00006): ~54 min, 4 scenes
- Episode 2 (00004.mpls, clips 00007+00010): ~60 min, 4 scenes
-Three specials are detected via IG menu analysis:
-- 2 commentary tracks (JumpTitle to episode playlists from special feature pages)
+One special is detected via IG menu analysis:
- 1 lyrics credit ending (00005.mpls, ~5.2 min; 00006.mpls is a stream
variant with different audio and is automatically excluded)
+
+The IG episode-selection page (page 4) targets both episode playlists;
+these are correctly identified as navigation buttons, not commentary.
"""
import pytest
@@ -46,27 +48,16 @@ def test_episode_durations_reasonable(self, disc8_analysis: DiscAnalysis) -> Non
class TestDisc8Specials:
def test_special_count(self, disc8_analysis: DiscAnalysis) -> None:
- """Disc8 should have 3 specials (2 commentary + 1 lyrics ending)."""
- assert len(disc8_analysis.special_features) == 3
-
- def test_commentaries_detected(self, disc8_analysis: DiscAnalysis) -> None:
- """Two commentary specials should reference the episode playlists."""
- commentaries = [sf for sf in disc8_analysis.special_features if sf.category == "commentary"]
- assert len(commentaries) == 2
- assert {c.playlist for c in commentaries} == {"00003.mpls", "00004.mpls"}
+ """Disc8 should have 1 special (lyrics ending)."""
+ assert len(disc8_analysis.special_features) == 1
def test_lyrics_ending_detected(self, disc8_analysis: DiscAnalysis) -> None:
- """One non-commentary special (lyrics credit ending) on 00005.mpls."""
- non_commentary = [
- sf for sf in disc8_analysis.special_features if sf.category != "commentary"
- ]
- assert len(non_commentary) == 1
- assert non_commentary[0].playlist == "00005.mpls"
+ """One special (lyrics credit ending) on 00005.mpls."""
+ assert disc8_analysis.special_features[0].playlist == "00005.mpls"
def test_specials_are_short(self, disc8_analysis: DiscAnalysis) -> None:
"""The lyrics ending special should be ~4–6 min."""
- lyrics = [sf for sf in disc8_analysis.special_features if sf.category != "commentary"]
- for sf in lyrics:
+ for sf in disc8_analysis.special_features:
dur_min = sf.duration_ms / 60_000
assert 4 < dur_min < 7, f"Special {sf.playlist} duration {dur_min:.1f}min out of range"
diff --git a/tests/test_disc_matrix.py b/tests/test_disc_matrix.py
index 3606d2d..eac5a0f 100644
--- a/tests/test_disc_matrix.py
+++ b/tests/test_disc_matrix.py
@@ -36,6 +36,10 @@
("disc23_analysis", 5, ["00002.mpls"] * 5),
("disc24_analysis", 3, ["00002.mpls"] * 3),
("disc25_analysis", 1, ["00002.mpls"]),
+ ("disc26_analysis", 3, ["00002.mpls", "00003.mpls", "00004.mpls"]),
+ ("disc27_analysis", 3, ["00002.mpls", "00003.mpls", "00004.mpls"]),
+ ("disc28_analysis", 3, ["00002.mpls", "00003.mpls", "00004.mpls"]),
+ ("disc29_analysis", 1, ["00002.mpls"]),
],
)
def test_disc_episode_expectation_matrix(
@@ -60,7 +64,7 @@ def test_disc_episode_expectation_matrix(
("disc5_analysis", 14, 11), # 14 IG-derived, 11 visible content buttons
("disc6_analysis", 3, 3), # 3 title-hint specials
("disc7_analysis", 2, 2), # 2 title-hint specials (stream variants)
- ("disc8_analysis", 3, 3), # 2 commentaries + 1 lyrics ending
+ ("disc8_analysis", 1, 1), # 1 lyrics ending
("disc9_analysis", 1, 1), # alt-audio variant detected as special
("disc10_analysis", 3, 3), # 3 commentaries (play_all-only episodes)
("disc11_analysis", 1, 1), # 1 short extra
@@ -77,6 +81,10 @@ def test_disc_episode_expectation_matrix(
("disc23_analysis", 0, 0), # chapter-split disc with no extras
("disc24_analysis", 8, 8), # 1 extra + 3 commentary + 4 creditless ED
("disc25_analysis", 1, 1), # 1 digital archive
+ ("disc26_analysis", 12, 12), # 4 creditless_ed + 8 extra
+ ("disc27_analysis", 12, 12), # 6 creditless_ed + 6 extra
+ ("disc28_analysis", 10, 10), # 7 creditless_ed + 3 extra
+ ("disc29_analysis", 3, 3), # 3 digital archives
],
)
def test_disc_special_visibility_expectation_matrix(
@@ -122,6 +130,10 @@ def test_disc_special_visibility_expectation_matrix(
"disc23_analysis",
"disc24_analysis",
"disc25_analysis",
+ "disc26_analysis",
+ "disc27_analysis",
+ "disc28_analysis",
+ "disc29_analysis",
],
)
def test_disc_episode_segment_boundaries_matrix(
@@ -171,6 +183,10 @@ def test_disc_episode_segment_boundaries_matrix(
"disc23_analysis",
"disc24_analysis",
"disc25_analysis",
+ "disc26_analysis",
+ "disc27_analysis",
+ "disc28_analysis",
+ "disc29_analysis",
],
)
def test_disc_special_boundary_semantics_matrix(
@@ -227,6 +243,10 @@ def test_disc_special_boundary_semantics_matrix(
("disc23_analysis", 0),
("disc24_analysis", 0),
("disc25_analysis", 0),
+ ("disc26_analysis", 0),
+ ("disc27_analysis", 0),
+ ("disc28_analysis", 0),
+ ("disc29_analysis", 0),
],
)
def test_disc_special_chapter_split_expectation_matrix(
@@ -266,6 +286,10 @@ def test_disc_special_chapter_split_expectation_matrix(
("disc23_analysis", "TEST DISC 23"),
("disc24_analysis", "TEST DISC 24"),
("disc25_analysis", "TEST DISC 25"),
+ ("disc26_analysis", "TEST DISC 26"),
+ ("disc27_analysis", "TEST DISC 27"),
+ ("disc28_analysis", "TEST DISC 28"),
+ ("disc29_analysis", "TEST DISC 29"),
],
)
def test_disc_title_extraction_matrix(