Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 84 additions & 72 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,132 +1,147 @@
# aw-cli
<h3 align="center">

Guarda anime dal terminale e molto altro!<br /> Gli anime vengono presi da <a href="https://www.animeworld.tv/">AnimeWorld</a>
**Guarda anime dal terminale e molto altro.**

</h3>
**Gli anime vengono presi da [AnimeWorld](https://www.animeworld.tv/)**

## Anteprima
https://github.com/fexh10/aw-cli/assets/90156014/88e1c2e2-bb7f-4002-8784-26f70861e164

[Guarda l'anteprima su GitHub](https://github.com/fexh10/aw-cli/assets/90156014/88e1c2e2-bb7f-4002-8784-26f70861e164)

## Indice

- [aw-cli](#aw-cli)
- [Anteprima](#anteprima)
- [Indice](#indice)
- [Installazione](#installazione)
- [Linux e macOS](#linux-e-macos)
- [Windows](#windows)
- [Ultima versione (WSL)](#ultima-versione-wsl)
- [Versione Legacy](#versione-legacy)
- [Android](#android)
- [iOS](#ios)
- [Problemi noti](#problemi-noti)
- [Linux / Windows WSL](#linux--windows-wsl)
- [macOS](#macos)
- [Windows Legacy](#windows-legacy)
- [Disinstallazione](#disinstallazione)
- [Utilizzo](#utilizzo)
- [Crediti](#crediti)


## Installazione

Lo script funziona sia con [MPV](https://mpv.io/installation/) che con [VLC](https://www.videolan.org/vlc/index.it.html). <br />
Lo script funziona sia con [MPV](https://mpv.io/installation/) che con [VLC](https://www.videolan.org/vlc/index.it.html).
È richiesta l'installazione di [fzf](https://github.com/junegunn/fzf?tab=readme-ov-file#installation).

È richiesta l'installazione di [fzf](https://github.com/junegunn/fzf?tab=readme-ov-file#installation).<br />
### Linux e macOS

<details><summary><b>Linux, MacOS</b></summary>
È possibile installare aw-cli da pip:
È possibile installare **aw-cli** da `pip`:

```
```sh
python3 -m pip install aw-cli
```
</details>

<details><summary><b>Windows</b></summary>
Attualmente, Windows presenta due versioni: la più recente, progettata per funzionare su WSL (Windows Subsystem for Linux), e una versione Legacy compatibile con PowerShell. La versione Legacy non riceverà ulteriori aggiornamenti, mentre l'altra sarà mantenuta costantemente.

<br>
### Windows

<details><summary><b>Ultima Versione</b></summary>
L'ultima versione per Windows richiede installare <a href="https://learn.microsoft.com/it-it/windows/wsl/install">WSL</a>:
Attualmente Windows presenta due versioni:

```
wsl --install
```
- **Ultima versione** (funziona su [WSL](https://learn.microsoft.com/it-it/windows/wsl/install))
- **Legacy** (compatibile con PowerShell, ma non più aggiornata)

Il programma dovrà essere installato e avviato da WSL:
#### Ultima versione (WSL)

```
```sh
wsl --install
python3 -m pip install aw-cli
```

</details>
<details><summary><b>Versione Legacy</b></summary>
Per installare la versione Legacy, è necessario avere <a href="https://www.git-scm.com/download/win">git</a>.
#### Versione Legacy

Richiede [Git per Windows](https://www.git-scm.com/download/win):

```
```sh
python3 -m pip install git+https://github.com/fexh10/aw-cli.git@winLegacy
```

</details>
</details>
### Android

<details><summary><b>Android</b></summary>
Android richiede l'installazione di <a href="https://github.com/termux/termux-app/releases/tag/v0.118.0">termux</a>. <br>
Richiede [Termux](https://github.com/termux/termux-app/releases/tag/v0.118.0).

```
```sh
pkg update && pkg upgrade
pkg install python python-pip fzf
python3 -m pip install aw-cli
```
</details>

<details><summary><b>iOS</b></summary>
La versione per iOS richiede <a href="https://apps.apple.com/it/app/ish-shell/id1436902243">iSH</a> e <a href="https://apps.apple.com/it/app/vlc-media-player/id650377962">VLC</a>.
### iOS

```
Richiede [iSH](https://apps.apple.com/it/app/ish-shell/id1436902243) e [VLC](https://apps.apple.com/it/app/vlc-media-player/id650377962).

```sh
apk update
apk upgrade
apk add python3 python3-dev py3-pip gcc musl-dev git
python3 -m pip install git+https://github.com/fexh10/aw-cli.git@iosCompatibility
```
Nota che la velocità di download e caricamento molto bassa è un problema di iSH e non di aw-cli.
</details>

## Problemi noti
Se è impossibile avviare `aw-cli`, è possibile che non si abbia la cartella degli script Python aggiunta al path. <br />
> In questo modo è necessario creare e attivare un ambiente virtuale prima di eseguire **aw-cli**.

<details> <summary><b>Linux/Windows WSL</b></summary>
Aggiungere la seguente linea al file di profilo (.bashrc, .zshrc, o altro):
Oppure, in alternativa:

```sh
apk update
apk upgrade
apk add python3 python3-dev py3-pip gcc musl-dev git bash
pip install pipx
pipx install git+https://github.com/fexh10/aw-cli.git@iosCompatibility
```

Prima di avviare **aw-cli**, è consigliato chiudere e riaprire l’app iSH.
La velocità di download e caricamento può essere ridotta a causa di iSH, non di **aw-cli**.

## Problemi noti

Se non riesci ad avviare `aw-cli`, probabilmente la cartella degli script Python non è nel tuo `PATH`.

### Linux / Windows WSL

Aggiungi al tuo `.bashrc` o `.zshrc`:

```sh
export PATH=$PATH:$HOME/.local/bin
```
Riavviare il terminale o eseguire `source ~/.bashrc`.

</details>

<details> <summary><b>MacOS</b></summary>
Aggiungere la seguente linea al file di profilo (.bashrc, .zshrc, o altro):
Poi riavvia il terminale o esegui:

```sh
source ~/.bashrc
```

### macOS

```sh
export PATH=$PATH:$HOME/Library/Python/3.x/bin
```
Sostituire `3.x` con la propria versione di Python. <br>
Riavviare il terminale o eseguire `source ~/.bashrc`.
</details>

<details> <summary><b>Windows Legacy</b></summary>
Inserire da linea di comando:
Sostituisci `3.x` con la tua versione di Python, poi riavvia il terminale.

### Windows Legacy

```sh
setx PATH "%PATH%;%APPDATA%\Local\Programs\Python\Python3x\Scripts"
```
setx PATH "%PATH%;%APPDATA%\Local\Programs\Python\Python3x\Scripts
```
Sostituire `3.x` con la propria versione di Python. <br/>
Se necessario, riavviare il sistema.
</details>

## Disinstallazione
Sostituisci `3x` con la tua versione di Python e riavvia se necessario.

```
## Disinstallazione

```sh
python3 -m pip uninstall aw-cli
```

## Utilizzo
```

```sh
usage: aw-cli [-h] [-v] [-c [{r}]] [-l [{a,s,d,t}]] [-i] [-s] [-d] [-o] [-p] [-u [UPDATE]] [-a]

Guarda anime dal terminale e molto altro!
Expand All @@ -136,23 +151,20 @@ Informazioni:
-v, --versione stampa la versione del programma

Opzioni:
-c [{r}], --cronologia [{r}]
continua a guardare un anime dalla cronologia. 'r' per rimuovere un anime (opzionale)
-l [{a,s,d,t}], --lista [{a,s,d,t}]
lista degli ultimi anime usciti su AnimeWorld. a = all, s = sub, d = dub, t = tendenze. Default 'a'
-c [{r}], --cronologia [{r}] continua a guardare un anime dalla cronologia. 'r' per rimuovere (opzionale)
-l [{a,s,d,t}], --lista [{a,s,d,t}] lista degli ultimi anime usciti. a=all, s=sub, d=dub, t=tendenze
-i, --info visualizza le informazioni e la trama di un anime
-s, --syncplay usa syncplay per guardare un anime insieme ai tuoi amici
-d, --download scarica gli episodi che preferisci
-o, --offline apri gli episodi scaricati precedentemente direttamente dal terminale
-p, --privato guarda un episodio senza che si aggiorni la cronologia o AniList
-u [UPDATE], --update [UPDATE]
aggiorna il programma
-s, --syncplay usa syncplay per guardare un anime con amici
-d, --download scarica gli episodi preferiti
-o, --offline apri episodi scaricati dal terminale
-p, --privato guarda senza aggiornare la cronologia o AniList
-u [UPDATE], --update [UPDATE] aggiorna il programma

Configurazione:
-a, --configurazione avvia il menu di configurazione
-a, --configurazione avvia il menu di configurazione
```

## Crediti
Progetto ispirato a <a href="https://github.com/pystardust/ani-cli">ani-cli</a>.

Un ringraziamento speciale a <a href="https://github.com/axtrat">axtrat</a> per l'aiuto nella realizzazione del progetto.
Progetto ispirato a [ani-cli](https://github.com/pystardust/ani-cli).
Un ringraziamento speciale a [axtrat](https://github.com/axtrat) per l’aiuto nella realizzazione del progetto.
67 changes: 55 additions & 12 deletions awcli/run.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import os
import re
import csv
import shutil
import subprocess
from signal import signal, SIGINT
from concurrent.futures import ThreadPoolExecutor
from pySmartDL import SmartDL
Expand Down Expand Up @@ -36,10 +38,16 @@ def fzf(elementi: list[str], prompt: str = "> ", multi: bool = False, cls: bool
if cls:
ut.my_print("", end="", cls=True)
string = "\n".join(elementi)
comando = f"""fzf --tac --height={len(elementi) + 2} --cycle --ansi --tiebreak=begin --prompt="{prompt}" """
comando_fzf = f"""fzf --tac --height={len(elementi) + 2} --cycle --ansi --tiebreak=begin --prompt="{prompt}" """
if multi:
comando += "--multi --bind 'ctrl-a:toggle-all'"
output = os.popen(f"""printf "{string}" | {comando}""").read().strip()
comando_fzf += "--multi --bind 'ctrl-a:toggle-all'"

comando_completo = f"""printf "{string}" | {comando_fzf}"""

# Esegue fzf, catturando solo lo stdout per ottenere la selezione,
# ma permettendo a fzf di usare stderr per disegnare l'interfaccia utente.
process = subprocess.run(comando_completo, shell=True, stdout=subprocess.PIPE, text=True, check=False)
output = process.stdout.strip()

if esci and output == "":
safeExit()
Expand Down Expand Up @@ -172,11 +180,13 @@ def openSyncplay(url_ep: str, nome_video: str, progress: int) -> tuple[bool, int


args = f'''--force-media-title="{nome_video}" --start="{progress}" --fullscreen --keep-open'''
if ut.configData["player"]["type"] == "vlc":
if ut.configData.get("player", {}).get("type") == "vlc":
args = f'''--meta-title "{nome_video}" --start-time="{progress}" --fullscreen'''

try :
out = os.popen(f'''{ut.configData["syncplay"]["path"]} -d --language it "{url_ep}" -- {args} 2>&1''').read()
try:
command = f'''{ut.configData["syncplay"]["path"]} -d --language it "{url_ep}" -- {args}'''
result = subprocess.run(command, shell=True, capture_output=True, text=True, check=False)
out = result.stdout
except UnicodeDecodeError:
out = ""

Expand Down Expand Up @@ -212,9 +222,11 @@ def openMPV(url_ep: str, nome_video: str, progress: int) -> tuple[bool, int]:
os.system(f'''am start --user 0 -a android.intent.action.VIEW -d "{url_ep}" -n is.xyz.mpv/.MPVActivity > /dev/null 2>&1''')
return True, 0

out = os.popen(f'''{ut.configData["player"]["path"]} "{url_ep}" --force-media-title="{nome_video}" --start="{progress}" --fullscreen --keep-open 2>&1''')
command = f'''{ut.configData["player"]["path"]} "{url_ep}" --force-media-title="{nome_video}" --start="{progress}" --fullscreen --keep-open'''
result = subprocess.run(command, shell=True, capture_output=True, text=True, check=False)
out = result.stdout

res = re.findall(r'(\d+):(\d+):(\d+) / [\d:]+ \((\d+)%\)', out.read())[-1]
res = re.findall(r'(\d+):(\d+):(\d+) / [\d:]+ \((\d+)%\)', out)[-1]
progress = (int(res[0]) * 3600) + (int(res[1]) * 60) + int(res[2])

return int(res[3]) >= completeLimit, progress
Expand Down Expand Up @@ -439,7 +451,18 @@ def setupConfig() -> None:
ut.my_print("", end="", cls=True)
ut.my_print("AW-CLI - CONFIGURAZIONE", color="giallo")

player = "vlc"
if ut.nome_os not in ["Android", "iOS"]:
player = fzf(["vlc", "mpv"], "Scegli il player che vuoi utilizzare")
ut.configData["player"]["type"] = player

player_type = ut.configData["player"]["type"]
path = shutil.which(player_type)

if not path:
ut.my_print(f"Percorso di {player_type} non trovato, inseriscilo manualmente.", color="giallo")
ut.configData["player"]["path"] = ut.my_input(f"Path di {player_type}")
else:
ut.configData["player"]["path"] = path

#anilist
if fzf(["sì","no"], "Aggiornare automaticamente la watchlist con AniList? ") == "sì":
Expand Down Expand Up @@ -510,7 +533,8 @@ def reloadCrono(cronologia: list[Anime]):
testo.append(f"\033[0;3{colore}m{i + 1} \033[0;37m{a.name} [Ep {a.ep_corrente}/{a.ep_totali}]")

if notSelected:
pid = os.popen("pgrep fzf").read().strip().split("\n")
process = subprocess.run(["pgrep", "fzf"], capture_output=True, text=True, check=False)
pid = process.stdout.strip().split("\n")
os.system(f"kill {pid[-1]}")
scelta_anime = fzf(testo, "Scegli un anime: ")

Expand Down Expand Up @@ -610,6 +634,10 @@ def main():
if update:
updateScript()

if not shutil.which("fzf"):
ut.my_print("Errore: fzf non è installato. Per favore installalo per continuare.", color="rosso")
exit(1)

try:
with open(f"{os.path.dirname(__file__)}/aw-cronologia.csv", encoding='utf-8') as file:
log = [riga for riga in csv.reader(file)]
Expand All @@ -622,9 +650,24 @@ def main():

ut.getConfig()

openPlayer = lambda url_ep, nome_video, progress: os.system(f"printf \"\e]8;;vlc://%s\a~~~~~~~~~~~~~~~~~~~~\n~ Premi per aprire VLC ~\n~~~~~~~~~~~~~~~~~~~~\e]8;;\a\n\" \"{url_ep}\"")
if ut.nome_os == "iOS":
def openPlayer_iOS(url_ep, nome_video, progress):
os.system(f"printf \"\e]8;;vlc://%s\a~~~~~~~~~~~~~~~~~~~~\n~ Premi per aprire VLC ~\n~~~~~~~~~~~~~~~~~~~~\e]8;;\a\n\" \"{url_ep}\"")
ut.my_input("Premi invio per continuare...", format=lambda _: True)
openPlayer = openPlayer_iOS
else:
player_type = ut.configData.get("player", {}).get("type")
if player_type == "vlc":
openPlayer = openVLC
elif player_type == "mpv":
openPlayer = openMPV
elif ut.nome_os == "Android":
openPlayer = openVLC
else:
ut.my_print("Player non configurato. Eseguire `aw-cli --config`.", color="rosso")
safeExit()

if nome_os != "Android" and args.syncpl:
if ut.nome_os not in ["Android", "iOS"] and getattr(args, "syncpl", False):
openPlayer = openSyncplay

reload = True
Expand Down
Loading