diff --git a/README.md b/README.md index 0e7031e..668166b 100644 --- a/README.md +++ b/README.md @@ -22,10 +22,10 @@ res = aw.find("No game no life") print(res) ``` La funzione estituirà un dizionario contentente per chiave il nome dell'anime e per valore il link della pagina di animeworld. -``` +```python { - 'No Game no Life': 'https://www.animeworld.tv/play/no-game-no-life.IJUH1', - 'No Game No Life: Zero': 'https://www.animeworld.tv/play/no-game-no-life-zero.p-2vq' + 'name': 'No Game no Life', + 'link': 'https://www.animeworld.tv/play/no-game-no-life.IJUH1' } ``` È Possibile anche scaricare gli episodi di un anime. @@ -53,5 +53,4 @@ Per testare velocemete le funzionalità della libreria è possibile usare consul Per un utilizzo avanzato consultare la [documentazione](../../wiki). - Per l'accesso al codice sorgente, alla documentazione e agli esempi andare [**qui**](https://github.com/MainKronos/Sonarr-AnimeDownloader/issues/6). \ No newline at end of file diff --git a/animeworld/__init__.py b/animeworld/__init__.py index d13cf33..5feff93 100644 --- a/animeworld/__init__.py +++ b/animeworld/__init__.py @@ -1,3 +1,6 @@ +""" +AnimeWorld-API +""" import json import requests from bs4 import BeautifulSoup @@ -35,7 +38,7 @@ def find(keyword: str) -> Optional[Dict]: - `keyword`: Il nome dell'anime o una porzione di esso. - ```python + ``` return { name: str, # Nome dell'anime trovato link: str # Link dell'anime trovato @@ -71,14 +74,25 @@ def find(keyword: str) -> Optional[Dict]: ### Server ### class Server: + """ + Attributes: + + - `link`: Link del server in cui è hostato l'episodio. + - `Nid`: ID del server. + - `name`: Nome del server. + - `number`: Numero dell'episodio. + + Methods: + + - `download`: Scarica l'episodio. + """ + def __init__(self, link: str, Nid: int, name: str, number: str): """ - Costruisce la classe Astratta Server. - - `link`: Link del server in cui è hostato l'episodio. - `Nid`: ID del server. - `name`: Nome del server. - - `number`: Numero dell'episodio + - `number`: Numero dell'episodio. """ self.link = link @@ -88,12 +102,12 @@ def __init__(self, link: str, Nid: int, name: str, number: str): self.name = name """Nome del server.""" self.number = number - """Numero dell'episodio""" + """Numero dell'episodio.""" self._HDR = HDR # Protected self._defTitle = f"{self.number} - {self.name}" # nome del file provvisorio - def sanitize(self, title: str) -> str: # Toglie i caratteri illegali per i file + def _sanitize(self, title: str) -> str: # Toglie i caratteri illegali per i file """ Rimuove i caratteri illegali per il nome del file. @@ -193,7 +207,7 @@ def download(self, title: Optional[str]=None, folder: str='') -> bool: ``` """ if title is None: title = self._defTitle - else: title = self.sanitize(title) + else: title = self._sanitize(title) return self._downloadIn(title,folder) class VVVVID(Server): @@ -226,7 +240,7 @@ def download(self, title: Optional[str]=None, folder: str='') -> bool: ``` """ if title is None: title = self._defTitle - else: title = self.sanitize(title) + else: title = self._sanitize(title) return self._dowloadEx(title,folder) @@ -262,7 +276,7 @@ def download(self, title: Optional[str]=None, folder: str='') -> bool: ``` """ if title is None: title = self._defTitle - else: title = self.sanitize(title) + else: title = self._sanitize(title) return self._dowloadEx(title,folder) class Streamtape(Server): @@ -301,25 +315,34 @@ def download(self, title: Optional[str]=None, folder: str='') -> bool: ``` """ if title is None: title = self._defTitle - else: title = self.sanitize(title) + else: title = self._sanitize(title) return self._downloadIn(title,folder) ## Class ############################################### class Episodio: + """ + Attributes: + + - `number`: Numero dell'episodio. + - `links`: Lista dei server in cui è hostato l'episodio. + + Methods: + + - `download`: Scarica l'episodio dal primo server della lista links. + """ + def __init__(self, number: str, link: str, legacy: List[Dict] = []): """ - Costruisce la classe Episodio. - - `number`: Numero dell'episodio. - `link`: Link dell'endpoint dell'episodio. - `legacy`: Lista di tutti i link dei server in cui sono hostati gli episodi. """ self.number = number """Numero dell'episodio.""" - self.link = link + self.__link = link """Link dell'endpoint dell'episodio.""" - self.legacy = legacy + self.__legacy = legacy """Lista di tutti i link dei server in cui sono hostati gli episodi.""" @property @@ -327,7 +350,7 @@ def links(self) -> List[Server]: # lista dei provider dove sono hostati gli ep """ Ottiene la lista dei server in cui è hostato l'episodio. - ```python + ``` return [ Server, # Classe Server ... @@ -336,7 +359,7 @@ def links(self) -> List[Server]: # lista dei provider dove sono hostati gli ep """ tmp = [] # tutti i links - res = requests.post(self.link, headers = HDR, cookies=cookies, timeout=(3, 27)) + res = requests.post(self.__link, headers = HDR, cookies=cookies, timeout=(3, 27)) data = res.json() for provID in data["links"]: @@ -347,7 +370,7 @@ def links(self) -> List[Server]: # lista dei provider dove sono hostati gli ep "link": data["links"][provID][key]["link"] }) - for prov in self.legacy: + for prov in self.__legacy: if str(prov['id']) in data["links"].keys(): continue tmp.append(prov) @@ -376,7 +399,7 @@ def __setServer(self, links: List[Dict], numero: str) -> List[Server]: # Per ogn - `links`: Dizionario ('id', 'name', 'link') contenente le informazioni del Server in cui è hostato l'episodio. - `numero`: Numero dell'episodio. - ```python + ``` return [ Server, # Classe Server ... @@ -413,20 +436,30 @@ def __sortServer(self, elem): class Anime: + """ + Attributes: + + - `link`: Link dell'anime. + - `html`: Pagina web di Animeworld dell'anime. + + Methods: + + - `getName`: Ottiene il nome dell'anime. + - `getTrama`: Ottiene la trama dell'anime. + - `getInfo`: Ottiene le informazioni dell'anime. + - `getEpisodes`: Ottiene tutti gli episodi dell'anime. + """ + + + def __init__(self, link: str): """ - Costruisce la classe Anime. - - - `link`: Il link dell'anime. + - `link`: Link dell'anime. """ self.link = link self.__fixCookie() self.html = self.__getHTML().content self.__check404() - # self.server = self.__getServer() - # self.nome = self.getName() - # self.trama = self.getTrama() - # self.info = self.getInfo() # Private def __fixCookie(self): @@ -445,6 +478,10 @@ def __fixCookie(self): def __getHTML(self) -> requests.Response: """ Ottiene la pagina web di Animeworld dell'anime e aggiorna i cookies. + + ``` + return Response # Risposta GET + ``` """ r = None while True: @@ -477,10 +514,10 @@ def __getServer(self) -> Dict[int, Dict[str, str]]: """ Ottiene tutti i server in cui sono hostati gli episodi. - ```python + ``` return { int: { # ID del server - name: str # nome del server + name: str # Nome del server }, ... } @@ -504,19 +541,19 @@ def getTrama(self) -> str: """ Ottiene la trama dell'anime. - ```python - return str # trama dell'anime + ``` + return str # Trama dell'anime ``` """ soupeddata = BeautifulSoup(self.html, "html.parser") return soupeddata.find("div", { "class" : "desc" }).get_text() @HealthCheck - def getInfo(self) -> Dict[str, str]: # Informazioni dell'anime + def getInfo(self) -> Dict[str, str]: """ Ottiene le informazioni dell'anime. - ```python + ``` return { 'Categoria': str, 'Audio': str, @@ -551,8 +588,8 @@ def getName(self) -> str: # Nome dell'anime """ Ottiene il nome dell'anime. - ```python - return str # nome dell'anime + ``` + return str # Nome dell'anime ``` """ soupeddata = BeautifulSoup(self.html, "html.parser") @@ -565,7 +602,7 @@ def getEpisodes(self) -> List[Episodio]: # Ritorna una lista di Episodi """ Ottiene tutti gli episodi dell'anime. - ```python + ``` return [ Episodio, # Classe Episodio ... diff --git a/documentation/example.py b/documentation/example.py index 7e746d5..0cbcdbb 100644 --- a/documentation/example.py +++ b/documentation/example.py @@ -1,40 +1,34 @@ import animeworld as aw -def main(): - - - try: - anime = aw.Anime(link="https://www.animeworld.tv/play/jaku-chara-tomozaki-kun.RDPHq") - - print("Titolo:", anime.getName()) # Titolo dell'anime - - print("\n----------------------------------\n") - - print("Trama:", anime.getTrama()) # Trama - - print("\n----------------------------------\n") - - print("Info:") - info = anime.getInfo() - for x in info: print(f"{x}: {info[x]}") # Informazioni presenti su Animeworld riguardanti l'anime - - print("\n----------------------------------\n") - - print("Episodi:") - try: - episodi = anime.getEpisodes() - except (aw.ServerNotSupported, aw.AnimeNotAvailable) as error: - print("Errore:", error) - else: - for x in episodi: - print(f"\n-> Ep. {x.number}") - for k in x.links: - print(f"\t{k.name} - {k.link}") - - # if x.number == '4': - # x.download() - except aw.DeprecatedLibrary as error: - print(error) - -if __name__ == '__main__': - main() \ No newline at end of file +try: + anime = aw.Anime(link="https://www.animeworld.tv/play/jaku-chara-tomozaki-kun.RDPHq") + + print("Titolo:", anime.getName()) # Titolo dell'anime + + print("\n----------------------------------\n") + + print("Trama:", anime.getTrama()) # Trama + + print("\n----------------------------------\n") + + print("Info:") + info = anime.getInfo() + for x in info: print(f"{x}: {info[x]}") # Informazioni presenti su Animeworld riguardanti l'anime + + print("\n----------------------------------\n") + + print("Episodi:") + try: + episodi = anime.getEpisodes() + except (aw.ServerNotSupported, aw.AnimeNotAvailable) as error: + print("Errore:", error) + else: + for x in episodi: + print(f"\n-> Ep. {x.number}") + for k in x.links: + print(f"\t{k.name} - {k.link}") + + if x.number == '1': + x.download() +except (aw.DeprecatedLibrary, aw.Error404) as error: + print(error) diff --git a/setup.py b/setup.py index 5fb1d5b..f96473e 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="animeworld", # Replace with your own username - version="1.4.7", + version="1.4.8", author="MainKronos", author_email="lorenzo.chesi@live.it", description="AnimeWorld UNOFFICIAL API",