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('\n')), '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) } }) })