Answer searches from YouTube InnerTube directly with yt-dlp fallback

This commit is contained in:
Claude
2026-09-30 06:58:05 +00:00
parent d61809f5c4
commit 556436da34
7 changed files with 104 additions and 8 deletions

View File

@@ -48,6 +48,7 @@ import { registerNoteRoutes, parseLrc, sanitizeLyrics } from './notes.js';
import { createRemoteHub } from './remote.js';
import { createPartyHub } from './party.js';
import { registerUploadRoutes } from './uploads.js';
import * as innertube from './innertube.js';
import QRCode from 'qrcode';
import { dirname, join as pathJoin } from 'node:path';
@@ -382,12 +383,23 @@ app.get('/api/search', async (c) => {
let mine = [];
try { mine = (await notesDb.listUploads({ q, limit: 20 })).map(uploads.card); } catch { /* library optional */ }
try {
const out = await runYtdlpResilient([
`ytsearch${SEARCH_LIMIT}:${q}`,
'--dump-json', '--flat-playlist',
'--no-warnings', '--ignore-errors',
]);
const results = [...mine, ...parseCards(out)];
let yt = [];
if (process.env.SEARCH_INNERTUBE !== '0') {
try {
yt = await innertube.search(q);
} catch (e) {
console.warn(`[search] innertube failed, using yt-dlp: ${e.message}`);
}
}
if (!yt.length) {
const out = await runYtdlpResilient([
`ytsearch${SEARCH_LIMIT}:${q}`,
'--dump-json', '--flat-playlist',
'--no-warnings', '--ignore-errors',
]);
yt = parseCards(out);
}
const results = [...mine, ...yt];
if (searchCache.size >= SEARCH_CACHE_MAX) searchCache.delete(searchCache.keys().next().value);
searchCache.set(cacheKey, { results, expiresAt: Date.now() + SEARCH_CACHE_TTL_MS });
return c.json({ ok: true, results });