From f094fb45939d386cc80c20fafe9b58a80052a414 Mon Sep 17 00:00:00 2001 From: Daan Meijer Date: Mon, 12 Oct 2026 02:45:29 +0200 Subject: [PATCH] Image sets: a suffix that ends the number before is a repeat too "051 - White leather kate054001_1_1.jpg": the index is inside 054001 (set 054, image 001) and _1_1 repeats it, but only a suffix equal to the whole number before counted as a repeat, so the set kept 054001 and every image was a release (Duke's threads: 2,791 releases of 3,251 files). A suffix that the number before ends with is a repeat as well. Both implementations; tests; fixtures identical. Co-Authored-By: Claude Opus 5.5 --- edge/src/names.rs | 4 +++- lib/release/identity.ts | 4 +++- tests/unit/release/identity.spec.ts | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/edge/src/names.rs b/edge/src/names.rs index e3afa69..4622554 100644 --- a/edge/src/names.rs +++ b/edge/src/names.rs @@ -430,7 +430,8 @@ pub fn image_set(stem: &str) -> String { let Some(last) = before.iter().rposition(u8::is_ascii_digit) else { break }; let start = before[..=last].iter().rposition(|c| !c.is_ascii_digit()).map_or(0, |i| i + 1); let previous = &before[start..=last]; - let same = trim_zeros(n) == trim_zeros(previous); + // A repeat: the same number, or the end of the one before (054001 ends in 1). + let same = trim_zeros(n) == trim_zeros(previous) || previous.ends_with(n); let year = n.len() == 4 && (n.starts_with(b"19") || n.starts_with(b"20")); if same || year || n.len() >= 4 { let cut = before.len(); @@ -1173,6 +1174,7 @@ mod image_set_tests { ("keira_s04_l keira_s04_0040_l", "keira_s04_l keira_s04_"), ("IMG_2676", "IMG_"), ("2877-041", "2877-"), + ("051 - White leather kate054001_1_1", "051 - White leather kate"), ("JimAndJoey Kindly Husband-to-Be", ""), ] { assert_eq!(image_set(stem), want, "{stem}"); diff --git a/lib/release/identity.ts b/lib/release/identity.ts index 4a350c7..1ec42da 100644 --- a/lib/release/identity.ts +++ b/lib/release/identity.ts @@ -156,7 +156,9 @@ export function imageSet(stem: string): string { const previous = /(\d+)\D*$/.exec(before) if (!previous) break const n = m[1] - if (Number(n) === Number(previous[1]) || /^(?:19|20)\d\d$/.test(n) || n.length >= 4) s = before + // A repeat: the same number, or the end of the one before ("kate054001_1_1": 054001 ends in 1). + const repeat = Number(n) === Number(previous[1]) || previous[1].endsWith(n) + if (repeat || /^(?:19|20)\d\d$/.test(n) || n.length >= 4) s = before else break } return /\d/.test(s) ? s.replace(/\d+\D*$/, '') : '' diff --git a/tests/unit/release/identity.spec.ts b/tests/unit/release/identity.spec.ts index 0d7bad1..178f603 100644 --- a/tests/unit/release/identity.spec.ts +++ b/tests/unit/release/identity.spec.ts @@ -234,6 +234,7 @@ test.group('release / par2 names', () => { ['keira_s04_l keira_s04_0040_l', 'keira_s04_l keira_s04_'], ['IMG_2676', 'IMG_'], ['2877-041', '2877-'], + ['051 - White leather kate054001_1_1', '051 - White leather kate'], ['JimAndJoey Kindly Husband-to-Be', ''], ]) assert.equal(imageSet(stem), set, stem) })