initial commit

This commit is contained in:
ION606
2023-02-26 15:16:21 -05:00
commit a1db1a1400
10 changed files with 772 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
node_modules
pref.json
config.json
+14
View File
@@ -0,0 +1,14 @@
{
currentPage: 1,
hasNextPage: false,
results: [
{
id: 'plunderer.55jj',
title: 'Plunderer',
url: 'https://9anime.pl/watch/plunderer.55jj',
image: 'https://static.bunnycdn.ru/i/cache/images/2020/01/3a6cacd4ec426119692ab40d1ca3998a.jpg',
subOrSub: 'both',
type: 'TV'
}
]
}
+196
View File
@@ -0,0 +1,196 @@
import fs from 'fs'
import m3u8stream from 'm3u8stream';
import chalk from 'chalk';
import axios from "axios";
import readline from 'readline'
import path from 'path';
import generateQuery from './userQuery.js';
import { getJSON, setJSON } from '../utils/JSON.js';
import https from 'https';
/**
* @param {String} query
* @returns {Promise<String>}
*/
function askUserQuery(query) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
return new Promise(resolve => rl.question(query, ans => {
rl.close();
resolve(ans);
}))
}
async function getAnime9(id, episode = null) {
var url = `https://api.consumet.org/anime/9anime/info/${id}`;
try {
const response = await axios.get(url, {params: {id: id}});
const { data } = response;
console.log(chalk.green('done!'));
var epNumber;
if (!episode) {
var query = generateQuery("animeep");
const userResp = (await askUserQuery(query)).toLowerCase();
if (userResp == "dumpdata") {
return console.log(data);
}
else if (userResp == "desc") {
return console.log(data.description)
}
else if (userResp == "episodes-all") {
return console.log(data.episodes);
}
else {
if (Number.isNaN(Number(userResp))) {
return console.log(chalk.red(`${userResp} is not an integer (1, 2, 3, 4, etc)`));
}
epNumber = Number(userResp);
}
} else {
epNumber = episode;
}
const episodeData = data.episodes.find((e) => e.number == epNumber);
if (!episodeData) {
return console.log(chalk.red(`ERROR: No data found for ` + chalk.bold(`${data.title} (episode ${epNumber})`)));
}
//get the urls
console.log(chalk.green('Fetching video sources...'));
url = `https://api.consumet.org/anime/9anime/watch/${episodeData.id}`; //?server={serverName}`
const epResp = await axios.get(url);
console.log(epResp.data)
const epSource = epResp.data.sources[0];
const vidPath = await getJSON("apath");
const newpath = path.resolve(vidPath, data.title + ' - ' + episodeData.title + '.mp4');
console.log(chalk.green('done!'));
console.log(chalk.green('writing to local file...'));
const file = fs.createWriteStream(newpath);
https.get(epSource.url, function(response) {
response.pipe(file);
// after download completed close filestream
file.on("finish", () => {
file.close();
console.log(chalk.green(`done!\nFile located at ${newpath}`));
});
});
// if (epSource.isM3U8) {
// m3u8stream(epSource.url).pipe(fs.createWriteStream(newpath));
// }
console.log(chalk.green('done!'));
} catch (err) {
console.error(err);
return console.log(chalk.red(`ERROR: ${err.message}\n\nTask aborted`));
}
}
async function getSearchTerm(name, episode = null) {
return new Promise(async (resolve) => {
console.log(chalk.green('Fetching data'));
var url = `https://api.consumet.org/anime/crunchyroll/${name}`;
// try {
// const response = await axios.get(url);
// const { data } = response;
// return resolve(data);
// } catch (err) {
// console.log(chalk.red(`ERROR: ${err.message}\n\nTrying backup method...`));
// }
//Backup section
url = `https://api.consumet.org/anime/9anime/${name}`;
try {
const { data } = await axios.get(url);
getAnime9(data.results[0].id, episode);
// return resolve(data);
} catch (err) {
console.log(chalk.red(`ERROR: ${err.message}\n\nTask aborted`));
}
});
}
async function getUrl(name, episode = null) {
const animeTerm = await getSearchTerm(name, episode);
return console.log(animeTerm);
const animeEpisode = animeTerm.episodesList.find((a) => (a.episodeNum == episode));
console.log(animeEpisode);
fetch(`https://api.consumet.stream/vidcdn/watch/${animeEpisode.episodeId}`)
.then((response) => response.json())
.then((animelist) => console.log(animelist));
}
// fetch(`https://gogoanime.consumet.stream/search?keyw=${"jojo"}`)
// .then((response) => response.json())
// .then((animelist) => console.log(animelist));
async function getAnime(name, subcommand, episode = null) {
switch (subcommand) {
default: getUrl(name, episode);
}
}
/**
* @param {Array<String>} command
* @returns
*/
export default async function animeMain(command) {
const apath = getJSON("apath");
if (!apath) {
const apath = await askUserQuery("Please specify a path to save to\n");
if (!apath || (apath === path.basename(apath))) {
return console.log(chalk.red('Incorrect path!'));
}
setJSON("apath", apath);
}
const nameOpt = command.find((o) => (o.indexOf('name=') != -1));
const subCommandOpt = command.find((o) => (o.indexOf('option=') != -1));
const episodeOpt = command.find((o) => (o.indexOf('episode=') != -1));
if (command.length == 0 || nameOpt.length == 0) {
console.log(chalk.red("Please specify an anime title!"));
return false;
}
console.log(episodeOpt);
const name = nameOpt.split('=')[1];
const subCommand = (subCommandOpt && subCommandOpt.length != 0) ? subCommandOpt.split('=')[1] : null;
const episode = (episodeOpt && episodeOpt.length != 0) ? Number(episodeOpt.split('=')[1]) : null;
getAnime(name, subCommand, episode);
return true;
// m3u8stream('http://somesite.com/link/to/the/playlist.m3u8')
// .pipe(fs.createWriteStream('videofile.mp4'));
}
+17
View File
@@ -0,0 +1,17 @@
import chalk from "chalk";
export default function generateQuery(context) {
var query;
if (context == "animeep") {
query = "To dump all data enter ";
query += chalk.red("dumpdata");
query += `\nTo get the anime description enter ${chalk.green("desc")}`;
query += "\nTo dump episode data enter ";
query += chalk.yellow("episodes-all");
query += ", therwise, enter the " + chalk.yellow("episode number\n");
query += chalk.italic("Note: to compile with an episode number use");
query += chalk.blueBright(" --anime name=\"name\" episode=#\n");
}
return query;
}
+12
View File
@@ -0,0 +1,12 @@
import chalk from "chalk"
const commandList = ['anime <name="string", option="string">']
export default function help(subcommand = []) {
if (subcommand.length != 0) {
console.log(chalk.green(commandList[commandList.indexOf(subcommand)]))
} else {
for (const i of commandList) {
console.log(chalk.cyanBright(i));
}
}
}
+34
View File
@@ -0,0 +1,34 @@
#!/usr/bin/env node
import chalk from 'chalk';
import { getAndParse } from './startup/getAndParseArgs.js';
import animeMain from './anime/getAndSave.js';
import help from './help.js'
function executeCommand(command, content = null) {
return new Promise((resolve) => {
switch(command) {
case 'help': help(content);
resolve(true);
break;
case 'anime': resolve(animeMain(content));
break;
default: console.log(chalk.red("Unknown command! try using"), chalk.red.bold("ion --help"));
resolve(false);
}
});
}
async function main() {
const args = await getAndParse();
for (const i in args) {
// console.log(chalk.blue(i) + ": " + args[i])
const worked = await executeCommand(i, args[i]);
if (!worked) break;
}
}
main();
+417
View File
@@ -0,0 +1,417 @@
{
"name": "ion",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ion",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"axios": "^1.3.4",
"boxen": "4.0",
"chalk": "2.4",
"m3u8stream": "^0.8.6",
"readline": "^1.3.0"
},
"bin": {
"ion": "main.js"
}
},
"node_modules/ansi-align": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
"integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
"dependencies": {
"string-width": "^4.1.0"
}
},
"node_modules/ansi-align/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-align/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"node_modules/ansi-align/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-align/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-align/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-regex": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
"engines": {
"node": ">=6"
}
},
"node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/axios": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz",
"integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
"dependencies": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/boxen": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/boxen/-/boxen-4.0.0.tgz",
"integrity": "sha512-gBklgJ9hxaEG8AvEq6JmHns0qQh7JS0uRQtpk4r0OW9AJFKfvP0PVoltH0xzZt/OIio2Iy48xkiV3OaIun7GUw==",
"dependencies": {
"ansi-align": "^3.0.0",
"camelcase": "^5.3.1",
"chalk": "^2.4.2",
"cli-boxes": "^2.2.0",
"string-width": "^3.1.0",
"term-size": "^2.1.0",
"type-fest": "^0.5.2",
"widest-line": "^3.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"engines": {
"node": ">=6"
}
},
"node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/cli-boxes": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
"integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
},
"node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/follow-redirects": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"engines": {
"node": ">=4"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
"engines": {
"node": ">=4"
}
},
"node_modules/m3u8stream": {
"version": "0.8.6",
"resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz",
"integrity": "sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==",
"dependencies": {
"miniget": "^4.2.2",
"sax": "^1.2.4"
},
"engines": {
"node": ">=12"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/miniget": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.2.tgz",
"integrity": "sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA==",
"engines": {
"node": ">=12"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/readline": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz",
"integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg=="
},
"node_modules/sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"node_modules/string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dependencies": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dependencies": {
"ansi-regex": "^4.1.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/term-size": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
"integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/type-fest": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz",
"integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==",
"engines": {
"node": ">=6"
}
},
"node_modules/widest-line": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
"integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
"dependencies": {
"string-width": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/widest-line/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"engines": {
"node": ">=8"
}
},
"node_modules/widest-line/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"node_modules/widest-line/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"engines": {
"node": ">=8"
}
},
"node_modules/widest-line/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/widest-line/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
}
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"name": "ion",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "ION606",
"license": "ISC",
"bin": {
"ion": "./main.js"
},
"dependencies": {
"axios": "^1.3.4",
"boxen": "4.0",
"chalk": "2.4",
"m3u8stream": "^0.8.6",
"readline": "^1.3.0"
},
"type": "module"
}
+25
View File
@@ -0,0 +1,25 @@
/**
* @returns { Promise<Array<String>>}
*/
export function getAndParse() {
return new Promise((resolve) => {
const argsRaw = [...process.argv].slice(2);
const args = {};
// const keys = {};
// for (const i of argsRaw) {
// if (i.indexOf('--') !== -1) {
// keys[i.split('--')[1]] = argsRaw.indexOf(i)
// }
// }
const keys = argsRaw.join(" ").split("--");
for (const i of keys) {
if (i.length == 0) continue;
const splitContent = i.split(" ");
args[splitContent[0]] = splitContent.slice(1);
}
return resolve(args);
});
}
+32
View File
@@ -0,0 +1,32 @@
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
export function getJSON(key) {
const p = path.resolve(__dirname, "../config.json");
const data = fs.readFileSync(p, 'utf8');
const obj = JSON.parse(data);
return obj[key];
}
export function setJSON(key, val) {
return new Promise((resolve, reject) => {
const p = path.resolve(__dirname, "../config.json");
const data = fs.readFileSync(p, 'utf8');
var obj = JSON.parse(data); //now it an object
obj[key] = val; //add some data
const json = JSON.stringify(obj); //convert it back to json
fs.writeFile(p, json, (err) => {
if (err) { return reject(err); }
resolve();
}); // write it back
});
}