commit a1db1a1400f7fcf82e6a8a59580d91a458e4177b Author: ION606 Date: Sun Feb 26 15:16:21 2023 -0500 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..16ede70 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +pref.json +config.json diff --git a/anime/9example.txt b/anime/9example.txt new file mode 100644 index 0000000..4622396 --- /dev/null +++ b/anime/9example.txt @@ -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' + } + ] +} \ No newline at end of file diff --git a/anime/getAndSave.js b/anime/getAndSave.js new file mode 100644 index 0000000..4237586 --- /dev/null +++ b/anime/getAndSave.js @@ -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} + */ +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} 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')); +} \ No newline at end of file diff --git a/anime/userQuery.js b/anime/userQuery.js new file mode 100644 index 0000000..684fe97 --- /dev/null +++ b/anime/userQuery.js @@ -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; +} \ No newline at end of file diff --git a/help.js b/help.js new file mode 100644 index 0000000..050b835 --- /dev/null +++ b/help.js @@ -0,0 +1,12 @@ +import chalk from "chalk" +const commandList = ['anime '] + +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)); + } + } +} \ No newline at end of file diff --git a/main.js b/main.js new file mode 100644 index 0000000..b92c762 --- /dev/null +++ b/main.js @@ -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(); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5509226 --- /dev/null +++ b/package-lock.json @@ -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" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..12882f7 --- /dev/null +++ b/package.json @@ -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" +} diff --git a/startup/getAndParseArgs.js b/startup/getAndParseArgs.js new file mode 100644 index 0000000..2d1456a --- /dev/null +++ b/startup/getAndParseArgs.js @@ -0,0 +1,25 @@ + +/** + * @returns { Promise>} + */ +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); + }); +} diff --git a/utils/JSON.js b/utils/JSON.js new file mode 100644 index 0000000..fb6c67f --- /dev/null +++ b/utils/JSON.js @@ -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 + }); +} \ No newline at end of file