UNPKG

@irfanshadikrishad/anilist

Version:

Minimalist unofficial AniList CLI for Anime and Manga Enthusiasts

238 lines (237 loc) 8.63 kB
#!/usr/bin/env node var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { Command } from "commander"; import process from "process"; import { Auth, Social } from "./helpers/auth.js"; import { AniList } from "./helpers/lists.js"; import { getCurrentPackageVersion } from "./helpers/workers.js"; const cli = new Command(); cli .name("anilist") .description("Minimalist unofficial AniList CLI for Anime and Manga Enthusiasts.") .version(getCurrentPackageVersion()); cli .command("login") .description("Login with AniList") .requiredOption("-i, --id <number>", null) .requiredOption("-s, --secret <string>", null) .action((_a) => __awaiter(void 0, [_a], void 0, function* ({ id, secret }) { if (id && secret) { yield Auth.Login(id, secret); } else { console.log("\nMust provide both ClientId and ClientSecret!"); } })); cli .command("whoami") .description("Get details of the logged in user") .action(() => __awaiter(void 0, void 0, void 0, function* () { yield Auth.Myself(); })); cli .command("trending") .alias("tr") .description("Get the trending list from AniList") .option("-c, --count <number>", "Number of list items to get", "10") .action((_a) => __awaiter(void 0, [_a], void 0, function* ({ count }) { yield AniList.getTrendingAnime(Number(count)); })); cli .command("popular") .alias("plr") .description("Get the popular list from AniList") .option("-c, --count <number>", "Number of list items to get", "10") .action((_a) => __awaiter(void 0, [_a], void 0, function* ({ count }) { yield AniList.getPopularAnime(Number(count)); })); cli .command("user <username>") .description("Get user information") .action((username) => __awaiter(void 0, void 0, void 0, function* () { yield AniList.getUserByUsername(username); })); cli .command("logout") .description("Log out the current user.") .action(() => __awaiter(void 0, void 0, void 0, function* () { yield Auth.Logout(); })); cli .command("lists") .alias("ls") .description("Get anime or manga list of authenticated user.") .option("-a, --anime", "For anime list of authenticated user", false) .option("-m, --manga", "For manga list of authenticated user", false) .action((_a) => __awaiter(void 0, [_a], void 0, function* ({ anime, manga }) { if ((!anime && !manga) || (anime && manga)) { console.error(`\nMust select an option, either --anime or --manga`); } else if (anime) { yield AniList.MyAnime(); } else if (manga) { yield AniList.MyManga(); } })); cli .command("delete") .alias("del") .description("Delete entire collections of anime or manga") .option("-a, --anime", "For anime list of authenticated user", false) .option("-m, --manga", "For manga list of authenticated user", false) .option("-s, --activity", "For activity of authenticated user", false) .action((_a) => __awaiter(void 0, [_a], void 0, function* ({ anime, manga, activity }) { const selectedOptions = [anime, manga, activity].filter(Boolean).length; if (selectedOptions === 0) { console.error(`\nMust select one option: either --anime, --manga, or --activity`); process.exit(1); } if (selectedOptions > 1) { console.error(`\nOnly one option can be selected at a time: --anime, --manga, or --activity`); process.exit(1); } if (anime) { yield Auth.DeleteMyAnimeList(); } else if (manga) { yield Auth.DeleteMyMangaList(); } else if (activity) { yield Auth.DeleteMyActivities(); } })); cli .command("upcoming") .alias("up") .description("Anime that will be released in upcoming season") .option("-c, --count <number>", "Number of items to get", "10") .action((_a) => __awaiter(void 0, [_a], void 0, function* ({ count }) { yield AniList.getUpcomingAnime(Number(count)); })); cli .command("anime <id>") .description("Get anime details by their ID") .action((id) => __awaiter(void 0, void 0, void 0, function* () { if (id && !Number.isNaN(Number(id))) { yield AniList.getAnimeDetailsByID(Number(id)); } else { console.error(`\nInvalid or missing ID (${id}). Please provide a valid numeric ID.`); } })); cli .command("manga <id>") .description("Get manga details by their ID") .option("-c, --count <number>", "Number of items to get", "10") .action((id) => __awaiter(void 0, void 0, void 0, function* () { yield AniList.getMangaDetailsByID(id); })); cli .command("search <query>") .alias("srch") .alias("find") .description("Search anime or manga.") .option("-a, --anime", "To get the anime search results.", false) .option("-m, --manga", "To get the manga search results.", false) .option("-c, --count <number>", "Number of search results to show.", "10") .action((query_1, _a) => __awaiter(void 0, [query_1, _a], void 0, function* (query, { anime, manga, count }) { if ((!anime && !manga) || (anime && manga)) { console.error(`\nMust select an option, either --anime or --manga`); } else { if (anime) { yield AniList.searchAnime(query, Number(count)); } else if (manga) { yield AniList.searchManga(query, Number(count)); } else { console.error(`\nMust select an option, either --anime or --manga`); } } })); cli .command("status <status>") .alias("post") .alias("write") .description("Write a status...") .action((status) => __awaiter(void 0, void 0, void 0, function* () { yield Auth.Write(status); })); cli .command("export") .alias("exp") .description("Export your anime or manga list.") .option("-a, --anime", "To get the anime search results.", false) .option("-m, --manga", "To get the manga search results.", false) .action((_a) => __awaiter(void 0, [_a], void 0, function* ({ anime, manga }) { if ((!anime && !manga) || (anime && manga)) { console.error(`\nMust select an option, either --anime or --manga`); } else { if (anime) { yield AniList.exportAnime(); } else if (manga) { yield AniList.exportManga(); } } })); cli .command("import") .alias("imp") .description("Import your anime or manga from anilist or other sources.") .option("-a, --anime", "To get the anime search results.", false) .option("-m, --manga", "To get the manga search results.", false) .action((_a) => __awaiter(void 0, [_a], void 0, function* ({ anime, manga }) { if ((!anime && !manga) || (anime && manga)) { console.error(`\nMust select an option, either --anime or --manga`); } else { if (yield Auth.isLoggedIn()) { if (anime) { yield Auth.callAnimeImporter(); } else if (manga) { yield Auth.callMangaImporter(); } } else { console.error(`\nPlease login to use this feature.`); } } })); cli .command("social") .alias("sol") .description("Automate your process") .option("-f, --follow", "Follow the user whos following you.", false) .option("-u, --unfollow", "Unfollow the user whos not following you.", false) .action((_a) => __awaiter(void 0, [_a], void 0, function* ({ follow, unfollow }) { if (!follow && !unfollow) { console.error(`\nMust select an option, either --follow or --unfollow`); } else { if (yield Auth.isLoggedIn()) { if (follow) { yield Social.follow(); } else if (unfollow) { yield Social.unfollow(); } } else { console.error(`\nPlease login to use this feature.`); } } })); cli.parse(process.argv);