added: better progressbars
This commit is contained in:
parent
c3f9e4aa84
commit
19bd44b3dc
@ -12,8 +12,8 @@ from fake_useragent import UserAgent
|
|||||||
from requests.adapters import HTTPAdapter
|
from requests.adapters import HTTPAdapter
|
||||||
from urllib3.util.retry import Retry
|
from urllib3.util.retry import Retry
|
||||||
|
|
||||||
from src.Loaders.Loader import Loader
|
from Loaders.Loader import Loader
|
||||||
from src.Loaders.Providers import Providers
|
from Loaders.Providers import Providers
|
||||||
from yt_dlp import YoutubeDL
|
from yt_dlp import YoutubeDL
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
@ -146,7 +146,7 @@ class AniworldLoader(Loader):
|
|||||||
|
|
||||||
return languageCode in languages
|
return languageCode in languages
|
||||||
|
|
||||||
def Download(self, baseDirectory: str, serieFolder: str, season: int, episode: int, key: str, language: str = "German Dub") -> bool:
|
def Download(self, baseDirectory: str, serieFolder: str, season: int, episode: int, key: str, language: str = "German Dub", progress_callback: callable = None) -> bool:
|
||||||
sanitized_anime_title = ''.join(
|
sanitized_anime_title = ''.join(
|
||||||
char for char in self.GetTitle(key) if char not in self.INVALID_PATH_CHARS
|
char for char in self.GetTitle(key) if char not in self.INVALID_PATH_CHARS
|
||||||
)
|
)
|
||||||
@ -168,8 +168,6 @@ class AniworldLoader(Loader):
|
|||||||
output_path = os.path.join(folderPath, output_file)
|
output_path = os.path.join(folderPath, output_file)
|
||||||
os.makedirs(os.path.dirname(output_path), exist_ok=True)
|
os.makedirs(os.path.dirname(output_path), exist_ok=True)
|
||||||
|
|
||||||
|
|
||||||
# Get the system-designated temp directory
|
|
||||||
temp_dir = "./Temp/"
|
temp_dir = "./Temp/"
|
||||||
os.makedirs(os.path.dirname(temp_dir), exist_ok=True)
|
os.makedirs(os.path.dirname(temp_dir), exist_ok=True)
|
||||||
temp_Path = os.path.join(temp_dir, output_file)
|
temp_Path = os.path.join(temp_dir, output_file)
|
||||||
@ -187,6 +185,8 @@ class AniworldLoader(Loader):
|
|||||||
|
|
||||||
if header:
|
if header:
|
||||||
ydl_opts['http_headers'] = header
|
ydl_opts['http_headers'] = header
|
||||||
|
if progress_callback:
|
||||||
|
ydl_opts['progress_hooks'] = [progress_callback]
|
||||||
|
|
||||||
with YoutubeDL(ydl_opts) as ydl:
|
with YoutubeDL(ydl_opts) as ydl:
|
||||||
ydl.download([link])
|
ydl.download([link])
|
||||||
@ -341,6 +341,3 @@ class AniworldLoader(Loader):
|
|||||||
episode_counts[season] = len(unique_links)
|
episode_counts[season] = len(unique_links)
|
||||||
|
|
||||||
return episode_counts
|
return episode_counts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,7 @@ class Loader(ABC):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def Download(self, baseDirectory: str, serieFolder: str, season: int, episode: int, key: str) -> bool:
|
def Download(self, baseDirectory: str, serieFolder: str, season: int, episode: int, key: str, progress_callback: callable = None) -> bool:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
from src.Loaders.AniWorldLoader import AniworldLoader
|
from Loaders.AniWorldLoader import AniworldLoader
|
||||||
from src.Loaders.Loader import Loader
|
from Loaders.Loader import Loader
|
||||||
|
|
||||||
class Loaders:
|
class Loaders:
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
|
|
||||||
from src.Loaders.provider.Provider import Provider
|
from Loaders.provider.Provider import Provider
|
||||||
from src.Loaders.provider.voe import VOE
|
from Loaders.provider.voe import VOE
|
||||||
|
|
||||||
class Providers:
|
class Providers:
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import time
|
|||||||
|
|
||||||
from fake_useragent import UserAgent
|
from fake_useragent import UserAgent
|
||||||
import requests
|
import requests
|
||||||
from src.Loaders.provider.Provider import Provider
|
from Loaders.provider.Provider import Provider
|
||||||
class Doodstream(Provider):
|
class Doodstream(Provider):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|||||||
@ -7,7 +7,7 @@ from urllib3.util.retry import Retry
|
|||||||
import requests
|
import requests
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
from fake_useragent import UserAgent
|
from fake_useragent import UserAgent
|
||||||
from src.Loaders.provider.Provider import Provider
|
from Loaders.provider.Provider import Provider
|
||||||
|
|
||||||
# Compile regex patterns once for better performance
|
# Compile regex patterns once for better performance
|
||||||
REDIRECT_PATTERN = re.compile(r"https?://[^'\"<>]+")
|
REDIRECT_PATTERN = re.compile(r"https?://[^'\"<>]+")
|
||||||
|
|||||||
64
src/Main.py
64
src/Main.py
@ -1,12 +1,13 @@
|
|||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
from src.Loaders import AniWorldLoader
|
from Loaders import AniWorldLoader
|
||||||
import progressbar
|
|
||||||
|
from rich.progress import Progress
|
||||||
import SerieList
|
import SerieList
|
||||||
import SerieScanner
|
import SerieScanner
|
||||||
from src.Loaders.Loaders import Loaders
|
from Loaders.Loaders import Loaders
|
||||||
from src.Serie import Serie
|
from Serie import Serie
|
||||||
import time
|
import time
|
||||||
|
|
||||||
# Configure logging
|
# Configure logging
|
||||||
@ -38,8 +39,7 @@ class SeriesApp:
|
|||||||
def __init__(self, directory_to_search: str):
|
def __init__(self, directory_to_search: str):
|
||||||
|
|
||||||
print("Please wait while initializing...")
|
print("Please wait while initializing...")
|
||||||
self.barTotal = None
|
self.progress = None
|
||||||
self.bar = None
|
|
||||||
self.directory_to_search = directory_to_search
|
self.directory_to_search = directory_to_search
|
||||||
self.Loaders = Loaders()
|
self.Loaders = Loaders()
|
||||||
loader = self.Loaders.GetLoader(key="aniworld.to")
|
loader = self.Loaders.GetLoader(key="aniworld.to")
|
||||||
@ -109,40 +109,47 @@ class SeriesApp:
|
|||||||
"""Simulate the downloading process with a progress bar."""
|
"""Simulate the downloading process with a progress bar."""
|
||||||
total_downloaded = 0
|
total_downloaded = 0
|
||||||
total_episodes = sum(sum(len(ep) for ep in serie.episodeDict.values()) for serie in series)
|
total_episodes = sum(sum(len(ep) for ep in serie.episodeDict.values()) for serie in series)
|
||||||
self.barTotal = progressbar.ProgressBar(
|
self.progress = Progress()
|
||||||
max_value=total_episodes,
|
task1 = self.progress.add_task("[red]Processing...", total=total_episodes)
|
||||||
widgets=[
|
task2 = self.progress.add_task(f"[green]...", total=0)
|
||||||
progressbar.FormatLabel(f'Processing:'),
|
self.task3 = self.progress.add_task(f"[Gray]...", total=100) # Setze total auf 100 für Prozentanzeige
|
||||||
' ', progressbar.Percentage(),
|
self.progress.start()
|
||||||
' ', progressbar.Bar(),
|
|
||||||
' ', progressbar.ETA()
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
for serie in series:
|
for serie in series:
|
||||||
serie_episodes = sum(len(ep) for ep in serie.episodeDict.values())
|
serie_episodes = sum(len(ep) for ep in serie.episodeDict.values())
|
||||||
|
self.progress.update(task2, description=f"[green]{serie.name}", total=serie_episodes)
|
||||||
downloaded = 0
|
downloaded = 0
|
||||||
self.bar = progressbar.ProgressBar(
|
|
||||||
max_value=serie_episodes,
|
|
||||||
widgets=[
|
|
||||||
progressbar.FormatLabel(f'Processing {serie.name}:'),
|
|
||||||
' ', progressbar.Percentage(),
|
|
||||||
' ', progressbar.Bar(),
|
|
||||||
' ', progressbar.ETA()
|
|
||||||
]
|
|
||||||
)
|
|
||||||
for season, episodes in serie.episodeDict.items():
|
for season, episodes in serie.episodeDict.items():
|
||||||
for episode in episodes:
|
for episode in episodes:
|
||||||
loader = self.Loaders.GetLoader(key="aniworld.to")
|
loader = self.Loaders.GetLoader(key="aniworld.to")
|
||||||
if loader.IsLanguage(season, episode, serie.key):
|
if loader.IsLanguage(season, episode, serie.key):
|
||||||
self.retry(loader.Download, 3, 1, self.directory_to_search, serie.folder, season, episode, serie.key)
|
self.retry(loader.Download, 3, 1, self.directory_to_search, serie.folder, season, episode, serie.key, self.print_Download_Progress)
|
||||||
|
|
||||||
downloaded += 1
|
downloaded += 1
|
||||||
total_downloaded += 1
|
total_downloaded += 1
|
||||||
self.bar.update(downloaded)
|
|
||||||
self.bar.update(total_downloaded)
|
|
||||||
|
|
||||||
|
self.progress.update(task1, advance=1)
|
||||||
|
self.progress.update(task2, advance=1)
|
||||||
|
time.sleep(0.02)
|
||||||
|
|
||||||
|
self.progress.stop()
|
||||||
|
self.progress = None
|
||||||
|
|
||||||
|
def print_Download_Progress(self, d):
|
||||||
|
# Nutze self.progress und self.task3 für Fortschrittsanzeige
|
||||||
|
if self.progress is None or not hasattr(self, 'task3'):
|
||||||
|
return
|
||||||
|
|
||||||
|
if d['status'] == 'downloading':
|
||||||
|
total = d.get('total_bytes') or d.get('total_bytes_estimate')
|
||||||
|
downloaded = d.get('downloaded_bytes', 0)
|
||||||
|
if total:
|
||||||
|
percent = downloaded / total * 100
|
||||||
|
self.progress.update(self.task3, completed=percent, description=f"[gray]Download: {percent:.1f}%")
|
||||||
|
else:
|
||||||
|
self.progress.update(self.task3, description=f"[gray]{downloaded/1024/1024:.2f}MB geladen")
|
||||||
|
elif d['status'] == 'finished':
|
||||||
|
self.progress.update(self.task3, completed=100, description="[gray]Download abgeschlossen.")
|
||||||
|
|
||||||
def search_mode(self):
|
def search_mode(self):
|
||||||
"""Search for a series and allow user to select an option."""
|
"""Search for a series and allow user to select an option."""
|
||||||
@ -209,6 +216,7 @@ class SeriesApp:
|
|||||||
|
|
||||||
# Run the app
|
# Run the app
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
# Read the base directory from an environment variable
|
# Read the base directory from an environment variable
|
||||||
directory_to_search = os.getenv("ANIME_DIRECTORY", "\\\\sshfs.r\\ubuntu@192.168.178.43\\media\\serien\\Serien")
|
directory_to_search = os.getenv("ANIME_DIRECTORY", "\\\\sshfs.r\\ubuntu@192.168.178.43\\media\\serien\\Serien")
|
||||||
app = SeriesApp(directory_to_search)
|
app = SeriesApp(directory_to_search)
|
||||||
|
|||||||
@ -5,7 +5,7 @@ from Serie import Serie
|
|||||||
import traceback
|
import traceback
|
||||||
from GlobalLogger import error_logger, noKeyFound_logger
|
from GlobalLogger import error_logger, noKeyFound_logger
|
||||||
from Exceptions import NoKeyFoundException, MatchNotFoundError
|
from Exceptions import NoKeyFoundException, MatchNotFoundError
|
||||||
from src.Loaders.Loader import Loader
|
from Loaders.Loader import Loader
|
||||||
|
|
||||||
|
|
||||||
class SerieScanner:
|
class SerieScanner:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user