import { mkdir } from 'node:fs/promises' import { asyncPool } from '@fuman/utils' import json5 from 'json5' import Spinnies from 'spinnies' import { z } from 'zod' import { downloadFile, ffetch } from '../../utils/fetch.ts' import { fileExists } from '../../utils/fs.ts' import { parseJsObject } from '../../utils/strings.ts' const $ = await ffetch('https://fwmc-ai.github.io/radio/').cheerio() const script = $('script:icontains(const playlist =)').html()! const playlistJs = parseJsObject(`[${script.split('const playlist = [').at(-1)!}`)! const playlist = z.array( z.object({ id: z.string(), title: z.string(), file: z.string(), cover: z.string(), category: z.enum(['original', 'cover']), lyrics: z.string(), }), ).parse(json5.parse(playlistJs)) const spinnies = new Spinnies() await mkdir('assets/fwmc-radio', { recursive: true }) await asyncPool(playlist, async (item) => { const dlPath = `assets/fwmc-radio/${item.id}.mp3` if (await fileExists(dlPath)) return spinnies.add(item.id, { text: item.title }) await downloadFile(new URL(item.file, 'https://fwmc-ai.github.io/radio/').toString(), dlPath) spinnies.remove(item.id) }) console.log('done') spinnies.stopAll()