fix: resolve line length violations (80+ characters)
- refactor src/cli/Main.py: split long logging config, user prompts, and method calls - refactor src/config/settings.py: break long Field definitions into multiple lines - refactor src/core/providers/enhanced_provider.py: split provider lists, headers, and long f-strings - refactor src/core/providers/streaming/voe.py: format HTTP header setup - update QualityTODO.md: mark all line length violations as completed All files now comply with 88-character line limit. Code readability improved with better-structured multi-line statements and intermediate variables for complex expressions.
This commit is contained in:
156
src/cli/Main.py
156
src/cli/Main.py
@@ -1,22 +1,22 @@
|
||||
import sys
|
||||
import os
|
||||
import logging
|
||||
from ..core.providers import aniworld_provider
|
||||
|
||||
from rich.progress import Progress
|
||||
from ..core.entities import SerieList
|
||||
from ..core.SerieScanner import SerieScanner
|
||||
from ..core.providers.provider_factory import Loaders
|
||||
from ..core.entities.series import Serie
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
from rich.progress import Progress
|
||||
|
||||
from ..core.entities import SerieList
|
||||
from ..core.entities.series import Serie
|
||||
from ..core.providers import aniworld_provider
|
||||
from ..core.providers.provider_factory import Loaders
|
||||
from ..core.SerieScanner import SerieScanner
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(level=logging.FATAL, format='%(asctime)s - %(levelname)s - %(funcName)s - %(message)s')
|
||||
log_format = "%(asctime)s - %(levelname)s - %(funcName)s - %(message)s"
|
||||
logging.basicConfig(level=logging.FATAL, format=log_format)
|
||||
console_handler = logging.StreamHandler()
|
||||
console_handler.setLevel(logging.ERROR)
|
||||
console_handler.setFormatter(logging.Formatter(
|
||||
"%(asctime)s - %(levelname)s - %(funcName)s - %(message)s")
|
||||
)
|
||||
console_handler.setFormatter(logging.Formatter(log_format))
|
||||
for h in logging.root.handlers:
|
||||
logging.root.removeHandler(h)
|
||||
|
||||
@@ -76,8 +76,11 @@ class SeriesApp:
|
||||
"""Handle user input for selecting series."""
|
||||
self.display_series()
|
||||
while True:
|
||||
selection = input(
|
||||
"\nSelect series by number (e.g. '1', '1,2' or 'all') or type 'exit' to return: ").strip().lower()
|
||||
prompt = (
|
||||
"\nSelect series by number (e.g. '1', '1,2' or 'all') "
|
||||
"or type 'exit' to return: "
|
||||
)
|
||||
selection = input(prompt).strip().lower()
|
||||
|
||||
if selection == "exit":
|
||||
return None
|
||||
@@ -87,17 +90,31 @@ class SeriesApp:
|
||||
selected_series = self.series_list
|
||||
else:
|
||||
try:
|
||||
indexes = [int(num) - 1 for num in selection.split(",")]
|
||||
selected_series = [self.series_list[i] for i in indexes if 0 <= i < len(self.series_list)]
|
||||
indexes = [
|
||||
int(num) - 1 for num in selection.split(",")
|
||||
]
|
||||
selected_series = [
|
||||
self.series_list[i]
|
||||
for i in indexes
|
||||
if 0 <= i < len(self.series_list)
|
||||
]
|
||||
except ValueError:
|
||||
print("Invalid selection. Going back to the result display.")
|
||||
msg = (
|
||||
"Invalid selection. "
|
||||
"Going back to the result display."
|
||||
)
|
||||
print(msg)
|
||||
self.display_series()
|
||||
continue
|
||||
|
||||
if selected_series:
|
||||
return selected_series
|
||||
else:
|
||||
print("No valid series selected. Going back to the result display.")
|
||||
msg = (
|
||||
"No valid series selected. "
|
||||
"Going back to the result display."
|
||||
)
|
||||
print(msg)
|
||||
return None
|
||||
|
||||
|
||||
@@ -107,7 +124,6 @@ class SeriesApp:
|
||||
func(*args, **kwargs)
|
||||
return True
|
||||
except Exception as e:
|
||||
|
||||
print(e)
|
||||
time.sleep(delay)
|
||||
return False
|
||||
@@ -115,22 +131,45 @@ class SeriesApp:
|
||||
def download_series(self, series):
|
||||
"""Simulate the downloading process with a progress bar."""
|
||||
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.progress = Progress()
|
||||
task1 = self.progress.add_task("[red]Processing...", total=total_episodes)
|
||||
task2 = self.progress.add_task(f"[green]...", total=0)
|
||||
self.task3 = self.progress.add_task(f"[Gray]...", total=100) # Setze total auf 100 für Prozentanzeige
|
||||
task1 = self.progress.add_task(
|
||||
"[red]Processing...", total=total_episodes
|
||||
)
|
||||
task2 = self.progress.add_task("[green]...", total=0)
|
||||
# Set total to 100 for percentage display
|
||||
self.task3 = self.progress.add_task("[Gray]...", total=100)
|
||||
self.progress.start()
|
||||
|
||||
for serie in series:
|
||||
serie_episodes = sum(len(ep) for ep in serie.episodeDict.values())
|
||||
self.progress.update(task2, description=f"[green]{serie.folder}", total=serie_episodes)
|
||||
serie_episodes = sum(
|
||||
len(ep) for ep in serie.episodeDict.values()
|
||||
)
|
||||
self.progress.update(
|
||||
task2,
|
||||
description=f"[green]{serie.folder}",
|
||||
total=serie_episodes,
|
||||
)
|
||||
downloaded = 0
|
||||
for season, episodes in serie.episodeDict.items():
|
||||
for episode in episodes:
|
||||
loader = self.Loaders.GetLoader(key="aniworld.to")
|
||||
if loader.IsLanguage(season, episode, serie.key):
|
||||
self.retry(loader.Download, 3, 1, self.directory_to_search, serie.folder, season, episode, serie.key, "German Dub",self.print_Download_Progress)
|
||||
self.retry(
|
||||
loader.Download,
|
||||
3,
|
||||
1,
|
||||
self.directory_to_search,
|
||||
serie.folder,
|
||||
season,
|
||||
episode,
|
||||
serie.key,
|
||||
"German Dub",
|
||||
self.print_Download_Progress,
|
||||
)
|
||||
|
||||
downloaded += 1
|
||||
total_downloaded += 1
|
||||
@@ -143,20 +182,29 @@ class SeriesApp:
|
||||
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'):
|
||||
"""Update download progress in the UI."""
|
||||
# Use self.progress and self.task3 to display progress
|
||||
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 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}%")
|
||||
desc = f"[gray]Download: {percent:.1f}%"
|
||||
self.progress.update(
|
||||
self.task3, completed=percent, description=desc
|
||||
)
|
||||
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.")
|
||||
mb_downloaded = downloaded / 1024 / 1024
|
||||
desc = f"[gray]{mb_downloaded:.2f}MB geladen"
|
||||
self.progress.update(self.task3, description=desc)
|
||||
elif d["status"] == "finished":
|
||||
desc = "[gray]Download abgeschlossen."
|
||||
self.progress.update(
|
||||
self.task3, completed=100, description=desc
|
||||
)
|
||||
|
||||
def search_mode(self):
|
||||
"""Search for a series and allow user to select an option."""
|
||||
@@ -172,7 +220,10 @@ class SeriesApp:
|
||||
print(f"{i}. {result.get('name')}")
|
||||
|
||||
while True:
|
||||
selection = input("\nSelect an option by number or type '<enter>' to return: ").strip().lower()
|
||||
prompt = (
|
||||
"\nSelect an option by number or type '<enter>' to return: "
|
||||
)
|
||||
selection = input(prompt).strip().lower()
|
||||
|
||||
if selection == "":
|
||||
return
|
||||
@@ -181,7 +232,14 @@ class SeriesApp:
|
||||
index = int(selection) - 1
|
||||
if 0 <= index < len(results):
|
||||
chosen_name = results[index]
|
||||
self.List.add(Serie(chosen_name["link"], chosen_name["name"], "aniworld.to", chosen_name["link"], {}))
|
||||
serie = Serie(
|
||||
chosen_name["link"],
|
||||
chosen_name["name"],
|
||||
"aniworld.to",
|
||||
chosen_name["link"],
|
||||
{},
|
||||
)
|
||||
self.List.add(serie)
|
||||
return
|
||||
else:
|
||||
print("Invalid selection. Try again.")
|
||||
@@ -194,16 +252,22 @@ class SeriesApp:
|
||||
def run(self):
|
||||
"""Main function to run the app."""
|
||||
while True:
|
||||
action = input("\nChoose action ('s' for search, 'i' for init or 'd' for download): ").strip().lower()
|
||||
prompt = (
|
||||
"\nChoose action ('s' for search, 'i' for init "
|
||||
"or 'd' for download): "
|
||||
)
|
||||
action = input(prompt).strip().lower()
|
||||
|
||||
if action == "s":
|
||||
self.search_mode()
|
||||
if action == "i":
|
||||
|
||||
print("\nRescanning series...\n")
|
||||
|
||||
self.progress = Progress()
|
||||
self.task1 = self.progress.add_task("[red]items processed...", total=300)
|
||||
task1 = self.progress.add_task(
|
||||
"[red]items processed...", total=300
|
||||
)
|
||||
self.task1 = task1
|
||||
self.progress.start()
|
||||
|
||||
self.SerieScanner.Reinit()
|
||||
@@ -220,10 +284,12 @@ class SeriesApp:
|
||||
if selected_series:
|
||||
self.download_series(selected_series)
|
||||
|
||||
# Run the app
|
||||
if __name__ == "__main__":
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 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")
|
||||
default_dir = (
|
||||
"\\\\sshfs.r\\ubuntu@192.168.178.43\\media\\serien\\Serien"
|
||||
)
|
||||
directory_to_search = os.getenv("ANIME_DIRECTORY", default_dir)
|
||||
app = SeriesApp(directory_to_search)
|
||||
app.run()
|
||||
app.run()
|
||||
|
||||
Reference in New Issue
Block a user