mirror of
https://github.com/hectorqin/reader.git
synced 2026-11-11 13:31:09 +08:00
Support local and OpenList libraries, metadata, independent media navigation, themes, and audio/video playback. Preserve approved v2 prototypes and current documentation; archive superseded review artifacts and keep generated validation output outside version control.
33 lines
2.4 KiB
TypeScript
33 lines
2.4 KiB
TypeScript
// Scan acceptance files into an in-memory catalog, never the user's database.
|
|
import assert from 'node:assert/strict';
|
|
import {resolve,join} from 'node:path';
|
|
import {writeFile} from 'node:fs/promises';
|
|
import {Db} from '../src/db/index.ts';
|
|
import {MediaLibraries} from '../src/media/libraries.ts';
|
|
import {MediaScanner} from '../src/media/scanner.ts';
|
|
if(!process.argv[2])throw Error('Provide the acceptance pack directory');
|
|
const root=resolve(process.argv[2]),db=new Db(':memory:'),libraries=new MediaLibraries(db),scanner=new MediaScanner(db,libraries);
|
|
const actor={id:'sample-verifier',role:'admin'} as const,report:{directory:string;counts:unknown;assets:number}[]=[];
|
|
try {
|
|
for(const [folder,kind,expected] of [
|
|
['video','video',{movie:6,series:1,season:2,episode:4}],
|
|
['music','music',{artist:6,album:6,track:12}],
|
|
['audiobooks','audiobook',{audiobook:3}],
|
|
] as const){
|
|
const lib=await libraries.create(actor,{name:'Acceptance '+folder,kind,root:join(root,folder),access:'all'});
|
|
const job=scanner.start(actor,lib.id);await scanner.wait(lib.id);
|
|
assert.equal(scanner.job(actor,job.id).state,'complete');
|
|
const counts=Object.fromEntries(db.all<{kind:string;count:number}>('SELECT kind,count(*) count FROM media_items WHERE library_id=? GROUP BY kind',lib.id).map(row=>[row.kind,row.count]));
|
|
assert.deepEqual(counts,expected);
|
|
assert.equal(db.get<{count:number}>("SELECT count(*) count FROM media_assets WHERE library_id=? AND probe_status!='ready'",lib.id)?.count,0);
|
|
assert.equal(db.get<{count:number}>("SELECT count(*) count FROM media_items WHERE library_id=? AND kind!='artist' AND json_extract(metadata_json,'$.coverRef') IS NULL",lib.id)?.count,0);
|
|
if(kind==='audiobook'){
|
|
assert.equal(db.get<{count:number}>('SELECT count(*) count FROM media_parts p JOIN media_assets a ON a.id=p.asset_id WHERE a.library_id=? AND p.active=1',lib.id)?.count,12);
|
|
assert.equal(db.get<{count:number}>('SELECT count(*) count FROM media_editions e JOIN media_items i ON i.id=e.item_id WHERE i.library_id=?',lib.id)?.count,4);
|
|
}
|
|
report.push({directory:folder,counts,assets:db.get<{count:number}>('SELECT count(*) count FROM media_assets WHERE library_id=?',lib.id)!.count});
|
|
}
|
|
const result={passed:true,checkedAt:new Date().toISOString(),database:'in-memory only',libraries:report};
|
|
await writeFile(join(root,'scan-verification.json'),JSON.stringify(result,null,2));console.log(JSON.stringify(result));
|
|
}finally{await scanner.close();db.close();}
|