From cc04d96e7067fba2d29c8d4eaacf2c7ac495049f Mon Sep 17 00:00:00 2001
From: Mauro Marzocca <57107500+mauromarzocca@users.noreply.github.com>
Date: Fri, 10 Oct 2025 04:02:30 +0200
Subject: [PATCH 1/6] =?UTF-8?q?Migliorata=20compatibilit=C3=A0=20iOS?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
awcli/run.py | 67 +++++++++++++++++++++++++++++++++--------
awcli/utilities.py | 63 ++++++++++++++++++++++++--------------
tests/test_anime.py | 11 +++++--
tests/test_utilities.py | 27 ++++++++---------
4 files changed, 117 insertions(+), 51 deletions(-)
diff --git a/awcli/run.py b/awcli/run.py
index ab9ce5b..cc1ecc5 100644
--- a/awcli/run.py
+++ b/awcli/run.py
@@ -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
@@ -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()
@@ -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 = ""
@@ -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
@@ -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ì":
@@ -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: ")
@@ -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)]
@@ -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 args.syncpl:
openPlayer = openSyncplay
reload = True
diff --git a/awcli/utilities.py b/awcli/utilities.py
index d9c1b7f..bd0723e 100644
--- a/awcli/utilities.py
+++ b/awcli/utilities.py
@@ -2,23 +2,36 @@
import re
import toml
import requests
+import warnings
+import subprocess
from time import sleep
from html import unescape
from collections import defaultdict
from awcli.anime import Anime
+from urllib3.exceptions import InsecureRequestWarning
-_url = "https://www.animeworld.so"
+_url = "https://www.animeworld.ac"
configData = defaultdict(dict)
+_ssl_warning_shown = False
+
+# Inizializza la sessione di requests
+session = requests.Session()
+session.headers.update({
+ 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
+})
# controllo il tipo del dispositivo
def get_os() -> str:
- out = os.popen("uname -a").read().strip().split()
+ result = subprocess.run(["uname", "-a"], capture_output=True, text=True, check=False)
+ out = result.stdout.strip().split()
nome_os = out[0]
if nome_os == "Linux":
if "Android" == out[-1]:
nome_os = "Android"
elif "WSL" in out[2]:
nome_os = "WSL"
+ elif len(out) > 1 and any(x in out[1].lower() for x in ["iphone", "ipad", "ipod"]):
+ nome_os = "iOS"
return nome_os
nome_os = get_os()
@@ -78,23 +91,33 @@ def getHtml(url: str) -> str:
Returns:
str: l'html della pagina web selezionata.
"""
- global cookies
+ global _ssl_warning_shown
try:
- result = requests.get(url, headers=headers, cookies=cookies)
- except requests.exceptions.ConnectionError:
- my_print("Errore di connessione", color="rosso")
+ # Sopprime l'avviso di richiesta non sicura per evitare output duplicati
+ warnings.filterwarnings('ignore', category=InsecureRequestWarning)
+
+ if not _ssl_warning_shown:
+ my_print("ATTENZIONE: La verifica del certificato SSL è disabilitata. Questo potrebbe esporre a rischi di sicurezza.", color="giallo")
+ _ssl_warning_shown = True
+
+ result = session.get(url, timeout=10, verify=False)
+ result.raise_for_status() # Lancia un'eccezione per status code non 2xx
+
+ # Gestione del reindirizzamento di Cloudflare
+ if result.status_code == 202 and "SecurityAW" in result.text:
+ my_print("Reindirizzamento...", color="giallo", end="\n")
+ result = session.get(url, timeout=10, verify=False)
+ result.raise_for_status()
+
+ except requests.exceptions.RequestException as e:
+ my_print(f"Errore di connessione: {e}", color="rosso")
exit()
+ finally:
+ # Ripristina il comportamento predefinito degli avvisi
+ warnings.resetwarnings()
- if result.status_code == 202:
- my_print("Reindirizzamento...", color="giallo", end="\n")
- match = re.search(r'(SecurityAW-\w+)=(.*) ;', result.text)
- key = match.group(1)
- value = match.group(2)
- cookies = {key: value}
- result = requests.get(url, headers=headers, cookies=cookies)
-
if result.status_code != 200:
- my_print("Errore: pagina non trovata", color="rosso")
+ my_print(f"Errore: pagina non trovata (status code: {result.status_code})", color="rosso")
exit()
return result.text
@@ -121,7 +144,7 @@ def search(input: str) -> list[Anime]:
# prendo i link degli anime relativi alla ricerca
for url, name in re.findall(r'
(?:.|\n)+?
([^<]+)', html):
if nome_os == "Android":
- caratteri_proibiti = '"*/:<>?\|'
+ caratteri_proibiti = r'"*/:<>?\|'
caratteri_rimpiazzo = '”⁎∕꞉‹›︖\⏐'
for a, b in zip(caratteri_proibiti, caratteri_rimpiazzo):
name = name.replace(a, b)
@@ -262,10 +285,4 @@ def getConfig() -> None:
if nome_os == "WSL":
configData["player"]["path"] = f'''"$(wslpath '{configData["player"]["path"]}')"'''
if "syncplay" in configData:
- configData["syncplay"]["path"] = f"/mnt/c/Windows/System32/cmd.exe /C '{configData["syncplay"]["path"]}'"
-
-headers = {
- 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
-}
-
-cookies = {}
\ No newline at end of file
+ configData["syncplay"]["path"] = f'''/mnt/c/Windows/System32/cmd.exe /C '{configData["syncplay"]["path"]}' '''
\ No newline at end of file
diff --git a/tests/test_anime.py b/tests/test_anime.py
index a8b4308..f91a848 100644
--- a/tests/test_anime.py
+++ b/tests/test_anime.py
@@ -12,6 +12,11 @@ def mock_download():
mock_download.return_value = "episode_content"
yield mock_download
+@pytest.fixture
+def mock_search():
+ with patch("awcli.utilities.search") as mock_search:
+ yield mock_search
+
@pytest.fixture
def mock_get_info_anime():
with patch("awcli.utilities.get_info_anime") as mock_get_info_anime:
@@ -51,11 +56,13 @@ def test_load_info(anime, mock_get_info_anime):
assert anime.views == 232023
assert anime.plot == "trama"
-def test_load_info_error(anime, mock_get_info_anime):
+def test_load_info_error(anime, mock_get_info_anime, mock_search):
mock_get_info_anime.side_effect = IndexError
+ mock_search.return_value = []
with pytest.raises(IndexError):
anime.load_info()
- assert mock_get_info_anime.call_count == 2
+ assert mock_get_info_anime.call_count == 1
+ assert mock_search.call_count == 1
def test_get_episodio(anime, mock_get_info_anime, mock_download):
diff --git a/tests/test_utilities.py b/tests/test_utilities.py
index 5e2b2b0..96c86a9 100644
--- a/tests/test_utilities.py
+++ b/tests/test_utilities.py
@@ -9,7 +9,7 @@
# Definisce la fixture mock_get
@pytest.fixture
def mock_get():
- with patch('requests.get') as mock:
+ with patch('awcli.utilities.session.get') as mock:
mock.return_value.status_code = 200
yield mock
@@ -19,28 +19,28 @@ def mock_get():
("empty", []),
])
def test_search(mock_get, input, expected):
- input = TEST_DIR + "/" + input
- with open(input, 'r') as html:
+ input_file = TEST_DIR + "/" + input
+ with open(input_file, 'r') as html:
mock_get.return_value.text = html.read()
- results = [anime.name for anime in utilities.search(input)]
+ results = [anime.name for anime in utilities.search("dummy_search")]
assert results == expected
def test_download(mock_get):
- input = TEST_DIR + "/" + "theeminenceinshadowep13"
- with open(input) as html:
+ input_file = TEST_DIR + "/" + "theeminenceinshadowep13"
+ with open(input_file) as html:
mock_get.return_value.text = html.read()
- results = utilities.download(input)
- expected = "https://server18.streamingaw.online/DDL/ANIME/KageNoJitsuryokushaNiNaritakute/KageNoJitsuryokushaNiNaritakute_Ep_13_SUB_ITA.mp4"
- ##assert results == expected
+ results = utilities.download("https://www.animeworld.ac/play/the-eminence-in-shadow/Dcqo-Q")
+ expected = "https://srv13-hana.sweetpixel.org/DDL/ANIME/KageNoJitsuryokushaNiNaritakute/KageNoJitsuryokushaNiNaritakute_Ep_13_SUB_ITA.mp4"
+ assert results == expected
def test_get_info_anime(mock_get):
- input = TEST_DIR + "/" + "theeminenceinshadowep13"
- with open(input) as html:
+ input_file = TEST_DIR + "/" + "theeminenceinshadowep13"
+ with open(input_file) as html:
mock_get.return_value.text = html.read()
- results = utilities.get_info_anime(input)
+ results = utilities.get_info_anime("https://www.animeworld.ac/play/the-eminence-in-shadow/pzm5jA")
expected = [
"Anime",
"Giapponese",
@@ -71,5 +71,4 @@ def test_my_input(input_mock, input_str, format_func, input_values, expected_out
# Esegue il test
result = utilities.my_input(input_str, format_func)
# Verifica che il risultato sia corretto
- assert result == expected_output
-
+ assert result == expected_output
\ No newline at end of file
From ca0a7178f768f1774f6060e9f45acf2d6a0d9828 Mon Sep 17 00:00:00 2001
From: Mauro Marzocca <57107500+mauromarzocca@users.noreply.github.com>
Date: Fri, 10 Oct 2025 04:08:04 +0200
Subject: [PATCH 2/6] Update README.md
---
README.md | 52 +++++++++++++++++++++++++++++++++++++---------------
1 file changed, 37 insertions(+), 15 deletions(-)
diff --git a/README.md b/README.md
index b61329f..013d8dc 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,13 @@
# aw-cli
+
-Guarda anime dal terminale e molto altro!
Gli anime vengono presi da AnimeWorld
+Guarda anime dal terminale e molto altro!
Gli anime vengono presi da AnimeWorld
## Anteprima
+
https://github.com/fexh10/aw-cli/assets/90156014/88e1c2e2-bb7f-4002-8784-26f70861e164
## Indice
@@ -22,16 +24,17 @@ https://github.com/fexh10/aw-cli/assets/90156014/88e1c2e2-bb7f-4002-8784-26f7086
## Installazione
-Lo script funziona sia con [MPV](https://mpv.io/installation/) che con [VLC](https://www.videolan.org/vlc/index.it.html).
+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).
Linux, MacOS
È possibile installare aw-cli da pip:
-```
+```sh
python3 -m pip install aw-cli
```
+
Windows
@@ -42,13 +45,13 @@ Attualmente, Windows presenta due versioni: la più recente, progettata per funz
Ultima Versione
L'ultima versione per Windows richiede installare WSL:
-```
+```sh
wsl --install
```
Il programma dovrà essere installato e avviato da WSL:
-```
+```sh
python3 -m pip install aw-cli
```
@@ -67,26 +70,41 @@ python3 -m pip install git+https://github.com/fexh10/aw-cli.git@winLegacy
Android
Android richiede l'installazione di termux.
-```
+```sh
pkg update && pkg upgrade
pkg install python python-pip fzf
python3 -m pip install aw-cli
```
+
iOS
La versione per iOS richiede iSH e VLC.
-```
+```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.
+
+NB: in questo modo occorre creare un ambiente virtuale ed attivarlo, prima di eseguire aw-cli.
+
+Oppure, in alternativa:
+
+```sh
+apk update
+apk upgrade
+apk add python3 python3-dev py3-pip gcc musl-dev git pipxss
+pipx install git+https://github.com/fexh10/aw-cli.git@iosCompatibility
+```
+
+Prima di avviare aw-cli, è consigliato chiudere e riapire l'applicazione iSH.
+Nota che la velocità di download e caricamento molto bassa è un problema di iSH e non di aw-cli.
## Problemi noti
+
Se è impossibile avviare `aw-cli`, è possibile che non si abbia la cartella degli script Python aggiunta al path.
Linux/Windows WSL
@@ -102,9 +120,10 @@ Riavviare il terminale o eseguire `source ~/.bashrc`.
MacOS
Aggiungere la seguente linea al file di profilo (.bashrc, .zshrc, o altro):
-```
+```sh
export PATH=$PATH:$HOME/Library/Python/3.x/bin
```
+
Sostituire `3.x` con la propria versione di Python.
Riavviare il terminale o eseguire `source ~/.bashrc`.
@@ -112,21 +131,23 @@ Riavviare il terminale o eseguire `source ~/.bashrc`.
Windows Legacy
Inserire da linea di comando:
-```
+```sh
setx PATH "%PATH%;%APPDATA%\Local\Programs\Python\Python3x\Scripts
```
+
Sostituire `3.x` con la propria versione di Python.
-Se necessario, riavviare il sistema.
+Se necessario, riavviare il sistema.
-## Disinstallazione
+## 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!
@@ -153,6 +174,7 @@ Configurazione:
```
## Crediti
+
Progetto ispirato a ani-cli.
Un ringraziamento speciale a axtrat per l'aiuto nella realizzazione del progetto.
From 257b87908f9e8d807b95d8567d9b3f36a9e475b3 Mon Sep 17 00:00:00 2001
From: Mauro Marzocca <57107500+mauromarzocca@users.noreply.github.com>
Date: Fri, 10 Oct 2025 04:15:43 +0200
Subject: [PATCH 3/6] Update README.md
---
README.md | 126 ++++++++++++++++++++++++------------------------------
1 file changed, 57 insertions(+), 69 deletions(-)
diff --git a/README.md b/README.md
index 013d8dc..872c69a 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,11 @@
# aw-cli
-
-
-Guarda anime dal terminale e molto altro!
Gli anime vengono presi da AnimeWorld
-
-
+**Guarda anime dal terminale e molto altro.**
+**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
@@ -16,59 +13,58 @@ https://github.com/fexh10/aw-cli/assets/90156014/88e1c2e2-bb7f-4002-8784-26f7086
- [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).
+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).
+### Linux e macOS
-Linux, MacOS
-È possibile installare aw-cli da pip:
+È possibile installare **aw-cli** da `pip`:
```sh
python3 -m pip install aw-cli
```
-
+### Windows
-Windows
-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.
+Attualmente Windows presenta due versioni:
-
+- **Ultima versione** (funziona su [WSL](https://learn.microsoft.com/it-it/windows/wsl/install))
+- **Legacy** (compatibile con PowerShell, ma non più aggiornata)
-Ultima Versione
-L'ultima versione per Windows richiede installare WSL:
+#### Ultima versione (WSL)
```sh
wsl --install
-```
-
-Il programma dovrà essere installato e avviato da WSL:
-
-```sh
python3 -m pip install aw-cli
```
-
-Versione Legacy
-Per installare la versione Legacy, è necessario avere git.
+#### 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
```
-
-
+### Android
-Android
-Android richiede l'installazione di termux.
+Richiede [Termux](https://github.com/termux/termux-app/releases/tag/v0.118.0).
```sh
pkg update && pkg upgrade
@@ -76,10 +72,9 @@ pkg install python python-pip fzf
python3 -m pip install aw-cli
```
-
+### iOS
-iOS
-La versione per iOS richiede iSH e VLC.
+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
@@ -88,56 +83,53 @@ apk add python3 python3-dev py3-pip gcc musl-dev git
python3 -m pip install git+https://github.com/fexh10/aw-cli.git@iosCompatibility
```
-NB: in questo modo occorre creare un ambiente virtuale ed attivarlo, prima di eseguire aw-cli.
+> In questo modo è necessario creare e attivare un ambiente virtuale prima di eseguire **aw-cli**.
Oppure, in alternativa:
```sh
apk update
apk upgrade
-apk add python3 python3-dev py3-pip gcc musl-dev git pipxss
+apk add python3 python3-dev py3-pip gcc musl-dev git pipx
pipx install git+https://github.com/fexh10/aw-cli.git@iosCompatibility
```
-Prima di avviare aw-cli, è consigliato chiudere e riapire l'applicazione iSH.
-Nota che la velocità di download e caricamento molto bassa è un problema di iSH e non di aw-cli.
-
+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 è impossibile avviare `aw-cli`, è possibile che non si abbia la cartella degli script Python aggiunta al path.
+Se non riesci ad avviare `aw-cli`, probabilmente la cartella degli script Python non è nel tuo `PATH`.
- Linux/Windows WSL
-Aggiungere la seguente linea al file di profilo (.bashrc, .zshrc, o altro):
+### Linux / Windows WSL
-```
+Aggiungi al tuo `.bashrc` o `.zshrc`:
+
+```sh
export PATH=$PATH:$HOME/.local/bin
```
-Riavviare il terminale o eseguire `source ~/.bashrc`.
-
+Poi riavvia il terminale o esegui:
- MacOS
-Aggiungere la seguente linea al file di profilo (.bashrc, .zshrc, o altro):
+```sh
+source ~/.bashrc
+```
+
+### macOS
```sh
export PATH=$PATH:$HOME/Library/Python/3.x/bin
```
-Sostituire `3.x` con la propria versione di Python.
-Riavviare il terminale o eseguire `source ~/.bashrc`.
-
+Sostituisci `3.x` con la tua versione di Python, poi riavvia il terminale.
- Windows Legacy
-Inserire da linea di comando:
+### 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.
-Se necessario, riavviare il sistema.
-
+Sostituisci `3x` con la tua versione di Python e riavvia se necessario.
## Disinstallazione
@@ -157,24 +149,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 ani-cli.
-
-Un ringraziamento speciale a axtrat 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.
From 4b63a259232977a1928d776a257a2c339a7b1f78 Mon Sep 17 00:00:00 2001
From: Mauro Marzocca <57107500+mauromarzocca@users.noreply.github.com>
Date: Fri, 10 Oct 2025 04:17:56 +0200
Subject: [PATCH 4/6] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 872c69a..288a678 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
# aw-cli
**Guarda anime dal terminale e molto altro.**
+
**Gli anime vengono presi da [AnimeWorld](https://www.animeworld.tv/)**
## Anteprima
From c7f147df171216b2cd36110d39b6eedc2b9a38ec Mon Sep 17 00:00:00 2001
From: Mauro Marzocca <57107500+mauromarzocca@users.noreply.github.com>
Date: Fri, 10 Oct 2025 21:50:15 +0200
Subject: [PATCH 5/6] Update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 288a678..18b8cd7 100644
--- a/README.md
+++ b/README.md
@@ -91,7 +91,8 @@ Oppure, in alternativa:
```sh
apk update
apk upgrade
-apk add python3 python3-dev py3-pip gcc musl-dev git pipx
+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
```
From 67387af535e1698e5495276f53754db0d3b8f6b1 Mon Sep 17 00:00:00 2001
From: Mauro Marzocca <57107500+mauromarzocca@users.noreply.github.com>
Date: Fri, 10 Oct 2025 21:51:01 +0200
Subject: [PATCH 6/6] Update run.py
---
awcli/run.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/awcli/run.py b/awcli/run.py
index cc1ecc5..ff35ceb 100644
--- a/awcli/run.py
+++ b/awcli/run.py
@@ -667,7 +667,7 @@ def openPlayer_iOS(url_ep, nome_video, progress):
ut.my_print("Player non configurato. Eseguire `aw-cli --config`.", color="rosso")
safeExit()
- if ut.nome_os not in ["Android", "iOS"] and args.syncpl:
+ if ut.nome_os not in ["Android", "iOS"] and getattr(args, "syncpl", False):
openPlayer = openSyncplay
reload = True