From fd6cfba7265ba78b78e2cc121488787a0f90fa8f Mon Sep 17 00:00:00 2001 From: desu-bot Date: Fri, 24 Jan 2025 09:56:11 +0000 Subject: [PATCH] chore: update public repo --- package.json | 4 +-- pnpm-lock.yaml | 21 +++++++----- scripts/media/soundcloud-dl.ts | 60 ++++++++++++++++++++++------------ 3 files changed, 55 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 12de66b..bccf840 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,8 @@ }, "devDependencies": { "@antfu/eslint-config": "3.10.0", - "@fuman/fetch": "0.0.7", - "@fuman/utils": "0.0.4", + "@fuman/fetch": "0.0.10", + "@fuman/utils": "0.0.10", "@types/node": "22.10.0", "domhandler": "^5.0.3", "dotenv": "16.4.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a21c8b..0185865 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -79,11 +79,11 @@ importers: specifier: 3.10.0 version: 3.10.0(@typescript-eslint/utils@8.16.0(eslint@9.15.0)(typescript@5.7.2))(@vue/compiler-sfc@3.5.13)(eslint@9.15.0)(typescript@5.7.2) '@fuman/fetch': - specifier: 0.0.7 - version: 0.0.7(@badrap/valita@0.4.2)(tough-cookie@5.0.0)(zod@3.23.8) + specifier: 0.0.10 + version: 0.0.10(@badrap/valita@0.4.2)(tough-cookie@5.0.0)(zod@3.23.8) '@fuman/utils': - specifier: 0.0.4 - version: 0.0.4 + specifier: 0.0.10 + version: 0.0.10 '@types/node': specifier: 22.10.0 version: 22.10.0 @@ -397,8 +397,8 @@ packages: resolution: {integrity: sha512-r0tJ3ZOkMd9xsu3VRfqlFR6cz0V/jFYRswAIpC+m/DIfAUXq7g8N7wTAlhSANySXYGKzGryfDXwtwsY8TxEIDw==} engines: {node: '>=18.0.0', npm: '>=9.0.0'} - '@fuman/fetch@0.0.7': - resolution: {integrity: sha512-yzyQI9ssqBrx04zKlfZwRHvJ9sw44RvfForjhaMhy7yA9jtghgVAjceeLTvF5xWEMgvIlIMfZRmSzEtCgGlfcg==} + '@fuman/fetch@0.0.10': + resolution: {integrity: sha512-Zy1GKZ8/NGP2adH0JXVaP91TZPpXngZDTGOFrb38pEp6RYAVSywt0yOPO2kwZGUpordfCj96CMNv+e6zUc7qqw==} peerDependencies: '@badrap/valita': '>=0.4.0' tough-cookie: ^5.0.0 || ^4.0.0 @@ -432,6 +432,9 @@ packages: '@fuman/node@0.0.4': resolution: {integrity: sha512-tgwbIceUHWuwh4RTwJRQ1sLjzuIGrWx0SeCrqYhGF+IkI/B7DY0FP2SZykWImkVDtW8IzmdZskPZqiDINRGcNg==} + '@fuman/utils@0.0.10': + resolution: {integrity: sha512-KVlDx0S1Og7IWcPi93f1T45WPfCSUV6/A4dQb36zZRtb8KECl1BK2u9WkNVI+sjrjKCb3xijjY5gq4lS3PqH5g==} + '@fuman/utils@0.0.4': resolution: {integrity: sha512-YBZIlGDbM8s9G85pWFZJ9wQrDY4511XLHZ06/uxZfXBY0eSStwje8JFNmRMNF0SjRk4D3iRmPl9wirHKTkg89w==} @@ -2332,9 +2335,9 @@ snapshots: '@faker-js/faker@9.3.0': {} - '@fuman/fetch@0.0.7(@badrap/valita@0.4.2)(tough-cookie@5.0.0)(zod@3.23.8)': + '@fuman/fetch@0.0.10(@badrap/valita@0.4.2)(tough-cookie@5.0.0)(zod@3.23.8)': dependencies: - '@fuman/utils': 0.0.4 + '@fuman/utils': 0.0.10 optionalDependencies: '@badrap/valita': 0.4.2 tough-cookie: 5.0.0 @@ -2364,6 +2367,8 @@ snapshots: '@fuman/net': 0.0.4 '@fuman/utils': 0.0.4 + '@fuman/utils@0.0.10': {} + '@fuman/utils@0.0.4': {} '@humanfs/core@0.19.1': {} diff --git a/scripts/media/soundcloud-dl.ts b/scripts/media/soundcloud-dl.ts index 0065ce6..2732d9e 100644 --- a/scripts/media/soundcloud-dl.ts +++ b/scripts/media/soundcloud-dl.ts @@ -14,7 +14,6 @@ import { generateOpusImageBlob } from '../../utils/opus.ts' const ffetchApi = ffetchBase.extend({ baseUrl: 'https://api-v2.soundcloud.com', - // @ts-expect-error lol fixme query: { client_id: '4BowhSywvkJtklODQDzjNMq9sK9wyDJ4', app_version: '1736857534', @@ -115,6 +114,14 @@ async function fetchPlaylistByUrl(url: string) { return ScPlaylist.parse(playlist.data) } +async function fetchPlaylistById(id: number) { + return ffetchApi(`/playlists/${id}`, { + query: { + linked_partitioning: '1', + }, + }).parsedJson(ScPlaylist) +} + async function fetchTracksById(trackIds: number[]) { return ffetchApi('/tracks', { query: { @@ -273,7 +280,7 @@ async function downloadPlaylist(playlist: ScPlaylist, params: { remaining -= ids.length spinnies.update('fetching', { text: `fetching ${remaining} tracks` }) }) - spinnies.succeed('fetching') + spinnies.succeed('fetching', { text: `fetched ${tracks.length} tracks` }) } const destDir = params.destination ?? join('assets/soundcloud-dl', sanitizeFilename(`${playlist.user.username} - ${playlist.title}`)) @@ -287,7 +294,7 @@ async function downloadPlaylist(playlist: ScPlaylist, params: { spinnies.add(`${track.id}`, { text: filename }) await downloadTrack(track, { - destination: join(destDir, filename), + destination: join(destDir, sanitizeFilename(filename)), onRateLimit: (wait) => { spinnies.update(`${track.id}`, { text: `[rate limit ${Math.floor(wait / 1000)}s] ${filename}` }) }, @@ -297,7 +304,7 @@ async function downloadPlaylist(playlist: ScPlaylist, params: { }) spinnies.remove(`${track.id}`) - }, { limit: 8 }) + }) console.log('done') spinnies.stopAll() @@ -358,27 +365,40 @@ async function downloadLikes(username: string) { spinnies.succeed('collect', { text: `collected ${tracks.length} tracks and ${playlists.length} playlists` }) + spinnies.add('tracks', { text: 'downloading tracks...' }) + const downloaded = 0 + const updateTracksSpinner = () => { + spinnies.update('tracks', { text: `[${downloaded}/${tracks.length}] downloading tracks...` }) + } + updateTracksSpinner() + const baseDir = join('assets/soundcloud-dl', `${sanitizeFilename(username)}-likes`) await mkdir(baseDir, { recursive: true }) - await asyncPool(tracks, async (track) => { - const filename = `${track.user.username} - ${track.title}` - spinnies.add(`${track.id}`, { text: filename }) - await downloadTrack(track, { - destination: join(baseDir, sanitizeFilename(filename)), - onRateLimit: (wait) => { - spinnies.update(`${track.id}`, { text: `[rate limit ${Math.floor(wait / 1000)}s] ${filename}` }) - }, - onCdnRateLimit: () => { - spinnies.update(`${track.id}`, { text: `[cdn rate limit] ${filename}` }) - }, - }) - spinnies.remove(`${track.id}`) - }) + // await asyncPool(tracks, async (track) => { + // const filename = `${track.user.username} - ${track.title}` + // spinnies.add(`${track.id}`, { text: filename }) + // await downloadTrack(track, { + // destination: join(baseDir, sanitizeFilename(filename)), + // onRateLimit: (wait) => { + // spinnies.update(`${track.id}`, { text: `[rate limit ${Math.floor(wait / 1000)}s] ${filename}` }) + // }, + // onCdnRateLimit: () => { + // spinnies.update(`${track.id}`, { text: `[cdn rate limit] ${filename}` }) + // }, + // }) + // spinnies.remove(`${track.id}`) + // updateTracksSpinner() + // }) + + spinnies.succeed('tracks', { text: `downloaded ${downloaded} tracks` }) + spinnies.stopAll() for (const playlist of playlists) { - console.log('\uDB83\uDCB8 %s', playlist.title) - await downloadPlaylist(playlist, { + console.log(`\uDB83\uDCB8 ${playlist.title}`) + + const fullPlaylist = await fetchPlaylistById(playlist.id) + await downloadPlaylist(fullPlaylist, { destination: join(baseDir, sanitizeFilename(`${playlist.user.username} - ${playlist.title}`)), }) }