Of 5,000 waiting inspection jobs, 3,212 were queued only because their stem looked random, and 2,044 of those were later RAR volumes (xyz.part47.rar, .r00) or par2 recovery volumes (.vol03+04.par2). Their first segment adds nothing: the set is listed from its first volume and named from its index .par2, as for readable names already. Each one cost a ~700 KB download; inspection pulled ~85 MB/s and fell behind the backfill. - isCandidate() rejects later volumes (isLaterVolume) before the random- name rule. - worker:file only queues files that are candidates, so the ~30% that inspection skips anyway no longer take queue slots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
66 lines
3.7 KiB
TypeScript
66 lines
3.7 KiB
TypeScript
import { test } from '@japa/runner'
|
|
import yencode from 'yencode'
|
|
import { isLaterVolume, sniffContentType } from '#lib/content/index'
|
|
import { crc32Hex, decodeSegment, YencError } from '#lib/yenc/index'
|
|
|
|
test.group('content / sniffContentType', () => {
|
|
test('recognises containers and media by magic bytes', ({ assert }) => {
|
|
const magic = (hex: string, pad = 16) => Buffer.concat([Buffer.from(hex, 'hex'), Buffer.alloc(pad)])
|
|
assert.equal(sniffContentType(Buffer.concat([Buffer.from('nzbe'), Buffer.alloc(40)])), 'nzbe')
|
|
assert.equal(sniffContentType(magic('5041523200504b54')), 'par2')
|
|
assert.equal(sniffContentType(magic('526172211a070100')), 'rar5')
|
|
assert.equal(sniffContentType(magic('526172211a0700')), 'rar4')
|
|
assert.equal(sniffContentType(magic('1a45dfa3')), 'matroska')
|
|
assert.equal(sniffContentType(magic('0000001866747970')), 'mp4')
|
|
assert.equal(sniffContentType(magic('28b52ffd')), 'zstd')
|
|
assert.equal(sniffContentType(Buffer.from('<?xml version="1.0"?>\n<!DOCTYPE nzb PUBLIC "x">')), 'nzb')
|
|
assert.isNull(sniffContentType(Buffer.from('plain text')))
|
|
assert.equal(sniffContentType(magic('ffd8ffe0')), 'jpeg')
|
|
assert.equal(sniffContentType(magic('89504e470d0a1a0a')), 'png')
|
|
assert.equal(sniffContentType(Buffer.concat([Buffer.from('ID3'), Buffer.alloc(16)])), 'mp3')
|
|
assert.equal(sniffContentType(Buffer.concat([Buffer.from('fLaC'), Buffer.alloc(16)])), 'flac')
|
|
assert.equal(sniffContentType(Buffer.from('RIFF\x00\x00\x00\x00AVI LIST', 'latin1')), 'avi')
|
|
|
|
// UDF (Blu-ray) volume recognition sequence at 32 KiB
|
|
const udf = Buffer.alloc(0x9000)
|
|
udf.write('BEA01', 0x8001, 'latin1')
|
|
udf.write('NSR03', 0x8801, 'latin1')
|
|
assert.equal(sniffContentType(udf), 'udf')
|
|
})
|
|
})
|
|
|
|
test.group('yenc / lenientSize', () => {
|
|
test("recognises yEncBin's encrypted .bin container by its header", ({ assert }) => {
|
|
// The first 48 bytes of 2141406641.bin (yEncBin@Poster.com).
|
|
const data = Buffer.from('54f399d117c492696e4dc4ef5b60c11d7f83e92dfdf23450e79370b048123da81e4c8013091b682fb22478daed2ae981', 'hex')
|
|
assert.equal(sniffContentType(data), 'yencbin')
|
|
// The second variant (1060238685.bin).
|
|
assert.equal(sniffContentType(Buffer.from('54f399e917c492696a4e9fb05b60c31d7f83e92df9f16f5086e3c3d9480d66ef1e48d915', 'hex')), 'yencbin')
|
|
assert.isNull(sniffContentType(Buffer.from('54f399d117c492696e4dc4ef5b60c11e7f83e92d', 'hex')))
|
|
})
|
|
|
|
test('decodes a part whose declared size leaves out a header, still checking the CRC', ({ assert }) => {
|
|
const data = Buffer.concat([Buffer.from('nzbe'), Buffer.alloc(16, 7), Buffer.from('ciphertext-here')])
|
|
const declared = data.length - 20
|
|
const body = Buffer.from(
|
|
`=ybegin part=1 line=128 size=${declared} name=f6dd6b156692a52b.bin\r\n=ypart begin=1 end=${declared}\r\n` +
|
|
yencode.encode(data).toString('latin1') +
|
|
`\r\n=yend size=${declared} part=1 pcrc32=${crc32Hex(data)}`,
|
|
'latin1'
|
|
)
|
|
assert.throws(() => decodeSegment(body), YencError as any)
|
|
assert.isTrue(decodeSegment(body, { lenientSize: true }).data.equals(data))
|
|
})
|
|
})
|
|
|
|
test.group('content / isLaterVolume', () => {
|
|
test('recognises later RAR volumes and par2 recovery volumes, also under a random stem', ({ assert }) => {
|
|
for (const name of ['P8vttYaPec1mL4nDZHPZo7Nd6iEWj8lP.part47.rar', 'Show.S01E01.part002.rar', 'abc.r00', 'abc.r123', 'x7Kq9.vol03+04.par2', 'Show.vol127-128.par2']) {
|
|
assert.isTrue(isLaterVolume(name), name)
|
|
}
|
|
for (const name of ['P8vttYaPec1mL4nDZHPZo7Nd6iEWj8lP.part01.rar', 'abc.part1.rar', 'abc.rar', 'x7Kq9.par2', '6e13186238ab54ca498e46d2d77da099', 'abc.7z.002', 'abc.mkv']) {
|
|
assert.isFalse(isLaterVolume(name), name)
|
|
}
|
|
})
|
|
})
|