mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-02 04:52:50 +08:00
feat(search): server-side offset pagination through providers + /search route (#115 backend)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
81b8953d52
commit
a1cc0b8574
14 files changed
+322
-34
No files matched your search
+12
-6
@@ -115,20 +115,26 @@ export class YouTubeProvider implements MusicProvider {
|
||||
readonly platform = "youtube" as const;
|
||||
private quality = "bestaudio";
|
||||
|
||||
async search(query: string, limit = 5): Promise<SearchResult> {
|
||||
async search(query: string, limit = 5, offset = 0): Promise<SearchResult> {
|
||||
try {
|
||||
// yt-dlp's `ytsearchN` has no offset cursor — it always returns the first
|
||||
// N results. Best-effort paginate by fetching offset+limit and slicing
|
||||
// locally. (offset 0 → identical to before.)
|
||||
const total = offset + limit;
|
||||
const raw = await runYtDlp([
|
||||
`ytsearch${limit}:${query}`,
|
||||
`ytsearch${total}:${query}`,
|
||||
"--dump-json",
|
||||
"--flat-playlist",
|
||||
"--no-warnings",
|
||||
"--quiet",
|
||||
]);
|
||||
const lines = raw.trim().split("\n").filter(Boolean);
|
||||
const songs: Song[] = lines.map((line) => {
|
||||
const entry = JSON.parse(line) as YtDlpEntry;
|
||||
return entryToSong(entry);
|
||||
});
|
||||
const songs: Song[] = lines
|
||||
.slice(offset, offset + limit)
|
||||
.map((line) => {
|
||||
const entry = JSON.parse(line) as YtDlpEntry;
|
||||
return entryToSong(entry);
|
||||
});
|
||||
return { songs, playlists: [], albums: [] };
|
||||
} catch {
|
||||
return { songs: [], playlists: [], albums: [] };
|
||||
|
||||
Reference in new issue
Block a user