From ee3af3812dfc42f2a5d3db532b7a54dd4cb4d86c Mon Sep 17 00:00:00 2001 From: CircleCrop <54088075+CircleCrop@users.noreply.github.com> Date: Wed, 15 Jul 2026 13:08:21 +0800 Subject: [PATCH] fix: preserve structured upload variants --- .../web-uploader/source-scanner.test.ts | 22 +++++++++++++++++++ .../components/web-uploader/source-scanner.ts | 5 +++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/apps/internal-site/components/web-uploader/source-scanner.test.ts b/apps/internal-site/components/web-uploader/source-scanner.test.ts index 7ed1082..de940d9 100644 --- a/apps/internal-site/components/web-uploader/source-scanner.test.ts +++ b/apps/internal-site/components/web-uploader/source-scanner.test.ts @@ -199,6 +199,28 @@ describe("scanBrowserUploadFiles", () => { expect(plan.frames[0].misc.map((asset) => asset.label)).toEqual(["Rip"]); }); + it("preserves explicit rip and flt variants inside an after directory", () => { + const plan = scanBrowserUploadFiles( + [ + image("case/before/24_WATANARE_ANIME_VOL1_00000.gen.vpy-27240-src.png"), + image("case/after/24_WATANARE_ANIME_VOL1_00000.gen.vpy-27240-output.png"), + image("case/after/24_WATANARE_ANIME_VOL1_00000.gen.vpy-27240-rip.png"), + image("case/after/24_WATANARE_ANIME_VOL1_00000.gen.vpy-27240-flt.png"), + ], + "case", + ); + + expect(plan.frames).toHaveLength(1); + expect(plan.frames[0].after.source.relativePath).toBe( + "after/24_WATANARE_ANIME_VOL1_00000.gen.vpy-27240-output.png", + ); + expect(plan.frames[0].misc.map((asset) => asset.source.relativePath)).toEqual([ + "after/24_WATANARE_ANIME_VOL1_00000.gen.vpy-27240-rip.png", + "after/24_WATANARE_ANIME_VOL1_00000.gen.vpy-27240-flt.png", + ]); + expect(plan.frames[0].misc.map((asset) => asset.label)).toEqual(["Rip", "Flt"]); + }); + it("pairs structured filenames even when only some variants keep the fps prefix", () => { const plan = scanBrowserUploadFiles( [ diff --git a/apps/internal-site/components/web-uploader/source-scanner.ts b/apps/internal-site/components/web-uploader/source-scanner.ts index 3725219..33ef0a3 100644 --- a/apps/internal-site/components/web-uploader/source-scanner.ts +++ b/apps/internal-site/components/web-uploader/source-scanner.ts @@ -261,7 +261,8 @@ function parseCandidate(entry: BrowserUploadFile, variantOverride?: string): Sou return { entry, originalName: basename(entry.relativePath), - variant: (variantOverride ?? structured.variant).trim().toLowerCase(), + // Structured filenames must carry an explicit variant, so directory hints must not replace it. + variant: structured.variant.trim().toLowerCase(), fps: structured.fps, episode: structured.episode, frameNumber: structured.frameNumber, @@ -279,7 +280,7 @@ function parseCandidate(entry: BrowserUploadFile, variantOverride?: string): Sou const prefix = match.groups.prefix; const rawFrame = match.groups.frame; const frameNumber = Number(rawFrame.replace(/^0+/, "") || "0"); - const variant = (variantOverride ?? match.groups.variant ?? "output").trim().toLowerCase(); + const variant = (match.groups.variant ?? variantOverride ?? "output").trim().toLowerCase(); const fps = extractFps(pathStem); const episode = extractEpisode(prefix); const title = `${fps}_${episode}_${frameNumber}`;