chore: update public repo
This commit is contained in:
parent
67a6238632
commit
fd6cfba726
3 changed files with 55 additions and 30 deletions
|
@ -30,8 +30,8 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@antfu/eslint-config": "3.10.0",
|
"@antfu/eslint-config": "3.10.0",
|
||||||
"@fuman/fetch": "0.0.7",
|
"@fuman/fetch": "0.0.10",
|
||||||
"@fuman/utils": "0.0.4",
|
"@fuman/utils": "0.0.10",
|
||||||
"@types/node": "22.10.0",
|
"@types/node": "22.10.0",
|
||||||
"domhandler": "^5.0.3",
|
"domhandler": "^5.0.3",
|
||||||
"dotenv": "16.4.5",
|
"dotenv": "16.4.5",
|
||||||
|
|
|
@ -79,11 +79,11 @@ importers:
|
||||||
specifier: 3.10.0
|
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)
|
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':
|
'@fuman/fetch':
|
||||||
specifier: 0.0.7
|
specifier: 0.0.10
|
||||||
version: 0.0.7(@badrap/valita@0.4.2)(tough-cookie@5.0.0)(zod@3.23.8)
|
version: 0.0.10(@badrap/valita@0.4.2)(tough-cookie@5.0.0)(zod@3.23.8)
|
||||||
'@fuman/utils':
|
'@fuman/utils':
|
||||||
specifier: 0.0.4
|
specifier: 0.0.10
|
||||||
version: 0.0.4
|
version: 0.0.10
|
||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: 22.10.0
|
specifier: 22.10.0
|
||||||
version: 22.10.0
|
version: 22.10.0
|
||||||
|
@ -397,8 +397,8 @@ packages:
|
||||||
resolution: {integrity: sha512-r0tJ3ZOkMd9xsu3VRfqlFR6cz0V/jFYRswAIpC+m/DIfAUXq7g8N7wTAlhSANySXYGKzGryfDXwtwsY8TxEIDw==}
|
resolution: {integrity: sha512-r0tJ3ZOkMd9xsu3VRfqlFR6cz0V/jFYRswAIpC+m/DIfAUXq7g8N7wTAlhSANySXYGKzGryfDXwtwsY8TxEIDw==}
|
||||||
engines: {node: '>=18.0.0', npm: '>=9.0.0'}
|
engines: {node: '>=18.0.0', npm: '>=9.0.0'}
|
||||||
|
|
||||||
'@fuman/fetch@0.0.7':
|
'@fuman/fetch@0.0.10':
|
||||||
resolution: {integrity: sha512-yzyQI9ssqBrx04zKlfZwRHvJ9sw44RvfForjhaMhy7yA9jtghgVAjceeLTvF5xWEMgvIlIMfZRmSzEtCgGlfcg==}
|
resolution: {integrity: sha512-Zy1GKZ8/NGP2adH0JXVaP91TZPpXngZDTGOFrb38pEp6RYAVSywt0yOPO2kwZGUpordfCj96CMNv+e6zUc7qqw==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@badrap/valita': '>=0.4.0'
|
'@badrap/valita': '>=0.4.0'
|
||||||
tough-cookie: ^5.0.0 || ^4.0.0
|
tough-cookie: ^5.0.0 || ^4.0.0
|
||||||
|
@ -432,6 +432,9 @@ packages:
|
||||||
'@fuman/node@0.0.4':
|
'@fuman/node@0.0.4':
|
||||||
resolution: {integrity: sha512-tgwbIceUHWuwh4RTwJRQ1sLjzuIGrWx0SeCrqYhGF+IkI/B7DY0FP2SZykWImkVDtW8IzmdZskPZqiDINRGcNg==}
|
resolution: {integrity: sha512-tgwbIceUHWuwh4RTwJRQ1sLjzuIGrWx0SeCrqYhGF+IkI/B7DY0FP2SZykWImkVDtW8IzmdZskPZqiDINRGcNg==}
|
||||||
|
|
||||||
|
'@fuman/utils@0.0.10':
|
||||||
|
resolution: {integrity: sha512-KVlDx0S1Og7IWcPi93f1T45WPfCSUV6/A4dQb36zZRtb8KECl1BK2u9WkNVI+sjrjKCb3xijjY5gq4lS3PqH5g==}
|
||||||
|
|
||||||
'@fuman/utils@0.0.4':
|
'@fuman/utils@0.0.4':
|
||||||
resolution: {integrity: sha512-YBZIlGDbM8s9G85pWFZJ9wQrDY4511XLHZ06/uxZfXBY0eSStwje8JFNmRMNF0SjRk4D3iRmPl9wirHKTkg89w==}
|
resolution: {integrity: sha512-YBZIlGDbM8s9G85pWFZJ9wQrDY4511XLHZ06/uxZfXBY0eSStwje8JFNmRMNF0SjRk4D3iRmPl9wirHKTkg89w==}
|
||||||
|
|
||||||
|
@ -2332,9 +2335,9 @@ snapshots:
|
||||||
|
|
||||||
'@faker-js/faker@9.3.0': {}
|
'@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:
|
dependencies:
|
||||||
'@fuman/utils': 0.0.4
|
'@fuman/utils': 0.0.10
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@badrap/valita': 0.4.2
|
'@badrap/valita': 0.4.2
|
||||||
tough-cookie: 5.0.0
|
tough-cookie: 5.0.0
|
||||||
|
@ -2364,6 +2367,8 @@ snapshots:
|
||||||
'@fuman/net': 0.0.4
|
'@fuman/net': 0.0.4
|
||||||
'@fuman/utils': 0.0.4
|
'@fuman/utils': 0.0.4
|
||||||
|
|
||||||
|
'@fuman/utils@0.0.10': {}
|
||||||
|
|
||||||
'@fuman/utils@0.0.4': {}
|
'@fuman/utils@0.0.4': {}
|
||||||
|
|
||||||
'@humanfs/core@0.19.1': {}
|
'@humanfs/core@0.19.1': {}
|
||||||
|
|
|
@ -14,7 +14,6 @@ import { generateOpusImageBlob } from '../../utils/opus.ts'
|
||||||
|
|
||||||
const ffetchApi = ffetchBase.extend({
|
const ffetchApi = ffetchBase.extend({
|
||||||
baseUrl: 'https://api-v2.soundcloud.com',
|
baseUrl: 'https://api-v2.soundcloud.com',
|
||||||
// @ts-expect-error lol fixme
|
|
||||||
query: {
|
query: {
|
||||||
client_id: '4BowhSywvkJtklODQDzjNMq9sK9wyDJ4',
|
client_id: '4BowhSywvkJtklODQDzjNMq9sK9wyDJ4',
|
||||||
app_version: '1736857534',
|
app_version: '1736857534',
|
||||||
|
@ -115,6 +114,14 @@ async function fetchPlaylistByUrl(url: string) {
|
||||||
return ScPlaylist.parse(playlist.data)
|
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[]) {
|
async function fetchTracksById(trackIds: number[]) {
|
||||||
return ffetchApi('/tracks', {
|
return ffetchApi('/tracks', {
|
||||||
query: {
|
query: {
|
||||||
|
@ -273,7 +280,7 @@ async function downloadPlaylist(playlist: ScPlaylist, params: {
|
||||||
remaining -= ids.length
|
remaining -= ids.length
|
||||||
spinnies.update('fetching', { text: `fetching ${remaining} tracks` })
|
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}`))
|
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 })
|
spinnies.add(`${track.id}`, { text: filename })
|
||||||
await downloadTrack(track, {
|
await downloadTrack(track, {
|
||||||
destination: join(destDir, filename),
|
destination: join(destDir, sanitizeFilename(filename)),
|
||||||
onRateLimit: (wait) => {
|
onRateLimit: (wait) => {
|
||||||
spinnies.update(`${track.id}`, { text: `[rate limit ${Math.floor(wait / 1000)}s] ${filename}` })
|
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}`)
|
spinnies.remove(`${track.id}`)
|
||||||
}, { limit: 8 })
|
})
|
||||||
|
|
||||||
console.log('done')
|
console.log('done')
|
||||||
spinnies.stopAll()
|
spinnies.stopAll()
|
||||||
|
@ -358,27 +365,40 @@ async function downloadLikes(username: string) {
|
||||||
|
|
||||||
spinnies.succeed('collect', { text: `collected ${tracks.length} tracks and ${playlists.length} playlists` })
|
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`)
|
const baseDir = join('assets/soundcloud-dl', `${sanitizeFilename(username)}-likes`)
|
||||||
await mkdir(baseDir, { recursive: true })
|
await mkdir(baseDir, { recursive: true })
|
||||||
|
|
||||||
await asyncPool(tracks, async (track) => {
|
// await asyncPool(tracks, async (track) => {
|
||||||
const filename = `${track.user.username} - ${track.title}`
|
// const filename = `${track.user.username} - ${track.title}`
|
||||||
spinnies.add(`${track.id}`, { text: filename })
|
// spinnies.add(`${track.id}`, { text: filename })
|
||||||
await downloadTrack(track, {
|
// await downloadTrack(track, {
|
||||||
destination: join(baseDir, sanitizeFilename(filename)),
|
// destination: join(baseDir, sanitizeFilename(filename)),
|
||||||
onRateLimit: (wait) => {
|
// onRateLimit: (wait) => {
|
||||||
spinnies.update(`${track.id}`, { text: `[rate limit ${Math.floor(wait / 1000)}s] ${filename}` })
|
// spinnies.update(`${track.id}`, { text: `[rate limit ${Math.floor(wait / 1000)}s] ${filename}` })
|
||||||
},
|
// },
|
||||||
onCdnRateLimit: () => {
|
// onCdnRateLimit: () => {
|
||||||
spinnies.update(`${track.id}`, { text: `[cdn rate limit] ${filename}` })
|
// spinnies.update(`${track.id}`, { text: `[cdn rate limit] ${filename}` })
|
||||||
},
|
// },
|
||||||
})
|
// })
|
||||||
spinnies.remove(`${track.id}`)
|
// spinnies.remove(`${track.id}`)
|
||||||
})
|
// updateTracksSpinner()
|
||||||
|
// })
|
||||||
|
|
||||||
|
spinnies.succeed('tracks', { text: `downloaded ${downloaded} tracks` })
|
||||||
|
spinnies.stopAll()
|
||||||
|
|
||||||
for (const playlist of playlists) {
|
for (const playlist of playlists) {
|
||||||
console.log('\uDB83\uDCB8 %s', playlist.title)
|
console.log(`\uDB83\uDCB8 ${playlist.title}`)
|
||||||
await downloadPlaylist(playlist, {
|
|
||||||
|
const fullPlaylist = await fetchPlaylistById(playlist.id)
|
||||||
|
await downloadPlaylist(fullPlaylist, {
|
||||||
destination: join(baseDir, sanitizeFilename(`${playlist.user.username} - ${playlist.title}`)),
|
destination: join(baseDir, sanitizeFilename(`${playlist.user.username} - ${playlist.title}`)),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue