mirror of
https://git.stupid.fish/teidesu/scripts.git
synced 2025-07-28 02:32:11 +10:00
40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
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()
|