ani-cli-npm 1.3.1 → 1.4.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/README.MD +5 -2
- package/bin/index.js +107 -55
- package/image.png +0 -0
- package/mpv.js +17 -7
- package/package.json +8 -2
- package/video.mp4 +0 -0
package/README.MD
CHANGED
|
@@ -19,7 +19,10 @@ npx ani-cli-npm@latest
|
|
|
19
19
|
```
|
|
20
20
|
pkg install nodejs
|
|
21
21
|
```
|
|
22
|
-
#### - Run
|
|
22
|
+
#### - Run
|
|
23
|
+
```
|
|
24
|
+
npx ani-cli-npm@latest
|
|
25
|
+
```
|
|
23
26
|
##### Note: At preset (1.0.6), you will need to change the player to browser, and will have to do any downloads through your browser of choice.
|
|
24
27
|
|
|
25
28
|
### Linux:
|
|
@@ -64,4 +67,4 @@ npx ani-cli-npm@latest
|
|
|
64
67
|
|
|
65
68
|
### This project is still somewhat under development, as such, there are a few bugs you may run into. Feel free to open an issue on github, though there is a solid chance I am aware of it and just havn't gotten round to fixing it yet.
|
|
66
69
|
|
|
67
|
-
## Happy watching :)
|
|
70
|
+
## Happy watching :)
|
package/bin/index.js
CHANGED
|
@@ -19,6 +19,10 @@ const open = require("open")
|
|
|
19
19
|
const prompt = require("simple-input");
|
|
20
20
|
const getAppDataPath = require("appdata-path")
|
|
21
21
|
const fs = require("fs")
|
|
22
|
+
const downloadsFolder = require('downloads-folder');
|
|
23
|
+
const dl = require("download-file-with-progressbar");
|
|
24
|
+
|
|
25
|
+
|
|
22
26
|
|
|
23
27
|
let config = {
|
|
24
28
|
player: "BROWSER",
|
|
@@ -28,7 +32,8 @@ let config = {
|
|
|
28
32
|
episode_number: 0,
|
|
29
33
|
anime_id: "",
|
|
30
34
|
episodes: []
|
|
31
|
-
}
|
|
35
|
+
},
|
|
36
|
+
download_folder: downloadsFolder()
|
|
32
37
|
}
|
|
33
38
|
|
|
34
39
|
|
|
@@ -36,18 +41,11 @@ function read_config(){
|
|
|
36
41
|
try{
|
|
37
42
|
try {
|
|
38
43
|
config = JSON.parse(fs.readFileSync(getAppDataPath() + "/ani-cli-npm.conf")) //getAppDataPath()
|
|
39
|
-
if (!config.hasOwnProperty("player"))
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (!config.hasOwnProperty("
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
if (!config.hasOwnProperty("proxy")) {
|
|
46
|
-
config.user_agent = ""
|
|
47
|
-
}
|
|
48
|
-
if (!config.hasOwnProperty("most_recent")) {
|
|
49
|
-
config.most_recent = null
|
|
50
|
-
}
|
|
44
|
+
if (!config.hasOwnProperty("player")) config.player = "BROWSER";
|
|
45
|
+
if (!config.hasOwnProperty("user_agent")) config.user_agent = "Mozilla/5.0 (X11; Linux x86_64; rv:99.0) Gecko/20100101 Firefox/100.0";
|
|
46
|
+
if (!config.hasOwnProperty("proxy")) config.user_agent = "";
|
|
47
|
+
if (!config.hasOwnProperty("most_recent")) config.most_recent = null;
|
|
48
|
+
if(!config.download_folder) config.download_folder = downloadsFolder();
|
|
51
49
|
fs.writeFileSync(getAppDataPath() + "/ani-cli-npm.conf", JSON.stringify(config))
|
|
52
50
|
} catch {
|
|
53
51
|
fs.writeFileSync(getAppDataPath() + "/ani-cli-npm.conf", JSON.stringify(config))
|
|
@@ -216,8 +214,28 @@ async function episode_list(anime_id){
|
|
|
216
214
|
return json
|
|
217
215
|
}
|
|
218
216
|
|
|
219
|
-
|
|
220
|
-
console.log(colors.Red, "
|
|
217
|
+
function download(link, file_name){
|
|
218
|
+
console.log(colors.Red, "Warning: Animixplay will download an m3u8 file. This will require some extra steps to play. It is advised to use a 3rd party website or tool to download these from the link.")
|
|
219
|
+
let option = {
|
|
220
|
+
filename: link.includes("m3u8") ? file_name.replace("mp4", "m3u8") : file_name,
|
|
221
|
+
dir: config.download_folder,
|
|
222
|
+
onDone: (info)=>{
|
|
223
|
+
console.log(colors.Green, `\n -- Download finished -- \nLocation: ${info.path}\nSize: ${Math.round(info.size/100000)*10} Bytes`);
|
|
224
|
+
return 0;
|
|
225
|
+
},
|
|
226
|
+
onError: (err) => {
|
|
227
|
+
console.log(colors.Red, 'error', err);
|
|
228
|
+
},
|
|
229
|
+
onProgress: (curr, total) => {
|
|
230
|
+
process.stdout.clearLine(0);
|
|
231
|
+
process.stdout.cursorTo(0);
|
|
232
|
+
process.stdout.write(('\x1b[32m -- progress '+ (curr / total * 100).toFixed(2) + '% -- \x1b[0m'));
|
|
233
|
+
},
|
|
234
|
+
}
|
|
235
|
+
console.log(colors.White, `${option.dir}/${option.filename}`)
|
|
236
|
+
|
|
237
|
+
return dl(link, option);
|
|
238
|
+
|
|
221
239
|
}
|
|
222
240
|
|
|
223
241
|
async function selection(options, prompt, extra_options = []){
|
|
@@ -311,7 +329,7 @@ async function generate_link(provider, id){
|
|
|
311
329
|
}
|
|
312
330
|
}
|
|
313
331
|
|
|
314
|
-
async function post_play(link, anime){
|
|
332
|
+
async function post_play(link, anime, player = null){
|
|
315
333
|
while (true){
|
|
316
334
|
config.most_recent = anime
|
|
317
335
|
write_config()
|
|
@@ -320,41 +338,43 @@ async function post_play(link, anime){
|
|
|
320
338
|
console.log(colors.Cyan, "1/l) Show Link")
|
|
321
339
|
console.log(colors.Cyan, "2/n) Next Episode")
|
|
322
340
|
console.log(colors.Cyan, "3/p) Prev Episode")
|
|
323
|
-
console.log(colors.Cyan, "4/
|
|
324
|
-
|
|
341
|
+
console.log(colors.Cyan, "4/d) Download")
|
|
342
|
+
console.log(colors.Cyan, "5/q) Quit")
|
|
343
|
+
switch (await selection(5, "select;", ["l", "n", "p", "d", "q"])){
|
|
325
344
|
case "l":
|
|
326
345
|
case "1":
|
|
327
|
-
console.clear()
|
|
328
|
-
console.log(colors.Blue, "ANI-CLI-NPM \n")
|
|
329
346
|
console.log(colors.Yellow, "Link: "+link)
|
|
330
347
|
break
|
|
331
348
|
case "n":
|
|
332
349
|
case "2":
|
|
333
350
|
if (anime.episode_number > anime.episodes.length-2){
|
|
334
|
-
console.clear()
|
|
335
351
|
console.log(colors.Red, "Damn, all out of episodes?")
|
|
336
352
|
break
|
|
337
353
|
}
|
|
338
354
|
anime.episode_number += 1
|
|
339
355
|
link = await get_video_link(anime.episodes[anime.episode_number])
|
|
340
|
-
await play(link, anime)
|
|
356
|
+
await play(link, anime, player)
|
|
341
357
|
process.exit()
|
|
342
358
|
break
|
|
343
359
|
//EVEN MORE NEEDLESS QUIT STATEMENTS!!!!!!
|
|
344
360
|
case "p":
|
|
345
361
|
case "3":
|
|
346
362
|
if (anime.episode_number < 2){
|
|
347
|
-
console.clear()
|
|
348
363
|
console.log(colors.Red, "Error; Episode 0 is only available for premium members")
|
|
349
364
|
break
|
|
350
365
|
}
|
|
351
366
|
anime.episode_number -= 1
|
|
352
367
|
link = await get_video_link(anime.episodes[anime.episode_number])
|
|
353
|
-
await play(link, anime)
|
|
368
|
+
await play(link, anime, player)
|
|
354
369
|
process.exit()
|
|
355
370
|
break
|
|
356
|
-
case "
|
|
371
|
+
case "d":
|
|
357
372
|
case "4":
|
|
373
|
+
console.log(colors.Yellow, "Beware of the dysfunctional await clause.")
|
|
374
|
+
await download(link, anime.anime_id+(anime.episode_number+1)+".mp4")
|
|
375
|
+
break
|
|
376
|
+
case "q":
|
|
377
|
+
case "5":
|
|
358
378
|
console.clear()
|
|
359
379
|
await main()
|
|
360
380
|
process.exit()
|
|
@@ -363,20 +383,34 @@ async function post_play(link, anime){
|
|
|
363
383
|
}
|
|
364
384
|
}
|
|
365
385
|
|
|
366
|
-
async function play(link, anime){
|
|
386
|
+
async function play(link, anime, player){
|
|
367
387
|
console.clear()
|
|
368
388
|
console.log(colors.Blue, "ANI-CLI-NPM \n")
|
|
369
389
|
if (config.player === "VLC"){
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
390
|
+
if (!player){
|
|
391
|
+
console.log(colors.Yellow, "Loading VLC... ")
|
|
392
|
+
player = new PlayerController({
|
|
393
|
+
app: 'vlc',
|
|
394
|
+
args: ['--fullscreen'],
|
|
395
|
+
media: link
|
|
396
|
+
});
|
|
397
|
+
await player.launch(err => {
|
|
398
|
+
if (err) return console.error(err.message);
|
|
399
|
+
});
|
|
400
|
+
}else{
|
|
401
|
+
player.quit()
|
|
402
|
+
console.log(colors.Yellow, "Loading VLC... ")
|
|
403
|
+
player = new PlayerController({
|
|
404
|
+
app: 'vlc',
|
|
405
|
+
args: ['--fullscreen'],
|
|
406
|
+
media: link
|
|
407
|
+
});
|
|
408
|
+
await player.launch(err => {
|
|
409
|
+
if (err) return console.error(err.message);
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
await post_play(link, anime, player)
|
|
380
414
|
process.exit()
|
|
381
415
|
|
|
382
416
|
|
|
@@ -386,23 +420,26 @@ async function play(link, anime){
|
|
|
386
420
|
await post_play(link, anime)
|
|
387
421
|
process.exit()
|
|
388
422
|
}else if (config.player === "MPV"){
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
423
|
+
if (!player){
|
|
424
|
+
console.log(colors.Yellow, "Loading MPV... ")
|
|
425
|
+
player = new PlayerController({
|
|
426
|
+
app: 'mpv',
|
|
427
|
+
args: ['--fullscreen'],
|
|
428
|
+
media: link
|
|
429
|
+
});
|
|
430
|
+
await player.launch(err => {
|
|
431
|
+
if (err) return console.error(err.message);
|
|
432
|
+
});
|
|
433
|
+
}else{
|
|
434
|
+
player.load(link)
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
await post_play(link, anime, player)
|
|
399
438
|
process.exit()
|
|
400
439
|
}
|
|
401
440
|
}
|
|
402
441
|
|
|
403
442
|
async function search(){
|
|
404
|
-
console.clear()
|
|
405
|
-
console.log(colors.Blue, "ANI-CLI-NPM \n")
|
|
406
443
|
console.log(colors.Magenta, "Search...")
|
|
407
444
|
let choice = await input("")
|
|
408
445
|
let anime = await process_search(choice)
|
|
@@ -411,8 +448,6 @@ async function search(){
|
|
|
411
448
|
|
|
412
449
|
console.log(colors.Blue, "Indexing video...")
|
|
413
450
|
let link = await get_video_link(anime.episodes[anime.episode_number])
|
|
414
|
-
console.clear()
|
|
415
|
-
console.log(colors.Blue, "ANI-CLI-NPM \n")
|
|
416
451
|
if (!link){
|
|
417
452
|
console.log(colors.Red, "Np link for this episode found?")
|
|
418
453
|
console.log(colors.Yellow, "^ at current this is due to not all of the required video repos being implemented.")
|
|
@@ -427,19 +462,37 @@ async function search(){
|
|
|
427
462
|
console.log(colors.Cyan, "2/d) Download")
|
|
428
463
|
console.log(colors.Cyan, "3/l) Show Link")
|
|
429
464
|
console.log(colors.Cyan, "4/q) quit")
|
|
430
|
-
choice = (await selection(4, "select;", "p", "d", "l", "q"))
|
|
465
|
+
choice = (await selection(4, "select;", ["p", "d", "l", "q"]))
|
|
431
466
|
switch (choice){
|
|
432
467
|
case "p":
|
|
433
468
|
case "1":
|
|
434
|
-
await play(link, anime)
|
|
469
|
+
await play(link, anime, null)
|
|
435
470
|
break
|
|
436
471
|
case "d":
|
|
437
472
|
case "2":
|
|
438
|
-
await download(link, anime.anime_id+anime.episode_number+".mp4")
|
|
473
|
+
await download(link, anime.anime_id+(anime.episode_number+1)+".mp4")
|
|
439
474
|
break
|
|
440
475
|
case "l":
|
|
441
476
|
case "3":
|
|
442
477
|
console.log(colors.Yellow, "Link: "+link)
|
|
478
|
+
console.log(colors.Cyan, "\n1/p) Play")
|
|
479
|
+
console.log(colors.Cyan, "2/d) Download")
|
|
480
|
+
console.log(colors.Cyan, "3/q) quit")
|
|
481
|
+
choice = (await selection(3, "select;", ["p", "d", "q"]))
|
|
482
|
+
switch (choice){
|
|
483
|
+
case "p":
|
|
484
|
+
case "1":
|
|
485
|
+
await play(link, anime, null)
|
|
486
|
+
break
|
|
487
|
+
case "d":
|
|
488
|
+
case "2":
|
|
489
|
+
await download(link, anime.anime_id+anime.episode_number+".mp4")
|
|
490
|
+
break
|
|
491
|
+
case "q":
|
|
492
|
+
case "3":
|
|
493
|
+
await main()
|
|
494
|
+
process.exit()
|
|
495
|
+
}
|
|
443
496
|
break
|
|
444
497
|
case "q":
|
|
445
498
|
case "4":
|
|
@@ -519,5 +572,4 @@ async function main(){
|
|
|
519
572
|
}
|
|
520
573
|
|
|
521
574
|
|
|
522
|
-
main()
|
|
523
|
-
|
|
575
|
+
main()
|
package/image.png
ADDED
|
Binary file
|
package/mpv.js
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
|
-
const
|
|
1
|
+
const dl = require('download-file-with-progressbar');
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
option = {
|
|
4
|
+
filename: 'video.mp4',
|
|
5
|
+
dir: '.',
|
|
6
|
+
onDone: (info)=>{
|
|
7
|
+
console.log('done', info);
|
|
8
|
+
},
|
|
9
|
+
onError: (err) => {
|
|
10
|
+
console.log('error', err);
|
|
11
|
+
},
|
|
12
|
+
onProgress: (curr, total) => {
|
|
13
|
+
process.stdout.clearLine(0);
|
|
14
|
+
process.stdout.cursorTo(0);
|
|
15
|
+
process.stdout.write(('\x1b[32m -- progress '+ (curr / total * 100).toFixed(2) + '% -- \x1b[0m'));
|
|
16
|
+
},
|
|
17
|
+
}
|
|
7
18
|
|
|
8
|
-
|
|
9
|
-
player.load("https://wwwx13.gogocdn.stream/videos/hls/l7dItSAxiTBxQMRxKVtoHQ/1669069114/114212/012ef98641ababee475564c70e8ebc93/ep.43.1662459121.m3u8")
|
|
19
|
+
var dd = dl('https://fvs.io/redirector?token=YWJSTUxWYW51UUFQS0dEVlZITHBKejQwbkZkOXJYSWdidnFkU3B1RnVPaVlPclhXbjRlNTVwQS9tclB0Rm1ZUzlNV1FIM2RJM2hOZXkyZmMycHFFUU5Hc0hHZCtHU2MxTWN2andnS2xWUGl3bjVVSnBibUhueTRJVTRuT1Jnbk5TRjRQRVFITERJL0svTVI1QkpTVG10Z0FNQnQvTWZxQ3FCZz06SUVYYjJQMzNUSjhGdE8zQmx5QjdmUT09H57e', option);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ani-cli-npm",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "ani-cli tool rewritten as npm package",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -16,7 +16,11 @@
|
|
|
16
16
|
"anime",
|
|
17
17
|
"ani-cli",
|
|
18
18
|
"anime",
|
|
19
|
-
"client"
|
|
19
|
+
"client",
|
|
20
|
+
"weeb",
|
|
21
|
+
"sad-weeb",
|
|
22
|
+
"video",
|
|
23
|
+
"download"
|
|
20
24
|
],
|
|
21
25
|
"author": "bumpkin-pi",
|
|
22
26
|
"license": "ISC",
|
|
@@ -25,6 +29,8 @@
|
|
|
25
29
|
},
|
|
26
30
|
"dependencies": {
|
|
27
31
|
"appdata-path": "^1.0.0",
|
|
32
|
+
"download-file-with-progressbar": "^1.2.3",
|
|
33
|
+
"downloads-folder": "^3.0.3",
|
|
28
34
|
"media-player-controller": "^1.5.3",
|
|
29
35
|
"node-fetch": "^2.6.6",
|
|
30
36
|
"open": "^8.4.0",
|
package/video.mp4
ADDED
|
Binary file
|