import type { Candidate, SearchParams, SubtitleProvider } from '../types/index.js'; import { generateMockArtifact } from '../lib/mockArtifact.js'; import { hashString, seeded } from '../lib/deterministic.js'; import { env } from '../config/env.js'; export class OpenSubtitlesProvider implements SubtitleProvider { async search(params: SearchParams): Promise { // TODO(v2): real OpenSubtitles API integration. const key = `${params.title}|${params.year}|${params.season}|${params.episode}|os`; const rnd = seeded(hashString(key)); const base = params.title.replace(/\s+/g, '.'); const directForMovie = params.type === 'movie' && rnd() > 0.4; return [ { id: `os-${hashString(`${key}-a`)}`, provider: 'opensubtitles', displayName: `OS ${base} Official`, downloadType: directForMovie ? 'direct' : 'archiveZip', downloadUrl: directForMovie ? `mock://os/${base}/direct.srt` : `mock://os/${base}/archive.zip`, lang: 'tr', releaseHints: ['1080p', rnd() > 0.5 ? 'x265' : 'x264', 'flux'], scoreHints: ['api_match'], isHI: rnd() > 0.8, isForced: rnd() > 0.92 }, { id: `os-${hashString(`${key}-b`)}`, provider: 'opensubtitles', displayName: `OS ${base} Backup`, downloadType: 'archiveZip', downloadUrl: `mock://os/${base}/backup.zip`, lang: 'tr', releaseHints: ['720p', 'x264'], scoreHints: ['backup'], isHI: false, isForced: false } ]; } async download(candidate: Candidate, params: SearchParams, jobToken: string) { const artifact = await generateMockArtifact(candidate, params, jobToken, `${env.tempRoot}/${jobToken}/download`); return { type: artifact.type, filePath: artifact.filePath, candidateId: candidate.id }; } }