diff --git a/README.md b/README.md index bb9dc61..6514eca 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Pease create a bug post on github or write [`fraujulian`](https://discord.com/us ## 📝 Usage -### Install Package +### Install package ``` npm i discord-audio-stream ``` @@ -27,7 +27,7 @@ or yarn add discord-audio-stream ``` -### Start Audio Stream +### Code Snippet - Start ```js const Audio = require("discord-audio-stream"); @@ -40,7 +40,7 @@ Audio.StreamStart({ }) ``` -### Stop Audio Stream +### Code Snippet - Stop ```js const Audio = require("discord-audio-stream"); @@ -51,4 +51,4 @@ Audio.StreamStart({ ## 🤝 Enjoy the package? -Give it a star ⭐ on github or [donate](https://buymeacoffee.com/fraujuliannn) a hot chocolate! \ No newline at end of file +Give it a star ⭐ on [github](https://github.com/FrauJulian/discord-audio-stream) or [donate](https://buymeacoffee.com/fraujuliannn) a hot chocolate! \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index bf35d23..7113038 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,9 +1,7 @@ "use strict"; -var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) @@ -17,14 +15,6 @@ var __copyProps = (to, from, except, desc) => { } return to; }; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts @@ -38,7 +28,7 @@ module.exports = __toCommonJS(src_exports); // src/stuff/error.ts function ERROR() { console.log(" "); - console.log(" ______ _____ _____ ____ _____ \r\n | ____| __ \\| __ \\ / __ \\| __ \\ \r\n | |__ | |__) | |__) | | | | |__) |\r\n | __| | _ /| _ /| | | | _ / \r\n | |____| | \\ \\| | \\ \\| |__| | | \\ \\ \r\n |______|_| \\_\\_| \\_\\\\____/|_| \\_\\"); + console.error(" ______ _____ _____ ____ _____ \r\n | ____| __ \\| __ \\ / __ \\| __ \\ \r\n | |__ | |__) | |__) | | | | |__) |\r\n | __| | _ /| _ /| | | | _ / \r\n | |____| | \\ \\| | \\ \\| |__| | | \\ \\ \r\n |______|_| \\_\\_| \\_\\\\____/|_| \\_\\"); console.log(" "); console.log("This error comes from the discord-audio-stream package!"); console.log("This error happens if you don't use the package right."); @@ -48,8 +38,8 @@ function ERROR() { } // src/functions/start.ts -var import_fs = __toESM(require("fs")); var import_node_path = require("path"); +var Source = ""; var { joinVoiceChannel, createAudioPlayer, createAudioResource } = require("@discordjs/voice"); function StreamStart({ imvci, @@ -60,9 +50,10 @@ function StreamStart({ }) { try { let FileResource2 = function() { - let Audio = createAudioResource((0, import_node_path.join)(__dirname, Resource), { inlineVolume: true }); + let Audio = createAudioResource((0, import_node_path.join)(__dirname, Source)); AudioPlayer.play(Audio); joinVoiceChannel({ + //Join the channel. channelId: imvci, guildId: igi, adapterCreator: igv @@ -71,6 +62,7 @@ function StreamStart({ let Audio = createAudioResource(Resource); AudioPlayer.play(Audio); joinVoiceChannel({ + //Join the channel. channelId: imvci, guildId: igi, adapterCreator: igv @@ -78,23 +70,71 @@ function StreamStart({ }; var FileResource = FileResource2, LinkResource = LinkResource2; const AudioPlayer = createAudioPlayer(); + var URLPattern = new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$", "i"); if (type === "Link") { - LinkResource2(); - } else if (type === "File") { - FileResource2(); - } else if (type === "Analyze") { - if (import_fs.default.existsSync(Resource)) { - FileResource2(); - } else { + if (URLPattern.test(Resource) === true) { LinkResource2(); + const result = new Promise((resolve2, reject) => { + resolve2("Play"); + }); + } else { + ERROR(); + console.log("CODE: Resource isn't a Link!"); + console.log(" "); + const result = new Promise((resolve2, reject) => { + resolve2("Unknown"); + }); + } + } else if (type === "File") { + if (Resource.startsWith(".") == true) { + Source = require(Resource); + FileResource2(); + const result = new Promise((resolve2, reject) => { + resolve2("Play"); + }); + } else { + ERROR(); + console.log("CODE: Resource isn't a File!"); + console.log(" "); + const result = new Promise((resolve2, reject) => { + resolve2("Unknown"); + }); + } + } else if (type === "Analyze") { + if (Resource.startsWith(".") == true) { + Source = require(Resource); + FileResource2(); + const result = new Promise((resolve2, reject) => { + resolve2("Play"); + }); + } else if (URLPattern.test(Resource) === true) { + LinkResource2(); + const result = new Promise((resolve2, reject) => { + resolve2("Play"); + }); + } else { + ERROR(); + console.log("CODE: Resource isn't a Link or a File!"); + console.log(" "); + const result = new Promise((resolve2, reject) => { + resolve2("Unknown"); + }); } } else { ERROR(); + console.log("CODE: Unknown resource type!"); + console.log(" "); + const result = new Promise((resolve2, reject) => { + resolve2("Unknown"); + }); } } catch (error) { ERROR(); - console.log("ERR:\n" + error); + console.log(">> ERR:\n" + error); console.log(" "); + const result = new Promise((resolve2, reject) => { + resolve2("ERROR"); + }); } } @@ -105,10 +145,10 @@ function StreamStop({ }) { try { const connection = getVoiceConnection(igi); - connection.disconnect(); + connection.destroy(); } catch (error) { ERROR(); - console.log("ERR:\n" + error); + console.log(">> ERR:\n" + error); console.log(" "); } } diff --git a/dist/index.mjs b/dist/index.mjs index 23681c6..cc0fb93 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -16,7 +16,7 @@ var __dirname = /* @__PURE__ */ getDirname(); // src/stuff/error.ts function ERROR() { console.log(" "); - console.log(" ______ _____ _____ ____ _____ \r\n | ____| __ \\| __ \\ / __ \\| __ \\ \r\n | |__ | |__) | |__) | | | | |__) |\r\n | __| | _ /| _ /| | | | _ / \r\n | |____| | \\ \\| | \\ \\| |__| | | \\ \\ \r\n |______|_| \\_\\_| \\_\\\\____/|_| \\_\\"); + console.error(" ______ _____ _____ ____ _____ \r\n | ____| __ \\| __ \\ / __ \\| __ \\ \r\n | |__ | |__) | |__) | | | | |__) |\r\n | __| | _ /| _ /| | | | _ / \r\n | |____| | \\ \\| | \\ \\| |__| | | \\ \\ \r\n |______|_| \\_\\_| \\_\\\\____/|_| \\_\\"); console.log(" "); console.log("This error comes from the discord-audio-stream package!"); console.log("This error happens if you don't use the package right."); @@ -26,8 +26,8 @@ function ERROR() { } // src/functions/start.ts -import fs from "fs"; import { join } from "node:path"; +var Source = ""; var { joinVoiceChannel, createAudioPlayer, createAudioResource } = __require("@discordjs/voice"); function StreamStart({ imvci, @@ -38,9 +38,10 @@ function StreamStart({ }) { try { let FileResource2 = function() { - let Audio = createAudioResource(join(__dirname, Resource), { inlineVolume: true }); + let Audio = createAudioResource(join(__dirname, Source)); AudioPlayer.play(Audio); joinVoiceChannel({ + //Join the channel. channelId: imvci, guildId: igi, adapterCreator: igv @@ -49,6 +50,7 @@ function StreamStart({ let Audio = createAudioResource(Resource); AudioPlayer.play(Audio); joinVoiceChannel({ + //Join the channel. channelId: imvci, guildId: igi, adapterCreator: igv @@ -56,23 +58,71 @@ function StreamStart({ }; var FileResource = FileResource2, LinkResource = LinkResource2; const AudioPlayer = createAudioPlayer(); + var URLPattern = new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$", "i"); if (type === "Link") { - LinkResource2(); - } else if (type === "File") { - FileResource2(); - } else if (type === "Analyze") { - if (fs.existsSync(Resource)) { - FileResource2(); - } else { + if (URLPattern.test(Resource) === true) { LinkResource2(); + const result = new Promise((resolve2, reject) => { + resolve2("Play"); + }); + } else { + ERROR(); + console.log("CODE: Resource isn't a Link!"); + console.log(" "); + const result = new Promise((resolve2, reject) => { + resolve2("Unknown"); + }); + } + } else if (type === "File") { + if (Resource.startsWith(".") == true) { + Source = __require(Resource); + FileResource2(); + const result = new Promise((resolve2, reject) => { + resolve2("Play"); + }); + } else { + ERROR(); + console.log("CODE: Resource isn't a File!"); + console.log(" "); + const result = new Promise((resolve2, reject) => { + resolve2("Unknown"); + }); + } + } else if (type === "Analyze") { + if (Resource.startsWith(".") == true) { + Source = __require(Resource); + FileResource2(); + const result = new Promise((resolve2, reject) => { + resolve2("Play"); + }); + } else if (URLPattern.test(Resource) === true) { + LinkResource2(); + const result = new Promise((resolve2, reject) => { + resolve2("Play"); + }); + } else { + ERROR(); + console.log("CODE: Resource isn't a Link or a File!"); + console.log(" "); + const result = new Promise((resolve2, reject) => { + resolve2("Unknown"); + }); } } else { ERROR(); + console.log("CODE: Unknown resource type!"); + console.log(" "); + const result = new Promise((resolve2, reject) => { + resolve2("Unknown"); + }); } } catch (error) { ERROR(); - console.log("ERR:\n" + error); + console.log(">> ERR:\n" + error); console.log(" "); + const result = new Promise((resolve2, reject) => { + resolve2("ERROR"); + }); } } @@ -83,10 +133,10 @@ function StreamStop({ }) { try { const connection = getVoiceConnection(igi); - connection.disconnect(); + connection.destroy(); } catch (error) { ERROR(); - console.log("ERR:\n" + error); + console.log(">> ERR:\n" + error); console.log(" "); } } diff --git a/package-lock.json b/package-lock.json index f0995ba..1c8d441 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,23 +1,24 @@ { "name": "discord-audio-stream", - "version": "0.0.3", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "discord-audio-stream", - "version": "0.0.3", + "version": "0.1.0", "license": "BSD-3-Clause", "dependencies": { "@discordjs/voice": "^0.16.1", "discord.js": "^14.14.1", - "ffmpeg": "^0.0.4", "ffmpeg-static": "^5.2.0", "fs": "^0.0.1-security", "libsodium-wrappers": "^0.7.13", "opusscript": "^0.0.8" }, "devDependencies": { + "@types/ejs": "^3.1.5", + "@types/node": "^20.12.8", "tsup": "^8.0.2", "typescript": "^5.4.5" } @@ -873,6 +874,12 @@ "npm": ">=7.0.0" } }, + "node_modules/@types/ejs": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", + "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==", + "dev": true + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -880,9 +887,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "20.12.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", + "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", "dependencies": { "undici-types": "~5.26.4" } @@ -1315,14 +1322,6 @@ "reusify": "^1.0.4" } }, - "node_modules/ffmpeg": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/ffmpeg/-/ffmpeg-0.0.4.tgz", - "integrity": "sha512-3TgWUJJlZGQn+crJFyhsO/oNeRRnGTy6GhgS98oUCIfZrOW5haPPV7DUfOm3xJcHr5q3TJpjk2GudPutrNisRA==", - "dependencies": { - "when": ">= 0.0.1" - } - }, "node_modules/ffmpeg-static": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.2.0.tgz", @@ -2437,11 +2436,6 @@ "webidl-conversions": "^4.0.2" } }, - "node_modules/when": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", - "integrity": "sha512-5cZ7mecD3eYcMiCH4wtRPA5iFJZ50BJYDfckI5RRpQiktMiYTcn0ccLTZOvcbBume+1304fQztxeNzNS9Gvrnw==" - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 3a0905e..59a40cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "discord-audio-stream", - "version": "0.0.3", + "version": "0.1.0", "description": "🖼️ NPM Package to stream any audio link on discord.", "main": "./dist/index.js", "module": "./dist/index.mjs", @@ -15,7 +15,8 @@ "keywords": [ "discordjs-v14", "stream", - "audio" + "audio", + "music" ], "author": "FrauJulian | Julian Lechner", "license": "BSD-3-Clause", @@ -24,13 +25,14 @@ }, "homepage": "https://github.com/FrauJulian/discord-audio-stream#readme", "devDependencies": { + "@types/ejs": "^3.1.5", + "@types/node": "^20.12.8", "tsup": "^8.0.2", "typescript": "^5.4.5" }, "dependencies": { "@discordjs/voice": "^0.16.1", "discord.js": "^14.14.1", - "ffmpeg": "^0.0.4", "ffmpeg-static": "^5.2.0", "fs": "^0.0.1-security", "libsodium-wrappers": "^0.7.13", diff --git a/src/functions/start.ts b/src/functions/start.ts index 33d61ab..9e3df8c 100644 --- a/src/functions/start.ts +++ b/src/functions/start.ts @@ -1,8 +1,9 @@ import { StartProps } from "../stuff/types"; import { ERROR } from "../stuff/error"; -import fs from "fs"; + import { join } from "node:path"; -import { AudioPlayer } from "@discordjs/voice"; + +let Source = ""; const { joinVoiceChannel, createAudioPlayer, createAudioResource } = require("@discordjs/voice"); @@ -17,52 +18,89 @@ export function StreamStart({ //Create AudioPlayer variable. const AudioPlayer = createAudioPlayer(); - //File Resource + //Play function for file resource. function FileResource() { - let Audio = createAudioResource(join(__dirname, Resource), { inlineVolume: true }); - AudioPlayer.play(Audio); + let Audio = createAudioResource(join(__dirname, Source)); //Fetch stream File. + AudioPlayer.play(Audio); //Set AudioPlayer to resource File. - joinVoiceChannel({ + joinVoiceChannel({ //Join the channel. channelId: imvci, guildId: igi, adapterCreator: igv - }).subscribe(AudioPlayer); + }).subscribe(AudioPlayer); //AudioPlayer start playing audio. } - //Link Resource + //Play function for link resource. function LinkResource() { - let Audio = createAudioResource(Resource); - AudioPlayer.play(Audio); + let Audio = createAudioResource(Resource); //Fetch stream Link. + AudioPlayer.play(Audio); //Set AudioPlayer to resource Link. - joinVoiceChannel({ + joinVoiceChannel({ //Join the channel. channelId: imvci, guildId: igi, adapterCreator: igv - }).subscribe(AudioPlayer) + }).subscribe(AudioPlayer) //AudioPlayer start playing audio. } - //If the type is "Link". - if (type === "Link") { - LinkResource(); - //If the type is "File". - } else if (type === "File") { - FileResource(); - //If the type is "Analyze". - } else if (type === "Analyze") { - if (fs.existsSync(Resource)) { //Check if Resource is a file and exist. - FileResource(); - } else { //If Resoure is not a file or doesn't exist. - LinkResource(); + //URL Pattern to test if the resource is a link. + var URLPattern = new RegExp('^(https?:\\/\\/)?'+ + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|'+ + '((\\d{1,3}\\.){3}\\d{1,3}))'+ + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ + '(\\?[;&a-z\\d%_.~+=-]*)?'+ + '(\\#[-a-z\\d_]*)?$','i'); + + if (type === "Link") { //If the type is "Link". + + if (URLPattern.test(Resource) === true) { //Check if Link is a URL. + + LinkResource(); //Run LinkResource function. + + } else { //If resource is not a link. + ERROR(); //Run ERROR function. + console.log("CODE: Resource isn't a Link!") //"Error Code" usefull for help people. + console.log(" ") //Placeholder xD } - } else { - //If no valid value is specified. - ERROR(); + + } else if (type === "File") { //If the type is "File". + if (Resource.startsWith(".") == true) { //Check if the resource file exist. + + Source = require(Resource); //Set Source variable to Audio File. + FileResource(); //Run FileResource function. + + } else { //If resource is not a file. + ERROR(); //Run ERROR function. + console.log("CODE: Resource isn't a File!") //"Error Code" usefull for help people. + console.log(" ") //Placeholder xD + } + + } else if (type === "Analyze") { //If the type is "Analyze". + + if (Resource.startsWith(".") == true) { //Check if the resource file exist. + + Source = require(Resource); //Set Source variable to Audio File. + FileResource(); //Run FileResource function. + + } else if (URLPattern.test(Resource) === true) { //Check if Link is a URL. + + LinkResource(); //Run LinkResource function. + + } else { //If resource is not a link or file. + ERROR(); //Run ERROR function. + console.log("CODE: Resource isn't a Link or a File!") //"Error Code" usefull for help people. + console.log(" ") //Placeholder xD + } + + } else { //If no valid value is specified. + ERROR(); //Run ERROR function. + console.log("CODE: Unknown resource type!") //"Error Code" usefull for help people. + console.log(" ") //Placeholder xD } - } catch (error) { - //If syntax is wrong. - ERROR(); - console.log("ERR:\n" + error); - console.log(" "); + + } catch (error) { //If syntax is wrong. + ERROR(); //Run ERROR function. + console.log(">> ERR:\n" + error); //Log the Error + console.log(" "); //Placeholder xD } }; \ No newline at end of file diff --git a/src/functions/stop.ts b/src/functions/stop.ts index 89913da..b60719a 100644 --- a/src/functions/stop.ts +++ b/src/functions/stop.ts @@ -14,8 +14,8 @@ export function StreamStop({ connection.destroy(); } catch (error) { - ERROR(); - console.log("ERR:\n" + error); - console.log(" "); + ERROR(); //Run ERROR function. + console.log(">> ERR:\n" + error); //Log the Error + console.log(" "); //Placeholder xD } }; \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 53d74c5..2c48056 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,3 @@ //Export Start and Stop Function export * from "./functions/start"; -export * from "./functions/stop"; \ No newline at end of file +export * from "./functions/stop"; diff --git a/src/stuff/error.ts b/src/stuff/error.ts index 897896e..85517d4 100644 --- a/src/stuff/error.ts +++ b/src/stuff/error.ts @@ -1,7 +1,7 @@ //ERROR Message export function ERROR() { console.log(" "); - console.log(" ______ _____ _____ ____ _____ \r\n | ____| __ \\| __ \\ \/ __ \\| __ \\ \r\n | |__ | |__) | |__) | | | | |__) |\r\n | __| | _ \/| _ \/| | | | _ \/ \r\n | |____| | \\ \\| | \\ \\| |__| | | \\ \\ \r\n |______|_| \\_\\_| \\_\\\\____\/|_| \\_\\"); + console.error(" ______ _____ _____ ____ _____ \r\n | ____| __ \\| __ \\ \/ __ \\| __ \\ \r\n | |__ | |__) | |__) | | | | |__) |\r\n | __| | _ \/| _ \/| | | | _ \/ \r\n | |____| | \\ \\| | \\ \\| |__| | | \\ \\ \r\n |______|_| \\_\\_| \\_\\\\____\/|_| \\_\\"); console.log(" "); console.log("This error comes from the discord-audio-stream package!"); console.log("This error happens if you don't use the package right."); diff --git a/tsconfig.json b/tsconfig.json index 1ee0f25..10a901b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "strict": true, + "allowJs": true, "noImplicitAny": true, "esModuleInterop": true, "strictNullChecks": true, @@ -8,10 +9,19 @@ "moduleResolution": "Node", "module": "CommonJS", "declaration": true, + "declarationMap": true, + "jsx": "react", "isolatedModules": true, "noEmit": true, - "outDir": "dist" + "outDir": "dist", + "types": [ + "node" + ], + "typeRoots": [ + "node_modules/@types" + ] }, + "include": ["src"], "exclude": ["node_modules"] } \ No newline at end of file