feat(youtube): InnerTube-first search, transcripts and watch-next related (Steps 15-18)
- InnerTube layer via pinned youtubei.js 18.1.0 (no quota, no key): search with merged continuations (unlimited pages), watch-next related with LockupView mapping, caption-track discovery - 3-layer dispatcher (YT_SEARCH_MODE, default innertube-first): innertube -> yt-dlp scrape -> official API, graceful errors.yt - Robust yt-dlp binary resolution (YT_DLP_PATH > PATH > bundled) with systematic API fallback (fixes spawn ENOENT in UI) - Transcript: InnerTube caption discovery (YT_TRANSCRIPT_SOURCE), reusing pickTrack/orderedTracks/parseTrackText; yt-dlp fallback kept - Watch: sidebar uses real watch-next related[] (/api/details), title-search fallback for other providers - Cache: memory LRU + SQLite (youtube_search_cache, youtube_metrics), never persist empty pages; /healthz observability; /api/trending - Includes pending Step 15/16 leftovers in same files (suggest, test scripts); unrelated provider adapters left uncommitted
This commit is contained in:
+9
-3
@@ -15,7 +15,12 @@
|
||||
"test:telemetry": "node ./server/tests/telemetry.test.mjs",
|
||||
"test:downloads": "node ./server/tests/download_jobs.test.mjs",
|
||||
"test:subscriptions": "node --loader ts-node/esm --experimental-specifier-resolution=node src/services/subscriptions.service.spec.ts",
|
||||
"test:search": "node --loader ts-node/esm --experimental-specifier-resolution=node src/app/search/search.service.spec.ts && node --loader ts-node/esm --experimental-specifier-resolution=node src/app/search/search-components.spec.ts"
|
||||
"test:search": "node --loader ts-node/esm --experimental-specifier-resolution=node src/app/search/search.service.spec.ts && node --loader ts-node/esm --experimental-specifier-resolution=node src/app/search/search-components.spec.ts",
|
||||
"test:suggest": "node --loader ts-node/esm --experimental-specifier-resolution=node src/app/search/suggest.spec.ts && node ./server/tests/suggest.test.mjs",
|
||||
"test:transcript": "node --test server/tests/transcript.test.mjs",
|
||||
"test:ytscrape": "node server/tests/youtube-scrape.test.mjs",
|
||||
"test:ytinnertube": "node server/tests/youtube-innertube.test.mjs",
|
||||
"ytdlp:update": "yt-dlp -U || python3 -m yt_dlp -U || echo \"yt-dlp update: installez yt-dlp puis relancez\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@angular/build": "^20.1.0",
|
||||
@@ -44,12 +49,13 @@
|
||||
"rxjs": "^7.8.2",
|
||||
"tailwindcss": "latest",
|
||||
"youtube-dl-exec": "^3.0.0",
|
||||
"youtubei.js": "18.1.0",
|
||||
"zone.js": "~0.15.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.14.0",
|
||||
"ts-node": "^10.9.2",
|
||||
"typescript": "~5.8.2",
|
||||
"vite": "^6.2.0",
|
||||
"ts-node": "^10.9.2"
|
||||
"vite": "^6.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user