fix: clip metadata intervals to playable duration

This commit is contained in:
2026-10-22 13:17:47 +02:00
parent fe34ce88f9
commit 7b53b00b15
4 changed files with 25 additions and 11 deletions
+13 -4
View File
@@ -167,15 +167,24 @@ struct MiruroMetadataChecks {
for duration in [0, -1, Double.nan, .infinity] {
try require(MiruroMetadata(title: nil, intervals: [valid]).visibleIntervals(episode: 1, duration: duration).isEmpty, "wait for finite positive actual duration")
}
let invalid = [interval(.intro, -1, 10), interval(.intro, 10, 10), interval(.intro, 20, 10),
interval(.intro, .nan, 10), interval(.intro, 0, .infinity), interval(.intro, 0, 101),
let invalid = [interval(.intro, -10, 0), interval(.intro, 100, 110),
interval(.intro, 10, 10), interval(.intro, 20, 10),
interval(.intro, .nan, 10), interval(.intro, 0, .infinity),
interval(episode: 2), interval(votes: -1), interval(votes: .nan),
interval(provider: "SomeCrunchyrollProvider"), interval(length: 106)]
try require(MiruroMetadata(title: nil, intervals: invalid).visibleIntervals(episode: 1, duration: 100).isEmpty, "bounds, episode, votes, provenance and reference-length rejection")
let metadata = MiruroMetadata(title: nil, intervals: [valid])
try require(metadata.visibleIntervals(episode: 1, duration: 100) == [valid], "end equal to duration allowed")
try require(metadata.visibleIntervals(episode: 1, duration: 99).isEmpty, "duration shrink revalidates without trimming")
try require(metadata.visibleIntervals(episode: 1, duration: 120) == [valid], "duration growth revalidates without scaling")
try require(metadata.visibleIntervals(episode: 1, duration: 99) == [interval(.intro, 10, 99)], "duration shrink clips the visible interval")
try require(metadata.visibleIntervals(episode: 1, duration: 120) == [valid] && metadata.intervals == [valid], "duration growth restores unchanged raw timestamps")
let overlapping = MiruroMetadata(title: nil, intervals: [
interval(.intro, -5.5, 10.25), interval(.outro, 90.75, 110.5)])
try require(overlapping.visibleIntervals(episode: 1, duration: 100) == [
interval(.intro, 0, 10.25), interval(.outro, 90.75, 100)], "partial overlaps clip at both playback boundaries")
try require(overlapping.visibleIntervals(episode: 1, duration: 120) == [
interval(.intro, 0, 10.25), interval(.outro, 90.75, 110.5)], "growth recomputes clipping from raw timestamps")
try require(MiruroMetadata(title: nil, intervals: [interval(.intro, -10, 110)])
.visibleIntervals(episode: 1, duration: 100) == [interval(.intro, 0, 100)], "interval spanning the video clips to the playable range")
let first = interval(.intro, 5, 15, votes: 4), tied = interval(.intro, 20, 30, votes: 4)
let ending = interval(.outro, 12, 40, votes: 2)
let ranked = MiruroMetadata(title: nil, intervals: [interval(), first, tied, ending, interval(.outro, 50, 60, votes: 1)])