chore: better logging
This commit is contained in:
parent
7bcc46ebff
commit
32cffc3079
21
Loader.py
21
Loader.py
@ -7,16 +7,14 @@ from aniworld.models import Anime
|
|||||||
from aniworld.config import PROVIDER_HEADERS, INVALID_PATH_CHARS
|
from aniworld.config import PROVIDER_HEADERS, INVALID_PATH_CHARS
|
||||||
from aniworld.parser import arguments
|
from aniworld.parser import arguments
|
||||||
|
|
||||||
# Configure logging
|
|
||||||
logging.basicConfig(
|
|
||||||
filename="download.log",
|
|
||||||
level=logging.INFO,
|
|
||||||
format="%(asctime)s - %(levelname)s - %(message)s"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Read timeout from environment variable, default to 600 seconds (10 minutes)
|
# Read timeout from environment variable, default to 600 seconds (10 minutes)
|
||||||
timeout = int(os.getenv("DOWNLOAD_TIMEOUT", 600))
|
timeout = int(os.getenv("DOWNLOAD_TIMEOUT", 600))
|
||||||
|
|
||||||
|
download_error_logger = logging.getLogger("DownloadErrors")
|
||||||
|
download_error_handler = logging.FileHandler("download_errors.log")
|
||||||
|
download_error_handler.setLevel(logging.ERROR)
|
||||||
|
download_error_logger.addHandler(download_error_handler)
|
||||||
|
|
||||||
def download(anime: Anime): # pylint: disable=too-many-branches
|
def download(anime: Anime): # pylint: disable=too-many-branches
|
||||||
for episode in anime:
|
for episode in anime:
|
||||||
sanitized_anime_title = ''.join(
|
sanitized_anime_title = ''.join(
|
||||||
@ -38,9 +36,6 @@ def download(anime: Anime): # pylint: disable=too-many-branches
|
|||||||
|
|
||||||
output_path = os.path.join(anime.output_directory, output_file)
|
output_path = os.path.join(anime.output_directory, output_file)
|
||||||
os.makedirs(os.path.dirname(output_path), exist_ok=True)
|
os.makedirs(os.path.dirname(output_path), exist_ok=True)
|
||||||
|
|
||||||
logging.info(f"Preparing to download: {output_path}")
|
|
||||||
|
|
||||||
command = [
|
command = [
|
||||||
"yt-dlp",
|
"yt-dlp",
|
||||||
episode.get_direct_link(anime.provider, anime.language),
|
episode.get_direct_link(anime.provider, anime.language),
|
||||||
@ -48,8 +43,7 @@ def download(anime: Anime): # pylint: disable=too-many-branches
|
|||||||
"--concurrent-fragments", "4",
|
"--concurrent-fragments", "4",
|
||||||
"-o", output_path,
|
"-o", output_path,
|
||||||
"--quiet",
|
"--quiet",
|
||||||
"--no-warnings",
|
"--no-warnings"
|
||||||
"--progress"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if anime.provider in PROVIDER_HEADERS:
|
if anime.provider in PROVIDER_HEADERS:
|
||||||
@ -64,10 +58,7 @@ def download(anime: Anime): # pylint: disable=too-many-branches
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
logging.info(f"Starting download to {output_path}...")
|
|
||||||
subprocess.run(command, check=True, timeout=timeout)
|
subprocess.run(command, check=True, timeout=timeout)
|
||||||
logging.info(f"Download completed: {output_path}")
|
|
||||||
except subprocess.TimeoutExpired:
|
except subprocess.TimeoutExpired:
|
||||||
logging.error(f"Download timed out after {timeout} seconds: {' '.join(str(item) for item in command)}")
|
logging.error(f"Download timed out after {timeout} seconds: {' '.join(str(item) for item in command)}")
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
|
|||||||
56
main.py
56
main.py
@ -10,26 +10,41 @@ from aniworld.common import get_season_episode_count, get_movie_episode_count
|
|||||||
from aniworld.search import search_anime
|
from aniworld.search import search_anime
|
||||||
from Loader import download
|
from Loader import download
|
||||||
|
|
||||||
# Configure basic logging to the console
|
# Configure logging
|
||||||
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
|
||||||
|
error_logger = logging.getLogger("ErrorLog")
|
||||||
|
error_handler = logging.FileHandler("errors.log")
|
||||||
|
error_handler.setLevel(logging.ERROR)
|
||||||
|
error_logger.addHandler(error_handler)
|
||||||
|
|
||||||
|
noKeyFound_logger = logging.getLogger("NoKeyFound")
|
||||||
|
noKeyFound_handler = logging.FileHandler("NoKeyFound.log")
|
||||||
|
noKeyFound_handler.setLevel(logging.ERROR)
|
||||||
|
noKeyFound_logger.addHandler(noKeyFound_handler)
|
||||||
|
|
||||||
|
class NoKeyFoundException(Exception):
|
||||||
|
"""Exception raised when an anime key cannot be found."""
|
||||||
|
pass
|
||||||
class MatchNotFoundError(Exception):
|
class MatchNotFoundError(Exception):
|
||||||
"""Custom exception raised when the pattern match is not found."""
|
"""Exception raised when an anime key cannot be found."""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class Loader:
|
class Loader:
|
||||||
def __init__(self, basePath: str):
|
def __init__(self, basePath: str):
|
||||||
self.directory = basePath
|
self.directory = basePath
|
||||||
logging.warning(f"Initialized Loader with base path: {self.directory}")
|
logging.info(f"Initialized Loader with base path: {self.directory}")
|
||||||
|
|
||||||
def __find_mp4_files(self):
|
def __find_mp4_files(self):
|
||||||
logging.warning("Scanning for .mp4 files")
|
logging.info("Scanning for .mp4 files")
|
||||||
|
|
||||||
for root_folder_name in os.listdir(self.directory):
|
for root_folder_name in os.listdir(self.directory):
|
||||||
|
|
||||||
folder_data = defaultdict(list) # Dictionary to store MP4 files per folder
|
folder_data = defaultdict(list) # Dictionary to store MP4 files per folder
|
||||||
folder = os.path.join(self.directory, root_folder_name)
|
folder = os.path.join(self.directory, root_folder_name)
|
||||||
|
|
||||||
|
logging.info(f"Processing folder: {root_folder_name}")
|
||||||
|
|
||||||
# First pass: Scan all folders and collect MP4 file data
|
# First pass: Scan all folders and collect MP4 file data
|
||||||
for root, dirs, files in os.walk(folder):
|
for root, dirs, files in os.walk(folder):
|
||||||
mp4_files = [file for file in files if file.endswith('.mp4')]
|
mp4_files = [file for file in files if file.endswith('.mp4')]
|
||||||
@ -38,7 +53,7 @@ class Loader:
|
|||||||
yield root_folder_name, folder_data[root_folder_name]
|
yield root_folder_name, folder_data[root_folder_name]
|
||||||
|
|
||||||
for dir in self.__find_empty_folders():
|
for dir in self.__find_empty_folders():
|
||||||
logging.debug(f"Found no .mp4 files in {dir}")
|
logging.info(f"Found no .mp4 files in {dir}")
|
||||||
yield dir, []
|
yield dir, []
|
||||||
|
|
||||||
def __find_empty_folders(self):
|
def __find_empty_folders(self):
|
||||||
@ -64,17 +79,21 @@ class Loader:
|
|||||||
if os.path.exists(key_file):
|
if os.path.exists(key_file):
|
||||||
with open(key_file, 'r') as file:
|
with open(key_file, 'r') as file:
|
||||||
key = file.read().strip()
|
key = file.read().strip()
|
||||||
logging.debug(f"Key found for folder '{folder_name}': {key}")
|
logging.info(f"Key found for folder '{folder_name}': {key}")
|
||||||
return key
|
return key
|
||||||
else:
|
else:
|
||||||
key = search_anime(self.__remove_year(folder_name), True)
|
try:
|
||||||
if (len(key) >= 1):
|
key = search_anime(folder_name, True)
|
||||||
key = key[0]['link']
|
if key:
|
||||||
with open(key_file, 'w') as file:
|
key = key[0]['link']
|
||||||
file.write(key)
|
with open(key_file, 'w') as file:
|
||||||
logging.warning(f"Generated new key for folder '{folder_name}': {key}")
|
file.write(key)
|
||||||
return key
|
logging.info(f"Generated new key for folder '{folder_name}': {key}")
|
||||||
raise Exception()
|
return key
|
||||||
|
else:
|
||||||
|
raise NoKeyFoundException(f"No key found for folder '{folder_name}'")
|
||||||
|
except Exception as e:
|
||||||
|
raise NoKeyFoundException(f"Failed to retrieve key for folder '{folder_name}'") from e
|
||||||
|
|
||||||
def __GetEpisodeAndSeason(self, filename: str):
|
def __GetEpisodeAndSeason(self, filename: str):
|
||||||
pattern = r'S(\d+)E(\d+)'
|
pattern = r'S(\d+)E(\d+)'
|
||||||
@ -136,13 +155,14 @@ class Loader:
|
|||||||
try:
|
try:
|
||||||
key = self.__check_and_generate_key(folder)
|
key = self.__check_and_generate_key(folder)
|
||||||
missings = self.__GetMissingEpisodesAndSeason(key, mp4_files)
|
missings = self.__GetMissingEpisodesAndSeason(key, mp4_files)
|
||||||
|
logging.info("Missing episodes for {key} \n" + "\n".join(f"Season {str(k)}: {', '.join(str(v))}" for k, v in missings))
|
||||||
for season, missing_episodes in missings:
|
for season, missing_episodes in missings:
|
||||||
for episode in missing_episodes:
|
for episode in missing_episodes:
|
||||||
executor.submit(download_episode, folder, season, episode, key)
|
executor.submit(download_episode, folder, season, episode, key)
|
||||||
|
except NoKeyFoundException as nkfe:
|
||||||
|
noKeyFound_logger.error(f"Error processing folder '{folder}': {nkfe}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Error processing folder '{folder}': {e}")
|
error_logger.error(f"Unexpected error processing folder '{folder}': {e} \n {traceback.format_exc()}")
|
||||||
traceback.print_exc()
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Read the base directory from an environment variable
|
# Read the base directory from an environment variable
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user