This commit is contained in:
Flummi 2021-01-25 20:30:39 +01:00
parent 6a4d3cb5bc
commit 2a10fd2e93
7 changed files with 74 additions and 46 deletions

44
package-lock.json generated
View File

@ -10,22 +10,22 @@
"integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==" "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ=="
}, },
"@types/node": { "@types/node": {
"version": "13.13.25", "version": "14.14.22",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.25.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz",
"integrity": "sha512-6ZMK4xRcF2XrPdKmPYQxZkdHKV18xKgUFVvhIgw2iwaaO6weleLPHLBGPZmLhjo+m1N+MZXRAoBEBCCVqgO2zQ==" "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw=="
}, },
"cuffeo": { "cuffeo": {
"version": "1.0.6-1", "version": "1.0.7",
"resolved": "https://registry.npmjs.org/cuffeo/-/cuffeo-1.0.6-1.tgz", "resolved": "https://registry.npmjs.org/cuffeo/-/cuffeo-1.0.7.tgz",
"integrity": "sha512-r7MCG7rIuG86leo4aB73YEkl7UWAGprd2A/9xy4iZmrbMepIFaCgHOn7SC6wemPbS4LRXQAgqvV9a6PCyHaCfg==", "integrity": "sha512-9XpEUnN9jIfaiIMJwcfPW61PxTxBJUoa9VN/TjiWk7Z/jNStdrlPTdn6Y2cdclsWsHtAyabHdCNUAHscQ89WCQ==",
"requires": { "requires": {
"flumm-fetch-cookies": "^1.3.5" "flumm-fetch-cookies": "^1.3.5"
} }
}, },
"denque": { "denque": {
"version": "1.4.1", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
"integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ=="
}, },
"flumm-fetch": { "flumm-fetch": {
"version": "1.0.1", "version": "1.0.1",
@ -41,11 +41,11 @@
} }
}, },
"iconv-lite": { "iconv-lite": {
"version": "0.5.2", "version": "0.6.2",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz",
"integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==",
"requires": { "requires": {
"safer-buffer": ">= 2.1.2 < 3" "safer-buffer": ">= 2.1.2 < 3.0.0"
} }
}, },
"long": { "long": {
@ -54,16 +54,16 @@
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
}, },
"mariadb": { "mariadb": {
"version": "2.4.2", "version": "2.5.2",
"resolved": "https://registry.npmjs.org/mariadb/-/mariadb-2.4.2.tgz", "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-2.5.2.tgz",
"integrity": "sha512-ybK520CO/8Z74MNJ77dEwXjRMhxMbQdpPia+/uJakJWiZoLEmuwSHqs51qWr4FE5WcgHQfL5KCmOiHErR/LpTg==", "integrity": "sha512-SfaBl5/LiX2qJNNr7wCQvizVjtWxVm1CUWYKe+y4OMeyYMM6g0GhwX7/BbGtv/O3WthnGrM+Kj1imFnlescO0w==",
"requires": { "requires": {
"@types/geojson": "^7946.0.7", "@types/geojson": "^7946.0.7",
"@types/node": "^13.9.8", "@types/node": "^14.14.7",
"denque": "^1.4.1", "denque": "^1.4.1",
"iconv-lite": "^0.5.1", "iconv-lite": "^0.6.2",
"long": "^4.0.0", "long": "^4.0.0",
"moment-timezone": "^0.5.31", "moment-timezone": "^0.5.32",
"please-upgrade-node": "^3.2.0" "please-upgrade-node": "^3.2.0"
} }
}, },
@ -73,9 +73,9 @@
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
}, },
"moment-timezone": { "moment-timezone": {
"version": "0.5.31", "version": "0.5.32",
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz",
"integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", "integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==",
"requires": { "requires": {
"moment": ">= 2.9.0" "moment": ">= 2.9.0"
} }

View File

@ -10,8 +10,8 @@
"author": "Flummi", "author": "Flummi",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"cuffeo": "^1.0.6-1", "cuffeo": "^1.0.7",
"flumm-fetch-cookies": "^1.4.0", "flumm-fetch-cookies": "^1.4.0",
"mariadb": "^2.4.2" "mariadb": "^2.5.2"
} }
} }

View File

@ -18,12 +18,20 @@ export default async bot => {
f: e => { f: e => {
logger.info(`${e.network} -> ${e.channel} -> ${e.user.nick}: ${e.message}`); logger.info(`${e.network} -> ${e.channel} -> ${e.user.nick}: ${e.message}`);
const trigger = [...bot._trigger.entries()].filter(t => let trigger;
t[1].call.exec(e.message) &&
t[1].clients.includes(e.type) && if(e.photo) {
t[1].active && trigger = [...bot._trigger.entries()].filter(t => t[1].name === "parser");
t[1].level <= getLevel(e.user).level if(!e.message)
); e.message = "";
} else {
trigger = [...bot._trigger.entries()].filter(t =>
t[1].call.exec(e.message) &&
t[1].clients.includes(e.type) &&
t[1].active &&
t[1].level <= getLevel(e.user).level
);
}
trigger.forEach(async t => { trigger.forEach(async t => {
try { try {
@ -31,6 +39,7 @@ export default async bot => {
console.log(`triggered > ${t[0]}`); console.log(`triggered > ${t[0]}`);
} }
catch(err) { catch(err) {
console.error(err);
e.reply(`${t[0]}: An error occured.`); e.reply(`${t[0]}: An error occured.`);
logger.error(`${e.network} -> ${e.channel} -> ${e.user.nick}: ${err.toString ? err : JSON.stringify(err)}`); logger.error(`${e.network} -> ${e.channel} -> ${e.user.nick}: ${err.toString ? err : JSON.stringify(err)}`);
} }

View File

@ -3,6 +3,6 @@ export default new class {
return (size / Math.pow(1024, i)).toFixed(2) * 1 + " " + ["B", "kB", "MB", "GB", "TB"][i]; return (size / Math.pow(1024, i)).toFixed(2) * 1 + " " + ["B", "kB", "MB", "GB", "TB"][i];
} }
calcSpeed(b, s) { calcSpeed(b, s) {
return `${(Math.round((b * 8 / s / 1e6) * 1e4) / 1e4).toFixed(2)} Mbit/s`; return (Math.round((b * 8 / s / 1e6) * 1e4) / 1e4);
} }
}; };

View File

@ -21,7 +21,7 @@ router.get("/", async (req, res) => {
router.get(/^\/([0-9]+)$/, async (req, res) => { router.get(/^\/([0-9]+)$/, async (req, res) => {
const query = (await sql.query(queries.item, Array(3).fill(req.url.split[0])))?.shift(); const query = (await sql.query(queries.item, Array(3).fill(req.url.split[0])))?.shift();
if(query.length === 0) if(!query?.id)
return res.redirect("/404"); return res.redirect("/404");
const data = { const data = {

View File

@ -17,11 +17,12 @@ export default async bot => {
call: regex, call: regex,
active: true, active: true,
f: e => { f: e => {
const links = e.message.match(regex)?.filter(link => { const links = e.message.match(regex)?.filter(link => !link.includes("f0ck.me")) || [];
return (
!link.includes("f0ck.me") if(e.photo) {
); links.push(e.photo);
}); }
if(links.length === 0) if(links.length === 0)
return false; return false;
@ -42,17 +43,31 @@ export default async bot => {
// generate uuid // generate uuid
const uuid = (await sql.query("select left(uuid(), 8) as uuid"))[0].uuid; const uuid = (await sql.query("select left(uuid(), 8) as uuid"))[0].uuid;
// read metadata const maxfilesize = ( getLevel(e.user).level > 50 ? cfg.main.maxfilesize * 2.5 : cfg.main.maxfilesize ) / 1024;
const meta = JSON.parse((await exec(`youtube-dlc --skip-download --dump-json "${link}"`)).stdout);
const filename = `${uuid}.mp4`; let meta;
// read metadata
try {
//meta = JSON.parse((await exec(`youtube-dlc -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" --skip-download --dump-json "${link}"`)).stdout);
meta = JSON.parse((await exec(`youtube-dlc -f "bestvideo[ext=mp4,filesize<${maxfilesize}k]+bestaudio/best" --skip-download --dump-json "${link}"`)).stdout);
}
catch(e) {
return;
}
const filename = `${uuid}.${meta.ext}`;
e.reply(`downloading ${filename}...`); e.reply(`downloading ${filename}...`);
// download data // download data
const start = new Date(); const start = new Date();
const maxfilesize = getLevel(e.user).level > 50 ? cfg.main.maxfilesize * 2.5 : cfg.main.maxfilesize; //const source = (await exec(`youtube-dlc "${link}" -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" --max-filesize ${maxfilesize} -o ./tmp/${filename}`)).stdout.trim();
const source = (await exec(`youtube-dlc "${link}" -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" --max-filesize ${maxfilesize} -o ./tmp/${filename}`)).stdout.trim(); let source;
if(meta.ext === "mp4")
source = (await exec(`youtube-dlc "${link}" --max-filesize ${maxfilesize}k -f "bestvideo[ext=mp4,filesize<${maxfilesize}k]+bestaudio/best" --merge-output-format mp4 -o ./tmp/${filename}`)).stdout.trim();
else
source = (await exec(`youtube-dlc "${link}" --max-filesize ${maxfilesize}k -f "bestvideo[ext=mp4,filesize<${maxfilesize}k]+bestaudio/best" -o ./tmp/${filename}`)).stdout.trim();
if(source.match(/larger than/)) if(source.match(/larger than/))
return e.reply("too large lol"); return e.reply("too large lol");
const end = ~~((new Date() - start) / 1e3); const end = ~~((new Date() - start) / 1e3);
@ -76,15 +91,15 @@ export default async bot => {
const insertq = await sql.query( const insertq = await sql.query(
"insert into items (src, dest, mime, size, checksum, username, userchannel, usernetwork, stamp, active) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "insert into items (src, dest, mime, size, checksum, username, userchannel, usernetwork, stamp, active) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
[ link, filename, mime, size, checksum, e.user.nick || e.user.username, e.channel, e.network, ~~(new Date() / 1000), 1 ] [ e.photo ? "" : link, filename, mime, size, checksum, e.user.nick || e.user.username, e.channel, e.network, ~~(new Date() / 1000), 1 ]
); );
// generate thumbnail // generate thumbnail
let thumb_orig = (await exec(`youtube-dlc --get-thumbnail "${link}"`)).stdout.trim(); let thumb_orig = (await exec(`youtube-dlc -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" --get-thumbnail "${link}"`)).stdout.trim();
if(!thumb_orig.startsWith("http")) { if(!thumb_orig.startsWith("http")) {
if(mime.startsWith("image") && mime !== "image/gif") if(mime.startsWith("image") && mime !== "image/gif")
thumb_orig = `./public/b/${filename}`; thumb_orig = `./public/b/${filename}`;
else { else if(!mime.startsWith("audio")) {
await exec(`ffmpegthumbnailer -i./public/b/${filename} -s1024 -o./tmp/${insertq.insertId}`); await exec(`ffmpegthumbnailer -i./public/b/${filename} -s1024 -o./tmp/${insertq.insertId}`);
thumb_orig = `./tmp/${insertq.insertId}`; thumb_orig = `./tmp/${insertq.insertId}`;
} }
@ -92,9 +107,12 @@ export default async bot => {
await exec(`convert "${thumb_orig}" -resize "200x200^" -gravity center -crop 128x128+0+0 +repage ./public/t/${insertq.insertId}.png`); await exec(`convert "${thumb_orig}" -resize "200x200^" -gravity center -crop 128x128+0+0 +repage ./public/t/${insertq.insertId}.png`);
await fs.promises.unlink(`./tmp/${insertq.insertId}`).catch(_=>{}); await fs.promises.unlink(`./tmp/${insertq.insertId}`).catch(_=>{});
let speed = lib.calcSpeed(size, end);
speed = !Number.isFinite(speed) ? "yes" : `${speed.toFixed(2)} Mbit/s`;
e.reply([ e.reply([
`title: ${meta.fulltitle}`, `title: ${meta.fulltitle}`,
`size: ${lib.formatSize(size)} ${lib.calcSpeed(size, end)} (ytdl: ${end})`, `size: ${lib.formatSize(size)} speed: ${speed}`,
`link: ${cfg.main.url}/${insertq.insertId}` `link: ${cfg.main.url}/${insertq.insertId}`
]); ]);

View File

@ -11,6 +11,7 @@ import "./websrv.mjs";
this.call = args.call; this.call = args.call;
this.help = args.help || false; this.help = args.help || false;
this.level = args.level || 0; this.level = args.level || 0;
this.name = args.name;
this.active = args.hasOwnProperty("active") ? args.active : true; this.active = args.hasOwnProperty("active") ? args.active : true;
this.clients = args.clients || [ "irc", "tg", "slack" ]; this.clients = args.clients || [ "irc", "tg", "slack" ];
this.f = args.f; this.f = args.f;