Port to Oceanic.js, use slash commands

main
hazycora 4 months ago
parent 49958906c4
commit 134bdc7b4f

3
.gitignore vendored

@ -1,2 +1,3 @@
node_modules/
.env
.env
rips/

@ -1,10 +1,11 @@
import fs from 'fs'
import Eris from "eris"
import { ApplicationCommandTypes, ApplicationCommandOptionTypes, InteractionTypes, Client } from 'oceanic.js'
import spDl from 'spotify-dl'
import fetch from 'node-fetch'
import {FormData, File} from 'formdata-node'
import archiver from 'archiver'
import * as dotenv from 'dotenv'
import download from 'spotify-dl'
dotenv.config()
const FILES_GAY_USER = process.env.FILES_GAY_USER??null
@ -50,60 +51,84 @@ function generateRandomId(length = 50) {
if (!fs.existsSync('rips')) await fs.mkdirSync('rips')
const ripsPath = fs.realpathSync('rips')
// Replace TOKEN with your bot account's token
const bot = new Eris(DISCORD_TOKEN, {
intents: [
"guildMessages"
]
});
const bot = new Client({
auth: "Bot "+DISCORD_TOKEN,
gateway: {
intents: [
'GUILD_MESSAGES',
'DIRECT_MESSAGES',
'MESSAGE_CONTENT'
]
}
})
bot.on("ready", async () => { // When the bot is ready
await getFilesGaySession() // Get the files.gay session
console.log("Ready!"); // Log "Ready!"
});
bot.on("error", (err) => {
console.error(err); // or your preferred logger
});
bot.on("messageCreate", async (msg) => {
if (!msg.content.trim().startsWith('!')) return
let command = msg.content.trim().split(' ')
if(command[0]==='!dl') { // If the message content is "!dl"
if (command.length>2) {
bot.createMessage(msg.channel.id, "This command takes only one argument! ``!dl <link-to-spotify-album>``")
return
}
let url = command[1]
let urlObj
try {
urlObj = new URL(url)
} catch (error) {
bot.createMessage(msg.channel.id, "Your second argument is not a valid URL!")
return
}
if (!url.host==='open.spotify.com') {
bot.createMessage(msg.channel.id, "Your second argument is not a Spotify URL!")
return
await bot.application.bulkEditGuildCommands('1046033831855132702', [
{
type: ApplicationCommandTypes.CHAT_INPUT,
name: "dl",
description: "Download",
defaultMemberPermissions: "2048",
options: [
{
type: ApplicationCommandOptionTypes.STRING,
name: "url",
description: "The URL of the Spotify resource",
required: true
}
],
}
urlObj.search = ''
url = urlObj.href
])
console.log("Ready as", bot.user.tag)
})
let sentMessage = await bot.createMessage(msg.channel.id, "Downloading!")
bot.on("error", (err) => {
console.error(err)
})
async function getSpotifyMetadata(url) {
let spotifyPageReq = await fetch(url)
const spotifyPageText = await spotifyPageReq.text()
let matches = spotifyPageText.match(/<meta\s+property="og:title"\s+content="(.*?)" ?\/>.*?<meta\s+property="og:description"\s+content="(.*?)" ?\/>/)
let parts = matches[2].split(' · ')
return {
title: matches[1],
author: parts[0],
type: parts[1]
}
}
async function editMsg(newText) {
return await bot.editMessage(sentMessage.channel.id, sentMessage.id, newText)
async function downloadAndUpdateMessage(url, editMsg) {
let metadata
try {
metadata = await getSpotifyMetadata(url)
} catch (error) {
metadata = {
unknown: true,
title: 'Unknown',
author: 'Unknown',
type: 'Unknown'
}
}
let messageStartText = ''
let itemName = 'the resource'
if (!metadata.unknown) {
itemName = `*${metadata.title}* by *${metadata.author}*`
messageStartText = `Downloading ${itemName} `
}
let randomId = generateRandomId()
const albumFolderPath = `${ripsPath}/${randomId}`
await fs.promises.mkdir(albumFolderPath)
let randomId = generateRandomId()
const albumFolderPath = `${ripsPath}/${randomId}`
await fs.promises.mkdir(albumFolderPath)
try {
await spDl(url, albumFolderPath, {
clspotifyPath: CLSPOTIFY_PATH,
onProgress: (dat) => {
if (dat.percent===100) return
let text = `${dat.percent}%`
let text = `${messageStartText}${dat.percent}%`
let newSong = dat.complete[dat.complete.length-1]
if (newSong) {
text += ` - Finished downloading "${newSong.name}"`
@ -111,45 +136,99 @@ bot.on("messageCreate", async (msg) => {
editMsg(text)
}
})
} catch (error) {
console.error(error)
await editMsg(`Something went wrong while downloading ${itemName}.`)
return
}
await editMsg('Finished downloading.\nCompressing to .zip file')
await editMsg(`Finished downloading ${itemName}.\nCompressing to .zip file`)
const zipFilePath = `${ripsPath}/${randomId}.zip`
const zipFilePath = `${ripsPath}/${randomId}.zip`
const output = fs.createWriteStream(zipFilePath)
const archive = archiver('zip', {
zlib: { level: 9 } // Sets the compression level.
})
archive.on('error', function(err) {
throw err;
const output = fs.createWriteStream(zipFilePath)
const archive = archiver('zip', {
zlib: { level: 9 } // Sets the compression level.
})
archive.on('error', function(err) {
throw err;
})
archive.pipe(output)
output.on('close', async () => {
fs.promises.rm(albumFolderPath, {recursive: true})
await editMsg(`Finished downloading ${itemName}.\nCompressed. The zip file is ${new Intl.NumberFormat().format(Math.round(archive.pointer() / 1000000))} Megabytes.\nUploading to files.gay`)
const form = new FormData()
let filename = 'album.zip'
if (!metadata.unknown) {
filename = metadata.title.replace(/[^a-zA-z0-9 \-_]/gm, '-')+'.zip'
}
const file = new File([await fs.promises.readFile(zipFilePath)], filename)
form.set('file', file)
let filesGayHeaders = {}
if (FILES_GAY_SESSION) filesGayHeaders.cookie = `session=${FILES_GAY_SESSION}`
let uploadReq = await fetch("https://files.gay/upload?json=1", {
headers: filesGayHeaders,
method: "POST",
body: form
})
archive.pipe(output)
output.on('close', async () => {
fs.promises.rm(albumFolderPath, {recursive: true})
await editMsg(`Finished downloading.\nCompressed. The zip file is ${new Intl.NumberFormat().format(Math.round(archive.pointer() / 1000000))} Megabytes.\nUploading to files.gay`)
const form = new FormData()
const file = new File([await fs.promises.readFile(zipFilePath)], "album.zip")
form.set('file', file)
let filesGayHeaders = {}
if (FILES_GAY_SESSION) filesGayHeaders.cookie = `session=${FILES_GAY_SESSION}`
let uploadReq = await fetch("https://files.gay/upload?json=1", {
headers: filesGayHeaders,
method: "POST",
body: form
})
let respJson = await uploadReq.json()
if (!respJson.success) {
await editMsg('Something went wrong uploading the file. :(')
let respJson = await uploadReq.json()
if (!respJson.success) {
await editMsg('Something went wrong uploading the file. :(')
return
}
if (!metadata.unknown) {
await editMsg(`Finished! Download ${itemName} at: https://files.gay/f/${respJson.data.id}/dl`)
} else {
await editMsg(`Finished! Download at: https://files.gay/f/${respJson.data.id}`)
}
await fs.promises.rm(zipFilePath)
})
archive.directory(albumFolderPath, false)
archive.finalize()
}
bot.on("interactionCreate", async(interaction) => {
if (interaction.type!==InteractionTypes.APPLICATION_COMMAND) return
if (interaction.data.type!==ApplicationCommandTypes.CHAT_INPUT) return
await interaction.defer()
if(interaction.data.name === "dl") {
try {
let url = interaction.data.options.getString("url", true)
let urlObj
try {
urlObj = new URL(url)
} catch (error) {
await interaction.createFollowup({
content: "Your second argument is not a valid URL!"
})
return
}
await editMsg(`Finished! Download at: https://files.gay/f/${respJson.data.id}/dl`)
await fs.promises.rm(zipFilePath)
})
archive.directory(albumFolderPath, false)
archive.finalize()
if (!url.host==='open.spotify.com') {
await interaction.createFollowup({
content: "Your second argument is not a Spotify URL!"
})
return
}
urlObj.search = ''
url = urlObj.href
let originalMessage = await interaction.createFollowup({
content: 'Downloading!'
})
await downloadAndUpdateMessage(urlObj.href, (newText) => interaction.editFollowup(originalMessage.id, {
content: newText
}))
} catch (error) {
console.log(error)
}
}
});
})
bot.on("error", (err) => {
console.error("Something Broke!", err)
})
bot.connect();
bot.connect()

229
package-lock.json generated

@ -11,12 +11,43 @@
"dependencies": {
"archiver": "^5.3.1",
"dotenv": "^16.0.3",
"eris": "^0.17.1",
"formdata-node": "^5.0.0",
"node-fetch": "^3.3.0",
"oceanic.js": "^1.3.1",
"spotify-dl": "git+https://git.gay/h/spotify-dl.git"
}
},
"node_modules/@discordjs/voice": {
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.13.0.tgz",
"integrity": "sha512-ZzwDmVINaLgkoDUeTJfpN9TkjINMLfTVoLMtEygm0YC5jTTw7AvKGqhc+Ae/2kNLywd0joyFVNrLp94yCkQ9SA==",
"optional": true,
"dependencies": {
"@types/ws": "^8.5.3",
"discord-api-types": "^0.37.12",
"prism-media": "^1.3.4",
"tslib": "^2.4.0",
"ws": "^8.9.0"
},
"engines": {
"node": ">=16.9.0"
}
},
"node_modules/@types/node": {
"version": "18.11.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz",
"integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==",
"optional": true
},
"node_modules/@types/ws": {
"version": "8.5.3",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
"integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
"optional": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/archiver": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz",
@ -160,6 +191,17 @@
"node": "*"
}
},
"node_modules/busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
"integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
"dependencies": {
"streamsearch": "^1.1.0"
},
"engines": {
"node": ">=10.16.0"
}
},
"node_modules/compress-commons": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
@ -215,6 +257,12 @@
"node": ">= 12"
}
},
"node_modules/discord-api-types": {
"version": "0.37.20",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.20.tgz",
"integrity": "sha512-uAO+55E11rMkYR36/paE1vKN8c2bZa1mgrIaiQIBgIZRKZTDIGOZB+8I5eMRPFJcGxrg16riUu+0aTu2JQEPew==",
"optional": true
},
"node_modules/dotenv": {
"version": "16.0.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
@ -231,21 +279,6 @@
"once": "^1.4.0"
}
},
"node_modules/eris": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/eris/-/eris-0.17.1.tgz",
"integrity": "sha512-PexpHusPxViuzcsSM0GQEAgZRJbziFfeeLifc8+ZrvS88UusPieQlUD7pRm28E7m7rN+p+Rt6bf9jGLwD725Zg==",
"dependencies": {
"ws": "^8.2.3"
},
"engines": {
"node": ">=10.4.0"
},
"optionalDependencies": {
"opusscript": "^0.0.8",
"tweetnacl": "^1.0.3"
}
},
"node_modules/fetch-blob": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
@ -488,6 +521,21 @@
"node": ">=0.10.0"
}
},
"node_modules/oceanic.js": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/oceanic.js/-/oceanic.js-1.3.1.tgz",
"integrity": "sha512-UhP9lLMaDQsUqerhMvJ4Rye3gLamXD6HWsn0h35CAj1eJ9sZacsCUoww6meU05y0YUPVIGiDNyKNZ77HA/8J5g==",
"dependencies": {
"undici": "^5.12.0",
"ws": "^8.11.0"
},
"engines": {
"node": ">=16.16.0"
},
"optionalDependencies": {
"@discordjs/voice": "^0.13.0"
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@ -500,7 +548,8 @@
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.0.8.tgz",
"integrity": "sha512-VSTi1aWFuCkRCVq+tx/BQ5q9fMnQ9pVZ3JU4UHKqTkf0ED3fKEPdr+gKAAl3IA2hj9rrP6iyq3hlcJq3HELtNQ==",
"optional": true
"optional": true,
"peer": true
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
@ -510,6 +559,32 @@
"node": ">=0.10.0"
}
},
"node_modules/prism-media": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz",
"integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==",
"optional": true,
"peerDependencies": {
"@discordjs/opus": "^0.8.0",
"ffmpeg-static": "^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0",
"node-opus": "^0.3.3",
"opusscript": "^0.0.8"
},
"peerDependenciesMeta": {
"@discordjs/opus": {
"optional": true
},
"ffmpeg-static": {
"optional": true
},
"node-opus": {
"optional": true
},
"opusscript": {
"optional": true
}
}
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@ -579,6 +654,14 @@
"resolved": "git+https://git.gay/h/spotify-dl.git#5cae087693ee7cf24571929da01304958ebe15d0",
"license": "ISC"
},
"node_modules/streamsearch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@ -602,12 +685,23 @@
"node": ">=6"
}
},
"node_modules/tweetnacl": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
"integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
"node_modules/tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
"integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
"optional": true
},
"node_modules/undici": {
"version": "5.13.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.13.0.tgz",
"integrity": "sha512-UDZKtwb2k7KRsK4SdXWG7ErXiL7yTGgLWvk2AXO1JMjgjh404nFo6tWSCM2xMpJwMPx3J8i/vfqEh1zOqvj82Q==",
"dependencies": {
"busboy": "^1.6.0"
},
"engines": {
"node": ">=12.18"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@ -661,6 +755,34 @@
}
},
"dependencies": {
"@discordjs/voice": {
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.13.0.tgz",
"integrity": "sha512-ZzwDmVINaLgkoDUeTJfpN9TkjINMLfTVoLMtEygm0YC5jTTw7AvKGqhc+Ae/2kNLywd0joyFVNrLp94yCkQ9SA==",
"optional": true,
"requires": {
"@types/ws": "^8.5.3",
"discord-api-types": "^0.37.12",
"prism-media": "^1.3.4",
"tslib": "^2.4.0",
"ws": "^8.9.0"
}
},
"@types/node": {
"version": "18.11.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz",
"integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==",
"optional": true
},
"@types/ws": {
"version": "8.5.3",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
"integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
"optional": true,
"requires": {
"@types/node": "*"
}
},
"archiver": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz",
@ -769,6 +891,14 @@
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
"integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="
},
"busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
"integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
"requires": {
"streamsearch": "^1.1.0"
}
},
"compress-commons": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
@ -809,6 +939,12 @@
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
},
"discord-api-types": {
"version": "0.37.20",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.20.tgz",
"integrity": "sha512-uAO+55E11rMkYR36/paE1vKN8c2bZa1mgrIaiQIBgIZRKZTDIGOZB+8I5eMRPFJcGxrg16riUu+0aTu2JQEPew==",
"optional": true
},
"dotenv": {
"version": "16.0.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
@ -822,16 +958,6 @@
"once": "^1.4.0"
}
},
"eris": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/eris/-/eris-0.17.1.tgz",
"integrity": "sha512-PexpHusPxViuzcsSM0GQEAgZRJbziFfeeLifc8+ZrvS88UusPieQlUD7pRm28E7m7rN+p+Rt6bf9jGLwD725Zg==",
"requires": {
"opusscript": "^0.0.8",
"tweetnacl": "^1.0.3",
"ws": "^8.2.3"
}
},
"fetch-blob": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
@ -1007,6 +1133,16 @@
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
},
"oceanic.js": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/oceanic.js/-/oceanic.js-1.3.1.tgz",
"integrity": "sha512-UhP9lLMaDQsUqerhMvJ4Rye3gLamXD6HWsn0h35CAj1eJ9sZacsCUoww6meU05y0YUPVIGiDNyKNZ77HA/8J5g==",
"requires": {
"@discordjs/voice": "^0.13.0",
"undici": "^5.12.0",
"ws": "^8.11.0"
}
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@ -1019,13 +1155,21 @@
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.0.8.tgz",
"integrity": "sha512-VSTi1aWFuCkRCVq+tx/BQ5q9fMnQ9pVZ3JU4UHKqTkf0ED3fKEPdr+gKAAl3IA2hj9rrP6iyq3hlcJq3HELtNQ==",
"optional": true
"optional": true,
"peer": true
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
},
"prism-media": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz",
"integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==",
"optional": true,
"requires": {}
},
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@ -1076,6 +1220,11 @@
"version": "git+https://git.gay/h/spotify-dl.git#5cae087693ee7cf24571929da01304958ebe15d0",
"from": "spotify-dl@git+https://git.gay/h/spotify-dl.git"
},
"streamsearch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="
},
"string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@ -1096,12 +1245,20 @@
"readable-stream": "^3.1.1"
}
},
"tweetnacl": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
"integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
"tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
"integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
"optional": true
},
"undici": {
"version": "5.13.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.13.0.tgz",
"integrity": "sha512-UDZKtwb2k7KRsK4SdXWG7ErXiL7yTGgLWvk2AXO1JMjgjh404nFo6tWSCM2xMpJwMPx3J8i/vfqEh1zOqvj82Q==",
"requires": {
"busboy": "^1.6.0"
}
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",

@ -13,9 +13,9 @@
"dependencies": {
"archiver": "^5.3.1",
"dotenv": "^16.0.3",
"eris": "^0.17.1",
"formdata-node": "^5.0.0",
"node-fetch": "^3.3.0",
"oceanic.js": "^1.3.1",
"spotify-dl": "git+https://git.gay/h/spotify-dl.git"
}
}

Loading…
Cancel
Save