- release-parser: title/file/dir parsing with MP parity + deviations (airDate/issue, cut, release group suffix fallback, dir+file merge, safe episode offset) - identity: title normalization (NFKC, trad->simp map, season suffix) and evidence-level candidate ranking (year tolerance ±1, no probabilities) - slot: hard/soft/upgrade evaluation (missing vs unmet fields), state machine, movie/unit completion (season pack must be covered by actual file list) - acquisition: new_title/catch_up/upgrade modes, priority order, budget, cache volume hard threshold with resume watermark (no double counting) - path: immutable path bindings, restricted naming templates, sanitize, conflict detection, downloader<->host path mapping - organize: planOrganize with sidecar pairing, sample exclusion, existing target policy, crossDevice marking, H&R -> conflict for move - download-state: qB state mapping, completion, no-progress evidence 230 tests, ~97% statement coverage. Co-Authored-By: Claude Fable 5.1 <[email protected]>
16 lines
685 B
TypeScript
16 lines
685 B
TypeScript
export { cnToInt } from "./cn-number";
|
|
export { evalEpisodeOffset, normalizeOffsetExpression, OffsetExpressionError } from "./offset";
|
|
export { type CnMarkers, confidenceOf, fileKindOf, parseRelease, scanCnMarkers } from "./parse";
|
|
export { mergeParsed, type PathSegments, parseReleasePath, splitReleasePath } from "./path";
|
|
export { buildGroupRegex, RELEASE_GROUP_SEED } from "./release-groups";
|
|
export * from "./types";
|
|
|
|
import type { EpisodeRange } from "./types";
|
|
/** 展开集号区间 */
|
|
export function expandEpisodes(r: EpisodeRange | undefined): number[] {
|
|
if (!r) return [];
|
|
const out: number[] = [];
|
|
for (let i = r.start; i <= r.end; i++) out.push(i);
|
|
return out;
|
|
}
|