anichi 2.2.6 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 ShDitz
3
+ Copyright (c) 2026 ShDitz
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
21
+ SOFTWARE.
package/README.md CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  <div align="center">
4
4
 
5
- ![Version](https://img.shields.io/badge/version-2.2.3-blue.svg)
5
+ ![Version](https://img.shields.io/badge/version-2.5.0-blue.svg)
6
6
  ![Node](https://img.shields.io/badge/node-%3E%3D16.0.0-green.svg)
7
7
  ![License](https://img.shields.io/badge/license-MIT-orange.svg)
8
8
 
9
- **Ultimate Anime CLI Experience**
9
+ **Streaming Anime CLI By ShDitz**
10
10
 
11
11
  Your modern, feature-rich, and interactive command-line tool for Anime streaming, downloading, and scheduling.
12
12
 
@@ -18,11 +18,16 @@ Your modern, feature-rich, and interactive command-line tool for Anime streaming
18
18
 
19
19
  ## 🌟 Features
20
20
 
21
+ ## 🌟 Features
22
+
21
23
  Anichi is built to provide a premium experience right from your terminal.
22
24
 
23
25
  - **🎨 Modern UI**: Gradient banners, clean tables, and colorful typography using `chalk`, `boxen`, and `figlet`.
24
- - **📅 Interactive Schedule**: View anime airing schedule by day (Senin - Minggu) or search by keyword.
25
- - **🔍 Smart Search**: Quickly find anime by title.
26
+ - **📂 Comprehensive Browsing**:
27
+ - **Ongoing & Completed Anime**: Browse lists with pagination (15 items per page).
28
+ - **Search by Genre**: Filter anime by specific genres.
29
+ - **Schedule**: View anime airing schedule by day (Senin - Minggu).
30
+ - **🔍 Smart Search**: Quickly find anime by title with detailed results.
26
31
  - **📺 Streaming**: Play anime directly with your favorite external media player (MPV, VLC) or fallback to browser.
27
32
  - **⬇️ Downloads**: Support for single episode downloads and **Batch Downloads** with multiple quality and provider options.
28
33
  - **⚡ Performance**: Integrated caching system (`node-cache`) for instant loading of previously accessed data.
@@ -113,11 +118,11 @@ You will be greeted with the main menu banner. From there, you can navigate usin
113
118
 
114
119
  #### 1. Ongoing Anime
115
120
 
116
- Shows currently airing anime with their release day and latest episode.
121
+ Shows currently airing anime with their release day and latest episode. Supports **pagination** for browsing more results.
117
122
 
118
123
  #### 2. Completed Anime
119
124
 
120
- Shows completed anime with their score and last release date.
125
+ Shows completed anime with their score and last release date. Supports **pagination**.
121
126
 
122
127
  #### 3. Search Anime
123
128
 
@@ -125,13 +130,21 @@ Search for any anime by its title.
125
130
 
126
131
  > **Tip**: Type "Naruto" or "One Piece".
127
132
 
128
- #### 4. Schedule Anime
133
+ #### 4. Search by Genre
134
+
135
+ Filter anime by specific genres (Action, Adventure, Comedy, etc.) and browse through **paginated** results.
136
+
137
+ #### 5. Schedule Anime
129
138
 
130
139
  View the broadcast schedule.
131
140
 
132
141
  - **By Number**: Type `1` for Senin, `2` for Selasa, etc.
133
142
  - **By Name**: Type "Senin", "Selasa", or "Minggu" to filter.
134
143
 
144
+ #### 6. FAQ
145
+
146
+ View frequently asked questions and help guides.
147
+
135
148
  ---
136
149
 
137
150
  ### 🎞️ How to Install MPV (Recommended Player)
@@ -156,7 +169,25 @@ choco install mpv
156
169
 
157
170
  #### 3. Verify Installation
158
171
 
159
- Type `mpv` in your terminal. If the player opens, installation is successful. Anichi will automatically detect `C:\Program Files\mpv\mpv.exe` on Windows.
172
+ Type `mpv` in your terminal. If the player opens, installation is successful.
173
+
174
+ ---
175
+
176
+ ### 📼 How to Install yt-dlp (Required for some streams)
177
+
178
+ Some streaming links or sources require `yt-dlp` to fetch the direct video URL. Without it, the player might fail to load certain streams.
179
+
180
+ #### 1. Install yt-dlp using Chocolatey
181
+
182
+ Open **PowerShell** or **CMD** and run:
183
+
184
+ ```bash
185
+ choco install yt-dlp
186
+ ```
187
+
188
+ #### 2. Verify Installation
189
+
190
+ Type `yt-dlp --version` in your terminal. If it outputs a version number, it's installed successfully.
160
191
 
161
192
  ---
162
193
 
package/dist/api.d.ts CHANGED
@@ -1,9 +1,12 @@
1
1
  declare class ApiClient {
2
2
  private client;
3
3
  private cache;
4
+ private lastRequestTime;
4
5
  constructor();
5
6
  private request;
6
7
  getHome(): Promise<any>;
8
+ getOngoing(page?: number): Promise<any>;
9
+ getCompleted(page?: number): Promise<any>;
7
10
  getAnime(slug: string): Promise<any>;
8
11
  getGenre(): Promise<any>;
9
12
  getEpisode(slug: string): Promise<any>;
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAoBA,cAAM,SAAS;IACb,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAY;;YAUX,OAAO;IAwCf,OAAO;IAGP,QAAQ,CAAC,IAAI,EAAE,MAAM;IAGrB,QAAQ;IAGR,UAAU,CAAC,IAAI,EAAE,MAAM;IAGvB,SAAS,CAAC,EAAE,EAAE,MAAM;IAGpB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAGrB,SAAS,CAAC,OAAO,EAAE,MAAM;IAGzB,WAAW;IAIX,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU;IAIlD,UAAU;CAIX;;AAED,wBAA+B"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAwBA,cAAM,SAAS;IACb,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,eAAe,CAAa;;YAUtB,OAAO;IAgDf,OAAO;IAIP,UAAU,CAAC,IAAI,GAAE,MAAU;IAI3B,YAAY,CAAC,IAAI,GAAE,MAAU;IAI7B,QAAQ,CAAC,IAAI,EAAE,MAAM;IAGrB,QAAQ;IAGR,UAAU,CAAC,IAAI,EAAE,MAAM;IAGvB,SAAS,CAAC,EAAE,EAAE,MAAM;IAGpB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAGrB,SAAS,CAAC,OAAO,EAAE,MAAM;IAGzB,WAAW;IAGX,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU;IAIlD,UAAU;CAIX;;AAED,wBAA+B"}
package/dist/api.js CHANGED
@@ -10,8 +10,10 @@ const ui_1 = require("./ui");
10
10
  const BASE_URL = "https://www.sankavollerei.com/anime";
11
11
  const CACHE_TTL = 3600;
12
12
  const MAX_RETRIES = 3;
13
+ const MIN_REQUEST_DELAY = 600;
13
14
  class ApiClient {
14
15
  constructor() {
16
+ this.lastRequestTime = 0;
15
17
  this.client = axios_1.default.create({
16
18
  baseURL: BASE_URL,
17
19
  timeout: 60000,
@@ -19,11 +21,18 @@ class ApiClient {
19
21
  this.cache = new node_cache_1.default({ stdTTL: CACHE_TTL, checkperiod: 600 });
20
22
  }
21
23
  async request(url) {
24
+ const now = Date.now();
25
+ const elapsed = now - this.lastRequestTime;
26
+ if (elapsed < MIN_REQUEST_DELAY) {
27
+ const waitTime = MIN_REQUEST_DELAY - elapsed;
28
+ await new Promise((r) => setTimeout(r, waitTime));
29
+ }
30
+ this.lastRequestTime = now;
22
31
  const cached = this.cache.get(url);
23
32
  if (cached)
24
33
  return cached;
25
34
  const spinner = (0, ora_1.default)({
26
- text: `Fetching ${url}...`,
35
+ text: "Loading data...",
27
36
  color: "cyan",
28
37
  }).start();
29
38
  for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
@@ -35,7 +44,6 @@ class ApiClient {
35
44
  }
36
45
  if (status !== 200)
37
46
  throw new Error(`HTTP ${status}`);
38
- // Hanya simpan jika success (perbaikan sebelumnya)
39
47
  if (data.ok === true || data.status === "success") {
40
48
  this.cache.set(url, data);
41
49
  }
@@ -57,6 +65,12 @@ class ApiClient {
57
65
  async getHome() {
58
66
  return this.request("/home");
59
67
  }
68
+ async getOngoing(page = 1) {
69
+ return this.request(`/ongoing-anime?page=${page}`);
70
+ }
71
+ async getCompleted(page = 1) {
72
+ return this.request(`/complete-anime?page=${page}`);
73
+ }
60
74
  async getAnime(slug) {
61
75
  return this.request(`/anime/${slug}`);
62
76
  }
@@ -78,7 +92,6 @@ class ApiClient {
78
92
  async getSchedule() {
79
93
  return this.request(`/schedule`);
80
94
  }
81
- // Method Baru: Get Anime by Genre with Pagination
82
95
  async getGenreAnime(slug, page = 1) {
83
96
  return this.request(`/genre/${slug}?page=${page}`);
84
97
  }
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,SAAS,EAAC,MAAM,SAAS,CAAC;AAIlC,eAAO,MAAM,eAAe,QAAO,IAIlC,CAAC;AAEF,eAAO,MAAM,UAAU,QAAO,SAW7B,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,QAAQ,SAAS,KAAG,IAG9C,CAAC;AAEF,eAAO,MAAM,aAAa,QAAO,MAAqB,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,SAAS,EAAC,MAAM,SAAS,CAAC;AAMlC,eAAO,MAAM,eAAe,QAAO,IAIlC,CAAC;AAEF,eAAO,MAAM,UAAU,QAAO,SAmB7B,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,QAAQ,SAAS,KAAG,IAO9C,CAAC;AAEF,eAAO,MAAM,aAAa,QAAO,MAAqB,CAAC"}
package/dist/config.js CHANGED
@@ -7,6 +7,7 @@ exports.getConfigPath = exports.saveConfig = exports.loadConfig = exports.ensure
7
7
  const fs_1 = __importDefault(require("fs"));
8
8
  const path_1 = __importDefault(require("path"));
9
9
  const os_1 = __importDefault(require("os"));
10
+ const ui_1 = require("./ui");
10
11
  const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), ".config", "anichi");
11
12
  const CONFIG_FILE = path_1.default.join(CONFIG_DIR, "config.json");
12
13
  const ensureConfigDir = () => {
@@ -22,16 +23,27 @@ const loadConfig = () => {
22
23
  }
23
24
  try {
24
25
  const content = fs_1.default.readFileSync(CONFIG_FILE, "utf-8");
25
- return JSON.parse(content);
26
+ const config = JSON.parse(content);
27
+ if (typeof config !== "object" || config === null) {
28
+ ui_1.logger.warn("Invalid config format, resetting to default.");
29
+ return {};
30
+ }
31
+ return config;
26
32
  }
27
33
  catch (err) {
34
+ ui_1.logger.warn("Corrupt config file found, resetting to default.");
28
35
  return {};
29
36
  }
30
37
  };
31
38
  exports.loadConfig = loadConfig;
32
39
  const saveConfig = (config) => {
33
40
  (0, exports.ensureConfigDir)();
34
- fs_1.default.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
41
+ try {
42
+ fs_1.default.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
43
+ }
44
+ catch (err) {
45
+ ui_1.logger.error(`Failed to save config: ${err.message}`);
46
+ }
35
47
  };
36
48
  exports.saveConfig = saveConfig;
37
49
  const getConfigPath = () => CONFIG_FILE;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAChE,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAElD,MAAM,eAAe,GAAG,GAAS,EAAE;IACxC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC,CAAC;AAJW,QAAA,eAAe,mBAI1B;AAEK,MAAM,UAAU,GAAG,GAAc,EAAE;IACxC,IAAA,uBAAe,GAAE,CAAC;IAClB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAXW,QAAA,UAAU,cAWrB;AAEK,MAAM,UAAU,GAAG,CAAC,MAAiB,EAAQ,EAAE;IACpD,IAAA,uBAAe,GAAE,CAAC;IAClB,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC,CAAC;AAHW,QAAA,UAAU,cAGrB;AAEK,MAAM,aAAa,GAAG,GAAW,EAAE,CAAC,WAAW,CAAC;AAA1C,QAAA,aAAa,iBAA6B"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,6BAA4B;AAE5B,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAChE,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAElD,MAAM,eAAe,GAAG,GAAS,EAAE;IACxC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC,CAAC;AAJW,QAAA,eAAe,mBAI1B;AAEK,MAAM,UAAU,GAAG,GAAc,EAAE;IACxC,IAAA,uBAAe,GAAE,CAAC;IAClB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,WAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YAC5D,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAnBW,QAAA,UAAU,cAmBrB;AAEK,MAAM,UAAU,GAAG,CAAC,MAAiB,EAAQ,EAAE;IACpD,IAAA,uBAAe,GAAE,CAAC;IAClB,IAAI,CAAC;QACH,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,WAAM,CAAC,KAAK,CAAC,0BAA0B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC,CAAC;AAPW,QAAA,UAAU,cAOrB;AAEK,MAAM,aAAa,GAAG,GAAW,EAAE,CAAC,WAAW,CAAC;AAA1C,QAAA,aAAa,iBAA6B"}