Skip to content

Commit

Permalink
1.4.12
Browse files Browse the repository at this point in the history
Aggiunta una barra di avanzamento durante il download
  • Loading branch information
MainKronos committed Mar 6, 2022
1 parent d4591af commit 082385f
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 41 deletions.
3 changes: 2 additions & 1 deletion animeworld/episodio.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,13 @@ def links(self) -> List[Server]: # lista dei provider dove sono hostati gli ep

return self.__setServer(tmp, self.number)

def download(self, title: Optional[str]=None, folder: str='') -> Optional[str]: # Scarica l'episodio con il primo link nella lista
def download(self, title: Optional[str]=None, folder: str='', show_progress: bool=True) -> Optional[str]: # Scarica l'episodio con il primo link nella lista
"""
Scarica l'episodio dal primo server della lista links.
- `title`: Nome con cui verrà nominato il file scaricato.
- `folder`: Posizione in cui verrà spostato il file scaricato.
- `show_progress`: Mostra la barra di avanzamento.
```
return str # File scaricato
Expand Down
89 changes: 53 additions & 36 deletions animeworld/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import re
import os
from typing import *
from alive_progress import alive_bar

from .globals import HDR, cookies
from .utility import HealthCheck
Expand Down Expand Up @@ -62,12 +63,13 @@ def _sanitize(self, title: str) -> str: # Toglie i caratteri illegali per i file
title = title.replace(x, '')
return title

def download(self, title: Optional[str]=None, folder: str='') -> Optional[str]:
def download(self, title: Optional[str]=None, folder: str='', show_progress: bool=True) -> Optional[str]:
"""
Scarica l'episodio.
- `title`: Nome con cui verrà nominato il file scaricato.
- `folder`: Posizione in cui verrà spostato il file scaricato.
- `show_progress`: Mostra la barra di avanzamento.
```
return str # File scaricato
Expand All @@ -76,12 +78,13 @@ def download(self, title: Optional[str]=None, folder: str='') -> Optional[str]:
raise ServerNotSupported(self.name)

# Protected
def _downloadIn(self, title: str, folder: str) -> bool: # Scarica l'episodio
def _downloadIn(self, title: str, folder: str, show_progress: bool) -> bool: # Scarica l'episodio
"""
Scarica il file utilizzando requests.
- `title`: Nome con cui verrà nominato il file scaricato.
- `folder`: Posizione in cui verrà spostato il file scaricato.
- `show_progress`: Mostra la barra di avanzamento.
```
return bool # File scaricato
Expand All @@ -92,49 +95,59 @@ def _downloadIn(self, title: str, folder: str) -> bool: # Scarica l'episodio
ext = r.headers['content-type'].split('/')[-1]
if ext == 'octet-stream': ext = 'mp4'
file = f"{title}.{ext}"
with open(f"{os.path.join(folder,file)}", 'wb') as f:
for chunk in r.iter_content(chunk_size = 1024*1024):

total_length = int(r.headers.get('content-length'))
with open(f"{os.path.join(folder,file)}", 'wb') as f, alive_bar(total_length//65536+1, disable = not show_progress, length = 80, monitor = "[{percent:.0%}]", stats ="(ETA: {eta})", stats_end=False) as bar:
for chunk in r.iter_content(chunk_size = 65536):
if chunk:
f.write(chunk)
f.flush()
bar()
else:
return file # Se il file è stato scaricato correttamente
return None # Se è accaduto qualche imprevisto

# Protected
def _dowloadEx(self, title: str, folder: str) -> Optional[str]:
def _dowloadEx(self, title: str, folder: str, show_progress: bool) -> Optional[str]:
"""
Scarica il file utilizzando yutube_dl.
- `title`: Nome con cui verrà nominato il file scaricato.
- `folder`: Posizione in cui verrà spostato il file scaricato.
- `show_progress`: Mostra la barra di avanzamento.
```
return str # File scaricato
```
"""
class MyLogger(object):
def debug(self, msg):
pass
def warning(self, msg):
pass
def error(self, msg):
print(msg)
return False
def my_hook(d):
if d['status'] == 'finished':
return True

ydl_opts = {
'outtmpl': f"{os.path.join(folder,title)}.%(ext)s",
'logger': MyLogger(),
'progress_hooks': [my_hook],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
url = self._getFileLink()
info = ydl.extract_info(url, download=False)
filename = ydl.prepare_filename(info)
ydl.download([url])
return filename

with alive_bar(disable = not show_progress, length = 80, monitor = "[{percent:.0%}]", stats ="(ETA: {eta})", stats_end=False, manual=True) as bar:
class MyLogger(object):
def debug(self, msg):
pass
def warning(self, msg):
pass
def error(self, msg):
print(msg)
return False

def my_hook(d):
if d['status'] == 'downloading':
bar(float(d['downloaded_bytes'])/float(d['total_bytes_estimate']))
if d['status'] == 'finished':
return True

ydl_opts = {
'outtmpl': f"{os.path.join(folder,title)}.%(ext)s",
'logger': MyLogger(),
'progress_hooks': [my_hook],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
url = self._getFileLink()
info = ydl.extract_info(url, download=False)
filename = ydl.prepare_filename(info)
ydl.download([url])
return filename


class AnimeWorld_Server(Server):
Expand All @@ -144,20 +157,21 @@ def _getFileLink(self):

return self.link.replace('download-file.php?id=', '')

def download(self, title: Optional[str]=None, folder: str='') -> bool:
def download(self, title: Optional[str]=None, folder: str='', show_progress: bool=True) -> bool:
"""
Scarica l'episodio.
- `title`: Nome con cui verrà nominato il file scaricato.
- `folder`: Posizione in cui verrà spostato il file scaricato.
- `show_progress`: Mostra la barra di avanzamento.
```
return bool # File scaricato
```
"""
if title is None: title = self._defTitle
else: title = self._sanitize(title)
return self._downloadIn(title,folder)
return self._downloadIn(title,folder,show_progress)

class VVVVID(Server):
# Protected
Expand All @@ -177,20 +191,21 @@ def _getFileLink(self):
raw = soupeddata.find("a", { "class" : "VVVVID-link" })
return raw.get("href")

def download(self, title: Optional[str]=None, folder: str='') -> bool:
def download(self, title: Optional[str]=None, folder: str='', show_progress: bool=True) -> bool:
"""
Scarica l'episodio.
- `title`: Nome con cui verrà nominato il file scaricato.
- `folder`: Posizione in cui verrà spostato il file scaricato.
- `show_progress`: Mostra la barra di avanzamento.
```
return bool # File scaricato
```
"""
if title is None: title = self._defTitle
else: title = self._sanitize(title)
return self._dowloadEx(title,folder)
return self._dowloadEx(title,folder,show_progress)


class YouTube(Server):
Expand All @@ -213,20 +228,21 @@ def _getFileLink(self):

return yutubelink_raw.replace('embed/', 'watch?v=')

def download(self, title: Optional[str]=None, folder: str='') -> bool:
def download(self, title: Optional[str]=None, folder: str='', show_progress: bool=True) -> bool:
"""
Scarica l'episodio.
- `title`: Nome con cui verrà nominato il file scaricato.
- `folder`: Posizione in cui verrà spostato il file scaricato.
- `show_progress`: Mostra la barra di avanzamento.
```
return bool # File scaricato
```
"""
if title is None: title = self._defTitle
else: title = self._sanitize(title)
return self._dowloadEx(title,folder)
return self._dowloadEx(title,folder,show_progress)

class Streamtape(Server):
# Protected
Expand All @@ -252,17 +268,18 @@ def _getFileLink(self):

return mp4_link

def download(self, title: Optional[str]=None, folder: str='') -> bool:
def download(self, title: Optional[str]=None, folder: str='', show_progress: bool=True) -> bool:
"""
Scarica l'episodio.
- `title`: Nome con cui verrà nominato il file scaricato.
- `folder`: Posizione in cui verrà spostato il file scaricato.
- `show_progress`: Mostra la barra di avanzamento.
```
return bool # File scaricato
```
"""
if title is None: title = self._defTitle
else: title = self._sanitize(title)
return self._downloadIn(title,folder)
return self._downloadIn(title,folder,show_progress)
5 changes: 3 additions & 2 deletions animeworld/utility.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
import inspect
from typing import *

import datetime
from datetime import datetime
import time
import locale

from .globals import HDR, cookies
Expand Down Expand Up @@ -87,7 +88,7 @@ def find(keyword: str) -> List[Dict]:
"name": elem["name"],
"jtitle": elem["jtitle"],
"studio": elem["studio"],
"release": datetime.datetime.strptime(elem["release"], "%d %B %Y"),
"release": datetime.strptime(elem["release"], "%d %B %Y"),
"episodes": int(elem["state"]),
"state": elem["state"],
"story": elem["story"],
Expand Down
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@

setuptools.setup(
name="animeworld",
version="1.4.11",
version="1.4.12",
author="MainKronos",
description="AnimeWorld UNOFFICIAL API",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/MainKronos/AnimeWorld-API",
packages=setuptools.find_packages(),
install_requires=['requests', 'youtube_dl', 'beautifulsoup4'],
install_requires=['requests', 'youtube_dl', 'beautifulsoup4', 'alive_progress'],
license='MIT',
classifiers=[
"Programming Language :: Python :: 3",
Expand Down

0 comments on commit 082385f

Please sign in to comment.