import { iter } from '@fuman/utils' import { z } from 'zod' import { minimist, question } from 'zx' import { downloadFile, ffetch } from '../../utils/fetch.ts' const args = minimist(process.argv.slice(2), { string: ['filename'], }) const query = args._[0] ?? await question('Search query (Artist - Album): ') const data = await ffetch('https://api.deezer.com/search', { query: { q: query, limit: 15, }, }).parsedJson(z.object({ data: z.array(z.object({ type: z.literal('track'), title: z.string(), artist: z.object({ name: z.string(), }), album: z.object({ id: z.number(), title: z.string(), cover_xl: z.string(), }), })), })) const groupedByAlbum = new Map() for (const result of data.data) { const albumId = result.album.id if (!groupedByAlbum.has(albumId)) { groupedByAlbum.set(albumId, []) } groupedByAlbum.get(albumId)!.push(result) } const idxToAlbum = new Map() for (const [idx, [id, tracks]] of iter.enumerate(groupedByAlbum.entries())) { idxToAlbum.set(idx, id) console.log(`${idx + 1}. ${tracks[0].artist.name} - ${tracks[0].album.title}`) for (const track of tracks) { console.log(` ${track.title}`) } } console.log('Enter number to download album art:') const number = Number.parseInt(await question('[1] > ') || '1') const artworkUrl = groupedByAlbum.get(idxToAlbum.get(number - 1)!)![0].album.cover_xl await downloadFile(artworkUrl, args.filename ?? `assets/${query.replace(/\s/g, '_')}.jpg`)