Spaces:
Paused
Paused
- .gitattributes +1 -0
- app.js +11 -9
- fnc/ai.js +63 -0
- fnc/apis.js +165 -0
- fnc/checktype.js +24 -0
- fnc/download.js +31 -0
- fnc/test.js +165 -0
- fnc/validate.js +26 -0
- lib/cookies/gtc.json +1 -0
- lib/cookies/qq.txt +10 -0
- lib/cookies/twt.txt +14 -0
- lib/cookies/yt.txt +26 -0
- lib/fb.js +89 -0
- lib/ig.js +70 -0
- lib/kuaishou.js +110 -0
- lib/pix.js +88 -0
- lib/pradigm.js +114 -0
- lib/qqm.js +114 -0
- lib/qqmusic.js +59 -0
- lib/skrep.js +160 -0
- lib/snapchat.js +48 -0
- lib/soundcloud.js +147 -0
- lib/spotify.js +171 -0
- lib/twt.js +54 -0
- lib/ytdl.js +130 -0
- package-lock.json +1390 -6
- package.json +8 -2
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
node_modules
|
app.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
| 1 |
const express = require("express");
|
| 2 |
const cors = require("cors");
|
|
|
|
|
|
|
| 3 |
require("dotenv").config();
|
| 4 |
const bodyParser = require("body-parser");
|
| 5 |
|
|
|
|
|
|
|
|
|
|
| 6 |
const app = express();
|
| 7 |
const port = process.env.PORT || 7860;
|
| 8 |
|
|
@@ -20,17 +25,14 @@ app.use(bodyParser.urlencoded({
|
|
| 20 |
extended: true
|
| 21 |
}));
|
| 22 |
|
|
|
|
|
|
|
|
|
|
| 23 |
app.get("/", (req, res) => {
|
| 24 |
-
res.send(
|
| 25 |
-
<html>
|
| 26 |
-
<head>
|
| 27 |
-
<meta http-equiv="refresh" content="3;url=https://app.wzblueline.xyz" />
|
| 28 |
-
</head>
|
| 29 |
-
<body>
|
| 30 |
-
</body>
|
| 31 |
-
</html>
|
| 32 |
-
`)
|
| 33 |
});
|
|
|
|
|
|
|
| 34 |
|
| 35 |
let server
|
| 36 |
app.listen(port, () => {
|
|
|
|
| 1 |
const express = require("express");
|
| 2 |
const cors = require("cors");
|
| 3 |
+
const path = require("path");
|
| 4 |
+
const fs = require("fs");
|
| 5 |
require("dotenv").config();
|
| 6 |
const bodyParser = require("body-parser");
|
| 7 |
|
| 8 |
+
const apis = require("./fnc/apis");
|
| 9 |
+
const downloadf = require("./fnc/download");
|
| 10 |
+
|
| 11 |
const app = express();
|
| 12 |
const port = process.env.PORT || 7860;
|
| 13 |
|
|
|
|
| 25 |
extended: true
|
| 26 |
}));
|
| 27 |
|
| 28 |
+
app.use("/cdn", express.static(path.join(__dirname, "cdn")));
|
| 29 |
+
app.use("/tmp", express.static(path.join(__dirname, "tmp")));
|
| 30 |
+
|
| 31 |
app.get("/", (req, res) => {
|
| 32 |
+
res.send({ error: "NIGGA"})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
});
|
| 34 |
+
app.post("/api", apis);
|
| 35 |
+
app.get("/download", downloadf);
|
| 36 |
|
| 37 |
let server
|
| 38 |
app.listen(port, () => {
|
fnc/ai.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const { enhance } = require("../lib/pradigm");
|
| 2 |
+
const drawever = require("../lib/pix"); // Import dari pix.js
|
| 3 |
+
const fs = require("fs");
|
| 4 |
+
const path = require("path");
|
| 5 |
+
const { v4: uuidv4 } = require("uuid");
|
| 6 |
+
|
| 7 |
+
async function checkCaptcha(response) {
|
| 8 |
+
const url = new URL("https://www.google.com/recaptcha/api/siteverify");
|
| 9 |
+
url.searchParams.set("secret", "6Le0_-YqAAAAAPFjisvdA9ruGjWr_V0wv9j1OP-d");
|
| 10 |
+
url.searchParams.set("response", response);
|
| 11 |
+
|
| 12 |
+
const res = await fetch(url, {
|
| 13 |
+
method: "POST"
|
| 14 |
+
});
|
| 15 |
+
/** @type {{ success: boolean, challenge_ts: string, hostname: string, score: number, action: string, "error-codes": ("missing-input-secret"|"invalid-input-secret"|"missing-input-response"|"invalid-input-response"|"bad-request"|"timeout-or-duplicate")[] }} */
|
| 16 |
+
const data = await res.json();
|
| 17 |
+
return data;
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
module.exports = async function (req, res) {
|
| 21 |
+
try {
|
| 22 |
+
const { buffer, type, style = "anime", quality = "medium" } = req.body;
|
| 23 |
+
//const ip = req._ip;
|
| 24 |
+
/** @type {string} */
|
| 25 |
+
const authHeader = req.headers.authorization;
|
| 26 |
+
|
| 27 |
+
if(!authHeader || !authHeader.startsWith("Bearer ")) {
|
| 28 |
+
return res.status(401).json({
|
| 29 |
+
message: "Unauthorized: Token is missing or invalid"
|
| 30 |
+
});
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
if (!buffer) return res.status(400).json({ error: "Buffer diperlukan." });
|
| 34 |
+
|
| 35 |
+
if (type === "hd") {
|
| 36 |
+
const imgBuffer = Buffer.from(buffer);
|
| 37 |
+
const enhancedImage = await enhance(imgBuffer);
|
| 38 |
+
if (!enhancedImage) throw new Error("Gagal memproses gambar.");
|
| 39 |
+
|
| 40 |
+
res.setHeader("Content-Type", "image/png");
|
| 41 |
+
return res.send(enhancedImage);
|
| 42 |
+
}
|
| 43 |
+
if (type === "effect") {
|
| 44 |
+
// Simpan buffer ke file sementara
|
| 45 |
+
const fileName = `${uuidv4()}.png`;
|
| 46 |
+
const filePath = path.join(__dirname, "../cdn", fileName);
|
| 47 |
+
await fs.writeFileSync(filePath, Buffer.from(buffer));
|
| 48 |
+
|
| 49 |
+
// Proses gambar dengan pix.js
|
| 50 |
+
const imageUrl = `https://beta.wzblueline.xyz/cdn/${fileName}`;
|
| 51 |
+
|
| 52 |
+
const quality = "medium";
|
| 53 |
+
|
| 54 |
+
await drawever.create(imageUrl, style, quality);
|
| 55 |
+
|
| 56 |
+
return res.json({ url: imageUrl });
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
} catch (error) {
|
| 60 |
+
console.error(error);
|
| 61 |
+
res.status(500).json({ error: "Terjadi kesalahan saat memproses gambar." });
|
| 62 |
+
}
|
| 63 |
+
};
|
fnc/apis.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const {
|
| 2 |
+
fileTypeFromBuffer
|
| 3 |
+
} = require("file-type");
|
| 4 |
+
const twit = require("../lib/twt")
|
| 5 |
+
const {
|
| 6 |
+
ttt
|
| 7 |
+
} = require("../lib/skrep");
|
| 8 |
+
const {
|
| 9 |
+
soundcloud
|
| 10 |
+
} = require("../lib/soundcloud");
|
| 11 |
+
const ig = require("../lib/ig");
|
| 12 |
+
const {
|
| 13 |
+
spotifyTrack,
|
| 14 |
+
spotifyPlaylist
|
| 15 |
+
} = require("../lib/spotify");
|
| 16 |
+
const yt = require("../lib/ytdl");
|
| 17 |
+
const kwaii = require("../lib/kuaishou");
|
| 18 |
+
const qq = require("../lib/qqm");
|
| 19 |
+
const fesnuk = require("../lib/fb");
|
| 20 |
+
|
| 21 |
+
const IGr = /^(https?:\/\/)?(www\.)?instagram\.com\/.*$/i;
|
| 22 |
+
const SCr = /^(https?:\/\/)?(www\.|m\.)?(on\.|)soundcloud\.com\/[^\s]+$/i;
|
| 23 |
+
const TTr = /https?:\/\/(www\.|v(t|m)\.|t\.)?tiktok\.com/i;
|
| 24 |
+
const Sr = /https?:\/\/open\.spotify\.com\/track\/([a-zA-Z0-9]+)(\?.*)?/i;
|
| 25 |
+
const Ser = /https?:\/\/open\.spotify\.com\/playlist\/([a-zA-Z0-9]+)(\?.*)?/i;
|
| 26 |
+
const YTr = /(?:http(?:s|):\/\/|)(?:(?:www\.|)?(?:music\.)?youtube(?:-nocookie|)\.com\/(?:shorts\/)?(?:watch\?.*(?:|&)v=|embed\/|v\/)?|youtu\.be\/)([-_0-9A-Za-z]{11})/i;
|
| 27 |
+
const Kr = /^https?:\/\/v\.kuaishou\.com\/[a-zA-Z0-9]+$/i;
|
| 28 |
+
const QQMr = /^https:\/\/c6\.y\.qq\.com\/base\/fcgi-bin\/u\?__=[a-zA-Z0-9]+$/;
|
| 29 |
+
const TwTr = /^https?:\/\/(www\.)?(twitter|x)\.com\/[^\/]+\/status\/\d+\/?$/i;
|
| 30 |
+
// Daftar domain yang diperbolehkan untuk Facebook
|
| 31 |
+
const allowX = [
|
| 32 |
+
"x.com",
|
| 33 |
+
"www.x.com",
|
| 34 |
+
"twitter.com",
|
| 35 |
+
"www.twitter.com"
|
| 36 |
+
]
|
| 37 |
+
const allowedFacebookHosts = [
|
| 38 |
+
"facebook.com",
|
| 39 |
+
"www.facebook.com",
|
| 40 |
+
"m.facebook.com",
|
| 41 |
+
"fb.com"
|
| 42 |
+
];
|
| 43 |
+
|
| 44 |
+
/**
|
| 45 |
+
* @param {string} response
|
| 46 |
+
* @returns {Promise<{ success: boolean, challenge_ts: string, hostname: string, score: number, action: string, "error-codes": ("missing-input-secret"|"invalid-input-secret"|"missing-input-response"|"invalid-input-response"|"bad-request"|"timeout-or-duplicate")[] }>}
|
| 47 |
+
*/
|
| 48 |
+
async function checkCaptcha(response) {
|
| 49 |
+
const url = new URL("https://www.google.com/recaptcha/api/siteverify");
|
| 50 |
+
url.searchParams.set("secret", "6Ldr6_cqAAAAAApmQtOImEUOVLq8cAIFUZuuRSrM");
|
| 51 |
+
url.searchParams.set("response", response);
|
| 52 |
+
|
| 53 |
+
const res = await fetch(url, {
|
| 54 |
+
method: "POST"
|
| 55 |
+
});
|
| 56 |
+
|
| 57 |
+
return await res.json();
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
/** @type {Map<string, any>} */
|
| 61 |
+
const yt_info = new Map();
|
| 62 |
+
module.exports = async function(req, res) {
|
| 63 |
+
const {
|
| 64 |
+
url
|
| 65 |
+
} = req.body;
|
| 66 |
+
//const ip = req._ip;
|
| 67 |
+
if(!url) {
|
| 68 |
+
return res.status(400).json({
|
| 69 |
+
error: "URL diperlukan."
|
| 70 |
+
});
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
let parsedUrl;
|
| 74 |
+
try {
|
| 75 |
+
parsedUrl = new URL(url);
|
| 76 |
+
} catch (error) {
|
| 77 |
+
return res.status(400).json({ error: "URL tidak valid." });
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
const authHeader = req.headers.authorization;
|
| 81 |
+
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
| 82 |
+
return res.status(401).json({ message: "Unauthorized: Token is missing or invalid" });
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
const token = authHeader.split(" ")[1];
|
| 86 |
+
const { success: isValid, "error-codes": errors } = await checkCaptcha(token);
|
| 87 |
+
|
| 88 |
+
if (!isValid) {
|
| 89 |
+
return res.status(400).send({ message: "Invalid captcha", errors });
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
console.log(parsedUrl);
|
| 93 |
+
let ress;
|
| 94 |
+
try {
|
| 95 |
+
if(IGr.test(url)) {
|
| 96 |
+
ress = await ig(url);
|
| 97 |
+
ress.type = "instagram";
|
| 98 |
+
} else if(SCr.test(url)) {
|
| 99 |
+
ress = await soundcloud(url);
|
| 100 |
+
ress.type = "soundcloud";
|
| 101 |
+
} else if(Ser.test(url)) {
|
| 102 |
+
ress = await spotifyPlaylist(url);
|
| 103 |
+
ress.type = "spotifyPlaylist";
|
| 104 |
+
} else if(TTr.test(url)) {
|
| 105 |
+
ress = await ttt(url);
|
| 106 |
+
ress.type = "tiktok";
|
| 107 |
+
} else if(Sr.test(url)) {
|
| 108 |
+
ress = await spotifyTrack(url);
|
| 109 |
+
ress.type = "spotify";
|
| 110 |
+
} else if(QQMr.test(url)) {
|
| 111 |
+
ress = await qq(url);
|
| 112 |
+
ress.type = "qq";
|
| 113 |
+
} else if(allowedFacebookHosts.includes(parsedUrl.hostname)) {
|
| 114 |
+
ress = await fesnuk(url);
|
| 115 |
+
ress.type = "facebook"
|
| 116 |
+
} else if(allowX.includes(parsedUrl.hostname)) {
|
| 117 |
+
ress = await twit(url);
|
| 118 |
+
ress.type = "twitter"
|
| 119 |
+
} else if(YTr.test(url)) {
|
| 120 |
+
const format = String(
|
| 121 |
+
req.headers["x-selected-format"] ||
|
| 122 |
+
""
|
| 123 |
+
).trim();
|
| 124 |
+
const [, id] = YTr.exec(url);
|
| 125 |
+
|
| 126 |
+
if(!format) {
|
| 127 |
+
ress = (
|
| 128 |
+
yt_info.has(id)
|
| 129 |
+
? yt_info.get(id)
|
| 130 |
+
: await yt.getInfo(url)
|
| 131 |
+
);
|
| 132 |
+
yt_info.set(id, ress);
|
| 133 |
+
ress.type = "yt_info";
|
| 134 |
+
} else {
|
| 135 |
+
const type = (
|
| 136 |
+
format === "audio"
|
| 137 |
+
? "Audio"
|
| 138 |
+
: "Video"
|
| 139 |
+
);
|
| 140 |
+
ress = await yt[`get${type}`](url, format);
|
| 141 |
+
}
|
| 142 |
+
} else if(Kr.test(url)) {
|
| 143 |
+
ress = await kwaii(url);
|
| 144 |
+
ress.type = "kwaii";
|
| 145 |
+
} else {
|
| 146 |
+
ress = {
|
| 147 |
+
status: 400,
|
| 148 |
+
message: "failed request"
|
| 149 |
+
};
|
| 150 |
+
}
|
| 151 |
+
} catch (e) {
|
| 152 |
+
console.log(e);
|
| 153 |
+
ress = {
|
| 154 |
+
status: 404,
|
| 155 |
+
message: e.message
|
| 156 |
+
};
|
| 157 |
+
}
|
| 158 |
+
|
| 159 |
+
if(Buffer.isBuffer(ress)) {
|
| 160 |
+
const { mime } = await fileTypeFromBuffer(ress);
|
| 161 |
+
res.setHeader("Content-Type", mime);
|
| 162 |
+
res.setHeader("Content-Length", ress.length);
|
| 163 |
+
}
|
| 164 |
+
return res.status(ress.status || 200).send(ress.data || ress);
|
| 165 |
+
};
|
fnc/checktype.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const fetch = require("node-fetch").default;
|
| 2 |
+
const axios = require("axios");
|
| 3 |
+
|
| 4 |
+
module.exports = async function(req, res) {
|
| 5 |
+
try {
|
| 6 |
+
const { url } = req.query;
|
| 7 |
+
if (!url) return res.status(400).json({ success: false, message: "URL tidak valid" });
|
| 8 |
+
const fileResponse = await axios.head(url, {
|
| 9 |
+
headers: { "User-Agent": "Mozilla/5.0" }
|
| 10 |
+
});
|
| 11 |
+
|
| 12 |
+
const contentType = fileResponse.headers["content-type"];
|
| 13 |
+
let fileExtension = "";
|
| 14 |
+
|
| 15 |
+
if (contentType === "video/mp4") fileExtension = ".mp4";
|
| 16 |
+
else if (contentType === "audio/mpeg") fileExtension = ".mp3";
|
| 17 |
+
else if (contentType?.startsWith("image")) fileExtension = ".jpg";
|
| 18 |
+
|
| 19 |
+
res.json({ success: true, extension: fileExtension });
|
| 20 |
+
} catch (error) {
|
| 21 |
+
console.error(error);
|
| 22 |
+
res.status(500).json({ success: false, message: "Gagal mendapatkan informasi file" });
|
| 23 |
+
}
|
| 24 |
+
}
|
fnc/download.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const fetch = require("node-fetch").default;
|
| 2 |
+
const axios = require("axios");
|
| 3 |
+
|
| 4 |
+
module.exports = async function(req, res, next) {
|
| 5 |
+
try {
|
| 6 |
+
const {
|
| 7 |
+
url,
|
| 8 |
+
name
|
| 9 |
+
} = req.query;
|
| 10 |
+
if(!url || !name) return next();
|
| 11 |
+
|
| 12 |
+
const _res = await fetch(url, {
|
| 13 |
+
headers: {
|
| 14 |
+
"Referer": url,
|
| 15 |
+
"Access-Control-Allow-Origin": "*",
|
| 16 |
+
"Referrer-Policy": "strict-origin-when-cross-origin",
|
| 17 |
+
"User-Agent": req.get("User-Agent"),
|
| 18 |
+
...(req.headers.range ? {
|
| 19 |
+
Range: req.headers.range
|
| 20 |
+
} : {})
|
| 21 |
+
}
|
| 22 |
+
});
|
| 23 |
+
for(const [key, value] of _res.headers.entries()) res.setHeader(key, value);
|
| 24 |
+
res.setHeader("Transfer-Encoding", "chunked");
|
| 25 |
+
res.setHeader("Content-Disposition", `attachment; filename*=UTF-8''${encodeURIComponent(name)}`);
|
| 26 |
+
_res.body.pipe(res.status(_res.status));
|
| 27 |
+
} catch(e) {
|
| 28 |
+
console.error(e)
|
| 29 |
+
next();
|
| 30 |
+
};
|
| 31 |
+
}
|
fnc/test.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const {
|
| 2 |
+
fileTypeFromBuffer
|
| 3 |
+
} = require("file-type");
|
| 4 |
+
const twit = require("../lib/twt")
|
| 5 |
+
const {
|
| 6 |
+
ttt
|
| 7 |
+
} = require("../lib/skrep");
|
| 8 |
+
const {
|
| 9 |
+
soundcloud
|
| 10 |
+
} = require("../lib/soundcloud");
|
| 11 |
+
const ig = require("../lib/ig");
|
| 12 |
+
const {
|
| 13 |
+
spotifyTrack,
|
| 14 |
+
spotifyPlaylist
|
| 15 |
+
} = require("../lib/spotify");
|
| 16 |
+
const yt = require("../lib/ytdl");
|
| 17 |
+
const kwaii = require("../lib/kuaishou");
|
| 18 |
+
const qq = require("../lib/qqm");
|
| 19 |
+
const fesnuk = require("../lib/fb");
|
| 20 |
+
|
| 21 |
+
const IGr = /^(https?:\/\/)?(www\.)?instagram\.com\/.*$/i;
|
| 22 |
+
const SCr = /^(https?:\/\/)?(www\.|m\.)?(on\.|)soundcloud\.com\/[^\s]+$/i;
|
| 23 |
+
const TTr = /https?:\/\/(www\.|v(t|m)\.|t\.)?tiktok\.com/i;
|
| 24 |
+
const Sr = /https?:\/\/open\.spotify\.com\/track\/([a-zA-Z0-9]+)(\?.*)?/i;
|
| 25 |
+
const Ser = /https?:\/\/open\.spotify\.com\/playlist\/([a-zA-Z0-9]+)(\?.*)?/i;
|
| 26 |
+
const YTr = /(?:http(?:s|):\/\/|)(?:(?:www\.|)?(?:music\.)?youtube(?:-nocookie|)\.com\/(?:shorts\/)?(?:watch\?.*(?:|&)v=|embed\/|v\/)?|youtu\.be\/)([-_0-9A-Za-z]{11})/i;
|
| 27 |
+
const Kr = /^https?:\/\/v\.kuaishou\.com\/[a-zA-Z0-9]+$/i;
|
| 28 |
+
const QQMr = /^https:\/\/c6\.y\.qq\.com\/base\/fcgi-bin\/u\?__=[a-zA-Z0-9]+$/;
|
| 29 |
+
const TwTr = /^https?:\/\/(www\.)?(twitter|x)\.com\/[^\/]+\/status\/\d+\/?$/i;
|
| 30 |
+
// Daftar domain yang diperbolehkan untuk Facebook
|
| 31 |
+
const allowX = [
|
| 32 |
+
"x.com",
|
| 33 |
+
"www.x.com",
|
| 34 |
+
"twitter.com",
|
| 35 |
+
"www.twitter.com"
|
| 36 |
+
]
|
| 37 |
+
const allowedFacebookHosts = [
|
| 38 |
+
"facebook.com",
|
| 39 |
+
"www.facebook.com",
|
| 40 |
+
"m.facebook.com",
|
| 41 |
+
"fb.com"
|
| 42 |
+
];
|
| 43 |
+
|
| 44 |
+
/**
|
| 45 |
+
* @param {string} response
|
| 46 |
+
* @returns {Promise<{ success: boolean, challenge_ts: string, hostname: string, score: number, action: string, "error-codes": ("missing-input-secret"|"invalid-input-secret"|"missing-input-response"|"invalid-input-response"|"bad-request"|"timeout-or-duplicate")[] }>}
|
| 47 |
+
*/
|
| 48 |
+
async function checkCaptcha(response) {
|
| 49 |
+
const url = new URL("https://www.google.com/recaptcha/api/siteverify");
|
| 50 |
+
url.searchParams.set("secret", "6Ldr6_cqAAAAAApmQtOImEUOVLq8cAIFUZuuRSrM");
|
| 51 |
+
url.searchParams.set("response", response);
|
| 52 |
+
|
| 53 |
+
const res = await fetch(url, {
|
| 54 |
+
method: "POST"
|
| 55 |
+
});
|
| 56 |
+
|
| 57 |
+
return await res.json();
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
/** @type {Map<string, any>} */
|
| 61 |
+
const yt_info = new Map();
|
| 62 |
+
module.exports = async function(req, res) {
|
| 63 |
+
const {
|
| 64 |
+
url
|
| 65 |
+
} = req.body;
|
| 66 |
+
//const ip = req._ip;
|
| 67 |
+
if(!url) {
|
| 68 |
+
return res.status(400).json({
|
| 69 |
+
error: "URL diperlukan."
|
| 70 |
+
});
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
let parsedUrl;
|
| 74 |
+
try {
|
| 75 |
+
parsedUrl = new URL(url);
|
| 76 |
+
} catch (error) {
|
| 77 |
+
return res.status(400).json({ error: "URL tidak valid." });
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
/*const authHeader = req.headers.authorization;
|
| 81 |
+
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
| 82 |
+
return res.status(401).json({ message: "Unauthorized: Token is missing or invalid" });
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
const token = authHeader.split(" ")[1];
|
| 86 |
+
const { success: isValid, "error-codes": errors } = await checkCaptcha(token);
|
| 87 |
+
|
| 88 |
+
if (!isValid) {
|
| 89 |
+
return res.status(400).send({ message: "Invalid captcha", errors });
|
| 90 |
+
}*/
|
| 91 |
+
|
| 92 |
+
console.log(parsedUrl);
|
| 93 |
+
let ress;
|
| 94 |
+
try {
|
| 95 |
+
if(IGr.test(url)) {
|
| 96 |
+
ress = await ig(url);
|
| 97 |
+
ress.type = "instagram";
|
| 98 |
+
} else if(SCr.test(url)) {
|
| 99 |
+
ress = await soundcloud(url);
|
| 100 |
+
ress.type = "soundcloud";
|
| 101 |
+
} else if(Ser.test(url)) {
|
| 102 |
+
ress = await spotifyPlaylist(url);
|
| 103 |
+
ress.type = "spotifyPlaylist";
|
| 104 |
+
} else if(TTr.test(url)) {
|
| 105 |
+
ress = await ttt(url);
|
| 106 |
+
ress.type = "tiktok";
|
| 107 |
+
} else if(Sr.test(url)) {
|
| 108 |
+
ress = await spotifyTrack(url);
|
| 109 |
+
ress.type = "spotify";
|
| 110 |
+
} else if(QQMr.test(url)) {
|
| 111 |
+
ress = await qq(url);
|
| 112 |
+
ress.type = "qq";
|
| 113 |
+
} else if(allowedFacebookHosts.includes(parsedUrl.hostname)) {
|
| 114 |
+
ress = await fesnuk(url);
|
| 115 |
+
ress.type = "facebook"
|
| 116 |
+
} else if(allowX.includes(parsedUrl.hostname)) {
|
| 117 |
+
ress = await twit(url);
|
| 118 |
+
ress.type = "twitter"
|
| 119 |
+
} else if(YTr.test(url)) {
|
| 120 |
+
const format = String(
|
| 121 |
+
req.headers["x-selected-format"] ||
|
| 122 |
+
""
|
| 123 |
+
).trim();
|
| 124 |
+
const [, id] = YTr.exec(url);
|
| 125 |
+
|
| 126 |
+
if(!format) {
|
| 127 |
+
ress = (
|
| 128 |
+
yt_info.has(id)
|
| 129 |
+
? yt_info.get(id)
|
| 130 |
+
: await yt.getInfo(url)
|
| 131 |
+
);
|
| 132 |
+
yt_info.set(id, ress);
|
| 133 |
+
ress.type = "yt_info";
|
| 134 |
+
} else {
|
| 135 |
+
const type = (
|
| 136 |
+
format === "audio"
|
| 137 |
+
? "Audio"
|
| 138 |
+
: "Video"
|
| 139 |
+
);
|
| 140 |
+
ress = await yt[`get${type}`](url, format);
|
| 141 |
+
}
|
| 142 |
+
} else if(Kr.test(url)) {
|
| 143 |
+
ress = await kwaii(url);
|
| 144 |
+
ress.type = "kwaii";
|
| 145 |
+
} else {
|
| 146 |
+
ress = {
|
| 147 |
+
status: 400,
|
| 148 |
+
message: "failed request"
|
| 149 |
+
};
|
| 150 |
+
}
|
| 151 |
+
} catch (e) {
|
| 152 |
+
console.log(e);
|
| 153 |
+
ress = {
|
| 154 |
+
status: 404,
|
| 155 |
+
message: e.message
|
| 156 |
+
};
|
| 157 |
+
}
|
| 158 |
+
|
| 159 |
+
if(Buffer.isBuffer(ress)) {
|
| 160 |
+
const { mime } = await fileTypeFromBuffer(ress);
|
| 161 |
+
res.setHeader("Content-Type", mime);
|
| 162 |
+
res.setHeader("Content-Length", ress.length);
|
| 163 |
+
}
|
| 164 |
+
return res.status(ress.status || 200).send(ress.data || ress);
|
| 165 |
+
};
|
fnc/validate.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const crypto = require("crypto");
|
| 2 |
+
|
| 3 |
+
function generateToken() {
|
| 4 |
+
return crypto.randomBytes(35).toString("hex");
|
| 5 |
+
}
|
| 6 |
+
|
| 7 |
+
module.exports = async function(req, res) {
|
| 8 |
+
const ip = req._ip;
|
| 9 |
+
const token = generateToken()
|
| 10 |
+
|
| 11 |
+
global.tokenVd = global.tokenVd.filter(entry => entry.ip !== ip);
|
| 12 |
+
global.tokenVd.push({
|
| 13 |
+
ip,
|
| 14 |
+
token
|
| 15 |
+
});
|
| 16 |
+
res.setHeader("X-Auth-Token", token);
|
| 17 |
+
res.status(200).json({
|
| 18 |
+
status: "success",
|
| 19 |
+
message: "Your Ip device Has been stored",
|
| 20 |
+
timestamp: Date.now(),
|
| 21 |
+
device: {
|
| 22 |
+
ip,
|
| 23 |
+
"User-Agent": req.get("user-agent"),
|
| 24 |
+
},
|
| 25 |
+
})
|
| 26 |
+
}
|
lib/cookies/gtc.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"web.getcontact.com":{"/":{"accessToken":{"key":"accessToken","value":"k1epack1m7d3erpokmblc8o833","domain":"web.getcontact.com","path":"/","secure":true,"httpOnly":true,"hostOnly":true,"creation":"2024-09-09T12:16:31.281Z","lastAccessed":"2024-09-10T10:13:49.063Z","sameSite":"strict"}}},"getcontact.com":{"/":{"lang":{"key":"lang","value":"en","expires":"2024-09-17T10:13:49.000Z","maxAge":604800,"domain":"getcontact.com","path":"/","secure":true,"httpOnly":true,"hostOnly":false,"creation":"2024-09-09T12:16:31.282Z","lastAccessed":"2024-09-10T10:13:49.560Z","sameSite":"strict"}}}}
|
lib/cookies/qq.txt
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Netscape HTTP Cookie File
|
| 2 |
+
# This file is generated by yt-dlp. Do not edit.
|
| 3 |
+
|
| 4 |
+
.qq.com TRUE / FALSE 1775522690 pgv_pvid 3157539980
|
| 5 |
+
.qq.com TRUE / FALSE 1775522582 fqm_pvqid e76154ca-b120-4254-b3fa-e81072a8c12e
|
| 6 |
+
.qq.com TRUE / FALSE 0 fqm_sessionid 50e2ad78-403b-4e41-95a0-3d30f1a31924
|
| 7 |
+
.qq.com TRUE / FALSE 0 pgv_info ssid=s5472847215
|
| 8 |
+
.qq.com TRUE / FALSE 0 _qpsvr_localtk 0.7401285126283235
|
| 9 |
+
.qq.com TRUE / FALSE 0 login_type 2
|
| 10 |
+
.y.qq.com TRUE / FALSE 1775522690 ts_uid 1529878964
|
lib/cookies/twt.txt
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Netscape HTTP Cookie File
|
| 2 |
+
# This file is generated by yt-dlp. Do not edit.
|
| 3 |
+
|
| 4 |
+
.x.com TRUE / TRUE 1750331668 guest_id v1%3A170332686229870139
|
| 5 |
+
.x.com TRUE / TRUE 1776858318 guest_id_ads v1%3A170332686229870139
|
| 6 |
+
.x.com TRUE / TRUE 1776858318 guest_id_marketing v1%3A170332686229870139
|
| 7 |
+
.x.com TRUE / TRUE 1776657587 kdt If8CE3YGg35fVb3dXwdv2aWiW59aZ2EpcXDqKgPK
|
| 8 |
+
.x.com TRUE / TRUE 1776657587 auth_token e751059b3aa2d90324e12505ebee30208d90c215
|
| 9 |
+
.x.com TRUE / TRUE 1776657587 ct0 c68643bbe144913a294f85810497c713c399fd3ee66393e4c51ed24c0340c23ba255929274e56acb3b3ae1bf00570d57ce38ceaf46df27fa9b1370c9fbc09e83e430ba8dbf72d4e1daf51b6925728f40
|
| 10 |
+
.x.com TRUE / TRUE 1773834318 twid u%3D1457478990747164675
|
| 11 |
+
.x.com TRUE / TRUE 1773633591 personalization_id "v1_qrJD886R5QtsnFa6uKK4uw=="
|
| 12 |
+
.x.com TRUE / TRUE 1742443562 __cf_bm g8TUQZaJ.LJ.VamcvG7m2DsIa8r2VH2LIe2Cy4QWUoQ-1742441762-1.0.1.1-HBhyZuLG2FH4NTxPnpuVSS8bcXjaTQC0Qbgu.xYlHvlrtpJju353UtPmRPyXMD38Po2gXKk2evwLDOvgGmJHpNKMCsSwb5A1WkH0o1NNHsk
|
| 13 |
+
x.com FALSE / TRUE 1757649584 g_state {"i_l":0}
|
| 14 |
+
x.com FALSE / FALSE 0 lang id
|
lib/cookies/yt.txt
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Netscape HTTP Cookie File
|
| 2 |
+
# This file is generated by yt-dlp. Do not edit.
|
| 3 |
+
|
| 4 |
+
.youtube.com TRUE / FALSE 0 PREF tz=UTC&f7=100&f6=40000000&hl=en
|
| 5 |
+
.youtube.com TRUE / TRUE 1758439410 LOGIN_INFO AFmmF2swRAIgZr72nRfUBYe2WwOkhbprKXnQcJHi4BfBdkJEptWn8VMCIDZael58JymiEpDm-8DrJfI-gNP297FXnHZncNBncL8l:QUQ3MjNmd19hS2EtMlhSNzhSSy1rZGFDTV9KMm1Md1pZOURKUlFkaUxhUlZEenRqMUtwU1JVdDlCeHoybW9lcldfTFB1ZXlibFJIYU9aSE8zYWd4bUNVZmZ1VkRKS1JYUlpaOXhUaDFuZlc2dWFPZ3ZhM2FiNUNBdld3d3lrcnhjZ2NCVUM3LW5CYllEczVDQkNwZVVCbGpNOGJ6blU0alpR
|
| 6 |
+
.youtube.com TRUE / TRUE 1764899348 __Secure-1PSIDTS sidts-CjIBQT4rX_xBWbrFJa5rVnNKdO27WmQe-gLTIsnHycw9lNXR-EmxQAuoS169ydN4pqd3hBAA
|
| 7 |
+
.youtube.com TRUE / TRUE 1764899348 __Secure-3PSIDTS sidts-CjIBQT4rX_xBWbrFJa5rVnNKdO27WmQe-gLTIsnHycw9lNXR-EmxQAuoS169ydN4pqd3hBAA
|
| 8 |
+
.youtube.com TRUE / FALSE 1775036690 HSID A-Ic277KbNCjxQ95u
|
| 9 |
+
.youtube.com TRUE / TRUE 1775036690 SSID A-zx7Npkr9ni8J_Ot
|
| 10 |
+
.youtube.com TRUE / FALSE 1775036690 APISID NJ9bG6QnEs2eeGZK/AjVyxaqKXzrKkc0Gu
|
| 11 |
+
.youtube.com TRUE / TRUE 1775036690 SAPISID VAxN26302hYv3b09/AAUzwPVK4ySu-3dkL
|
| 12 |
+
.youtube.com TRUE / TRUE 1775036690 __Secure-1PAPISID VAxN26302hYv3b09/AAUzwPVK4ySu-3dkL
|
| 13 |
+
.youtube.com TRUE / TRUE 1775036690 __Secure-3PAPISID VAxN26302hYv3b09/AAUzwPVK4ySu-3dkL
|
| 14 |
+
.youtube.com TRUE / FALSE 1775036690 SID g.a000uAhrP7e8IUjWS8HrzePXGBkk5Lx9E59jxXxqcaew85Kurcz2HXHVPmBon1jGDVahJA8RNgACgYKAR8SARcSFQHGX2Mi7NzMZMn9z5RNz0p6nLbFQhoVAUF8yKrlcJ8si136TF9S4EiJofej0076
|
| 15 |
+
.youtube.com TRUE / TRUE 1775036690 __Secure-1PSID g.a000uAhrP7e8IUjWS8HrzePXGBkk5Lx9E59jxXxqcaew85Kurcz2dTxUea1qKKB7uBGEaCptBwACgYKAWgSARcSFQHGX2MixouKhILhILOnCgDau3ExyRoVAUF8yKqQ4ovWpp1yFksDx4KRx4nh0076
|
| 16 |
+
.youtube.com TRUE / TRUE 1775036690 __Secure-3PSID g.a000uAhrP7e8IUjWS8HrzePXGBkk5Lx9E59jxXxqcaew85Kurcz2Sn_2oMxfHSjvZoeUKJIQfAACgYKAUQSARcSFQHGX2MigCv66d6OMJWkAg-efbXYEBoVAUF8yKpBrjPafDMzILJYbbnWGqdC0076
|
| 17 |
+
.youtube.com TRUE / FALSE 1774210887 SIDCC AKEyXzWdRPAwby9kre7bBzSAXLItq69N8IjtbWUJRPoE01aKfAPkjth1vM0pexORLHxbC7eqF2g
|
| 18 |
+
.youtube.com TRUE / TRUE 1774210887 __Secure-1PSIDCC AKEyXzVQ0TXi0VCVegUrTDHoLg_HOwLbDpb9Kgz0XqiCKxdvEQRpCZSFOl1YqyIKEQeOGc7MaGY
|
| 19 |
+
.youtube.com TRUE / TRUE 1774210887 __Secure-3PSIDCC AKEyXzUl9WXrklM11Z-8f158yYngdLy1oJkTOpWbJuPF7ytjEvDaUMh_L6-NCbCYXpM-UhVlvp0
|
| 20 |
+
.youtube.com TRUE / TRUE 0 YSC Cp7zocGc5mQ
|
| 21 |
+
.youtube.com TRUE / TRUE 1758197457 __Secure-ROLLOUT_TOKEN CLvzx8Ttx-3WFhDCy7Gb1J2MAxjQtOSb1J2MAw%3D%3D
|
| 22 |
+
.youtube.com TRUE / TRUE 1758226887 VISITOR_INFO1_LIVE HfMgLjm828Y
|
| 23 |
+
.youtube.com TRUE / TRUE 1758226887 VISITOR_PRIVACY_METADATA CgJVUxIEGgAgKg%3D%3D
|
| 24 |
+
.youtube.com TRUE / TRUE 1758226887 YT_DEVICE_MEASUREMENT_ID qNFt3Rg=
|
| 25 |
+
.youtube.com TRUE / TRUE 1805746887 __Secure-YT_TVFAS t=484068&s=2
|
| 26 |
+
.youtube.com TRUE / TRUE 1758226887 DEVICE_INFO ChxOelE0TkRZd05USTBOell3TmpZeE5UZzFOQT09EMe3/L4GGNHR+r4G
|
lib/fb.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* eslint-disable jsdoc/require-jsdoc */
|
| 2 |
+
const FormData = require("form-data")
|
| 3 |
+
const axios = require("axios")
|
| 4 |
+
const beautify = require("js-beautify")
|
| 5 |
+
const cheerio = require("cheerio")
|
| 6 |
+
const similarity = require("similarity")
|
| 7 |
+
|
| 8 |
+
async function getSize(url) {
|
| 9 |
+
try {
|
| 10 |
+
const res = await axios.head(url)
|
| 11 |
+
return res.headers["content-length"] ? parseInt(res.headers["content-length"]) : 0
|
| 12 |
+
} catch {
|
| 13 |
+
return 0
|
| 14 |
+
}
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
function bytesToSize(bytes) {
|
| 18 |
+
const sizes = ["B", "KB", "MB", "GB", "TB"]
|
| 19 |
+
if (bytes == 0 || isNaN(bytes)) return "0 B"
|
| 20 |
+
const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)))
|
| 21 |
+
return (bytes / Math.pow(1024, i)).toFixed(1) + " " + sizes[i]
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
async function fbdl(url) {
|
| 25 |
+
if (!url) return { error: true, message: "URL Required" }
|
| 26 |
+
|
| 27 |
+
try {
|
| 28 |
+
const { hostname } = new URL(url)
|
| 29 |
+
const _sim = similarity("facebook.com", hostname)
|
| 30 |
+
if (!(_sim >= 0.65 && hostname.includes("facebook.com"))) throw false
|
| 31 |
+
} catch {
|
| 32 |
+
return { error: true, message: "Invalid URL" }
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
const form = new FormData()
|
| 36 |
+
form.append("url", url)
|
| 37 |
+
|
| 38 |
+
try {
|
| 39 |
+
const res = await axios.post("https://snapsave.app/action.php", form, {
|
| 40 |
+
headers: {
|
| 41 |
+
...form.getHeaders(),
|
| 42 |
+
"User-Agent": "WhatsApp/2.24.6.21",
|
| 43 |
+
Referer: "https://snapsave.app/"
|
| 44 |
+
}
|
| 45 |
+
})
|
| 46 |
+
|
| 47 |
+
const script = res.data
|
| 48 |
+
let js
|
| 49 |
+
try {
|
| 50 |
+
js = eval(script.replace("eval", ""))
|
| 51 |
+
js = beautify(js).split("\n")[2]
|
| 52 |
+
} catch {
|
| 53 |
+
throw script
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
try {
|
| 57 |
+
const html = eval(js.slice(js.indexOf("<") - 1, -1))
|
| 58 |
+
const $ = cheerio.load(html)
|
| 59 |
+
|
| 60 |
+
const thumbnail = $(".image > img").attr("src")
|
| 61 |
+
const video = []
|
| 62 |
+
|
| 63 |
+
for (const i of $("table > tbody > tr")) {
|
| 64 |
+
const _$ = $(i).find.bind($(i))
|
| 65 |
+
|
| 66 |
+
const quality = _$(".video-quality").text()
|
| 67 |
+
let url = _$("a").attr("href")
|
| 68 |
+
if (!url) continue
|
| 69 |
+
|
| 70 |
+
url = new URL(url)
|
| 71 |
+
url.searchParams.delete("dl")
|
| 72 |
+
url = url.toString()
|
| 73 |
+
const size = await getSize(url)
|
| 74 |
+
const fSize = bytesToSize(size)
|
| 75 |
+
|
| 76 |
+
video.push({ resolusi: quality, url, size, fSize })
|
| 77 |
+
}
|
| 78 |
+
|
| 79 |
+
return { status: 200, title: "", thumbnail, video }
|
| 80 |
+
} catch (e) {
|
| 81 |
+
if (!(e instanceof SyntaxError)) throw e
|
| 82 |
+
return { error: true, message: eval(js.split(" = ")[1]) }
|
| 83 |
+
}
|
| 84 |
+
} catch (error) {
|
| 85 |
+
return { error: true, message: "Failed to fetch data" }
|
| 86 |
+
}
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
module.exports = fbdl
|
lib/ig.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* eslint-disable jsdoc/require-jsdoc */
|
| 2 |
+
const axios = require('axios');
|
| 3 |
+
const FormData = require('form-data');
|
| 4 |
+
const cheerio = require('cheerio');
|
| 5 |
+
const fromBuffer = x => import("file-type").then(v => v.fileTypeFromBuffer(x))
|
| 6 |
+
|
| 7 |
+
async function igdl(url) {
|
| 8 |
+
try {
|
| 9 |
+
const formData = new FormData();
|
| 10 |
+
formData.append('url', url);
|
| 11 |
+
|
| 12 |
+
const { data } = await axios.post('https://snapsave.app/id/action.php?lang=id', formData, {
|
| 13 |
+
headers: {
|
| 14 |
+
...formData.getHeaders(),
|
| 15 |
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
| 16 |
+
}
|
| 17 |
+
});
|
| 18 |
+
|
| 19 |
+
// eslint-disable-next-line no-unused-vars
|
| 20 |
+
const js = await new Promise(r => eval(data.replace('eval', 'r')));
|
| 21 |
+
const raw = js.match(/document\.getElementById\("download-section"\)\.innerHTML\s*=\s*"(.*?)";/s);
|
| 22 |
+
const $ = cheerio.load(raw[1].replace(/\\"/g, '"').replace(/\\n/g, '').replace(/\\t/g, '').replace(/\\\\/g, '\\'));
|
| 23 |
+
|
| 24 |
+
let thumb = "";
|
| 25 |
+
$("img").each((i, img) => {
|
| 26 |
+
const src = $(img).attr("src")
|
| 27 |
+
thumb = src
|
| 28 |
+
})
|
| 29 |
+
|
| 30 |
+
let res = {
|
| 31 |
+
status: 200,
|
| 32 |
+
type: "ig",
|
| 33 |
+
title: "",
|
| 34 |
+
thumbnail: thumb,
|
| 35 |
+
video: [],
|
| 36 |
+
image: []
|
| 37 |
+
};
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
let sesi = []
|
| 41 |
+
// Cek setiap link yang ada
|
| 42 |
+
$('.download-items__btn a').each(async (i, element) => {
|
| 43 |
+
const xk = $(element).attr('href');
|
| 44 |
+
sesi.push(xk)
|
| 45 |
+
});
|
| 46 |
+
for (const i of sesi) {
|
| 47 |
+
const response = await axios.get(i, { responseType: 'arraybuffer' });
|
| 48 |
+
const buffer = Buffer.from(response.data);
|
| 49 |
+
const type = await fromBuffer(buffer);
|
| 50 |
+
|
| 51 |
+
if (type) {
|
| 52 |
+
if (type.mime.startsWith('image')) {
|
| 53 |
+
res.image.push(i);
|
| 54 |
+
if (!res.thumbnail) {
|
| 55 |
+
res.thumbnail = i;
|
| 56 |
+
}
|
| 57 |
+
}
|
| 58 |
+
// Jika file adalah video
|
| 59 |
+
else if (type.mime.startsWith('video')) {
|
| 60 |
+
res.video.push({ resolusi: "HD", url: i, mimetype: type.mime });
|
| 61 |
+
}
|
| 62 |
+
}
|
| 63 |
+
}
|
| 64 |
+
return res;
|
| 65 |
+
} catch (err) {
|
| 66 |
+
console.error("[ERROR IG]\n\n", e);
|
| 67 |
+
return null;
|
| 68 |
+
}
|
| 69 |
+
}
|
| 70 |
+
module.exports = igdl;
|
lib/kuaishou.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* eslint-disable jsdoc/require-jsdoc */
|
| 2 |
+
const axios = require("axios");
|
| 3 |
+
const cheerio = require("cheerio");
|
| 4 |
+
|
| 5 |
+
function decodeKey(encodedKey) {
|
| 6 |
+
const unicodeDecoded = encodedKey.replace(/\\u[0-9a-fA-F]{4}/g, (match) =>
|
| 7 |
+
String.fromCharCode(parseInt(match.replace("\\u", ""), 16))
|
| 8 |
+
);
|
| 9 |
+
return unicodeDecoded
|
| 10 |
+
.split("")
|
| 11 |
+
.map((char) => {
|
| 12 |
+
if (char >= "a" && char <= "z") {
|
| 13 |
+
return String.fromCharCode(((char.charCodeAt(0) - 97 - 1 + 26) % 26) + 97);
|
| 14 |
+
} else if (char >= "A" && char <= "Z") {
|
| 15 |
+
return String.fromCharCode(((char.charCodeAt(0) - 65 - 1 + 26) % 26) + 65);
|
| 16 |
+
} else {
|
| 17 |
+
return char;
|
| 18 |
+
}
|
| 19 |
+
})
|
| 20 |
+
.join("");
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
async function scrapeKuaishou(url) {
|
| 24 |
+
try {
|
| 25 |
+
const { data: html } = await axios.get(url);
|
| 26 |
+
const $ = cheerio.load(html);
|
| 27 |
+
|
| 28 |
+
const scriptTag = $("script")
|
| 29 |
+
.filter((_, el) => $(el).html().includes("window.INIT_STATE"))
|
| 30 |
+
.html();
|
| 31 |
+
|
| 32 |
+
if (!scriptTag) {
|
| 33 |
+
console.warn("INIT_STATE tidak ditemukan.");
|
| 34 |
+
return null;
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
const jsonString = scriptTag.match(/window\.INIT_STATE\s*=\s*(\{.*\});?/)[1];
|
| 38 |
+
const result = JSON.parse(jsonString);
|
| 39 |
+
|
| 40 |
+
const decodedResult = Object.keys(result).reduce((acc, key) => {
|
| 41 |
+
const decodedKey = decodeKey(key);
|
| 42 |
+
acc[decodedKey] = result[key];
|
| 43 |
+
return acc;
|
| 44 |
+
}, {});
|
| 45 |
+
|
| 46 |
+
const photoKey = Object.keys(decodedResult).find((key) => {
|
| 47 |
+
const data = decodedResult[key];
|
| 48 |
+
return data && data.photo;
|
| 49 |
+
});
|
| 50 |
+
|
| 51 |
+
if (!photoKey) {
|
| 52 |
+
console.warn("Key dengan variabel 'photo' tidak ditemukan.");
|
| 53 |
+
return null;
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
const x_1a = decodedResult[photoKey];
|
| 57 |
+
|
| 58 |
+
const res = {
|
| 59 |
+
userInfo: {
|
| 60 |
+
id: x_1a.photo.userId,
|
| 61 |
+
username: x_1a.photo.kwaiId,
|
| 62 |
+
fullname: x_1a.photo.userName,
|
| 63 |
+
avatar: x_1a.photo.headUrl,
|
| 64 |
+
sex: x_1a.photo.userSex,
|
| 65 |
+
stats: x_1a.counts,
|
| 66 |
+
},
|
| 67 |
+
caption: x_1a.photo.caption,
|
| 68 |
+
};
|
| 69 |
+
|
| 70 |
+
if (x_1a.atlas) {
|
| 71 |
+
res.slide = {
|
| 72 |
+
size: x_1a.atlas.size,
|
| 73 |
+
urls: x_1a.atlas.list.map((v) => "https://p5.a.yximgs.com" + v),
|
| 74 |
+
};
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
if (x_1a.photo.photoType === "VIDEO") {
|
| 78 |
+
res.video = x_1a.photo.manifest.adaptationSet[0].representation[0].url;
|
| 79 |
+
}
|
| 80 |
+
if (x_1a.photo.soundTrack) {
|
| 81 |
+
res.sound = {
|
| 82 |
+
name: x_1a.photo.soundTrack.name,
|
| 83 |
+
cover: x_1a.photo.soundTrack.imageUrls[0].url,
|
| 84 |
+
audio: x_1a.photo.soundTrack.audioUrls[0].url,
|
| 85 |
+
};
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
return res;
|
| 89 |
+
} catch (error) {
|
| 90 |
+
console.warn(`Gagal scrape: ${error.message}`);
|
| 91 |
+
return null;
|
| 92 |
+
}
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
async function validasi(url, maxRetries = 3) {
|
| 96 |
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
| 97 |
+
console.log(`Step ${attempt}...`);
|
| 98 |
+
const result = await scrapeKuaishou(url);
|
| 99 |
+
if (result) {
|
| 100 |
+
console.log("Scraping berhasil!");
|
| 101 |
+
console.log(result);
|
| 102 |
+
return result;
|
| 103 |
+
}
|
| 104 |
+
console.log("Gagal, mencoba ulang...");
|
| 105 |
+
}
|
| 106 |
+
console.error("Scraping gagal setelah 3 kali percobaan.");
|
| 107 |
+
return null;
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
module.exports = validasi;
|
lib/pix.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const axios = require('axios');
|
| 2 |
+
const fs = require('fs');
|
| 3 |
+
const path = require('path');
|
| 4 |
+
const { v4: uuidv4 } = require('uuid');
|
| 5 |
+
|
| 6 |
+
//const styles = [ "anime", "manga", "3d", "comic", "realistic" ];
|
| 7 |
+
//const qualitys = [ "low", "medium" ];
|
| 8 |
+
|
| 9 |
+
const drawever = {
|
| 10 |
+
queue: async (imageUrl, style, quality) => {
|
| 11 |
+
const imageResponse = await axios.get(imageUrl, { responseType: 'arraybuffer' });
|
| 12 |
+
const mimeType = imageResponse.headers['content-type'];
|
| 13 |
+
const base64Image = Buffer.from(imageResponse.data).toString('base64');
|
| 14 |
+
const base64ImageUrl = `data:${mimeType};base64,${base64Image}`;
|
| 15 |
+
|
| 16 |
+
const data = JSON.stringify({
|
| 17 |
+
"image": base64ImageUrl,
|
| 18 |
+
"style": style,
|
| 19 |
+
"quality": quality,
|
| 20 |
+
"strength": 0.4
|
| 21 |
+
});
|
| 22 |
+
|
| 23 |
+
const config = {
|
| 24 |
+
method: 'POST',
|
| 25 |
+
url: 'https://www.drawever.com/api/tools/queue',
|
| 26 |
+
headers: {
|
| 27 |
+
'User-Agent': 'Mozilla/5.0 (Android 10; Mobile; rv:131.0 Firefox/131.0',
|
| 28 |
+
'Accept': 'application/json',
|
| 29 |
+
'Content-Type': 'application/json',
|
| 30 |
+
'accept-language': 'id-ID',
|
| 31 |
+
'referer': 'https://www.drawever.com/ai/photo-to-anime?start=1736212737985',
|
| 32 |
+
'path': '/ai/photo-to-anime',
|
| 33 |
+
'origin': 'https://www.drawever.com',
|
| 34 |
+
'alt-used': 'www.drawever.com',
|
| 35 |
+
'sec-fetch-dest': 'empty',
|
| 36 |
+
'sec-fetch-mode': 'cors',
|
| 37 |
+
'sec-fetch-site': 'same-origin',
|
| 38 |
+
'priority': 'u=0',
|
| 39 |
+
'te': 'trailers',
|
| 40 |
+
'Cookie': '_ga_H15YQYJC6R=GS1.1.1736212732.1.0.1736212732.0.0.0; _ga=GA1.1.1471909988.1736212732'
|
| 41 |
+
},
|
| 42 |
+
data: data
|
| 43 |
+
};
|
| 44 |
+
|
| 45 |
+
const api = await axios.request(config);
|
| 46 |
+
return api.data;
|
| 47 |
+
},
|
| 48 |
+
create: async (imageUrl, style, quality) => {
|
| 49 |
+
const { queueId } = await drawever.queue(imageUrl, style, quality);
|
| 50 |
+
|
| 51 |
+
const checkStatus = async () => {
|
| 52 |
+
const config = {
|
| 53 |
+
method: 'GET',
|
| 54 |
+
url: `https://www.drawever.com/api/tools/queue?queueId=${queueId}`,
|
| 55 |
+
headers: {
|
| 56 |
+
'User-Agent': 'Mozilla/5.0 (Android 10; Mobile; rv:131.0) Gecko/131.0 Firefox/131.0',
|
| 57 |
+
'accept-language': 'id-ID',
|
| 58 |
+
'referer': 'https://www.drawever.com/ai/photo-to-anime?start=1736212737985',
|
| 59 |
+
'content-type': 'application/json',
|
| 60 |
+
'alt-used': 'www.drawever.com',
|
| 61 |
+
'sec-fetch-dest': 'empty',
|
| 62 |
+
'sec-fetch-mode': 'cors',
|
| 63 |
+
'sec-fetch-site': 'same-origin',
|
| 64 |
+
'priority': 'u=4',
|
| 65 |
+
'te': 'trailers',
|
| 66 |
+
'Cookie': '_ga_H15YQYJC6R=GS1.1.1736226490.2.1.1736226501.0.0.0; _ga=GA1.1.1471909988.1736212732; _ym_uid=1736782704433305783; _ym_d=1736782704; _ym_isad=2; _ym_visorc=w'
|
| 67 |
+
}
|
| 68 |
+
};
|
| 69 |
+
|
| 70 |
+
const api = await axios.request(config);
|
| 71 |
+
const output = api.data.output;
|
| 72 |
+
|
| 73 |
+
if (output) {
|
| 74 |
+
const base64Image = output.split(';base64,').pop();
|
| 75 |
+
const imageBuffer = Buffer.from(base64Image, 'base64');
|
| 76 |
+
const fileName = `${uuidv4()}.png`;
|
| 77 |
+
const filePath = path.join(__dirname, '../cdn', fileName);
|
| 78 |
+
fs.writeFileSync(filePath, imageBuffer);
|
| 79 |
+
console.log(api.data)
|
| 80 |
+
return imageBuffer
|
| 81 |
+
}
|
| 82 |
+
};
|
| 83 |
+
checkStatus();
|
| 84 |
+
}
|
| 85 |
+
};
|
| 86 |
+
|
| 87 |
+
// Example usage
|
| 88 |
+
module.exports = drawever
|
lib/pradigm.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const FormData = require("form-data");
|
| 2 |
+
const axios = require("axios");
|
| 3 |
+
const fs = require('fs');
|
| 4 |
+
const qs = require('qs');
|
| 5 |
+
|
| 6 |
+
const tool = [ 'removebg', 'enhance', 'upscale', 'restore', 'colorize' ];
|
| 7 |
+
|
| 8 |
+
const pxpic = {
|
| 9 |
+
upload: async (filePath) => {
|
| 10 |
+
const {
|
| 11 |
+
fileTypeFromBuffer: fromBuffer
|
| 12 |
+
} = await import( 'file-type')
|
| 13 |
+
const buffer = fs.readFileSync(filePath);
|
| 14 |
+
const { ext, mime } = (await fromBuffer(buffer)) || {};
|
| 15 |
+
const fileName = Date.now() + "." + ext;
|
| 16 |
+
|
| 17 |
+
const folder = "uploads";
|
| 18 |
+
const responsej = await axios.post("https://pxpic.com/getSignedUrl", { folder, fileName }, {
|
| 19 |
+
headers: {
|
| 20 |
+
"Content-Type": "application/json",
|
| 21 |
+
},
|
| 22 |
+
});
|
| 23 |
+
|
| 24 |
+
const { presignedUrl } = responsej.data;
|
| 25 |
+
|
| 26 |
+
await axios.put(presignedUrl, buffer, {
|
| 27 |
+
headers: {
|
| 28 |
+
"Content-Type": mime,
|
| 29 |
+
},
|
| 30 |
+
});
|
| 31 |
+
|
| 32 |
+
const cdnDomain = "https://files.fotoenhancer.com/uploads/";
|
| 33 |
+
const sourceFileUrl = cdnDomain + fileName;
|
| 34 |
+
|
| 35 |
+
return sourceFileUrl;
|
| 36 |
+
},
|
| 37 |
+
create: async (filePath, tools) => {
|
| 38 |
+
if (!tool.includes(tools)) {
|
| 39 |
+
return `Pilih salah satu dari tools ini: ${tool.join(', ')}`;
|
| 40 |
+
}
|
| 41 |
+
const url = await pxpic.upload(filePath);
|
| 42 |
+
let data = qs.stringify({
|
| 43 |
+
'imageUrl': url,
|
| 44 |
+
'targetFormat': 'png',
|
| 45 |
+
'needCompress': 'no',
|
| 46 |
+
'imageQuality': '100',
|
| 47 |
+
'compressLevel': '6',
|
| 48 |
+
'fileOriginalExtension': 'png',
|
| 49 |
+
'aiFunction': tools,
|
| 50 |
+
'upscalingLevel': ''
|
| 51 |
+
});
|
| 52 |
+
|
| 53 |
+
let config = {
|
| 54 |
+
method: 'POST',
|
| 55 |
+
url: 'https://pxpic.com/callAiFunction',
|
| 56 |
+
headers: {
|
| 57 |
+
'User-Agent': 'Mozilla/5.0 (Android 10; Mobile; rv:131.0) Gecko/131.0 Firefox/131.0',
|
| 58 |
+
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8',
|
| 59 |
+
'Content-Type': 'application/x-www-form-urlencoded',
|
| 60 |
+
'accept-language': 'id-ID'
|
| 61 |
+
},
|
| 62 |
+
data: data
|
| 63 |
+
};
|
| 64 |
+
|
| 65 |
+
const api = await axios.request(config);
|
| 66 |
+
return api.data;
|
| 67 |
+
}
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
const domain = {
|
| 72 |
+
efek: "https://effect-api.visual-paradigm.com",
|
| 73 |
+
ai: "https://ai-services.visual-paradigm.com"
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
|
| 77 |
+
const paradigm = {
|
| 78 |
+
async rmbg(buffer) {
|
| 79 |
+
|
| 80 |
+
const { fileTypeFromBuffer } = await import('file-type');
|
| 81 |
+
const fileType = await fileTypeFromBuffer(buffer);
|
| 82 |
+
|
| 83 |
+
if (!fileType || !['image/jpeg', 'image/png', 'image/gif'].includes(fileType.mime)) throw new Error("File yang diunggah bukan gambar. Hanya file gambar yang diperbolehkan.");
|
| 84 |
+
|
| 85 |
+
const form = new FormData();
|
| 86 |
+
form.append("file", buffer, `anjuc.jpg`);
|
| 87 |
+
|
| 88 |
+
const { data } = await axios.post(`${domain.efek}/remove-bg`, form, {
|
| 89 |
+
headers: form.getHeaders(),
|
| 90 |
+
responseType: "arraybuffer"
|
| 91 |
+
}).catch(e => e.response);
|
| 92 |
+
|
| 93 |
+
return data;
|
| 94 |
+
},
|
| 95 |
+
async enhance(buffer) {
|
| 96 |
+
const { fileTypeFromBuffer } = await import('file-type');
|
| 97 |
+
|
| 98 |
+
const fileType = await fileTypeFromBuffer(buffer);
|
| 99 |
+
|
| 100 |
+
if (!fileType || !['image/jpeg', 'image/png', 'image/gif'].includes(fileType.mime)) throw new Error("File yang diunggah bukan gambar. Hanya file gambar yang diperbolehkan.");
|
| 101 |
+
|
| 102 |
+
const form = new FormData();
|
| 103 |
+
form.append("file", buffer, `${Date.now()}.jpg`);
|
| 104 |
+
|
| 105 |
+
const { data } = await axios.post(`${domain.ai}/api/super-resolution/file`, form, {
|
| 106 |
+
headers: form.getHeaders(),
|
| 107 |
+
responseType: "arraybuffer"
|
| 108 |
+
}).catch(e => e.response);
|
| 109 |
+
|
| 110 |
+
return data;
|
| 111 |
+
}
|
| 112 |
+
};
|
| 113 |
+
|
| 114 |
+
module.exports = { enhance: paradigm.enhance, pxpic };
|
lib/qqm.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const { exec } = require("child_process");
|
| 2 |
+
const path = require("path");
|
| 3 |
+
const fs = require("fs");
|
| 4 |
+
const axios = require("axios");
|
| 5 |
+
|
| 6 |
+
const COOKIES_PATH = path.join(__dirname, "./cookies/qq.txt");
|
| 7 |
+
const ytdlp = path.join(__dirname, "./yt-dlp")
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
async function getRedirectedURL(url) {
|
| 12 |
+
try {
|
| 13 |
+
const response = await axios.get(url, {
|
| 14 |
+
maxRedirects: 0,
|
| 15 |
+
validateStatus: (status) => status >= 300 && status < 400,
|
| 16 |
+
});
|
| 17 |
+
|
| 18 |
+
return response.headers.location || null;
|
| 19 |
+
} catch (error) {
|
| 20 |
+
console.error("Error mendapatkan URL redirect:", error.message);
|
| 21 |
+
return null;
|
| 22 |
+
}
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
function convertToSongDetailURL(url) {
|
| 27 |
+
try {
|
| 28 |
+
const urlObj = new URL(url);
|
| 29 |
+
const songmid = urlObj.searchParams.get("songmid");
|
| 30 |
+
|
| 31 |
+
if (songmid) {
|
| 32 |
+
return `https://y.qq.com/n/ryqq/songDetail/${songmid}`;
|
| 33 |
+
}
|
| 34 |
+
} catch (error) {
|
| 35 |
+
console.error("Error parsing URL:", error.message);
|
| 36 |
+
}
|
| 37 |
+
return null;
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
async function processQQMusicURL(url) {
|
| 41 |
+
try {
|
| 42 |
+
if (url.includes("y.qq.com/n/ryqq/songDetail/")) {
|
| 43 |
+
return url;
|
| 44 |
+
} else if (url.includes("c6.y.qq.com/base/fcgi-bin/u?")) {
|
| 45 |
+
const redirectedURL = await getRedirectedURL(url);
|
| 46 |
+
if (redirectedURL) {
|
| 47 |
+
return convertToSongDetailURL(redirectedURL);
|
| 48 |
+
}
|
| 49 |
+
} else if (url.includes("i.y.qq.com/v8/playsong.html")) {
|
| 50 |
+
return convertToSongDetailURL(url);
|
| 51 |
+
}
|
| 52 |
+
} catch (error) {
|
| 53 |
+
console.error("Error processing URL:", error.message);
|
| 54 |
+
}
|
| 55 |
+
return null;
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
async function getInfo(url) {
|
| 59 |
+
return new Promise(async(resolve, reject) => {
|
| 60 |
+
const thumbnail = await getQQMusicCover(url);
|
| 61 |
+
|
| 62 |
+
exec(`${ytdlp} -j --cookies ${COOKIES_PATH} "${await processQQMusicURL(url)}"`, (error, stdout, stderr) => {
|
| 63 |
+
if (error) {
|
| 64 |
+
return reject(`Error: ${stderr || error.message}`);
|
| 65 |
+
}
|
| 66 |
+
try {
|
| 67 |
+
const info = JSON.parse(stdout);
|
| 68 |
+
|
| 69 |
+
resolve({
|
| 70 |
+
status: 200,
|
| 71 |
+
title: info.title,
|
| 72 |
+
artist: info.creators[0],
|
| 73 |
+
duration: info.duration,
|
| 74 |
+
thumbnail,
|
| 75 |
+
music: info.formats.map(f => ({
|
| 76 |
+
format_id: f.format_id,
|
| 77 |
+
ext: f.ext,
|
| 78 |
+
filesize: f.size,
|
| 79 |
+
url: f.url
|
| 80 |
+
}))
|
| 81 |
+
});
|
| 82 |
+
} catch (e) {
|
| 83 |
+
reject(`Parsing Error: ${e.message}`);
|
| 84 |
+
}
|
| 85 |
+
});
|
| 86 |
+
});
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
|
| 90 |
+
|
| 91 |
+
|
| 92 |
+
|
| 93 |
+
async function getQQMusicCover(songURL) {
|
| 94 |
+
try {
|
| 95 |
+
const response = await axios.get(await getRedirectedURL(songURL));
|
| 96 |
+
const html = response.data;
|
| 97 |
+
const match = html.match(/window\.__ssrFirstPageData__\s*=\s*(\{.*?\})<\/script>/s);
|
| 98 |
+
|
| 99 |
+
if (match) {
|
| 100 |
+
const jsonData = JSON.parse(match[1]);
|
| 101 |
+
const coverURL = jsonData?.metaData?.image;
|
| 102 |
+
|
| 103 |
+
return coverURL;
|
| 104 |
+
} else {
|
| 105 |
+
throw new Error("Data JSON tidak ditemukan dalam HTML.");
|
| 106 |
+
}
|
| 107 |
+
} catch (error) {
|
| 108 |
+
console.error("Error mendapatkan cover:", error.message);
|
| 109 |
+
return null;
|
| 110 |
+
}
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
|
| 114 |
+
module.exports = getInfo
|
lib/qqmusic.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const { exec } = require("child_process");
|
| 2 |
+
const path = require("path");
|
| 3 |
+
const fs = require("fs");
|
| 4 |
+
|
| 5 |
+
const COOKIES_PATH = "cookies/qq.txt";
|
| 6 |
+
const DOWNLOAD_DIR = path.join(__dirname, "tmp");
|
| 7 |
+
|
| 8 |
+
// Pastikan folder download ada
|
| 9 |
+
if (!fs.existsSync(DOWNLOAD_DIR)) {
|
| 10 |
+
fs.mkdirSync(DOWNLOAD_DIR, { recursive: true });
|
| 11 |
+
}
|
| 12 |
+
|
| 13 |
+
// Fungsi untuk mendapatkan informasi lagu
|
| 14 |
+
function getInfo(url) {
|
| 15 |
+
return new Promise((resolve, reject) => {
|
| 16 |
+
exec(`./yt-dlp -j --cookies ${COOKIES_PATH} "${url}"`, (error, stdout, stderr) => {
|
| 17 |
+
if (error) {
|
| 18 |
+
return reject(`Error: ${stderr || error.message}`);
|
| 19 |
+
}
|
| 20 |
+
try {
|
| 21 |
+
const info = JSON.parse(stdout);
|
| 22 |
+
|
| 23 |
+
resolve({
|
| 24 |
+
title: info.title,
|
| 25 |
+
artist: info.creators[0],
|
| 26 |
+
duration: info.duration,
|
| 27 |
+
thumbnail: info.thumbnai,
|
| 28 |
+
formats: info.formats.map(f => ({
|
| 29 |
+
format_id: f.format_id,
|
| 30 |
+
ext: f.ext,
|
| 31 |
+
filesize: f.size,
|
| 32 |
+
url: f.url
|
| 33 |
+
}))
|
| 34 |
+
});
|
| 35 |
+
} catch (e) {
|
| 36 |
+
reject(`Parsing Error: ${e.message}`);
|
| 37 |
+
}
|
| 38 |
+
});
|
| 39 |
+
});
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
// Fungsi untuk mengunduh lagu
|
| 43 |
+
function download(url) {
|
| 44 |
+
return new Promise((resolve, reject) => {
|
| 45 |
+
const command = `./yt-dlp -vU --cookies ${COOKIES_PATH} -f ba --extract-audio --audio-format mp3 -o "${DOWNLOAD_DIR}/%(title)s.%(ext)s" "${url}"`;
|
| 46 |
+
|
| 47 |
+
exec(command, (error, stdout, stderr) => {
|
| 48 |
+
if (error) {
|
| 49 |
+
return reject(`Download Error: ${stderr || error.message}`);
|
| 50 |
+
}
|
| 51 |
+
resolve(`${DOWNLOAD_DIR}`);
|
| 52 |
+
});
|
| 53 |
+
});
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
module.exports = {
|
| 57 |
+
getInfo,
|
| 58 |
+
download
|
| 59 |
+
}
|
lib/skrep.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* eslint-disable jsdoc/require-jsdoc */
|
| 2 |
+
const axios = require("axios");
|
| 3 |
+
const FormData = require("form-data");
|
| 4 |
+
const fs = require("fs");
|
| 5 |
+
const { exec } = require("child_process");
|
| 6 |
+
|
| 7 |
+
async function ttt(link) {
|
| 8 |
+
const form = new FormData();
|
| 9 |
+
form.append("url", link);
|
| 10 |
+
form.append("count", "12");
|
| 11 |
+
form.append("cursor", "0");
|
| 12 |
+
form.append("web", "1");
|
| 13 |
+
form.append("hd", "1");
|
| 14 |
+
|
| 15 |
+
const { data } = await axios.post("https://www.tikwm.com/api/", form);
|
| 16 |
+
|
| 17 |
+
if (data.code === 0 && data.msg === "success") {
|
| 18 |
+
const baseUrl = "https://www.tikwm.com";
|
| 19 |
+
data.data.cover = baseUrl + data.data.cover;
|
| 20 |
+
data.data.play = baseUrl + data.data.play;
|
| 21 |
+
data.data.wmplay = baseUrl + data.data.wmplay;
|
| 22 |
+
data.data.hdplay = baseUrl + data.data.hdplay;
|
| 23 |
+
data.data.music = baseUrl + data.data.music;
|
| 24 |
+
data.data.author.avatar = baseUrl + data.data.author.avatar;
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
const res = {
|
| 28 |
+
status: 200,
|
| 29 |
+
type: "tiktok",
|
| 30 |
+
title: data.data?.title || null,
|
| 31 |
+
desc: null,
|
| 32 |
+
thumbnail: data.data.cover,
|
| 33 |
+
video: [
|
| 34 |
+
{ url: data.data.hdplay },
|
| 35 |
+
{ url: data.data.play },
|
| 36 |
+
],
|
| 37 |
+
music: [{ url: data.data.music }],
|
| 38 |
+
image: data.data.images,
|
| 39 |
+
};
|
| 40 |
+
|
| 41 |
+
/*if (res.images) {
|
| 42 |
+
const outputDir = "./cdn";
|
| 43 |
+
await downloadImages(res.images, outputDir);
|
| 44 |
+
|
| 45 |
+
const FNvd = `tt_video_${Date.now()}.mp4`;
|
| 46 |
+
const FNad = `tt_audio_${Date.now()}.mp3`;
|
| 47 |
+
const videoPath = `${outputDir}/${FNvd}`;
|
| 48 |
+
const audioPath = `${outputDir}/${FNad}`;
|
| 49 |
+
|
| 50 |
+
// ✅ Unduh audio sebelum dipakai
|
| 51 |
+
await downloadAudio(res.music[0].url, audioPath);
|
| 52 |
+
|
| 53 |
+
const slideResult = await createSlideshow(outputDir, videoPath, audioPath);
|
| 54 |
+
if (slideResult) {
|
| 55 |
+
res.video.push({ resolusi: "Slide", url: `https://beta.wzblueline.xyz/cdn/${FNvd}` });
|
| 56 |
+
}
|
| 57 |
+
}
|
| 58 |
+
*/
|
| 59 |
+
return res;
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
async function downloadAudio(audioUrl, outputFile) {
|
| 63 |
+
const response = await axios({
|
| 64 |
+
url: audioUrl,
|
| 65 |
+
responseType: "stream",
|
| 66 |
+
});
|
| 67 |
+
|
| 68 |
+
return new Promise((resolve, reject) => {
|
| 69 |
+
const writer = fs.createWriteStream(outputFile);
|
| 70 |
+
response.data.pipe(writer);
|
| 71 |
+
writer.on("finish", () => {
|
| 72 |
+
console.log(`✅ Audio telah diunduh: ${outputFile}`);
|
| 73 |
+
resolve(outputFile);
|
| 74 |
+
});
|
| 75 |
+
writer.on("error", reject);
|
| 76 |
+
});
|
| 77 |
+
}
|
| 78 |
+
|
| 79 |
+
async function downloadImages(imageUrls, outputDir) {
|
| 80 |
+
if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir);
|
| 81 |
+
|
| 82 |
+
let downloadPromises = imageUrls.map((url, index) => {
|
| 83 |
+
const filePath = `${outputDir}/image${index + 1}.jpg`;
|
| 84 |
+
return axios({ url, responseType: "stream" }).then((response) => {
|
| 85 |
+
return new Promise((resolve, reject) => {
|
| 86 |
+
const writer = fs.createWriteStream(filePath);
|
| 87 |
+
response.data.pipe(writer);
|
| 88 |
+
writer.on("finish", resolve);
|
| 89 |
+
writer.on("error", reject);
|
| 90 |
+
});
|
| 91 |
+
});
|
| 92 |
+
});
|
| 93 |
+
|
| 94 |
+
await Promise.all(downloadPromises);
|
| 95 |
+
console.log("✅ Semua gambar telah diunduh.");
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
async function getAudioDuration(audioFile) {
|
| 99 |
+
return new Promise((resolve, reject) => {
|
| 100 |
+
exec(`ffprobe -i ${audioFile} -show_entries format=duration -v quiet -of csv="p=0"`, (error, stdout) => {
|
| 101 |
+
if (error) {
|
| 102 |
+
reject("❌ Gagal mendapatkan durasi audio.");
|
| 103 |
+
return;
|
| 104 |
+
}
|
| 105 |
+
resolve(parseFloat(stdout.trim()));
|
| 106 |
+
});
|
| 107 |
+
});
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
async function createSlideshow(imagesDir, outputVideo, audioFile) {
|
| 111 |
+
const imageFiles = fs.readdirSync(imagesDir).filter(file => file.endsWith(".jpg"));
|
| 112 |
+
const totalImages = imageFiles.length;
|
| 113 |
+
|
| 114 |
+
if (totalImages === 0) {
|
| 115 |
+
console.error("❌ Tidak ada gambar untuk slideshow.");
|
| 116 |
+
return null;
|
| 117 |
+
}
|
| 118 |
+
|
| 119 |
+
try {
|
| 120 |
+
const audioDuration = await getAudioDuration(audioFile);
|
| 121 |
+
const frameDuration = audioDuration / totalImages;
|
| 122 |
+
const tempDirv = `./cdn/temp_video_${Date.now()}.mp4`
|
| 123 |
+
console.log(`📏 Durasi audio: ${audioDuration}s`);
|
| 124 |
+
console.log(`🖼 Durasi per gambar: ${frameDuration}s`);
|
| 125 |
+
|
| 126 |
+
const ffmpegCommand = `ffmpeg -framerate 1/${frameDuration} -i ${imagesDir}/image%d.jpg -filter_complex "pad=iw:ih:(ow-iw)/2:(oh-ih)/2" -r 25 -c:v libx264 -pix_fmt yuv420p ${tempDirv}`;
|
| 127 |
+
|
| 128 |
+
console.log("🚀 Membuat slideshow...");
|
| 129 |
+
return new Promise((resolve, reject) => {
|
| 130 |
+
exec(ffmpegCommand, (error) => {
|
| 131 |
+
if (error) {
|
| 132 |
+
console.error("❌ Error saat membuat slideshow:", error);
|
| 133 |
+
reject(null);
|
| 134 |
+
return;
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
console.log("✅ Slideshow selesai dibuat.");
|
| 138 |
+
const audioCommand = `ffmpeg -i ${tempDirv} -i ${audioFile} -filter_complex "[1:a]apad" -shortest -c:v libx264 -pix_fmt yuv420p -c:a aac -b:a 128k ${outputVideo}`;
|
| 139 |
+
|
| 140 |
+
exec(audioCommand, (audioError) => {
|
| 141 |
+
if (audioError) {
|
| 142 |
+
console.error("❌ Error saat menambahkan audio:", audioError);
|
| 143 |
+
reject(null);
|
| 144 |
+
return;
|
| 145 |
+
}
|
| 146 |
+
|
| 147 |
+
console.log("✅ Video dengan audio selesai dibuat.");
|
| 148 |
+
|
| 149 |
+
console.log("🧹 Folder gambar sementara dihapus.");
|
| 150 |
+
resolve(outputVideo); // ✅ Return path video hasil!
|
| 151 |
+
});
|
| 152 |
+
});
|
| 153 |
+
});
|
| 154 |
+
} catch (error) {
|
| 155 |
+
console.error(error);
|
| 156 |
+
return null;
|
| 157 |
+
}
|
| 158 |
+
}
|
| 159 |
+
|
| 160 |
+
module.exports = { ttt };
|
lib/snapchat.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* eslint-disable jsdoc/require-jsdoc */
|
| 2 |
+
const axios = require("axios");
|
| 3 |
+
const { JSDOM } = require("jsdom");
|
| 4 |
+
|
| 5 |
+
async function spotlight(url) {
|
| 6 |
+
try {
|
| 7 |
+
const { data } = await axios.get(url, {
|
| 8 |
+
headers: {
|
| 9 |
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
|
| 10 |
+
}
|
| 11 |
+
});
|
| 12 |
+
|
| 13 |
+
const dom = new JSDOM(data);
|
| 14 |
+
const scripts = dom.window.document.querySelectorAll('script[type="application/ld+json"]');
|
| 15 |
+
|
| 16 |
+
let jsonData = null;
|
| 17 |
+
scripts.forEach(script => {
|
| 18 |
+
try {
|
| 19 |
+
const parsedData = JSON.parse(script.textContent);
|
| 20 |
+
if (parsedData["@context"] === "https://schema.org") {
|
| 21 |
+
jsonData = {
|
| 22 |
+
status: 200,
|
| 23 |
+
thumbnail: parsedData["@graph"][0].thumbnailUrl,
|
| 24 |
+
title: parsedData["@graph"][0].name,
|
| 25 |
+
author: parsedData["@graph"][0].creator,
|
| 26 |
+
video: [{
|
| 27 |
+
resolusi: "Watermark",
|
| 28 |
+
url: parsedData["@graph"][0].contentUrl
|
| 29 |
+
}]
|
| 30 |
+
}
|
| 31 |
+
}
|
| 32 |
+
} catch {
|
| 33 |
+
/* empty */
|
| 34 |
+
}
|
| 35 |
+
});
|
| 36 |
+
|
| 37 |
+
if (jsonData) {
|
| 38 |
+
console.log("JSON ditemukan:");
|
| 39 |
+
console.log(JSON.stringify(jsonData, null, 2));
|
| 40 |
+
} else {
|
| 41 |
+
console.log("Tidak ditemukan data JSON yang sesuai.");
|
| 42 |
+
}
|
| 43 |
+
} catch (error) {
|
| 44 |
+
console.error("Gagal mengambil data:", error.message);
|
| 45 |
+
}
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
module.exports = { spotlight };
|
lib/soundcloud.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* eslint-disable jsdoc/require-jsdoc */
|
| 2 |
+
const FormData = require("form-data");
|
| 3 |
+
const axios = require("axios");
|
| 4 |
+
const cheerio = require("cheerio");
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
async function getRedirectedURL(url) {
|
| 8 |
+
try {
|
| 9 |
+
const response = await axios.get(url, {
|
| 10 |
+
maxRedirects: 0,
|
| 11 |
+
validateStatus: (status) => status >= 300 && status < 400,
|
| 12 |
+
});
|
| 13 |
+
|
| 14 |
+
return response.headers.location || null;
|
| 15 |
+
} catch (error) {
|
| 16 |
+
console.error("Error mendapatkan URL redirect:", error.message);
|
| 17 |
+
return null;
|
| 18 |
+
}
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
async function search(query) {
|
| 23 |
+
try {
|
| 24 |
+
const url = `https://m.soundcloud.com/search?q=${encodeURIComponent(query)}`;
|
| 25 |
+
const response = await axios.get(url);
|
| 26 |
+
const $ = await cheerio.load(response.data);
|
| 27 |
+
|
| 28 |
+
const results = [];
|
| 29 |
+
|
| 30 |
+
$(".List_VerticalList__2uQYU li").each((index, element) => {
|
| 31 |
+
const title = $(element).find(".Information_CellTitle__2KitR").text();
|
| 32 |
+
const artist = $(element).find(".Information_CellSubtitle__1mXGx").text();
|
| 33 |
+
const thumbnail = $(element)
|
| 34 |
+
.find(".Artwork_ArtworkImage__1Ws9-")
|
| 35 |
+
.attr("src");
|
| 36 |
+
const link = $(element)
|
| 37 |
+
.find(".Cell_CellLink__3yLVS")
|
| 38 |
+
.attr("href");
|
| 39 |
+
|
| 40 |
+
results.push({
|
| 41 |
+
title,
|
| 42 |
+
artist,
|
| 43 |
+
thumbnail,
|
| 44 |
+
link: `https://soundcloud.com${link}`,
|
| 45 |
+
});
|
| 46 |
+
});
|
| 47 |
+
|
| 48 |
+
return results;
|
| 49 |
+
} catch (error) {
|
| 50 |
+
console.error(error);
|
| 51 |
+
return [];
|
| 52 |
+
}
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
async function download(url) {
|
| 56 |
+
const form = new FormData();
|
| 57 |
+
form.append("formurl", url);
|
| 58 |
+
|
| 59 |
+
const {
|
| 60 |
+
data
|
| 61 |
+
} = await axios.post("https://www.forhub.io/download.php", form, {
|
| 62 |
+
headers: form.getHeaders(),
|
| 63 |
+
});
|
| 64 |
+
|
| 65 |
+
const $ = cheerio.load(data);
|
| 66 |
+
const fullTitleText = $("td.small-10.columns").text().trim();
|
| 67 |
+
// eslint-disable-next-line no-unused-vars
|
| 68 |
+
const [title] = fullTitleText.split("320 KB/S").map((text) => text.trim());
|
| 69 |
+
const music = $("td a").attr("href");
|
| 70 |
+
// eslint-disable-next-line no-unused-vars
|
| 71 |
+
const cover = $("td img").attr("src");
|
| 72 |
+
|
| 73 |
+
return music
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
async function metadata(url) {
|
| 77 |
+
|
| 78 |
+
const parsedd = new URL(url)
|
| 79 |
+
const scUri = [
|
| 80 |
+
"m.soundcloud.com"
|
| 81 |
+
]
|
| 82 |
+
let Modif;
|
| 83 |
+
if (scUri.includes(parsedd.hostname)) {
|
| 84 |
+
Modif = url.replace(/(?:m\.)?soundcloud\.com/, "soundcloud.com");
|
| 85 |
+
} else {
|
| 86 |
+
Modif = await getRedirectedURL(url);
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
const { data } = await axios.get(Modif);
|
| 90 |
+
const $ = cheerio.load(data);
|
| 91 |
+
|
| 92 |
+
let hydrationData;
|
| 93 |
+
$("script").each(function() {
|
| 94 |
+
const scr = $(this).html();
|
| 95 |
+
if (scr.includes("window.__sc_hydration")) {
|
| 96 |
+
try {
|
| 97 |
+
// Ambil JSON dari bagian setelah "window.__sc_hydration = "
|
| 98 |
+
const jsonStr = scr.split("window.__sc_hydration = ")[1].trim().slice(0, -1); // Hapus titik koma terakhir
|
| 99 |
+
hydrationData = JSON.parse(jsonStr);
|
| 100 |
+
} catch (err) {
|
| 101 |
+
console.error("Gagal parse JSON:", err);
|
| 102 |
+
}
|
| 103 |
+
}
|
| 104 |
+
});
|
| 105 |
+
|
| 106 |
+
if (!hydrationData) {
|
| 107 |
+
throw new Error("Metadata tidak ditemukan.");
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
const trackData = hydrationData.find(entry => entry.hydratable === "sound")?.data;
|
| 111 |
+
if (!trackData) {
|
| 112 |
+
throw new Error("Data track tidak ditemukan.");
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
return trackData;
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
async function soundcloud(query, type) {
|
| 119 |
+
if(type === "search") {
|
| 120 |
+
const search_result = await search(query)
|
| 121 |
+
return search_result
|
| 122 |
+
} else {
|
| 123 |
+
const result_download = await download(query)
|
| 124 |
+
const result_metadata = await metadata(query)
|
| 125 |
+
|
| 126 |
+
const resd = {
|
| 127 |
+
status: 200,
|
| 128 |
+
title: result_metadata.title,
|
| 129 |
+
thumbnail: result_metadata.artwork_url,
|
| 130 |
+
music: [
|
| 131 |
+
{
|
| 132 |
+
resolusi: "default",
|
| 133 |
+
url: result_download
|
| 134 |
+
}
|
| 135 |
+
]
|
| 136 |
+
}
|
| 137 |
+
console.log(resd)
|
| 138 |
+
return resd
|
| 139 |
+
}
|
| 140 |
+
}
|
| 141 |
+
|
| 142 |
+
module.exports = {
|
| 143 |
+
search,
|
| 144 |
+
download,
|
| 145 |
+
soundcloud,
|
| 146 |
+
metadata
|
| 147 |
+
}
|
lib/spotify.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const axios = require('axios');
|
| 2 |
+
const yts = require("yt-search");
|
| 3 |
+
const { getAudio } = require("../lib/ytdl");
|
| 4 |
+
const path = require("path");
|
| 5 |
+
const fs = require("fs");
|
| 6 |
+
const { ID3Writer } = require('browser-id3-writer');
|
| 7 |
+
|
| 8 |
+
const dirTmp = path.join(__dirname, "../tmp");
|
| 9 |
+
const clientId = '8f777f61f80e4051b754d8e50310ad6e';
|
| 10 |
+
const clientSecret = '5802d3726d3149bfb880a577aa855fb3';
|
| 11 |
+
const tokenUrl = 'https://accounts.spotify.com/api/token';
|
| 12 |
+
const base64Credentials = Buffer.from(`${clientId}:${clientSecret}`).toString('base64');
|
| 13 |
+
|
| 14 |
+
// Pastikan folder tmp ada
|
| 15 |
+
if (!fs.existsSync(dirTmp)) {
|
| 16 |
+
fs.mkdirSync(dirTmp, { recursive: true });
|
| 17 |
+
}
|
| 18 |
+
|
| 19 |
+
async function getAccessToken() {
|
| 20 |
+
try {
|
| 21 |
+
const response = await axios.post(tokenUrl, 'grant_type=client_credentials', {
|
| 22 |
+
headers: {
|
| 23 |
+
'Authorization': `Basic ${base64Credentials}`,
|
| 24 |
+
'Content-Type': 'application/x-www-form-urlencoded',
|
| 25 |
+
},
|
| 26 |
+
});
|
| 27 |
+
return response.data.access_token;
|
| 28 |
+
} catch (error) {
|
| 29 |
+
console.error('Gagal mendapatkan token:', error.response?.data || error.message);
|
| 30 |
+
return null;
|
| 31 |
+
}
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
async function spotifyTrack(trackUrl) {
|
| 35 |
+
try {
|
| 36 |
+
const match = trackUrl.match(/track\/([a-zA-Z0-9]+)/);
|
| 37 |
+
if (!match) throw new Error('URL tidak valid');
|
| 38 |
+
const trackId = match[1];
|
| 39 |
+
|
| 40 |
+
// Dapatkan token
|
| 41 |
+
const accessToken = await getAccessToken();
|
| 42 |
+
if (!accessToken) throw new Error('Gagal mendapatkan token akses');
|
| 43 |
+
|
| 44 |
+
// Ambil metadata Spotify
|
| 45 |
+
const trackResponse = await axios.get(`https://api.spotify.com/v1/tracks/${trackId}`, {
|
| 46 |
+
headers: { Authorization: `Bearer ${accessToken}` },
|
| 47 |
+
});
|
| 48 |
+
const trackData = trackResponse.data;
|
| 49 |
+
|
| 50 |
+
// Cari lagu di YouTube
|
| 51 |
+
const searchResults = await yts(`${trackData.name} - ${trackData.artists.map(a => a.name).join(', ')}`);
|
| 52 |
+
if (!searchResults.videos.length) throw new Error('Video tidak ditemukan di YouTube');
|
| 53 |
+
|
| 54 |
+
const videoUrl = searchResults.videos[0].url;
|
| 55 |
+
const audio = await getAudio(videoUrl);
|
| 56 |
+
if (!audio) throw new Error("Gagal mendapatkan audio dari YouTube");
|
| 57 |
+
|
| 58 |
+
// Simpan file dengan nama unik
|
| 59 |
+
const Filename = `NSpotify_${Date.now()}_${Math.floor(Math.random() * 1000)}.mp3`;
|
| 60 |
+
const FilenameM = `Spotify_${Date.now()}_${Math.floor(Math.random() * 1000)}.mp3`;
|
| 61 |
+
await fs.writeFileSync(`${dirTmp}/${Filename}`, audio);
|
| 62 |
+
|
| 63 |
+
// Tambahkan ID3 Tag
|
| 64 |
+
const writer = new ID3Writer(fs.readFileSync(`${dirTmp}/${Filename}`));
|
| 65 |
+
writer
|
| 66 |
+
.setFrame('TIT2', trackData.name)
|
| 67 |
+
.setFrame('TPE1', trackData.artists.map(a => a.name))
|
| 68 |
+
.setFrame('TALB', trackData.album.name || "")
|
| 69 |
+
.setFrame('TYER', parseInt(trackData.album.release_date.split('-')[0]))
|
| 70 |
+
.setFrame('APIC', {
|
| 71 |
+
type: 3,
|
| 72 |
+
data: await urlToBuffer(trackData.album.images[0]?.url),
|
| 73 |
+
description: 'Super picture'
|
| 74 |
+
})
|
| 75 |
+
.addTag();
|
| 76 |
+
|
| 77 |
+
// Simpan file dengan tag ID3
|
| 78 |
+
const taggedSongBuffer = Buffer.from(writer.arrayBuffer);
|
| 79 |
+
await fs.writeFileSync(`${dirTmp}/${FilenameM}`, taggedSongBuffer);
|
| 80 |
+
|
| 81 |
+
const URI = `https://beta.wzblueline.xyz/tmp/${FilenameM}`;
|
| 82 |
+
|
| 83 |
+
const res = {
|
| 84 |
+
status: 200,
|
| 85 |
+
title: trackData.name,
|
| 86 |
+
artist: trackData.artists.map(artist => artist.name).join(', '),
|
| 87 |
+
album: trackData.album.name,
|
| 88 |
+
duration_ms: trackData.duration_ms,
|
| 89 |
+
release_date: trackData.album.release_date,
|
| 90 |
+
thumbnail: trackData.album.images[0]?.url || null,
|
| 91 |
+
music: [{ url: URI }]
|
| 92 |
+
};
|
| 93 |
+
console.log(res)
|
| 94 |
+
return res
|
| 95 |
+
} catch (error) {
|
| 96 |
+
console.error(error);
|
| 97 |
+
return null;
|
| 98 |
+
}
|
| 99 |
+
}
|
| 100 |
+
|
| 101 |
+
async function spotifyPlaylist(playlistUrl) {
|
| 102 |
+
try {
|
| 103 |
+
const match = playlistUrl.match(/playlist\/([a-zA-Z0-9]+)/);
|
| 104 |
+
if (!match) throw new Error('URL playlist tidak valid');
|
| 105 |
+
const playlistId = match[1];
|
| 106 |
+
|
| 107 |
+
const accessToken = await getAccessToken();
|
| 108 |
+
if (!accessToken) throw new Error('Gagal mendapatkan token akses');
|
| 109 |
+
|
| 110 |
+
const playlistResponse = await axios.get(`https://api.spotify.com/v1/playlists/${playlistId}`, {
|
| 111 |
+
headers: { Authorization: `Bearer ${accessToken}` },
|
| 112 |
+
});
|
| 113 |
+
|
| 114 |
+
const playlistData = playlistResponse.data;
|
| 115 |
+
const tracks = playlistData.tracks.items;
|
| 116 |
+
if (!tracks.length) throw new Error('Playlist kosong atau tidak ditemukan');
|
| 117 |
+
|
| 118 |
+
console.log(`🎵 Playlist: ${playlistData.name} (${tracks.length} lagu)`);
|
| 119 |
+
|
| 120 |
+
let results = [];
|
| 121 |
+
|
| 122 |
+
|
| 123 |
+
const limitedTracks = tracks.slice(0, 3);
|
| 124 |
+
|
| 125 |
+
for (const item of limitedTracks) {
|
| 126 |
+
const track = item.track;
|
| 127 |
+
if (!track) continue;
|
| 128 |
+
|
| 129 |
+
const trackUrl = `https://open.spotify.com/track/${track.id}`;
|
| 130 |
+
console.log(`🔄 Memproses: ${track.name} - ${track.artists.map(a => a.name).join(', ')}`);
|
| 131 |
+
|
| 132 |
+
const trackData = await spotifyTrack(trackUrl);
|
| 133 |
+
if (trackData) results.push(trackData.music[0].url);
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
return {
|
| 137 |
+
status: 200,
|
| 138 |
+
playlist_name: playlistData.name,
|
| 139 |
+
total_tracks: tracks.length,
|
| 140 |
+
cover_image: playlistData.images[0]?.url || null,
|
| 141 |
+
tracks: results
|
| 142 |
+
};
|
| 143 |
+
} catch (error) {
|
| 144 |
+
console.error(error);
|
| 145 |
+
return null;
|
| 146 |
+
}
|
| 147 |
+
}
|
| 148 |
+
|
| 149 |
+
const urlToBuffer = async (url, options) => {
|
| 150 |
+
try {
|
| 151 |
+
options ? options : {};
|
| 152 |
+
const res = await axios({
|
| 153 |
+
method: "get",
|
| 154 |
+
url,
|
| 155 |
+
headers: {
|
| 156 |
+
'DNT': 1,
|
| 157 |
+
'Upgrade-Insecure-Request': 1
|
| 158 |
+
},
|
| 159 |
+
...options,
|
| 160 |
+
responseType: 'arraybuffer'
|
| 161 |
+
});
|
| 162 |
+
return res.data;
|
| 163 |
+
} catch (e) {
|
| 164 |
+
console.log(`Error : ${e}`);
|
| 165 |
+
}
|
| 166 |
+
};
|
| 167 |
+
|
| 168 |
+
module.exports = {
|
| 169 |
+
spotifyTrack,
|
| 170 |
+
spotifyPlaylist
|
| 171 |
+
}
|
lib/twt.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const { exec } = require("child_process");
|
| 2 |
+
const path = require("path");
|
| 3 |
+
|
| 4 |
+
/**
|
| 5 |
+
* Mengambil metadata video Twitter menggunakan yt-dlp.
|
| 6 |
+
* @param {string} url - URL tweet yang berisi video.
|
| 7 |
+
* @returns {Promise<Object>} - Metadata video dalam format JSON.
|
| 8 |
+
*/
|
| 9 |
+
async function getTwitterVideoInfo(url) {
|
| 10 |
+
return new Promise((resolve, reject) => {
|
| 11 |
+
exec(`${path.join(__dirname, "./yt-dlp")} -j "${url}" --cookies ${path.join(__dirname, "./cookies/twt.txt")}`, (error, stdout, stderr) => {
|
| 12 |
+
if (error) {
|
| 13 |
+
reject(`Error: ${stderr || error.message}`);
|
| 14 |
+
return;
|
| 15 |
+
}
|
| 16 |
+
try {
|
| 17 |
+
const x = JSON.parse(stdout);
|
| 18 |
+
|
| 19 |
+
// Filter video yang benar-benar memiliki video (video_ext valid atau URL mengandung .mp4)
|
| 20 |
+
const videoFormats = x.formats.filter(f =>
|
| 21 |
+
(f.video_ext !== 'none' && f.audio_ext !== 'none') ||
|
| 22 |
+
(f.url.includes(".mp4"))
|
| 23 |
+
);
|
| 24 |
+
|
| 25 |
+
// Filter audio yang benar-benar hanya audio
|
| 26 |
+
const audioFormats = x.formats.filter(f => f.video_ext === 'none' && f.audio_ext !== 'none');
|
| 27 |
+
|
| 28 |
+
const res = {
|
| 29 |
+
status: 200,
|
| 30 |
+
title: x.title,
|
| 31 |
+
description: x.description,
|
| 32 |
+
thumbnail: x.thumbnail,
|
| 33 |
+
video: videoFormats.map(v => ({
|
| 34 |
+
format_id: v.format_id,
|
| 35 |
+
resolution: v.resolution || `${v.width}x${v.height}`,
|
| 36 |
+
url: v.url
|
| 37 |
+
})),
|
| 38 |
+
audio: audioFormats.map(a => ({
|
| 39 |
+
format_id: a.format_id,
|
| 40 |
+
bitrate: a.abr,
|
| 41 |
+
url: a.url
|
| 42 |
+
}))
|
| 43 |
+
};
|
| 44 |
+
|
| 45 |
+
resolve(res);
|
| 46 |
+
} catch (parseError) {
|
| 47 |
+
reject("Failed to parse JSON response");
|
| 48 |
+
}
|
| 49 |
+
});
|
| 50 |
+
});
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
|
| 54 |
+
module.exports = getTwitterVideoInfo
|
lib/ytdl.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const { exec } = require("child_process");
|
| 2 |
+
const path = require("path");
|
| 3 |
+
const fs = require("fs");
|
| 4 |
+
|
| 5 |
+
const tmp = path.join(__dirname, "../tmp"); // path to your tmp folder
|
| 6 |
+
const ytdlp =
|
| 7 |
+
// path to your yt-dlp
|
| 8 |
+
path.join(__dirname, "./yt-dlp") +
|
| 9 |
+
" --cookies " +
|
| 10 |
+
// path to your cookies (Netscape format)
|
| 11 |
+
path.join(__dirname, "./cookies/yt.txt");
|
| 12 |
+
|
| 13 |
+
/**
|
| 14 |
+
* Get YouTube Video Information
|
| 15 |
+
* @param {string} url
|
| 16 |
+
* @returns {Promise<{ id: string, title: string, thumbnail: string, description: string, duration: number, views: number, likes: number, comments: number, uploaded: string, channel: { id: string, handle: string, name: string, picture: string, subscribers: number, verified: boolean }, videos: string[] }>}
|
| 17 |
+
*/
|
| 18 |
+
function getInfo(url) {
|
| 19 |
+
return new Promise((res, rej) => {
|
| 20 |
+
exec(`${ytdlp} -j "${url}"`, async (err, stdout) => {
|
| 21 |
+
if(err) {
|
| 22 |
+
return rej(err);
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
const info = JSON.parse(stdout);
|
| 26 |
+
const _res = await fetch("https://imageyoutube.com/profile-photo-download/imgyt", {
|
| 27 |
+
method: "POST",
|
| 28 |
+
headers: {
|
| 29 |
+
"Content-Type": "application/x-www-form-urlencoded",
|
| 30 |
+
Referer: "https://imageyoutube.com/profile-photo-download/"
|
| 31 |
+
},
|
| 32 |
+
body: `v=${encodeURIComponent(url)}&mcountry=en`
|
| 33 |
+
});
|
| 34 |
+
const txt = await _res.text();
|
| 35 |
+
const picture = /<img src='(.*)' alt/.exec(txt)[1];
|
| 36 |
+
|
| 37 |
+
res({
|
| 38 |
+
id: info.id,
|
| 39 |
+
title: info.title,
|
| 40 |
+
thumbnail: `https://i.ytimg.com/vi/${info.id}/maxresdefault.jpg`,
|
| 41 |
+
description: info.description,
|
| 42 |
+
duration: info.duration,
|
| 43 |
+
views: info.view_count,
|
| 44 |
+
likes: info.like_count,
|
| 45 |
+
comments: info.comment_count,
|
| 46 |
+
uploaded: info.timestamp,
|
| 47 |
+
channel: {
|
| 48 |
+
id: info.channel_id,
|
| 49 |
+
handle: info.uploader_id,
|
| 50 |
+
name: info.uploader,
|
| 51 |
+
picture,
|
| 52 |
+
subscribers: info.channel_follower_count,
|
| 53 |
+
verified: !!info.channel_is_verified
|
| 54 |
+
},
|
| 55 |
+
videos: [
|
| 56 |
+
...new Set(
|
| 57 |
+
info.formats
|
| 58 |
+
.filter(v => v.video_ext === "mp4")
|
| 59 |
+
.map(v => v.height + "p")
|
| 60 |
+
)
|
| 61 |
+
]
|
| 62 |
+
});
|
| 63 |
+
});
|
| 64 |
+
});
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
/**
|
| 68 |
+
* Download YouTube video as mp4
|
| 69 |
+
* @param {string} url
|
| 70 |
+
* @param {string} [quality="480p"]
|
| 71 |
+
* @returns {Promise<Buffer>}
|
| 72 |
+
*/
|
| 73 |
+
function getVideo(url, quality = "480p") {
|
| 74 |
+
return new Promise((res, rej) => {
|
| 75 |
+
const ts = Date.now();
|
| 76 |
+
exec(`${ytdlp} -f "ba[ext=m4a]+bv[height=${quality.slice(0, -1)}]" -o "${tmp}/${ts}.%(ext)s" --merge-output-format mp4 "${url}"`, (_, stdout, stderr) => {
|
| 77 |
+
if(stderr.length) {
|
| 78 |
+
return rej(new Error(stderr));
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
try {
|
| 82 |
+
const filename = /Merging formats into "(.*)"/.exec(stdout)[1];
|
| 83 |
+
const result = fs.readFileSync(filename);
|
| 84 |
+
fs.unlinkSync(filename);
|
| 85 |
+
res(result);
|
| 86 |
+
} catch(e) {
|
| 87 |
+
rej(e);
|
| 88 |
+
}
|
| 89 |
+
});
|
| 90 |
+
});
|
| 91 |
+
}
|
| 92 |
+
|
| 93 |
+
/**
|
| 94 |
+
* Download YouTube video as mp3
|
| 95 |
+
* @param {string} url
|
| 96 |
+
* @returns {Promise<Buffer>}
|
| 97 |
+
*/
|
| 98 |
+
function getAudio(url) {
|
| 99 |
+
return new Promise((res, rej) => {
|
| 100 |
+
const ts = Date.now();
|
| 101 |
+
exec(`${ytdlp} -f "ba" -o "${tmp}/${ts}.%(ext)s" "${url}"`, (_, stdout, stderr) => {
|
| 102 |
+
if(stderr.length) {
|
| 103 |
+
return rej(new Error(stderr));
|
| 104 |
+
}
|
| 105 |
+
|
| 106 |
+
const filename = /Destination: (.*)/.exec(stdout)[1];
|
| 107 |
+
exec(`ffmpeg -i ${filename} -vn -ar 44100 -ac 2 -b:a 192k ${tmp}/${ts}.mp3`, (err) => {
|
| 108 |
+
if(err) {
|
| 109 |
+
return rej(err);
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
try {
|
| 113 |
+
const result = fs.readFileSync(`${tmp}/${ts}.mp3`);
|
| 114 |
+
fs.unlinkSync(filename);
|
| 115 |
+
fs.unlinkSync(`${tmp}/${ts}.mp3`);
|
| 116 |
+
|
| 117 |
+
res(result);
|
| 118 |
+
} catch(e) {
|
| 119 |
+
rej(e);
|
| 120 |
+
}
|
| 121 |
+
});
|
| 122 |
+
});
|
| 123 |
+
});
|
| 124 |
+
}
|
| 125 |
+
|
| 126 |
+
module.exports = {
|
| 127 |
+
getInfo,
|
| 128 |
+
getAudio,
|
| 129 |
+
getVideo
|
| 130 |
+
}
|
package-lock.json
CHANGED
|
@@ -11,10 +11,155 @@
|
|
| 11 |
"dependencies": {
|
| 12 |
"axios": "^1.8.4",
|
| 13 |
"body-parser": "^2.2.0",
|
|
|
|
| 14 |
"cheerio": "^1.0.0",
|
| 15 |
"cors": "^2.8.5",
|
| 16 |
"dotenv": "^16.4.7",
|
| 17 |
-
"express": "^4.21.2"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
}
|
| 19 |
},
|
| 20 |
"node_modules/accepts": {
|
|
@@ -30,12 +175,121 @@
|
|
| 30 |
"node": ">= 0.6"
|
| 31 |
}
|
| 32 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
"node_modules/array-flatten": {
|
| 34 |
"version": "1.1.1",
|
| 35 |
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
| 36 |
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
|
| 37 |
"license": "MIT"
|
| 38 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
"node_modules/asynckit": {
|
| 40 |
"version": "0.4.0",
|
| 41 |
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
|
@@ -53,6 +307,12 @@
|
|
| 53 |
"proxy-from-env": "^1.1.0"
|
| 54 |
}
|
| 55 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
"node_modules/body-parser": {
|
| 57 |
"version": "2.2.0",
|
| 58 |
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
|
|
@@ -161,6 +421,28 @@
|
|
| 161 |
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
|
| 162 |
"license": "ISC"
|
| 163 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 164 |
"node_modules/bytes": {
|
| 165 |
"version": "3.1.2",
|
| 166 |
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
|
|
@@ -241,6 +523,38 @@
|
|
| 241 |
"url": "https://github.com/sponsors/fb55"
|
| 242 |
}
|
| 243 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 244 |
"node_modules/combined-stream": {
|
| 245 |
"version": "1.0.8",
|
| 246 |
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
|
@@ -253,6 +567,31 @@
|
|
| 253 |
"node": ">= 0.8"
|
| 254 |
}
|
| 255 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 256 |
"node_modules/content-disposition": {
|
| 257 |
"version": "0.5.4",
|
| 258 |
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
|
|
@@ -302,6 +641,20 @@
|
|
| 302 |
"node": ">= 0.10"
|
| 303 |
}
|
| 304 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 305 |
"node_modules/css-select": {
|
| 306 |
"version": "5.1.0",
|
| 307 |
"resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
|
|
@@ -330,6 +683,34 @@
|
|
| 330 |
"url": "https://github.com/sponsors/fb55"
|
| 331 |
}
|
| 332 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 333 |
"node_modules/debug": {
|
| 334 |
"version": "2.6.9",
|
| 335 |
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
|
@@ -448,12 +829,66 @@
|
|
| 448 |
"node": ">= 0.4"
|
| 449 |
}
|
| 450 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 451 |
"node_modules/ee-first": {
|
| 452 |
"version": "1.1.1",
|
| 453 |
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
| 454 |
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
|
| 455 |
"license": "MIT"
|
| 456 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 457 |
"node_modules/encodeurl": {
|
| 458 |
"version": "2.0.0",
|
| 459 |
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
|
|
@@ -533,12 +968,79 @@
|
|
| 533 |
"node": ">= 0.4"
|
| 534 |
}
|
| 535 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 536 |
"node_modules/escape-html": {
|
| 537 |
"version": "1.0.3",
|
| 538 |
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
| 539 |
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
|
| 540 |
"license": "MIT"
|
| 541 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 542 |
"node_modules/etag": {
|
| 543 |
"version": "1.8.1",
|
| 544 |
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
|
@@ -548,6 +1050,16 @@
|
|
| 548 |
"node": ">= 0.6"
|
| 549 |
}
|
| 550 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 551 |
"node_modules/express": {
|
| 552 |
"version": "4.21.2",
|
| 553 |
"resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
|
|
@@ -645,11 +1157,67 @@
|
|
| 645 |
"node": ">= 0.8"
|
| 646 |
}
|
| 647 |
},
|
| 648 |
-
"node_modules/
|
| 649 |
-
"version": "1.
|
| 650 |
-
"resolved": "https://registry.npmjs.org/
|
| 651 |
-
"integrity": "sha512-
|
| 652 |
-
"license": "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 653 |
"dependencies": {
|
| 654 |
"debug": "2.6.9",
|
| 655 |
"encodeurl": "~2.0.0",
|
|
@@ -683,6 +1251,22 @@
|
|
| 683 |
}
|
| 684 |
}
|
| 685 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 686 |
"node_modules/form-data": {
|
| 687 |
"version": "4.0.2",
|
| 688 |
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
|
|
@@ -698,6 +1282,18 @@
|
|
| 698 |
"node": ">= 6"
|
| 699 |
}
|
| 700 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 701 |
"node_modules/forwarded": {
|
| 702 |
"version": "0.2.0",
|
| 703 |
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
|
|
@@ -762,6 +1358,50 @@
|
|
| 762 |
"node": ">= 0.4"
|
| 763 |
}
|
| 764 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 765 |
"node_modules/gopd": {
|
| 766 |
"version": "1.2.0",
|
| 767 |
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
|
|
@@ -848,6 +1488,12 @@
|
|
| 848 |
"node": ">= 0.8"
|
| 849 |
}
|
| 850 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 851 |
"node_modules/iconv-lite": {
|
| 852 |
"version": "0.6.3",
|
| 853 |
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
|
|
@@ -860,12 +1506,38 @@
|
|
| 860 |
"node": ">=0.10.0"
|
| 861 |
}
|
| 862 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 863 |
"node_modules/inherits": {
|
| 864 |
"version": "2.0.4",
|
| 865 |
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
| 866 |
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
| 867 |
"license": "ISC"
|
| 868 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 869 |
"node_modules/ipaddr.js": {
|
| 870 |
"version": "1.9.1",
|
| 871 |
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
|
@@ -875,6 +1547,115 @@
|
|
| 875 |
"node": ">= 0.10"
|
| 876 |
}
|
| 877 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 878 |
"node_modules/math-intrinsics": {
|
| 879 |
"version": "1.1.0",
|
| 880 |
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
|
|
@@ -893,6 +1674,25 @@
|
|
| 893 |
"node": ">= 0.6"
|
| 894 |
}
|
| 895 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 896 |
"node_modules/merge-descriptors": {
|
| 897 |
"version": "1.0.3",
|
| 898 |
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
|
|
@@ -944,6 +1744,36 @@
|
|
| 944 |
"node": ">= 0.6"
|
| 945 |
}
|
| 946 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 947 |
"node_modules/ms": {
|
| 948 |
"version": "2.0.0",
|
| 949 |
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
|
@@ -959,6 +1789,81 @@
|
|
| 959 |
"node": ">= 0.6"
|
| 960 |
}
|
| 961 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 962 |
"node_modules/nth-check": {
|
| 963 |
"version": "2.1.1",
|
| 964 |
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
|
|
@@ -1004,6 +1909,12 @@
|
|
| 1004 |
"node": ">= 0.8"
|
| 1005 |
}
|
| 1006 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1007 |
"node_modules/parse5": {
|
| 1008 |
"version": "7.2.1",
|
| 1009 |
"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz",
|
|
@@ -1050,12 +1961,56 @@
|
|
| 1050 |
"node": ">= 0.8"
|
| 1051 |
}
|
| 1052 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1053 |
"node_modules/path-to-regexp": {
|
| 1054 |
"version": "0.1.12",
|
| 1055 |
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
|
| 1056 |
"integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
|
| 1057 |
"license": "MIT"
|
| 1058 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1059 |
"node_modules/proxy-addr": {
|
| 1060 |
"version": "2.0.7",
|
| 1061 |
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
|
|
@@ -1114,6 +2069,15 @@
|
|
| 1114 |
"node": ">= 0.8"
|
| 1115 |
}
|
| 1116 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1117 |
"node_modules/safe-buffer": {
|
| 1118 |
"version": "5.2.1",
|
| 1119 |
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
|
@@ -1140,6 +2104,18 @@
|
|
| 1140 |
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
| 1141 |
"license": "MIT"
|
| 1142 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1143 |
"node_modules/send": {
|
| 1144 |
"version": "0.19.0",
|
| 1145 |
"resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
|
|
@@ -1200,6 +2176,27 @@
|
|
| 1200 |
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
|
| 1201 |
"license": "ISC"
|
| 1202 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1203 |
"node_modules/side-channel": {
|
| 1204 |
"version": "1.1.0",
|
| 1205 |
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
|
|
@@ -1272,6 +2269,30 @@
|
|
| 1272 |
"url": "https://github.com/sponsors/ljharb"
|
| 1273 |
}
|
| 1274 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1275 |
"node_modules/statuses": {
|
| 1276 |
"version": "2.0.1",
|
| 1277 |
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
|
|
@@ -1281,6 +2302,137 @@
|
|
| 1281 |
"node": ">= 0.8"
|
| 1282 |
}
|
| 1283 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1284 |
"node_modules/toidentifier": {
|
| 1285 |
"version": "1.0.1",
|
| 1286 |
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
|
|
@@ -1290,6 +2442,37 @@
|
|
| 1290 |
"node": ">=0.6"
|
| 1291 |
}
|
| 1292 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1293 |
"node_modules/type-is": {
|
| 1294 |
"version": "1.6.18",
|
| 1295 |
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
|
@@ -1303,6 +2486,18 @@
|
|
| 1303 |
"node": ">= 0.6"
|
| 1304 |
}
|
| 1305 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1306 |
"node_modules/undici": {
|
| 1307 |
"version": "6.21.2",
|
| 1308 |
"resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz",
|
|
@@ -1339,6 +2534,15 @@
|
|
| 1339 |
"node": ">= 0.8"
|
| 1340 |
}
|
| 1341 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1342 |
"node_modules/whatwg-encoding": {
|
| 1343 |
"version": "3.1.1",
|
| 1344 |
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
|
|
@@ -1359,6 +2563,186 @@
|
|
| 1359 |
"engines": {
|
| 1360 |
"node": ">=18"
|
| 1361 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1362 |
}
|
| 1363 |
}
|
| 1364 |
}
|
|
|
|
| 11 |
"dependencies": {
|
| 12 |
"axios": "^1.8.4",
|
| 13 |
"body-parser": "^2.2.0",
|
| 14 |
+
"browser-id3-writer": "^6.2.0",
|
| 15 |
"cheerio": "^1.0.0",
|
| 16 |
"cors": "^2.8.5",
|
| 17 |
"dotenv": "^16.4.7",
|
| 18 |
+
"express": "^4.21.2",
|
| 19 |
+
"file-type": "^20.4.1",
|
| 20 |
+
"js-beautify": "^1.15.4",
|
| 21 |
+
"node-fetch": "^3.3.2",
|
| 22 |
+
"similarity": "^1.2.1",
|
| 23 |
+
"yt-search": "^2.12.1"
|
| 24 |
+
}
|
| 25 |
+
},
|
| 26 |
+
"node_modules/@isaacs/cliui": {
|
| 27 |
+
"version": "8.0.2",
|
| 28 |
+
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
|
| 29 |
+
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
|
| 30 |
+
"license": "ISC",
|
| 31 |
+
"dependencies": {
|
| 32 |
+
"string-width": "^5.1.2",
|
| 33 |
+
"string-width-cjs": "npm:string-width@^4.2.0",
|
| 34 |
+
"strip-ansi": "^7.0.1",
|
| 35 |
+
"strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
|
| 36 |
+
"wrap-ansi": "^8.1.0",
|
| 37 |
+
"wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
|
| 38 |
+
},
|
| 39 |
+
"engines": {
|
| 40 |
+
"node": ">=12"
|
| 41 |
+
}
|
| 42 |
+
},
|
| 43 |
+
"node_modules/@isaacs/cliui/node_modules/ansi-regex": {
|
| 44 |
+
"version": "6.1.0",
|
| 45 |
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
|
| 46 |
+
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
|
| 47 |
+
"license": "MIT",
|
| 48 |
+
"engines": {
|
| 49 |
+
"node": ">=12"
|
| 50 |
+
},
|
| 51 |
+
"funding": {
|
| 52 |
+
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
|
| 53 |
+
}
|
| 54 |
+
},
|
| 55 |
+
"node_modules/@isaacs/cliui/node_modules/emoji-regex": {
|
| 56 |
+
"version": "9.2.2",
|
| 57 |
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
|
| 58 |
+
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
|
| 59 |
+
"license": "MIT"
|
| 60 |
+
},
|
| 61 |
+
"node_modules/@isaacs/cliui/node_modules/string-width": {
|
| 62 |
+
"version": "5.1.2",
|
| 63 |
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
|
| 64 |
+
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
|
| 65 |
+
"license": "MIT",
|
| 66 |
+
"dependencies": {
|
| 67 |
+
"eastasianwidth": "^0.2.0",
|
| 68 |
+
"emoji-regex": "^9.2.2",
|
| 69 |
+
"strip-ansi": "^7.0.1"
|
| 70 |
+
},
|
| 71 |
+
"engines": {
|
| 72 |
+
"node": ">=12"
|
| 73 |
+
},
|
| 74 |
+
"funding": {
|
| 75 |
+
"url": "https://github.com/sponsors/sindresorhus"
|
| 76 |
+
}
|
| 77 |
+
},
|
| 78 |
+
"node_modules/@isaacs/cliui/node_modules/strip-ansi": {
|
| 79 |
+
"version": "7.1.0",
|
| 80 |
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
|
| 81 |
+
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
|
| 82 |
+
"license": "MIT",
|
| 83 |
+
"dependencies": {
|
| 84 |
+
"ansi-regex": "^6.0.1"
|
| 85 |
+
},
|
| 86 |
+
"engines": {
|
| 87 |
+
"node": ">=12"
|
| 88 |
+
},
|
| 89 |
+
"funding": {
|
| 90 |
+
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
|
| 91 |
+
}
|
| 92 |
+
},
|
| 93 |
+
"node_modules/@one-ini/wasm": {
|
| 94 |
+
"version": "0.1.1",
|
| 95 |
+
"resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz",
|
| 96 |
+
"integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
|
| 97 |
+
"license": "MIT"
|
| 98 |
+
},
|
| 99 |
+
"node_modules/@pkgjs/parseargs": {
|
| 100 |
+
"version": "0.11.0",
|
| 101 |
+
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
|
| 102 |
+
"integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
|
| 103 |
+
"license": "MIT",
|
| 104 |
+
"optional": true,
|
| 105 |
+
"engines": {
|
| 106 |
+
"node": ">=14"
|
| 107 |
+
}
|
| 108 |
+
},
|
| 109 |
+
"node_modules/@tokenizer/inflate": {
|
| 110 |
+
"version": "0.2.7",
|
| 111 |
+
"resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz",
|
| 112 |
+
"integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==",
|
| 113 |
+
"license": "MIT",
|
| 114 |
+
"dependencies": {
|
| 115 |
+
"debug": "^4.4.0",
|
| 116 |
+
"fflate": "^0.8.2",
|
| 117 |
+
"token-types": "^6.0.0"
|
| 118 |
+
},
|
| 119 |
+
"engines": {
|
| 120 |
+
"node": ">=18"
|
| 121 |
+
},
|
| 122 |
+
"funding": {
|
| 123 |
+
"type": "github",
|
| 124 |
+
"url": "https://github.com/sponsors/Borewit"
|
| 125 |
+
}
|
| 126 |
+
},
|
| 127 |
+
"node_modules/@tokenizer/inflate/node_modules/debug": {
|
| 128 |
+
"version": "4.4.0",
|
| 129 |
+
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
|
| 130 |
+
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
|
| 131 |
+
"license": "MIT",
|
| 132 |
+
"dependencies": {
|
| 133 |
+
"ms": "^2.1.3"
|
| 134 |
+
},
|
| 135 |
+
"engines": {
|
| 136 |
+
"node": ">=6.0"
|
| 137 |
+
},
|
| 138 |
+
"peerDependenciesMeta": {
|
| 139 |
+
"supports-color": {
|
| 140 |
+
"optional": true
|
| 141 |
+
}
|
| 142 |
+
}
|
| 143 |
+
},
|
| 144 |
+
"node_modules/@tokenizer/inflate/node_modules/ms": {
|
| 145 |
+
"version": "2.1.3",
|
| 146 |
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
| 147 |
+
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
| 148 |
+
"license": "MIT"
|
| 149 |
+
},
|
| 150 |
+
"node_modules/@tokenizer/token": {
|
| 151 |
+
"version": "0.3.0",
|
| 152 |
+
"resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
|
| 153 |
+
"integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==",
|
| 154 |
+
"license": "MIT"
|
| 155 |
+
},
|
| 156 |
+
"node_modules/abbrev": {
|
| 157 |
+
"version": "2.0.0",
|
| 158 |
+
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
|
| 159 |
+
"integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
|
| 160 |
+
"license": "ISC",
|
| 161 |
+
"engines": {
|
| 162 |
+
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
|
| 163 |
}
|
| 164 |
},
|
| 165 |
"node_modules/accepts": {
|
|
|
|
| 175 |
"node": ">= 0.6"
|
| 176 |
}
|
| 177 |
},
|
| 178 |
+
"node_modules/ansi-regex": {
|
| 179 |
+
"version": "2.1.1",
|
| 180 |
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
| 181 |
+
"integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
|
| 182 |
+
"license": "MIT",
|
| 183 |
+
"engines": {
|
| 184 |
+
"node": ">=0.10.0"
|
| 185 |
+
}
|
| 186 |
+
},
|
| 187 |
+
"node_modules/ansi-styles": {
|
| 188 |
+
"version": "6.2.1",
|
| 189 |
+
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
|
| 190 |
+
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
|
| 191 |
+
"license": "MIT",
|
| 192 |
+
"engines": {
|
| 193 |
+
"node": ">=12"
|
| 194 |
+
},
|
| 195 |
+
"funding": {
|
| 196 |
+
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
| 197 |
+
}
|
| 198 |
+
},
|
| 199 |
"node_modules/array-flatten": {
|
| 200 |
"version": "1.1.1",
|
| 201 |
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
| 202 |
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
|
| 203 |
"license": "MIT"
|
| 204 |
},
|
| 205 |
+
"node_modules/async.parallellimit": {
|
| 206 |
+
"version": "0.5.2",
|
| 207 |
+
"resolved": "https://registry.npmjs.org/async.parallellimit/-/async.parallellimit-0.5.2.tgz",
|
| 208 |
+
"integrity": "sha512-4Di2nFsb3jL7aUIICvRSvtw/oynpMIx0JrwYn5hqJI661Dd+mYBi2ElOukOQgRHihU1SCTapb86Vx/Snva5M1w==",
|
| 209 |
+
"license": "MIT",
|
| 210 |
+
"dependencies": {
|
| 211 |
+
"async.util.eachoflimit": "0.5.2",
|
| 212 |
+
"async.util.parallel": "0.5.2"
|
| 213 |
+
}
|
| 214 |
+
},
|
| 215 |
+
"node_modules/async.util.eachoflimit": {
|
| 216 |
+
"version": "0.5.2",
|
| 217 |
+
"resolved": "https://registry.npmjs.org/async.util.eachoflimit/-/async.util.eachoflimit-0.5.2.tgz",
|
| 218 |
+
"integrity": "sha512-oZksH0sBW0AEOJKgBCQ79io9DZruoRBLTAea/Ik36pejR7pDpByvtXeuJsoZdPwSVslsrQcsUfucbUaiXYBnAQ==",
|
| 219 |
+
"license": "MIT",
|
| 220 |
+
"dependencies": {
|
| 221 |
+
"async.util.keyiterator": "0.5.2",
|
| 222 |
+
"async.util.noop": "0.5.2",
|
| 223 |
+
"async.util.once": "0.5.2",
|
| 224 |
+
"async.util.onlyonce": "0.5.2"
|
| 225 |
+
}
|
| 226 |
+
},
|
| 227 |
+
"node_modules/async.util.isarray": {
|
| 228 |
+
"version": "0.5.2",
|
| 229 |
+
"resolved": "https://registry.npmjs.org/async.util.isarray/-/async.util.isarray-0.5.2.tgz",
|
| 230 |
+
"integrity": "sha512-wbUzlrwON8RUgi+v/rhF0U99Ce8Osjcn+JP/mFNg6ymvShcobAOvE6cvLajSY5dPqKCOE1xfdhefgBif11zZgw==",
|
| 231 |
+
"license": "MIT"
|
| 232 |
+
},
|
| 233 |
+
"node_modules/async.util.isarraylike": {
|
| 234 |
+
"version": "0.5.2",
|
| 235 |
+
"resolved": "https://registry.npmjs.org/async.util.isarraylike/-/async.util.isarraylike-0.5.2.tgz",
|
| 236 |
+
"integrity": "sha512-DbFpsz3ZFNkohAW8IpGTlm8gotU32zpqe3Y2XkEA/G3XNO6rmUTKPpo7XgXUruoI+AsGi8+0zWpJHe7t1sLiAg==",
|
| 237 |
+
"license": "MIT",
|
| 238 |
+
"dependencies": {
|
| 239 |
+
"async.util.isarray": "0.5.2"
|
| 240 |
+
}
|
| 241 |
+
},
|
| 242 |
+
"node_modules/async.util.keyiterator": {
|
| 243 |
+
"version": "0.5.2",
|
| 244 |
+
"resolved": "https://registry.npmjs.org/async.util.keyiterator/-/async.util.keyiterator-0.5.2.tgz",
|
| 245 |
+
"integrity": "sha512-cktrETawCwgu13y3KZs2uMGFnNHc+IjKPZsavtRaoCjLELkePb2co4zrr+ghPvEqLXZIJPTKqC2HFZgJTssMVw==",
|
| 246 |
+
"license": "MIT",
|
| 247 |
+
"dependencies": {
|
| 248 |
+
"async.util.isarraylike": "0.5.2",
|
| 249 |
+
"async.util.keys": "0.5.2"
|
| 250 |
+
}
|
| 251 |
+
},
|
| 252 |
+
"node_modules/async.util.keys": {
|
| 253 |
+
"version": "0.5.2",
|
| 254 |
+
"resolved": "https://registry.npmjs.org/async.util.keys/-/async.util.keys-0.5.2.tgz",
|
| 255 |
+
"integrity": "sha512-umCOCRCRYwIC2Ho3fbuhKwIIe7OhQsVoVKGoF5GoQiGJUmjP4TG0Bmmcdpm7yW/znoIGKpnjKzVQz0niH4tfqw==",
|
| 256 |
+
"license": "MIT"
|
| 257 |
+
},
|
| 258 |
+
"node_modules/async.util.noop": {
|
| 259 |
+
"version": "0.5.2",
|
| 260 |
+
"resolved": "https://registry.npmjs.org/async.util.noop/-/async.util.noop-0.5.2.tgz",
|
| 261 |
+
"integrity": "sha512-AdwShXwE0KoskgqVJAck8zcM32nIHj3AC8ZN62ZaR5srhrY235Nw18vOJZWxcOfhxdVM0hRVKM8kMx7lcl7cCQ==",
|
| 262 |
+
"license": "MIT"
|
| 263 |
+
},
|
| 264 |
+
"node_modules/async.util.once": {
|
| 265 |
+
"version": "0.5.2",
|
| 266 |
+
"resolved": "https://registry.npmjs.org/async.util.once/-/async.util.once-0.5.2.tgz",
|
| 267 |
+
"integrity": "sha512-YQ5WPzDTt2jlblUDkq2I5RV/KiAJErJ4/0cEFhYPaZzqIuF/xDzdGvnEKe7UeuoMszsVPeajzcpKgkbwdb9MUA==",
|
| 268 |
+
"license": "MIT"
|
| 269 |
+
},
|
| 270 |
+
"node_modules/async.util.onlyonce": {
|
| 271 |
+
"version": "0.5.2",
|
| 272 |
+
"resolved": "https://registry.npmjs.org/async.util.onlyonce/-/async.util.onlyonce-0.5.2.tgz",
|
| 273 |
+
"integrity": "sha512-UgQvkU9JZ+I0Cm1f56XyGXcII+J3d/5XWUuHpcevlItuA3WFSJcqZrsyAUck2FkRSD8BwYQX1zUTDp3SJMVESg==",
|
| 274 |
+
"license": "MIT"
|
| 275 |
+
},
|
| 276 |
+
"node_modules/async.util.parallel": {
|
| 277 |
+
"version": "0.5.2",
|
| 278 |
+
"resolved": "https://registry.npmjs.org/async.util.parallel/-/async.util.parallel-0.5.2.tgz",
|
| 279 |
+
"integrity": "sha512-0bEvwmQ8fxsTYNwacw5iq0i3PvGryRkXxZ01Rvox21izdMdls9IH2rAZjfunbgI8j6nFRyIdCmMINQ9kka99ow==",
|
| 280 |
+
"license": "MIT",
|
| 281 |
+
"dependencies": {
|
| 282 |
+
"async.util.isarraylike": "0.5.2",
|
| 283 |
+
"async.util.noop": "0.5.2",
|
| 284 |
+
"async.util.restparam": "0.5.2"
|
| 285 |
+
}
|
| 286 |
+
},
|
| 287 |
+
"node_modules/async.util.restparam": {
|
| 288 |
+
"version": "0.5.2",
|
| 289 |
+
"resolved": "https://registry.npmjs.org/async.util.restparam/-/async.util.restparam-0.5.2.tgz",
|
| 290 |
+
"integrity": "sha512-Q9Z+zgmtMxFX5i7CnBvNOkgrL5hptztCqwarQluyNudUUk4iCmyjmsQl8MuQEjNh3gGqP5ayvDaextL1VXXgIg==",
|
| 291 |
+
"license": "MIT"
|
| 292 |
+
},
|
| 293 |
"node_modules/asynckit": {
|
| 294 |
"version": "0.4.0",
|
| 295 |
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
|
|
|
| 307 |
"proxy-from-env": "^1.1.0"
|
| 308 |
}
|
| 309 |
},
|
| 310 |
+
"node_modules/balanced-match": {
|
| 311 |
+
"version": "1.0.2",
|
| 312 |
+
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
| 313 |
+
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
| 314 |
+
"license": "MIT"
|
| 315 |
+
},
|
| 316 |
"node_modules/body-parser": {
|
| 317 |
"version": "2.2.0",
|
| 318 |
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
|
|
|
|
| 421 |
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
|
| 422 |
"license": "ISC"
|
| 423 |
},
|
| 424 |
+
"node_modules/boolstring": {
|
| 425 |
+
"version": "1.0.2",
|
| 426 |
+
"resolved": "https://registry.npmjs.org/boolstring/-/boolstring-1.0.2.tgz",
|
| 427 |
+
"integrity": "sha512-0JLNSmZUv1m/O8sVayFm2t0naiOXwQ9O2Gq9u1eoIkhvu6U5NQER/e3k4BGpjZ33G775lWMT7TzJ7r5VtmEnbQ==",
|
| 428 |
+
"license": "MIT"
|
| 429 |
+
},
|
| 430 |
+
"node_modules/brace-expansion": {
|
| 431 |
+
"version": "1.1.11",
|
| 432 |
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
| 433 |
+
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
| 434 |
+
"license": "MIT",
|
| 435 |
+
"dependencies": {
|
| 436 |
+
"balanced-match": "^1.0.0",
|
| 437 |
+
"concat-map": "0.0.1"
|
| 438 |
+
}
|
| 439 |
+
},
|
| 440 |
+
"node_modules/browser-id3-writer": {
|
| 441 |
+
"version": "6.2.0",
|
| 442 |
+
"resolved": "https://registry.npmjs.org/browser-id3-writer/-/browser-id3-writer-6.2.0.tgz",
|
| 443 |
+
"integrity": "sha512-1tZPvkQ1LpGLS/bLXtic/rUkcOjfZpfvPcSxyMBnt7eA1VmNiKeJjKj3m/0UhNLOOp84fEn9uOuGS827CYQjlg==",
|
| 444 |
+
"license": "MIT"
|
| 445 |
+
},
|
| 446 |
"node_modules/bytes": {
|
| 447 |
"version": "3.1.2",
|
| 448 |
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
|
|
|
|
| 523 |
"url": "https://github.com/sponsors/fb55"
|
| 524 |
}
|
| 525 |
},
|
| 526 |
+
"node_modules/cli-color": {
|
| 527 |
+
"version": "1.2.0",
|
| 528 |
+
"resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.2.0.tgz",
|
| 529 |
+
"integrity": "sha512-AqfwItf/UqGif3FBErI3NHX04v5ywJtGYlL5z4OqWR50u7g+Fz3Xw2qcCIbKVPrqtJCBwSOkDgnSlHbcpwDKHw==",
|
| 530 |
+
"license": "MIT",
|
| 531 |
+
"dependencies": {
|
| 532 |
+
"ansi-regex": "^2.1.1",
|
| 533 |
+
"d": "1",
|
| 534 |
+
"es5-ext": "^0.10.12",
|
| 535 |
+
"es6-iterator": "2",
|
| 536 |
+
"memoizee": "^0.4.3",
|
| 537 |
+
"timers-ext": "0.1"
|
| 538 |
+
}
|
| 539 |
+
},
|
| 540 |
+
"node_modules/color-convert": {
|
| 541 |
+
"version": "2.0.1",
|
| 542 |
+
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
| 543 |
+
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
| 544 |
+
"license": "MIT",
|
| 545 |
+
"dependencies": {
|
| 546 |
+
"color-name": "~1.1.4"
|
| 547 |
+
},
|
| 548 |
+
"engines": {
|
| 549 |
+
"node": ">=7.0.0"
|
| 550 |
+
}
|
| 551 |
+
},
|
| 552 |
+
"node_modules/color-name": {
|
| 553 |
+
"version": "1.1.4",
|
| 554 |
+
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
| 555 |
+
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
| 556 |
+
"license": "MIT"
|
| 557 |
+
},
|
| 558 |
"node_modules/combined-stream": {
|
| 559 |
"version": "1.0.8",
|
| 560 |
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
|
|
|
| 567 |
"node": ">= 0.8"
|
| 568 |
}
|
| 569 |
},
|
| 570 |
+
"node_modules/commander": {
|
| 571 |
+
"version": "10.0.1",
|
| 572 |
+
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
|
| 573 |
+
"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
|
| 574 |
+
"license": "MIT",
|
| 575 |
+
"engines": {
|
| 576 |
+
"node": ">=14"
|
| 577 |
+
}
|
| 578 |
+
},
|
| 579 |
+
"node_modules/concat-map": {
|
| 580 |
+
"version": "0.0.1",
|
| 581 |
+
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
| 582 |
+
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
|
| 583 |
+
"license": "MIT"
|
| 584 |
+
},
|
| 585 |
+
"node_modules/config-chain": {
|
| 586 |
+
"version": "1.1.13",
|
| 587 |
+
"resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
|
| 588 |
+
"integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
|
| 589 |
+
"license": "MIT",
|
| 590 |
+
"dependencies": {
|
| 591 |
+
"ini": "^1.3.4",
|
| 592 |
+
"proto-list": "~1.2.1"
|
| 593 |
+
}
|
| 594 |
+
},
|
| 595 |
"node_modules/content-disposition": {
|
| 596 |
"version": "0.5.4",
|
| 597 |
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
|
|
|
|
| 641 |
"node": ">= 0.10"
|
| 642 |
}
|
| 643 |
},
|
| 644 |
+
"node_modules/cross-spawn": {
|
| 645 |
+
"version": "7.0.6",
|
| 646 |
+
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
| 647 |
+
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
|
| 648 |
+
"license": "MIT",
|
| 649 |
+
"dependencies": {
|
| 650 |
+
"path-key": "^3.1.0",
|
| 651 |
+
"shebang-command": "^2.0.0",
|
| 652 |
+
"which": "^2.0.1"
|
| 653 |
+
},
|
| 654 |
+
"engines": {
|
| 655 |
+
"node": ">= 8"
|
| 656 |
+
}
|
| 657 |
+
},
|
| 658 |
"node_modules/css-select": {
|
| 659 |
"version": "5.1.0",
|
| 660 |
"resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
|
|
|
|
| 683 |
"url": "https://github.com/sponsors/fb55"
|
| 684 |
}
|
| 685 |
},
|
| 686 |
+
"node_modules/d": {
|
| 687 |
+
"version": "1.0.2",
|
| 688 |
+
"resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz",
|
| 689 |
+
"integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
|
| 690 |
+
"license": "ISC",
|
| 691 |
+
"dependencies": {
|
| 692 |
+
"es5-ext": "^0.10.64",
|
| 693 |
+
"type": "^2.7.2"
|
| 694 |
+
},
|
| 695 |
+
"engines": {
|
| 696 |
+
"node": ">=0.12"
|
| 697 |
+
}
|
| 698 |
+
},
|
| 699 |
+
"node_modules/dasu": {
|
| 700 |
+
"version": "0.4.3",
|
| 701 |
+
"resolved": "https://registry.npmjs.org/dasu/-/dasu-0.4.3.tgz",
|
| 702 |
+
"integrity": "sha512-AFwspl5k7V8MW8H7tyIGJ0gtOauUg7JC+DgiRFUIXvPNNDFXTMtvnCkZY0macN6JLGqBjNP38WVnQN7Iv3RSlg==",
|
| 703 |
+
"license": "MIT"
|
| 704 |
+
},
|
| 705 |
+
"node_modules/data-uri-to-buffer": {
|
| 706 |
+
"version": "4.0.1",
|
| 707 |
+
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
|
| 708 |
+
"integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
|
| 709 |
+
"license": "MIT",
|
| 710 |
+
"engines": {
|
| 711 |
+
"node": ">= 12"
|
| 712 |
+
}
|
| 713 |
+
},
|
| 714 |
"node_modules/debug": {
|
| 715 |
"version": "2.6.9",
|
| 716 |
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
|
|
|
| 829 |
"node": ">= 0.4"
|
| 830 |
}
|
| 831 |
},
|
| 832 |
+
"node_modules/eastasianwidth": {
|
| 833 |
+
"version": "0.2.0",
|
| 834 |
+
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
|
| 835 |
+
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
|
| 836 |
+
"license": "MIT"
|
| 837 |
+
},
|
| 838 |
+
"node_modules/editorconfig": {
|
| 839 |
+
"version": "1.0.4",
|
| 840 |
+
"resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz",
|
| 841 |
+
"integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==",
|
| 842 |
+
"license": "MIT",
|
| 843 |
+
"dependencies": {
|
| 844 |
+
"@one-ini/wasm": "0.1.1",
|
| 845 |
+
"commander": "^10.0.0",
|
| 846 |
+
"minimatch": "9.0.1",
|
| 847 |
+
"semver": "^7.5.3"
|
| 848 |
+
},
|
| 849 |
+
"bin": {
|
| 850 |
+
"editorconfig": "bin/editorconfig"
|
| 851 |
+
},
|
| 852 |
+
"engines": {
|
| 853 |
+
"node": ">=14"
|
| 854 |
+
}
|
| 855 |
+
},
|
| 856 |
+
"node_modules/editorconfig/node_modules/brace-expansion": {
|
| 857 |
+
"version": "2.0.1",
|
| 858 |
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
| 859 |
+
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
| 860 |
+
"license": "MIT",
|
| 861 |
+
"dependencies": {
|
| 862 |
+
"balanced-match": "^1.0.0"
|
| 863 |
+
}
|
| 864 |
+
},
|
| 865 |
+
"node_modules/editorconfig/node_modules/minimatch": {
|
| 866 |
+
"version": "9.0.1",
|
| 867 |
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
|
| 868 |
+
"integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
|
| 869 |
+
"license": "ISC",
|
| 870 |
+
"dependencies": {
|
| 871 |
+
"brace-expansion": "^2.0.1"
|
| 872 |
+
},
|
| 873 |
+
"engines": {
|
| 874 |
+
"node": ">=16 || 14 >=14.17"
|
| 875 |
+
},
|
| 876 |
+
"funding": {
|
| 877 |
+
"url": "https://github.com/sponsors/isaacs"
|
| 878 |
+
}
|
| 879 |
+
},
|
| 880 |
"node_modules/ee-first": {
|
| 881 |
"version": "1.1.1",
|
| 882 |
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
| 883 |
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
|
| 884 |
"license": "MIT"
|
| 885 |
},
|
| 886 |
+
"node_modules/emoji-regex": {
|
| 887 |
+
"version": "8.0.0",
|
| 888 |
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
| 889 |
+
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
|
| 890 |
+
"license": "MIT"
|
| 891 |
+
},
|
| 892 |
"node_modules/encodeurl": {
|
| 893 |
"version": "2.0.0",
|
| 894 |
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
|
|
|
|
| 968 |
"node": ">= 0.4"
|
| 969 |
}
|
| 970 |
},
|
| 971 |
+
"node_modules/es5-ext": {
|
| 972 |
+
"version": "0.10.64",
|
| 973 |
+
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
|
| 974 |
+
"integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
|
| 975 |
+
"hasInstallScript": true,
|
| 976 |
+
"license": "ISC",
|
| 977 |
+
"dependencies": {
|
| 978 |
+
"es6-iterator": "^2.0.3",
|
| 979 |
+
"es6-symbol": "^3.1.3",
|
| 980 |
+
"esniff": "^2.0.1",
|
| 981 |
+
"next-tick": "^1.1.0"
|
| 982 |
+
},
|
| 983 |
+
"engines": {
|
| 984 |
+
"node": ">=0.10"
|
| 985 |
+
}
|
| 986 |
+
},
|
| 987 |
+
"node_modules/es6-iterator": {
|
| 988 |
+
"version": "2.0.3",
|
| 989 |
+
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
|
| 990 |
+
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
|
| 991 |
+
"license": "MIT",
|
| 992 |
+
"dependencies": {
|
| 993 |
+
"d": "1",
|
| 994 |
+
"es5-ext": "^0.10.35",
|
| 995 |
+
"es6-symbol": "^3.1.1"
|
| 996 |
+
}
|
| 997 |
+
},
|
| 998 |
+
"node_modules/es6-symbol": {
|
| 999 |
+
"version": "3.1.4",
|
| 1000 |
+
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
|
| 1001 |
+
"integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
|
| 1002 |
+
"license": "ISC",
|
| 1003 |
+
"dependencies": {
|
| 1004 |
+
"d": "^1.0.2",
|
| 1005 |
+
"ext": "^1.7.0"
|
| 1006 |
+
},
|
| 1007 |
+
"engines": {
|
| 1008 |
+
"node": ">=0.12"
|
| 1009 |
+
}
|
| 1010 |
+
},
|
| 1011 |
+
"node_modules/es6-weak-map": {
|
| 1012 |
+
"version": "2.0.3",
|
| 1013 |
+
"resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
|
| 1014 |
+
"integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
|
| 1015 |
+
"license": "ISC",
|
| 1016 |
+
"dependencies": {
|
| 1017 |
+
"d": "1",
|
| 1018 |
+
"es5-ext": "^0.10.46",
|
| 1019 |
+
"es6-iterator": "^2.0.3",
|
| 1020 |
+
"es6-symbol": "^3.1.1"
|
| 1021 |
+
}
|
| 1022 |
+
},
|
| 1023 |
"node_modules/escape-html": {
|
| 1024 |
"version": "1.0.3",
|
| 1025 |
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
| 1026 |
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
|
| 1027 |
"license": "MIT"
|
| 1028 |
},
|
| 1029 |
+
"node_modules/esniff": {
|
| 1030 |
+
"version": "2.0.1",
|
| 1031 |
+
"resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
|
| 1032 |
+
"integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
|
| 1033 |
+
"license": "ISC",
|
| 1034 |
+
"dependencies": {
|
| 1035 |
+
"d": "^1.0.1",
|
| 1036 |
+
"es5-ext": "^0.10.62",
|
| 1037 |
+
"event-emitter": "^0.3.5",
|
| 1038 |
+
"type": "^2.7.2"
|
| 1039 |
+
},
|
| 1040 |
+
"engines": {
|
| 1041 |
+
"node": ">=0.10"
|
| 1042 |
+
}
|
| 1043 |
+
},
|
| 1044 |
"node_modules/etag": {
|
| 1045 |
"version": "1.8.1",
|
| 1046 |
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
|
|
|
| 1050 |
"node": ">= 0.6"
|
| 1051 |
}
|
| 1052 |
},
|
| 1053 |
+
"node_modules/event-emitter": {
|
| 1054 |
+
"version": "0.3.5",
|
| 1055 |
+
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
|
| 1056 |
+
"integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
|
| 1057 |
+
"license": "MIT",
|
| 1058 |
+
"dependencies": {
|
| 1059 |
+
"d": "1",
|
| 1060 |
+
"es5-ext": "~0.10.14"
|
| 1061 |
+
}
|
| 1062 |
+
},
|
| 1063 |
"node_modules/express": {
|
| 1064 |
"version": "4.21.2",
|
| 1065 |
"resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
|
|
|
|
| 1157 |
"node": ">= 0.8"
|
| 1158 |
}
|
| 1159 |
},
|
| 1160 |
+
"node_modules/ext": {
|
| 1161 |
+
"version": "1.7.0",
|
| 1162 |
+
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
|
| 1163 |
+
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
|
| 1164 |
+
"license": "ISC",
|
| 1165 |
+
"dependencies": {
|
| 1166 |
+
"type": "^2.7.2"
|
| 1167 |
+
}
|
| 1168 |
+
},
|
| 1169 |
+
"node_modules/fetch-blob": {
|
| 1170 |
+
"version": "3.2.0",
|
| 1171 |
+
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
|
| 1172 |
+
"integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
|
| 1173 |
+
"funding": [
|
| 1174 |
+
{
|
| 1175 |
+
"type": "github",
|
| 1176 |
+
"url": "https://github.com/sponsors/jimmywarting"
|
| 1177 |
+
},
|
| 1178 |
+
{
|
| 1179 |
+
"type": "paypal",
|
| 1180 |
+
"url": "https://paypal.me/jimmywarting"
|
| 1181 |
+
}
|
| 1182 |
+
],
|
| 1183 |
+
"license": "MIT",
|
| 1184 |
+
"dependencies": {
|
| 1185 |
+
"node-domexception": "^1.0.0",
|
| 1186 |
+
"web-streams-polyfill": "^3.0.3"
|
| 1187 |
+
},
|
| 1188 |
+
"engines": {
|
| 1189 |
+
"node": "^12.20 || >= 14.13"
|
| 1190 |
+
}
|
| 1191 |
+
},
|
| 1192 |
+
"node_modules/fflate": {
|
| 1193 |
+
"version": "0.8.2",
|
| 1194 |
+
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
|
| 1195 |
+
"integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
|
| 1196 |
+
"license": "MIT"
|
| 1197 |
+
},
|
| 1198 |
+
"node_modules/file-type": {
|
| 1199 |
+
"version": "20.4.1",
|
| 1200 |
+
"resolved": "https://registry.npmjs.org/file-type/-/file-type-20.4.1.tgz",
|
| 1201 |
+
"integrity": "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==",
|
| 1202 |
+
"license": "MIT",
|
| 1203 |
+
"dependencies": {
|
| 1204 |
+
"@tokenizer/inflate": "^0.2.6",
|
| 1205 |
+
"strtok3": "^10.2.0",
|
| 1206 |
+
"token-types": "^6.0.0",
|
| 1207 |
+
"uint8array-extras": "^1.4.0"
|
| 1208 |
+
},
|
| 1209 |
+
"engines": {
|
| 1210 |
+
"node": ">=18"
|
| 1211 |
+
},
|
| 1212 |
+
"funding": {
|
| 1213 |
+
"url": "https://github.com/sindresorhus/file-type?sponsor=1"
|
| 1214 |
+
}
|
| 1215 |
+
},
|
| 1216 |
+
"node_modules/finalhandler": {
|
| 1217 |
+
"version": "1.3.1",
|
| 1218 |
+
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
|
| 1219 |
+
"integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
|
| 1220 |
+
"license": "MIT",
|
| 1221 |
"dependencies": {
|
| 1222 |
"debug": "2.6.9",
|
| 1223 |
"encodeurl": "~2.0.0",
|
|
|
|
| 1251 |
}
|
| 1252 |
}
|
| 1253 |
},
|
| 1254 |
+
"node_modules/foreground-child": {
|
| 1255 |
+
"version": "3.3.1",
|
| 1256 |
+
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
|
| 1257 |
+
"integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
|
| 1258 |
+
"license": "ISC",
|
| 1259 |
+
"dependencies": {
|
| 1260 |
+
"cross-spawn": "^7.0.6",
|
| 1261 |
+
"signal-exit": "^4.0.1"
|
| 1262 |
+
},
|
| 1263 |
+
"engines": {
|
| 1264 |
+
"node": ">=14"
|
| 1265 |
+
},
|
| 1266 |
+
"funding": {
|
| 1267 |
+
"url": "https://github.com/sponsors/isaacs"
|
| 1268 |
+
}
|
| 1269 |
+
},
|
| 1270 |
"node_modules/form-data": {
|
| 1271 |
"version": "4.0.2",
|
| 1272 |
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
|
|
|
|
| 1282 |
"node": ">= 6"
|
| 1283 |
}
|
| 1284 |
},
|
| 1285 |
+
"node_modules/formdata-polyfill": {
|
| 1286 |
+
"version": "4.0.10",
|
| 1287 |
+
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
|
| 1288 |
+
"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
|
| 1289 |
+
"license": "MIT",
|
| 1290 |
+
"dependencies": {
|
| 1291 |
+
"fetch-blob": "^3.1.2"
|
| 1292 |
+
},
|
| 1293 |
+
"engines": {
|
| 1294 |
+
"node": ">=12.20.0"
|
| 1295 |
+
}
|
| 1296 |
+
},
|
| 1297 |
"node_modules/forwarded": {
|
| 1298 |
"version": "0.2.0",
|
| 1299 |
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
|
|
|
|
| 1358 |
"node": ">= 0.4"
|
| 1359 |
}
|
| 1360 |
},
|
| 1361 |
+
"node_modules/glob": {
|
| 1362 |
+
"version": "10.4.5",
|
| 1363 |
+
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
|
| 1364 |
+
"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
|
| 1365 |
+
"license": "ISC",
|
| 1366 |
+
"dependencies": {
|
| 1367 |
+
"foreground-child": "^3.1.0",
|
| 1368 |
+
"jackspeak": "^3.1.2",
|
| 1369 |
+
"minimatch": "^9.0.4",
|
| 1370 |
+
"minipass": "^7.1.2",
|
| 1371 |
+
"package-json-from-dist": "^1.0.0",
|
| 1372 |
+
"path-scurry": "^1.11.1"
|
| 1373 |
+
},
|
| 1374 |
+
"bin": {
|
| 1375 |
+
"glob": "dist/esm/bin.mjs"
|
| 1376 |
+
},
|
| 1377 |
+
"funding": {
|
| 1378 |
+
"url": "https://github.com/sponsors/isaacs"
|
| 1379 |
+
}
|
| 1380 |
+
},
|
| 1381 |
+
"node_modules/glob/node_modules/brace-expansion": {
|
| 1382 |
+
"version": "2.0.1",
|
| 1383 |
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
| 1384 |
+
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
| 1385 |
+
"license": "MIT",
|
| 1386 |
+
"dependencies": {
|
| 1387 |
+
"balanced-match": "^1.0.0"
|
| 1388 |
+
}
|
| 1389 |
+
},
|
| 1390 |
+
"node_modules/glob/node_modules/minimatch": {
|
| 1391 |
+
"version": "9.0.5",
|
| 1392 |
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
|
| 1393 |
+
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
|
| 1394 |
+
"license": "ISC",
|
| 1395 |
+
"dependencies": {
|
| 1396 |
+
"brace-expansion": "^2.0.1"
|
| 1397 |
+
},
|
| 1398 |
+
"engines": {
|
| 1399 |
+
"node": ">=16 || 14 >=14.17"
|
| 1400 |
+
},
|
| 1401 |
+
"funding": {
|
| 1402 |
+
"url": "https://github.com/sponsors/isaacs"
|
| 1403 |
+
}
|
| 1404 |
+
},
|
| 1405 |
"node_modules/gopd": {
|
| 1406 |
"version": "1.2.0",
|
| 1407 |
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
|
|
|
|
| 1488 |
"node": ">= 0.8"
|
| 1489 |
}
|
| 1490 |
},
|
| 1491 |
+
"node_modules/human-time": {
|
| 1492 |
+
"version": "0.0.2",
|
| 1493 |
+
"resolved": "https://registry.npmjs.org/human-time/-/human-time-0.0.2.tgz",
|
| 1494 |
+
"integrity": "sha512-sbYI90YhYmstslPTb70BLGjy6mdESa0lxL7uDR4fIVAx9Iobz8fLEqi7FqF4Q/6vblrzZALg//MsYJlIPBU8SA==",
|
| 1495 |
+
"license": "MIT"
|
| 1496 |
+
},
|
| 1497 |
"node_modules/iconv-lite": {
|
| 1498 |
"version": "0.6.3",
|
| 1499 |
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
|
|
|
|
| 1506 |
"node": ">=0.10.0"
|
| 1507 |
}
|
| 1508 |
},
|
| 1509 |
+
"node_modules/ieee754": {
|
| 1510 |
+
"version": "1.2.1",
|
| 1511 |
+
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
|
| 1512 |
+
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
|
| 1513 |
+
"funding": [
|
| 1514 |
+
{
|
| 1515 |
+
"type": "github",
|
| 1516 |
+
"url": "https://github.com/sponsors/feross"
|
| 1517 |
+
},
|
| 1518 |
+
{
|
| 1519 |
+
"type": "patreon",
|
| 1520 |
+
"url": "https://www.patreon.com/feross"
|
| 1521 |
+
},
|
| 1522 |
+
{
|
| 1523 |
+
"type": "consulting",
|
| 1524 |
+
"url": "https://feross.org/support"
|
| 1525 |
+
}
|
| 1526 |
+
],
|
| 1527 |
+
"license": "BSD-3-Clause"
|
| 1528 |
+
},
|
| 1529 |
"node_modules/inherits": {
|
| 1530 |
"version": "2.0.4",
|
| 1531 |
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
| 1532 |
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
| 1533 |
"license": "ISC"
|
| 1534 |
},
|
| 1535 |
+
"node_modules/ini": {
|
| 1536 |
+
"version": "1.3.8",
|
| 1537 |
+
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
|
| 1538 |
+
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
|
| 1539 |
+
"license": "ISC"
|
| 1540 |
+
},
|
| 1541 |
"node_modules/ipaddr.js": {
|
| 1542 |
"version": "1.9.1",
|
| 1543 |
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
|
|
|
| 1547 |
"node": ">= 0.10"
|
| 1548 |
}
|
| 1549 |
},
|
| 1550 |
+
"node_modules/is-fullwidth-code-point": {
|
| 1551 |
+
"version": "2.0.0",
|
| 1552 |
+
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
|
| 1553 |
+
"integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
|
| 1554 |
+
"license": "MIT",
|
| 1555 |
+
"engines": {
|
| 1556 |
+
"node": ">=4"
|
| 1557 |
+
}
|
| 1558 |
+
},
|
| 1559 |
+
"node_modules/is-promise": {
|
| 1560 |
+
"version": "2.2.2",
|
| 1561 |
+
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
|
| 1562 |
+
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
|
| 1563 |
+
"license": "MIT"
|
| 1564 |
+
},
|
| 1565 |
+
"node_modules/isexe": {
|
| 1566 |
+
"version": "2.0.0",
|
| 1567 |
+
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
|
| 1568 |
+
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
|
| 1569 |
+
"license": "ISC"
|
| 1570 |
+
},
|
| 1571 |
+
"node_modules/jackspeak": {
|
| 1572 |
+
"version": "3.4.3",
|
| 1573 |
+
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
|
| 1574 |
+
"integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
|
| 1575 |
+
"license": "BlueOak-1.0.0",
|
| 1576 |
+
"dependencies": {
|
| 1577 |
+
"@isaacs/cliui": "^8.0.2"
|
| 1578 |
+
},
|
| 1579 |
+
"funding": {
|
| 1580 |
+
"url": "https://github.com/sponsors/isaacs"
|
| 1581 |
+
},
|
| 1582 |
+
"optionalDependencies": {
|
| 1583 |
+
"@pkgjs/parseargs": "^0.11.0"
|
| 1584 |
+
}
|
| 1585 |
+
},
|
| 1586 |
+
"node_modules/js-beautify": {
|
| 1587 |
+
"version": "1.15.4",
|
| 1588 |
+
"resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz",
|
| 1589 |
+
"integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==",
|
| 1590 |
+
"license": "MIT",
|
| 1591 |
+
"dependencies": {
|
| 1592 |
+
"config-chain": "^1.1.13",
|
| 1593 |
+
"editorconfig": "^1.0.4",
|
| 1594 |
+
"glob": "^10.4.2",
|
| 1595 |
+
"js-cookie": "^3.0.5",
|
| 1596 |
+
"nopt": "^7.2.1"
|
| 1597 |
+
},
|
| 1598 |
+
"bin": {
|
| 1599 |
+
"css-beautify": "js/bin/css-beautify.js",
|
| 1600 |
+
"html-beautify": "js/bin/html-beautify.js",
|
| 1601 |
+
"js-beautify": "js/bin/js-beautify.js"
|
| 1602 |
+
},
|
| 1603 |
+
"engines": {
|
| 1604 |
+
"node": ">=14"
|
| 1605 |
+
}
|
| 1606 |
+
},
|
| 1607 |
+
"node_modules/js-cookie": {
|
| 1608 |
+
"version": "3.0.5",
|
| 1609 |
+
"resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz",
|
| 1610 |
+
"integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
|
| 1611 |
+
"license": "MIT",
|
| 1612 |
+
"engines": {
|
| 1613 |
+
"node": ">=14"
|
| 1614 |
+
}
|
| 1615 |
+
},
|
| 1616 |
+
"node_modules/jsonpath-plus": {
|
| 1617 |
+
"version": "5.0.7",
|
| 1618 |
+
"resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-5.0.7.tgz",
|
| 1619 |
+
"integrity": "sha512-7TS6wsiw1s2UMK/A6nA4n0aUJuirCVhJ87nWX5je5MPOl0z5VTr2qs7nMP8NZ2ed3rlt6kePTqddgVPE9F0i0w==",
|
| 1620 |
+
"license": "MIT",
|
| 1621 |
+
"engines": {
|
| 1622 |
+
"node": ">=10.0.0"
|
| 1623 |
+
}
|
| 1624 |
+
},
|
| 1625 |
+
"node_modules/keypress": {
|
| 1626 |
+
"version": "0.2.1",
|
| 1627 |
+
"resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz",
|
| 1628 |
+
"integrity": "sha512-HjorDJFNhnM4SicvaUXac0X77NiskggxJdesG72+O5zBKpSqKFCrqmndKVqpu3pFqkla0St6uGk8Ju0sCurrmg==",
|
| 1629 |
+
"license": "MIT"
|
| 1630 |
+
},
|
| 1631 |
+
"node_modules/levenshtein-edit-distance": {
|
| 1632 |
+
"version": "2.0.5",
|
| 1633 |
+
"resolved": "https://registry.npmjs.org/levenshtein-edit-distance/-/levenshtein-edit-distance-2.0.5.tgz",
|
| 1634 |
+
"integrity": "sha512-Yuraz7QnMX/JENJU1HA6UtdsbhRzoSFnGpVGVryjQgHtl2s/YmVgmNYkVs5yzVZ9aAvQR9wPBUH3lG755ylxGA==",
|
| 1635 |
+
"license": "MIT",
|
| 1636 |
+
"bin": {
|
| 1637 |
+
"levenshtein-edit-distance": "cli.js"
|
| 1638 |
+
},
|
| 1639 |
+
"funding": {
|
| 1640 |
+
"type": "github",
|
| 1641 |
+
"url": "https://github.com/sponsors/wooorm"
|
| 1642 |
+
}
|
| 1643 |
+
},
|
| 1644 |
+
"node_modules/lru-cache": {
|
| 1645 |
+
"version": "10.4.3",
|
| 1646 |
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
|
| 1647 |
+
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
|
| 1648 |
+
"license": "ISC"
|
| 1649 |
+
},
|
| 1650 |
+
"node_modules/lru-queue": {
|
| 1651 |
+
"version": "0.1.0",
|
| 1652 |
+
"resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
|
| 1653 |
+
"integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==",
|
| 1654 |
+
"license": "MIT",
|
| 1655 |
+
"dependencies": {
|
| 1656 |
+
"es5-ext": "~0.10.2"
|
| 1657 |
+
}
|
| 1658 |
+
},
|
| 1659 |
"node_modules/math-intrinsics": {
|
| 1660 |
"version": "1.1.0",
|
| 1661 |
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
|
|
|
|
| 1674 |
"node": ">= 0.6"
|
| 1675 |
}
|
| 1676 |
},
|
| 1677 |
+
"node_modules/memoizee": {
|
| 1678 |
+
"version": "0.4.17",
|
| 1679 |
+
"resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz",
|
| 1680 |
+
"integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==",
|
| 1681 |
+
"license": "ISC",
|
| 1682 |
+
"dependencies": {
|
| 1683 |
+
"d": "^1.0.2",
|
| 1684 |
+
"es5-ext": "^0.10.64",
|
| 1685 |
+
"es6-weak-map": "^2.0.3",
|
| 1686 |
+
"event-emitter": "^0.3.5",
|
| 1687 |
+
"is-promise": "^2.2.2",
|
| 1688 |
+
"lru-queue": "^0.1.0",
|
| 1689 |
+
"next-tick": "^1.1.0",
|
| 1690 |
+
"timers-ext": "^0.1.7"
|
| 1691 |
+
},
|
| 1692 |
+
"engines": {
|
| 1693 |
+
"node": ">=0.12"
|
| 1694 |
+
}
|
| 1695 |
+
},
|
| 1696 |
"node_modules/merge-descriptors": {
|
| 1697 |
"version": "1.0.3",
|
| 1698 |
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
|
|
|
|
| 1744 |
"node": ">= 0.6"
|
| 1745 |
}
|
| 1746 |
},
|
| 1747 |
+
"node_modules/minimatch": {
|
| 1748 |
+
"version": "3.0.8",
|
| 1749 |
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
|
| 1750 |
+
"integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
|
| 1751 |
+
"license": "ISC",
|
| 1752 |
+
"dependencies": {
|
| 1753 |
+
"brace-expansion": "^1.1.7"
|
| 1754 |
+
},
|
| 1755 |
+
"engines": {
|
| 1756 |
+
"node": "*"
|
| 1757 |
+
}
|
| 1758 |
+
},
|
| 1759 |
+
"node_modules/minimist": {
|
| 1760 |
+
"version": "1.2.8",
|
| 1761 |
+
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
|
| 1762 |
+
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
|
| 1763 |
+
"license": "MIT",
|
| 1764 |
+
"funding": {
|
| 1765 |
+
"url": "https://github.com/sponsors/ljharb"
|
| 1766 |
+
}
|
| 1767 |
+
},
|
| 1768 |
+
"node_modules/minipass": {
|
| 1769 |
+
"version": "7.1.2",
|
| 1770 |
+
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
|
| 1771 |
+
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
|
| 1772 |
+
"license": "ISC",
|
| 1773 |
+
"engines": {
|
| 1774 |
+
"node": ">=16 || 14 >=14.17"
|
| 1775 |
+
}
|
| 1776 |
+
},
|
| 1777 |
"node_modules/ms": {
|
| 1778 |
"version": "2.0.0",
|
| 1779 |
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
|
|
|
| 1789 |
"node": ">= 0.6"
|
| 1790 |
}
|
| 1791 |
},
|
| 1792 |
+
"node_modules/next-tick": {
|
| 1793 |
+
"version": "1.1.0",
|
| 1794 |
+
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
|
| 1795 |
+
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
|
| 1796 |
+
"license": "ISC"
|
| 1797 |
+
},
|
| 1798 |
+
"node_modules/node-domexception": {
|
| 1799 |
+
"version": "1.0.0",
|
| 1800 |
+
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
|
| 1801 |
+
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
|
| 1802 |
+
"funding": [
|
| 1803 |
+
{
|
| 1804 |
+
"type": "github",
|
| 1805 |
+
"url": "https://github.com/sponsors/jimmywarting"
|
| 1806 |
+
},
|
| 1807 |
+
{
|
| 1808 |
+
"type": "github",
|
| 1809 |
+
"url": "https://paypal.me/jimmywarting"
|
| 1810 |
+
}
|
| 1811 |
+
],
|
| 1812 |
+
"license": "MIT",
|
| 1813 |
+
"engines": {
|
| 1814 |
+
"node": ">=10.5.0"
|
| 1815 |
+
}
|
| 1816 |
+
},
|
| 1817 |
+
"node_modules/node-fetch": {
|
| 1818 |
+
"version": "3.3.2",
|
| 1819 |
+
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
|
| 1820 |
+
"integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
|
| 1821 |
+
"license": "MIT",
|
| 1822 |
+
"dependencies": {
|
| 1823 |
+
"data-uri-to-buffer": "^4.0.0",
|
| 1824 |
+
"fetch-blob": "^3.1.4",
|
| 1825 |
+
"formdata-polyfill": "^4.0.10"
|
| 1826 |
+
},
|
| 1827 |
+
"engines": {
|
| 1828 |
+
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
| 1829 |
+
},
|
| 1830 |
+
"funding": {
|
| 1831 |
+
"type": "opencollective",
|
| 1832 |
+
"url": "https://opencollective.com/node-fetch"
|
| 1833 |
+
}
|
| 1834 |
+
},
|
| 1835 |
+
"node_modules/node-fzf": {
|
| 1836 |
+
"version": "0.5.3",
|
| 1837 |
+
"resolved": "https://registry.npmjs.org/node-fzf/-/node-fzf-0.5.3.tgz",
|
| 1838 |
+
"integrity": "sha512-crN8rRfApu/GUrtKq+zJ6LueUyNAOJpFHxoT2Ru1Q+OYRa/F/H7CXvzcMrFc7D964yakYZEZ9XR3YbdSHXgyCw==",
|
| 1839 |
+
"license": "MIT",
|
| 1840 |
+
"dependencies": {
|
| 1841 |
+
"cli-color": "~1.2.0",
|
| 1842 |
+
"keypress": "~0.2.1",
|
| 1843 |
+
"minimist": "~1.2.0",
|
| 1844 |
+
"redstar": "0.0.2",
|
| 1845 |
+
"string-width": "~2.1.1",
|
| 1846 |
+
"ttys": "0.0.3"
|
| 1847 |
+
},
|
| 1848 |
+
"bin": {
|
| 1849 |
+
"nfzf": "bin/cli.js"
|
| 1850 |
+
}
|
| 1851 |
+
},
|
| 1852 |
+
"node_modules/nopt": {
|
| 1853 |
+
"version": "7.2.1",
|
| 1854 |
+
"resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
|
| 1855 |
+
"integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
|
| 1856 |
+
"license": "ISC",
|
| 1857 |
+
"dependencies": {
|
| 1858 |
+
"abbrev": "^2.0.0"
|
| 1859 |
+
},
|
| 1860 |
+
"bin": {
|
| 1861 |
+
"nopt": "bin/nopt.js"
|
| 1862 |
+
},
|
| 1863 |
+
"engines": {
|
| 1864 |
+
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
|
| 1865 |
+
}
|
| 1866 |
+
},
|
| 1867 |
"node_modules/nth-check": {
|
| 1868 |
"version": "2.1.1",
|
| 1869 |
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
|
|
|
|
| 1909 |
"node": ">= 0.8"
|
| 1910 |
}
|
| 1911 |
},
|
| 1912 |
+
"node_modules/package-json-from-dist": {
|
| 1913 |
+
"version": "1.0.1",
|
| 1914 |
+
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
|
| 1915 |
+
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
|
| 1916 |
+
"license": "BlueOak-1.0.0"
|
| 1917 |
+
},
|
| 1918 |
"node_modules/parse5": {
|
| 1919 |
"version": "7.2.1",
|
| 1920 |
"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz",
|
|
|
|
| 1961 |
"node": ">= 0.8"
|
| 1962 |
}
|
| 1963 |
},
|
| 1964 |
+
"node_modules/path-key": {
|
| 1965 |
+
"version": "3.1.1",
|
| 1966 |
+
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
|
| 1967 |
+
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
|
| 1968 |
+
"license": "MIT",
|
| 1969 |
+
"engines": {
|
| 1970 |
+
"node": ">=8"
|
| 1971 |
+
}
|
| 1972 |
+
},
|
| 1973 |
+
"node_modules/path-scurry": {
|
| 1974 |
+
"version": "1.11.1",
|
| 1975 |
+
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
|
| 1976 |
+
"integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
|
| 1977 |
+
"license": "BlueOak-1.0.0",
|
| 1978 |
+
"dependencies": {
|
| 1979 |
+
"lru-cache": "^10.2.0",
|
| 1980 |
+
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
|
| 1981 |
+
},
|
| 1982 |
+
"engines": {
|
| 1983 |
+
"node": ">=16 || 14 >=14.18"
|
| 1984 |
+
},
|
| 1985 |
+
"funding": {
|
| 1986 |
+
"url": "https://github.com/sponsors/isaacs"
|
| 1987 |
+
}
|
| 1988 |
+
},
|
| 1989 |
"node_modules/path-to-regexp": {
|
| 1990 |
"version": "0.1.12",
|
| 1991 |
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
|
| 1992 |
"integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
|
| 1993 |
"license": "MIT"
|
| 1994 |
},
|
| 1995 |
+
"node_modules/peek-readable": {
|
| 1996 |
+
"version": "7.0.0",
|
| 1997 |
+
"resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-7.0.0.tgz",
|
| 1998 |
+
"integrity": "sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==",
|
| 1999 |
+
"license": "MIT",
|
| 2000 |
+
"engines": {
|
| 2001 |
+
"node": ">=18"
|
| 2002 |
+
},
|
| 2003 |
+
"funding": {
|
| 2004 |
+
"type": "github",
|
| 2005 |
+
"url": "https://github.com/sponsors/Borewit"
|
| 2006 |
+
}
|
| 2007 |
+
},
|
| 2008 |
+
"node_modules/proto-list": {
|
| 2009 |
+
"version": "1.2.4",
|
| 2010 |
+
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
|
| 2011 |
+
"integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
|
| 2012 |
+
"license": "ISC"
|
| 2013 |
+
},
|
| 2014 |
"node_modules/proxy-addr": {
|
| 2015 |
"version": "2.0.7",
|
| 2016 |
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
|
|
|
|
| 2069 |
"node": ">= 0.8"
|
| 2070 |
}
|
| 2071 |
},
|
| 2072 |
+
"node_modules/redstar": {
|
| 2073 |
+
"version": "0.0.2",
|
| 2074 |
+
"resolved": "https://registry.npmjs.org/redstar/-/redstar-0.0.2.tgz",
|
| 2075 |
+
"integrity": "sha512-VNvLaLxMJMYiAasJX5Q/GC+Os7FXL0yPWFDuTodhR7Na9wqzrXsePPWC+EtIv4t3q5DyAK00w423xi5mQN2fqg==",
|
| 2076 |
+
"license": "MIT",
|
| 2077 |
+
"dependencies": {
|
| 2078 |
+
"minimatch": "~3.0.4"
|
| 2079 |
+
}
|
| 2080 |
+
},
|
| 2081 |
"node_modules/safe-buffer": {
|
| 2082 |
"version": "5.2.1",
|
| 2083 |
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
|
|
|
| 2104 |
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
| 2105 |
"license": "MIT"
|
| 2106 |
},
|
| 2107 |
+
"node_modules/semver": {
|
| 2108 |
+
"version": "7.7.1",
|
| 2109 |
+
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
|
| 2110 |
+
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
|
| 2111 |
+
"license": "ISC",
|
| 2112 |
+
"bin": {
|
| 2113 |
+
"semver": "bin/semver.js"
|
| 2114 |
+
},
|
| 2115 |
+
"engines": {
|
| 2116 |
+
"node": ">=10"
|
| 2117 |
+
}
|
| 2118 |
+
},
|
| 2119 |
"node_modules/send": {
|
| 2120 |
"version": "0.19.0",
|
| 2121 |
"resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
|
|
|
|
| 2176 |
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
|
| 2177 |
"license": "ISC"
|
| 2178 |
},
|
| 2179 |
+
"node_modules/shebang-command": {
|
| 2180 |
+
"version": "2.0.0",
|
| 2181 |
+
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
|
| 2182 |
+
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
|
| 2183 |
+
"license": "MIT",
|
| 2184 |
+
"dependencies": {
|
| 2185 |
+
"shebang-regex": "^3.0.0"
|
| 2186 |
+
},
|
| 2187 |
+
"engines": {
|
| 2188 |
+
"node": ">=8"
|
| 2189 |
+
}
|
| 2190 |
+
},
|
| 2191 |
+
"node_modules/shebang-regex": {
|
| 2192 |
+
"version": "3.0.0",
|
| 2193 |
+
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
|
| 2194 |
+
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
|
| 2195 |
+
"license": "MIT",
|
| 2196 |
+
"engines": {
|
| 2197 |
+
"node": ">=8"
|
| 2198 |
+
}
|
| 2199 |
+
},
|
| 2200 |
"node_modules/side-channel": {
|
| 2201 |
"version": "1.1.0",
|
| 2202 |
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
|
|
|
|
| 2269 |
"url": "https://github.com/sponsors/ljharb"
|
| 2270 |
}
|
| 2271 |
},
|
| 2272 |
+
"node_modules/signal-exit": {
|
| 2273 |
+
"version": "4.1.0",
|
| 2274 |
+
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
|
| 2275 |
+
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
|
| 2276 |
+
"license": "ISC",
|
| 2277 |
+
"engines": {
|
| 2278 |
+
"node": ">=14"
|
| 2279 |
+
},
|
| 2280 |
+
"funding": {
|
| 2281 |
+
"url": "https://github.com/sponsors/isaacs"
|
| 2282 |
+
}
|
| 2283 |
+
},
|
| 2284 |
+
"node_modules/similarity": {
|
| 2285 |
+
"version": "1.2.1",
|
| 2286 |
+
"resolved": "https://registry.npmjs.org/similarity/-/similarity-1.2.1.tgz",
|
| 2287 |
+
"integrity": "sha512-lMOpWVaWrTnyL+tkvDs8oGV/KAUBQ3wfbZtdiwDcC+KYGlwO8kgtiyag1B6akAjALDMwn5rN5YHHei1hr4X7nw==",
|
| 2288 |
+
"license": "ISC",
|
| 2289 |
+
"dependencies": {
|
| 2290 |
+
"levenshtein-edit-distance": "^2.0.0"
|
| 2291 |
+
},
|
| 2292 |
+
"bin": {
|
| 2293 |
+
"similarity": "cli.js"
|
| 2294 |
+
}
|
| 2295 |
+
},
|
| 2296 |
"node_modules/statuses": {
|
| 2297 |
"version": "2.0.1",
|
| 2298 |
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
|
|
|
|
| 2302 |
"node": ">= 0.8"
|
| 2303 |
}
|
| 2304 |
},
|
| 2305 |
+
"node_modules/string-width": {
|
| 2306 |
+
"version": "2.1.1",
|
| 2307 |
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
|
| 2308 |
+
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
|
| 2309 |
+
"license": "MIT",
|
| 2310 |
+
"dependencies": {
|
| 2311 |
+
"is-fullwidth-code-point": "^2.0.0",
|
| 2312 |
+
"strip-ansi": "^4.0.0"
|
| 2313 |
+
},
|
| 2314 |
+
"engines": {
|
| 2315 |
+
"node": ">=4"
|
| 2316 |
+
}
|
| 2317 |
+
},
|
| 2318 |
+
"node_modules/string-width-cjs": {
|
| 2319 |
+
"name": "string-width",
|
| 2320 |
+
"version": "4.2.3",
|
| 2321 |
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
| 2322 |
+
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
|
| 2323 |
+
"license": "MIT",
|
| 2324 |
+
"dependencies": {
|
| 2325 |
+
"emoji-regex": "^8.0.0",
|
| 2326 |
+
"is-fullwidth-code-point": "^3.0.0",
|
| 2327 |
+
"strip-ansi": "^6.0.1"
|
| 2328 |
+
},
|
| 2329 |
+
"engines": {
|
| 2330 |
+
"node": ">=8"
|
| 2331 |
+
}
|
| 2332 |
+
},
|
| 2333 |
+
"node_modules/string-width-cjs/node_modules/ansi-regex": {
|
| 2334 |
+
"version": "5.0.1",
|
| 2335 |
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
| 2336 |
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
|
| 2337 |
+
"license": "MIT",
|
| 2338 |
+
"engines": {
|
| 2339 |
+
"node": ">=8"
|
| 2340 |
+
}
|
| 2341 |
+
},
|
| 2342 |
+
"node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": {
|
| 2343 |
+
"version": "3.0.0",
|
| 2344 |
+
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
|
| 2345 |
+
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
|
| 2346 |
+
"license": "MIT",
|
| 2347 |
+
"engines": {
|
| 2348 |
+
"node": ">=8"
|
| 2349 |
+
}
|
| 2350 |
+
},
|
| 2351 |
+
"node_modules/string-width-cjs/node_modules/strip-ansi": {
|
| 2352 |
+
"version": "6.0.1",
|
| 2353 |
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
| 2354 |
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
| 2355 |
+
"license": "MIT",
|
| 2356 |
+
"dependencies": {
|
| 2357 |
+
"ansi-regex": "^5.0.1"
|
| 2358 |
+
},
|
| 2359 |
+
"engines": {
|
| 2360 |
+
"node": ">=8"
|
| 2361 |
+
}
|
| 2362 |
+
},
|
| 2363 |
+
"node_modules/strip-ansi": {
|
| 2364 |
+
"version": "4.0.0",
|
| 2365 |
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
|
| 2366 |
+
"integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
|
| 2367 |
+
"license": "MIT",
|
| 2368 |
+
"dependencies": {
|
| 2369 |
+
"ansi-regex": "^3.0.0"
|
| 2370 |
+
},
|
| 2371 |
+
"engines": {
|
| 2372 |
+
"node": ">=4"
|
| 2373 |
+
}
|
| 2374 |
+
},
|
| 2375 |
+
"node_modules/strip-ansi-cjs": {
|
| 2376 |
+
"name": "strip-ansi",
|
| 2377 |
+
"version": "6.0.1",
|
| 2378 |
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
| 2379 |
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
| 2380 |
+
"license": "MIT",
|
| 2381 |
+
"dependencies": {
|
| 2382 |
+
"ansi-regex": "^5.0.1"
|
| 2383 |
+
},
|
| 2384 |
+
"engines": {
|
| 2385 |
+
"node": ">=8"
|
| 2386 |
+
}
|
| 2387 |
+
},
|
| 2388 |
+
"node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
|
| 2389 |
+
"version": "5.0.1",
|
| 2390 |
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
| 2391 |
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
|
| 2392 |
+
"license": "MIT",
|
| 2393 |
+
"engines": {
|
| 2394 |
+
"node": ">=8"
|
| 2395 |
+
}
|
| 2396 |
+
},
|
| 2397 |
+
"node_modules/strip-ansi/node_modules/ansi-regex": {
|
| 2398 |
+
"version": "3.0.1",
|
| 2399 |
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
|
| 2400 |
+
"integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
|
| 2401 |
+
"license": "MIT",
|
| 2402 |
+
"engines": {
|
| 2403 |
+
"node": ">=4"
|
| 2404 |
+
}
|
| 2405 |
+
},
|
| 2406 |
+
"node_modules/strtok3": {
|
| 2407 |
+
"version": "10.2.2",
|
| 2408 |
+
"resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.2.2.tgz",
|
| 2409 |
+
"integrity": "sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==",
|
| 2410 |
+
"license": "MIT",
|
| 2411 |
+
"dependencies": {
|
| 2412 |
+
"@tokenizer/token": "^0.3.0",
|
| 2413 |
+
"peek-readable": "^7.0.0"
|
| 2414 |
+
},
|
| 2415 |
+
"engines": {
|
| 2416 |
+
"node": ">=18"
|
| 2417 |
+
},
|
| 2418 |
+
"funding": {
|
| 2419 |
+
"type": "github",
|
| 2420 |
+
"url": "https://github.com/sponsors/Borewit"
|
| 2421 |
+
}
|
| 2422 |
+
},
|
| 2423 |
+
"node_modules/timers-ext": {
|
| 2424 |
+
"version": "0.1.8",
|
| 2425 |
+
"resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz",
|
| 2426 |
+
"integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==",
|
| 2427 |
+
"license": "ISC",
|
| 2428 |
+
"dependencies": {
|
| 2429 |
+
"es5-ext": "^0.10.64",
|
| 2430 |
+
"next-tick": "^1.1.0"
|
| 2431 |
+
},
|
| 2432 |
+
"engines": {
|
| 2433 |
+
"node": ">=0.12"
|
| 2434 |
+
}
|
| 2435 |
+
},
|
| 2436 |
"node_modules/toidentifier": {
|
| 2437 |
"version": "1.0.1",
|
| 2438 |
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
|
|
|
|
| 2442 |
"node": ">=0.6"
|
| 2443 |
}
|
| 2444 |
},
|
| 2445 |
+
"node_modules/token-types": {
|
| 2446 |
+
"version": "6.0.0",
|
| 2447 |
+
"resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.0.tgz",
|
| 2448 |
+
"integrity": "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==",
|
| 2449 |
+
"license": "MIT",
|
| 2450 |
+
"dependencies": {
|
| 2451 |
+
"@tokenizer/token": "^0.3.0",
|
| 2452 |
+
"ieee754": "^1.2.1"
|
| 2453 |
+
},
|
| 2454 |
+
"engines": {
|
| 2455 |
+
"node": ">=14.16"
|
| 2456 |
+
},
|
| 2457 |
+
"funding": {
|
| 2458 |
+
"type": "github",
|
| 2459 |
+
"url": "https://github.com/sponsors/Borewit"
|
| 2460 |
+
}
|
| 2461 |
+
},
|
| 2462 |
+
"node_modules/ttys": {
|
| 2463 |
+
"version": "0.0.3",
|
| 2464 |
+
"resolved": "https://registry.npmjs.org/ttys/-/ttys-0.0.3.tgz",
|
| 2465 |
+
"integrity": "sha512-UCqXRZS2S7U4aVB7Salj3ChPRSsb57ogJpJ1eMCvyowxFOBGsaHKcRU8bovcDwajX1mRbv0IpUnYkoG7Ieo5Zg==",
|
| 2466 |
+
"engines": {
|
| 2467 |
+
"node": ">= 0.6.0"
|
| 2468 |
+
}
|
| 2469 |
+
},
|
| 2470 |
+
"node_modules/type": {
|
| 2471 |
+
"version": "2.7.3",
|
| 2472 |
+
"resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz",
|
| 2473 |
+
"integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==",
|
| 2474 |
+
"license": "ISC"
|
| 2475 |
+
},
|
| 2476 |
"node_modules/type-is": {
|
| 2477 |
"version": "1.6.18",
|
| 2478 |
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
|
|
|
| 2486 |
"node": ">= 0.6"
|
| 2487 |
}
|
| 2488 |
},
|
| 2489 |
+
"node_modules/uint8array-extras": {
|
| 2490 |
+
"version": "1.4.0",
|
| 2491 |
+
"resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz",
|
| 2492 |
+
"integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==",
|
| 2493 |
+
"license": "MIT",
|
| 2494 |
+
"engines": {
|
| 2495 |
+
"node": ">=18"
|
| 2496 |
+
},
|
| 2497 |
+
"funding": {
|
| 2498 |
+
"url": "https://github.com/sponsors/sindresorhus"
|
| 2499 |
+
}
|
| 2500 |
+
},
|
| 2501 |
"node_modules/undici": {
|
| 2502 |
"version": "6.21.2",
|
| 2503 |
"resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz",
|
|
|
|
| 2534 |
"node": ">= 0.8"
|
| 2535 |
}
|
| 2536 |
},
|
| 2537 |
+
"node_modules/web-streams-polyfill": {
|
| 2538 |
+
"version": "3.3.3",
|
| 2539 |
+
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
|
| 2540 |
+
"integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
|
| 2541 |
+
"license": "MIT",
|
| 2542 |
+
"engines": {
|
| 2543 |
+
"node": ">= 8"
|
| 2544 |
+
}
|
| 2545 |
+
},
|
| 2546 |
"node_modules/whatwg-encoding": {
|
| 2547 |
"version": "3.1.1",
|
| 2548 |
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
|
|
|
|
| 2563 |
"engines": {
|
| 2564 |
"node": ">=18"
|
| 2565 |
}
|
| 2566 |
+
},
|
| 2567 |
+
"node_modules/which": {
|
| 2568 |
+
"version": "2.0.2",
|
| 2569 |
+
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
| 2570 |
+
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
|
| 2571 |
+
"license": "ISC",
|
| 2572 |
+
"dependencies": {
|
| 2573 |
+
"isexe": "^2.0.0"
|
| 2574 |
+
},
|
| 2575 |
+
"bin": {
|
| 2576 |
+
"node-which": "bin/node-which"
|
| 2577 |
+
},
|
| 2578 |
+
"engines": {
|
| 2579 |
+
"node": ">= 8"
|
| 2580 |
+
}
|
| 2581 |
+
},
|
| 2582 |
+
"node_modules/wrap-ansi": {
|
| 2583 |
+
"version": "8.1.0",
|
| 2584 |
+
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
|
| 2585 |
+
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
|
| 2586 |
+
"license": "MIT",
|
| 2587 |
+
"dependencies": {
|
| 2588 |
+
"ansi-styles": "^6.1.0",
|
| 2589 |
+
"string-width": "^5.0.1",
|
| 2590 |
+
"strip-ansi": "^7.0.1"
|
| 2591 |
+
},
|
| 2592 |
+
"engines": {
|
| 2593 |
+
"node": ">=12"
|
| 2594 |
+
},
|
| 2595 |
+
"funding": {
|
| 2596 |
+
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
|
| 2597 |
+
}
|
| 2598 |
+
},
|
| 2599 |
+
"node_modules/wrap-ansi-cjs": {
|
| 2600 |
+
"name": "wrap-ansi",
|
| 2601 |
+
"version": "7.0.0",
|
| 2602 |
+
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
| 2603 |
+
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
|
| 2604 |
+
"license": "MIT",
|
| 2605 |
+
"dependencies": {
|
| 2606 |
+
"ansi-styles": "^4.0.0",
|
| 2607 |
+
"string-width": "^4.1.0",
|
| 2608 |
+
"strip-ansi": "^6.0.0"
|
| 2609 |
+
},
|
| 2610 |
+
"engines": {
|
| 2611 |
+
"node": ">=10"
|
| 2612 |
+
},
|
| 2613 |
+
"funding": {
|
| 2614 |
+
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
|
| 2615 |
+
}
|
| 2616 |
+
},
|
| 2617 |
+
"node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
|
| 2618 |
+
"version": "5.0.1",
|
| 2619 |
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
| 2620 |
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
|
| 2621 |
+
"license": "MIT",
|
| 2622 |
+
"engines": {
|
| 2623 |
+
"node": ">=8"
|
| 2624 |
+
}
|
| 2625 |
+
},
|
| 2626 |
+
"node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
|
| 2627 |
+
"version": "4.3.0",
|
| 2628 |
+
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
| 2629 |
+
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
| 2630 |
+
"license": "MIT",
|
| 2631 |
+
"dependencies": {
|
| 2632 |
+
"color-convert": "^2.0.1"
|
| 2633 |
+
},
|
| 2634 |
+
"engines": {
|
| 2635 |
+
"node": ">=8"
|
| 2636 |
+
},
|
| 2637 |
+
"funding": {
|
| 2638 |
+
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
| 2639 |
+
}
|
| 2640 |
+
},
|
| 2641 |
+
"node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": {
|
| 2642 |
+
"version": "3.0.0",
|
| 2643 |
+
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
|
| 2644 |
+
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
|
| 2645 |
+
"license": "MIT",
|
| 2646 |
+
"engines": {
|
| 2647 |
+
"node": ">=8"
|
| 2648 |
+
}
|
| 2649 |
+
},
|
| 2650 |
+
"node_modules/wrap-ansi-cjs/node_modules/string-width": {
|
| 2651 |
+
"version": "4.2.3",
|
| 2652 |
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
| 2653 |
+
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
|
| 2654 |
+
"license": "MIT",
|
| 2655 |
+
"dependencies": {
|
| 2656 |
+
"emoji-regex": "^8.0.0",
|
| 2657 |
+
"is-fullwidth-code-point": "^3.0.0",
|
| 2658 |
+
"strip-ansi": "^6.0.1"
|
| 2659 |
+
},
|
| 2660 |
+
"engines": {
|
| 2661 |
+
"node": ">=8"
|
| 2662 |
+
}
|
| 2663 |
+
},
|
| 2664 |
+
"node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
|
| 2665 |
+
"version": "6.0.1",
|
| 2666 |
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
| 2667 |
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
| 2668 |
+
"license": "MIT",
|
| 2669 |
+
"dependencies": {
|
| 2670 |
+
"ansi-regex": "^5.0.1"
|
| 2671 |
+
},
|
| 2672 |
+
"engines": {
|
| 2673 |
+
"node": ">=8"
|
| 2674 |
+
}
|
| 2675 |
+
},
|
| 2676 |
+
"node_modules/wrap-ansi/node_modules/ansi-regex": {
|
| 2677 |
+
"version": "6.1.0",
|
| 2678 |
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
|
| 2679 |
+
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
|
| 2680 |
+
"license": "MIT",
|
| 2681 |
+
"engines": {
|
| 2682 |
+
"node": ">=12"
|
| 2683 |
+
},
|
| 2684 |
+
"funding": {
|
| 2685 |
+
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
|
| 2686 |
+
}
|
| 2687 |
+
},
|
| 2688 |
+
"node_modules/wrap-ansi/node_modules/emoji-regex": {
|
| 2689 |
+
"version": "9.2.2",
|
| 2690 |
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
|
| 2691 |
+
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
|
| 2692 |
+
"license": "MIT"
|
| 2693 |
+
},
|
| 2694 |
+
"node_modules/wrap-ansi/node_modules/string-width": {
|
| 2695 |
+
"version": "5.1.2",
|
| 2696 |
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
|
| 2697 |
+
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
|
| 2698 |
+
"license": "MIT",
|
| 2699 |
+
"dependencies": {
|
| 2700 |
+
"eastasianwidth": "^0.2.0",
|
| 2701 |
+
"emoji-regex": "^9.2.2",
|
| 2702 |
+
"strip-ansi": "^7.0.1"
|
| 2703 |
+
},
|
| 2704 |
+
"engines": {
|
| 2705 |
+
"node": ">=12"
|
| 2706 |
+
},
|
| 2707 |
+
"funding": {
|
| 2708 |
+
"url": "https://github.com/sponsors/sindresorhus"
|
| 2709 |
+
}
|
| 2710 |
+
},
|
| 2711 |
+
"node_modules/wrap-ansi/node_modules/strip-ansi": {
|
| 2712 |
+
"version": "7.1.0",
|
| 2713 |
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
|
| 2714 |
+
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
|
| 2715 |
+
"license": "MIT",
|
| 2716 |
+
"dependencies": {
|
| 2717 |
+
"ansi-regex": "^6.0.1"
|
| 2718 |
+
},
|
| 2719 |
+
"engines": {
|
| 2720 |
+
"node": ">=12"
|
| 2721 |
+
},
|
| 2722 |
+
"funding": {
|
| 2723 |
+
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
|
| 2724 |
+
}
|
| 2725 |
+
},
|
| 2726 |
+
"node_modules/yt-search": {
|
| 2727 |
+
"version": "2.12.1",
|
| 2728 |
+
"resolved": "https://registry.npmjs.org/yt-search/-/yt-search-2.12.1.tgz",
|
| 2729 |
+
"integrity": "sha512-suEbEGqIDa7OBuZQSNabPKS4sZrHrocak7JhxSw3gagCUxPgHqyEDqyWEruvLYax2uCIQ7UhQoDVqQGOFn+jrQ==",
|
| 2730 |
+
"license": "MIT",
|
| 2731 |
+
"dependencies": {
|
| 2732 |
+
"async.parallellimit": "~0.5.2",
|
| 2733 |
+
"boolstring": "~1.0.2",
|
| 2734 |
+
"cheerio": "^1.0.0-rc.10",
|
| 2735 |
+
"dasu": "~0.4.3",
|
| 2736 |
+
"human-time": "0.0.2",
|
| 2737 |
+
"jsonpath-plus": "~5.0.2",
|
| 2738 |
+
"minimist": "~1.2.5",
|
| 2739 |
+
"node-fzf": "~0.5.1"
|
| 2740 |
+
},
|
| 2741 |
+
"bin": {
|
| 2742 |
+
"yt-search": "bin/cli.js",
|
| 2743 |
+
"yt-search-audio": "bin/mpv_audio.sh",
|
| 2744 |
+
"yt-search-video": "bin/mpv_video.sh"
|
| 2745 |
+
}
|
| 2746 |
}
|
| 2747 |
}
|
| 2748 |
}
|
package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
| 2 |
"name": "api",
|
| 3 |
"version": "1.0.0",
|
| 4 |
"main": "app.js",
|
| 5 |
-
|
| 6 |
"start": "node app.js",
|
| 7 |
"dev": "nodemon app.js"
|
| 8 |
},
|
|
@@ -12,9 +12,15 @@
|
|
| 12 |
"dependencies": {
|
| 13 |
"axios": "^1.8.4",
|
| 14 |
"body-parser": "^2.2.0",
|
|
|
|
| 15 |
"cheerio": "^1.0.0",
|
| 16 |
"cors": "^2.8.5",
|
| 17 |
"dotenv": "^16.4.7",
|
| 18 |
-
"express": "^4.21.2"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
}
|
| 20 |
}
|
|
|
|
| 2 |
"name": "api",
|
| 3 |
"version": "1.0.0",
|
| 4 |
"main": "app.js",
|
| 5 |
+
"scripts": {
|
| 6 |
"start": "node app.js",
|
| 7 |
"dev": "nodemon app.js"
|
| 8 |
},
|
|
|
|
| 12 |
"dependencies": {
|
| 13 |
"axios": "^1.8.4",
|
| 14 |
"body-parser": "^2.2.0",
|
| 15 |
+
"browser-id3-writer": "^6.2.0",
|
| 16 |
"cheerio": "^1.0.0",
|
| 17 |
"cors": "^2.8.5",
|
| 18 |
"dotenv": "^16.4.7",
|
| 19 |
+
"express": "^4.21.2",
|
| 20 |
+
"file-type": "^20.4.1",
|
| 21 |
+
"js-beautify": "^1.15.4",
|
| 22 |
+
"node-fetch": "^3.3.2",
|
| 23 |
+
"similarity": "^1.2.1",
|
| 24 |
+
"yt-search": "^2.12.1"
|
| 25 |
}
|
| 26 |
}
|