import { test } from '@japa/runner' import { fileStem, releaseIdentity, subjectRemainder } from '#lib/release/index' import { looksLikeFilename, weakFileKey } from '#lib/subject/index' test.group('release / fileStem', () => { test('reduces all files of a set to the same stem', ({ assert }) => { const names = [ '1790546808_nicovideo_jp_watch_sm26679715.tar.zst', '1790546808_nicovideo_jp_watch_sm26679715.tar.zst.par2', '1790546808_nicovideo_jp_watch_sm26679715.tar.zst.vol03+04.par2', ] assert.deepEqual(new Set(names.map(fileStem)), new Set(['1790546808_nicovideo_jp_watch_sm26679715'])) }) test('handles rar, split and par2 volume naming', ({ assert }) => { assert.equal(fileStem('lJzuoIKA3T8xjzAD3vqtw0.part036.rar'), 'lJzuoIKA3T8xjzAD3vqtw0') assert.equal(fileStem('Some.Movie.2024.r07'), 'Some.Movie.2024') assert.equal(fileStem('Some.Movie.2024.mkv.001'), 'Some.Movie.2024') assert.equal(fileStem('Some.Movie.2024.2160p.WEB-DL.H.265.mkv'), 'Some.Movie.2024.2160p.WEB-DL.H.265') assert.equal(fileStem('Some.Movie.2024.H.264.nzb'), 'Some.Movie.2024.H.264') assert.equal(fileStem('Some.Movie.2024.vol127-128.par2'), 'Some.Movie.2024') assert.equal(fileStem('Some.Movie.2024.nfo'), 'Some.Movie.2024') assert.equal(fileStem('00-artist-album-web-2026.m3u'), '00-artist-album-web-2026') assert.equal(fileStem('f6dd6b156692a52b.bin'), 'f6dd6b156692a52b') }) test('never reduces a name to nothing', ({ assert }) => { assert.equal(fileStem('.par2'), '.par2') }) }) test.group('release / subjectRemainder', () => { test('is empty when the subject only has counters, filename and size', ({ assert }) => { assert.equal(subjectRemainder('[1/4] - "x.tar.zst" yEnc 15411409'), '') assert.equal(subjectRemainder('. - [00/88] - "60SHkTQSvn5RZGExwju2.nzb" yEnc'), '') }) test('keeps a release name written outside the quotes', ({ assert }) => { assert.equal( subjectRemainder('Some.Show.S01E02.1080p [03/40] - "abc.part02.rar" yEnc'), 'Some Show S01E02 1080p' ) }) }) test.group('release / releaseIdentity', () => { test('groups a par2 set with its archive by stem, per poster', ({ assert }) => { const base = { poster: 'p', weak: false } const a = releaseIdentity({ ...base, subject: '[1/4] - "x.tar.zst" yEnc 1', name: 'x.tar.zst' })! const b = releaseIdentity({ ...base, subject: '[3/4] - "x.tar.zst.vol01+02.par2" yEnc 2', name: 'x.tar.zst.vol01+02.par2' })! assert.equal(a.key, b.key) assert.equal(a.name, 'x') assert.equal(a.fileTotal, 4) const other = releaseIdentity({ ...base, poster: 'q', subject: '[1/4] - "x.tar.zst" yEnc 1', name: 'x.tar.zst' })! assert.notEqual(a.key, other.key) }) test('a par2 index posted without [i/M] counter joins its release', ({ assert }) => { const base = { poster: 'nicovideo_archiver', weak: false } const archive = releaseIdentity({ ...base, subject: '[1/6] - "x.tar.zst" yEnc 105054576', name: 'x.tar.zst' })! const index = releaseIdentity({ ...base, subject: '"x.tar.zst.par2" yEnc 3100', name: 'x.tar.zst.par2' })! assert.equal(index.key, archive.key) assert.equal(archive.fileTotal, 6) assert.isUndefined(index.fileTotal) }) test('uses the subject text when it names the release', ({ assert }) => { const base = { poster: 'p', weak: false } const a = releaseIdentity({ ...base, subject: 'My.Release [01/40] - "abc.part01.rar" yEnc', name: 'abc.part01.rar' })! const b = releaseIdentity({ ...base, subject: 'My.Release [40/40] - "abc.par2" yEnc', name: 'abc.par2' })! assert.equal(a.key, b.key) assert.equal(a.name, 'My Release') }) test('obfuscated volumes group by stem regardless of the random poster', ({ assert }) => { const a = releaseIdentity({ poster: '3Uzx7TTSFpLzz@ngPost.com', subject: '"lJzu.part033.rar" yEnc', name: 'lJzu.part033.rar', weak: true })! const b = releaseIdentity({ poster: 'bGLd1oaXRdrK1@ngPost.com', subject: '"lJzu.part034.rar" yEnc', name: 'lJzu.part034.rar', weak: true })! assert.equal(a.key, b.key) }) test('random extensionless names cannot be grouped by name', ({ assert }) => { const name = '204b914a977e5f891590ff1099c7a8caf1a0be537bfa5bf7f3a8b1213231' assert.isNull(releaseIdentity({ poster: 'x', subject: `"${name}" yEnc`, name, weak: true })) }) }) test.group('subject / weakFileKey', () => { test('ignores random per-article names, keeps real filenames', ({ assert }) => { assert.isFalse(looksLikeFilename('204b914a977e5f891590ff1099c7a8caf1a0be537bfa5bf7f3a8b1213231')) assert.isTrue(looksLikeFilename('lJzuoIKA3T8xjzAD3vqtw0.part033.rar')) // Same file, different random names per article: same key. assert.equal(weakFileKey('aaaa1111', 5000, 7), weakFileKey('bbbb2222', 5000, 7)) // Equal-sized volumes with real names: different keys. assert.notEqual(weakFileKey('x.part01.rar', 5000, 7), weakFileKey('x.part02.rar', 5000, 7)) assert.notEqual(weakFileKey('aaaa1111', 5000, 7), weakFileKey('aaaa1111', 5001, 7)) }) }) test.group('release / rarReleaseIdentity', () => { test('groups volumes by the shared top-level directory', async ({ assert }) => { const { rarReleaseIdentity } = await import('#lib/release/index') const first = rarReleaseIdentity([ { name: 'LASZR_-_DYING_ALIVE-(PRO094)-WEB-2026-DIM/00-cover.jpg', size: 589382 }, { name: 'LASZR_-_DYING_ALIVE-(PRO094)-WEB-2026-DIM/01-track.flac', size: 30_000_000 }, ])! const later = rarReleaseIdentity([{ name: 'LASZR_-_DYING_ALIVE-(PRO094)-WEB-2026-DIM/03-track.flac', size: 29_000_000 }])! assert.equal(first.key, later.key) assert.equal(first.name, 'LASZR_-_DYING_ALIVE-(PRO094)-WEB-2026-DIM') assert.equal(first.source, 'rar') }) test('without a directory, volumes of one file share its first entry', async ({ assert }) => { const { rarReleaseIdentity } = await import('#lib/release/index') const a = rarReleaseIdentity([{ name: 'Some.Show.S01E01.1080p.mkv', size: 3_000_000_000 }])! const b = rarReleaseIdentity([{ name: 'Some.Show.S01E01.1080p.mkv', size: 3_000_000_000 }])! assert.equal(a.key, b.key) assert.equal(a.name, 'Some.Show.S01E01.1080p') assert.isNull(rarReleaseIdentity([])) }) }) test.group('release / namesRelease', () => { test('random per-file tags and poster ids are not a release name', async ({ assert }) => { const { namesRelease, subjectRemainder, releaseIdentity } = await import('#lib/release/index') const subject = 'elys-de81bcabef5faf6a - [Nyh5Q07Y] "JkpNIFg7En50zU1U" yEnc' assert.isFalse(namesRelease(subjectRemainder(subject))) const a = releaseIdentity({ poster: 'elys', subject, name: 'JkpNIFg7En50zU1U', weak: false })! assert.equal(a.source, 'stem') assert.isTrue(namesRelease(subjectRemainder('Some.Show.S01E02.1080p [03/40] - "abc.part02.rar" yEnc'))) assert.isTrue(namesRelease('My Release')) }) }) test.group('release / post id', () => { test('groups random-named files of one post by poster, post id and file count', async ({ assert }) => { const { releaseIdentity, isPostToken } = await import('#lib/release/index') const base = { poster: 'jW344UtC8R2bZEegrVLz@x', weak: false } const a = releaseIdentity({ ...base, subject: '83110629-n [10/18] - "eiae6fulpolas2adfts6o8643n3e6j6ct8d3219aau0jc33ol9r50tohncgr46evpl0dqoqktfb7k" yEnc', name: 'eiae6fulpolas2adfts6o8643n3e6j6ct8d3219aau0jc33ol9r50tohncgr46evpl0dqoqktfb7k' })! const b = releaseIdentity({ ...base, subject: '83110629-n [01/18] - "2ef0vm4kb618nv17kn0qsb0j1ofh7pgqtk5a3v5lkqqf1f7g6ed0" yEnc', name: '2ef0vm4kb618nv17kn0qsb0j1ofh7pgqtk5a3v5lkqqf1f7g6ed0' })! assert.equal(a.key, b.key) assert.equal(a.source, 'post') assert.equal(a.fileTotal, 18) const other = releaseIdentity({ ...base, subject: '83110630-n [01/18] - "x" yEnc', name: 'x' })! assert.notEqual(a.key, other.key) assert.isTrue(isPostToken('83110629 n')) assert.isFalse(isPostToken('PRiVATE')) assert.isFalse(isPostToken('')) // Without a counter there is nothing to bound the post: fall back to the stem. assert.equal(releaseIdentity({ ...base, subject: '83110629-n - "x.bin" yEnc', name: 'x.bin' })!.source, 'stem') }) }) test.group('release / par2 names', () => { test('names a season pack after what its episodes share', async ({ assert }) => { const { par2ReleaseName } = await import('#lib/release/index') const eps = Array.from({ length: 20 }, (_, i) => `SEAL.Team.S03E${String(i + 1).padStart(2, '0')}.1080p.AMZN.WEB-DL.AAC2.0.H.265.DUAL-nitrato.mkv`) assert.equal(par2ReleaseName(eps), 'SEAL.Team.S03.1080p.AMZN.WEB-DL.AAC2.0.H.265.DUAL-nitrato') // Movie plus sample and nfo: the movie's (longest) name. assert.equal( par2ReleaseName(['Some.Movie.2024.1080p.BluRay.x264-GRP.mkv', 'Some.Movie.2024.1080p.BluRay.x264-GRP.nfo', 'sample.mkv']), 'Some.Movie.2024.1080p.BluRay.x264-GRP' ) // Numbered parts: the shared name without the part number. assert.equal(par2ReleaseName(['Album.Name-2024-GRP.part01.rar', 'Album.Name-2024-GRP.part02.rar']), 'Album.Name-2024-GRP') assert.equal(par2ReleaseName(['only.one.file.2024.mkv']), 'only.one.file.2024') }) })