From 22ee445b7eb12f6eed8d23f9d161a2fefdfd00d1 Mon Sep 17 00:00:00 2001 From: Lukas Pupka-Lipinski Date: Fri, 30 May 2025 17:30:32 +0200 Subject: [PATCH] backup --- .gitmodules | 4 + AniWorld-Downloader | 1 + aniworld-3.0.2-py3-none-any.whl | Bin 68843 -> 0 bytes requirements.txt | 1 - src/Exceptions.py | 7 ++ src/FolderLookup.py | 160 ++++++++++++++++++++++++++++++++ src/GlobalLogger.py | 40 ++++++++ Loader.py => src/Loader.py | 2 +- src/Serie.py | 47 ++++++++++ src/console.py | 59 ++++++++++++ main.py => src/main.py | 17 ++-- 11 files changed, 325 insertions(+), 13 deletions(-) create mode 100644 .gitmodules create mode 160000 AniWorld-Downloader delete mode 100644 aniworld-3.0.2-py3-none-any.whl create mode 100644 src/Exceptions.py create mode 100644 src/FolderLookup.py create mode 100644 src/GlobalLogger.py rename Loader.py => src/Loader.py (97%) create mode 100644 src/Serie.py create mode 100644 src/console.py rename main.py => src/main.py (92%) diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..2bc6a96 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "AniWorld-Downloader"] + path = AniWorld-Downloader + url = https://github.com/lukaspupkalipinski/AniWorld-Downloader.git + branch = next diff --git a/AniWorld-Downloader b/AniWorld-Downloader new file mode 160000 index 0000000..94e332f --- /dev/null +++ b/AniWorld-Downloader @@ -0,0 +1 @@ +Subproject commit 94e332f37b3f037d175e579ea370ab2be90534e4 diff --git a/aniworld-3.0.2-py3-none-any.whl b/aniworld-3.0.2-py3-none-any.whl deleted file mode 100644 index dbe63964caaa8850fd3f570e99a1580680c3bac8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68843 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 z 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 xe_{U?jCjv{AA|Tev&IMH>3 '{cleaned_string}'") + return cleaned_string + + def __ReadDataFromFile(self, folder_name: str): + folder_path = os.path.join(self.directory, folder_name) + key = None + key_file = os.path.join(folder_path, 'key') + serie_file = os.path.join(folder_path, 'data') + + if os.path.exists(key_file): + with open(key_file, 'r') as file: + logging.info(f"Key found for folder '{folder_name}': {key}") + key = file.read().strip() + return Serie(key, "", "aniworld.to" ,folder_name) + + if os.path.exists(serie_file): + with open(serie_file, "rb") as file: + logging.info(f"load serie_file from '{folder_name}': {serie_file}") + return pickle.load(file) + + return None + + def __SaveData(self, serie: Serie, folder_name: str): + """Saves a Serie object to a file using JSON.""" + + folder_path = os.path.join(self.directory, folder_name) + serie_file = os.path.join(folder_path, 'data') + with open(serie_file, "w", encoding="utf-8") as file: + json.dump(serie, file, indent=4) + + + def __GetEpisodeAndSeason(self, filename: str): + pattern = r'S(\d+)E(\d+)' + match = re.search(pattern, filename) + if match: + season = match.group(1) + episode = match.group(2) + logging.debug(f"Extracted season {season}, episode {episode} from '{filename}'") + return int(season), int(episode) + else: + logging.error(f"Failed to find season/episode pattern in '{filename}'") + raise MatchNotFoundError("Season and episode pattern not found in the filename.") + + def __GetEpisodesAndSeasons(self, mp4_files: []): + episodes_dict = {} + + for file in mp4_files: + season, episode = self.__GetEpisodeAndSeason(file) + + if season in episodes_dict: + episodes_dict[season].append(episode) + else: + episodes_dict[season] = [episode] + + return episodes_dict + + + def __GetMissingEpisodesAndSeason(self, key: str, mp4_files: []): + expected_dict = get_season_episode_count(key) # key season , value count of episodes + filedict = self.__GetEpisodesAndSeasons(mp4_files) + episodes_dict = {} + for season, expected_count in expected_dict.items(): + existing_episodes = filedict.get(season, []) + missing_episodes = [ep for ep in range(1, expected_count + 1) if ep not in existing_episodes] + + if missing_episodes: + episodes_dict[season] = [missing_episodes] + + return episodes_dict, "aniworld.to" + +#gg = FolderLookup("\\\\sshfs.r\\ubuntu@192.168.178.43\\media\\serien\\Serien") + +base_url = f"https://aniworld.to/anime/stream/aico-incarnation" +headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", + "Accept": "*/*", + "Referer": "https://www.example.com" +} + +session = requests.Session() +response = requests.get(base_url, headers=headers, timeout=30) +c = response.content; \ No newline at end of file diff --git a/src/GlobalLogger.py b/src/GlobalLogger.py new file mode 100644 index 0000000..def22d1 --- /dev/null +++ b/src/GlobalLogger.py @@ -0,0 +1,40 @@ +import logging + +console_handler = None +error_logger = None +noKeyFound_logger = None +noGerFound_logger = None +def setupLogger(): + global console_handler, error_logger, noKeyFound_logger, noGerFound_logger + # Configure logging + logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(funcName)s - %(message)s') + if (console_handler is None): + console_handler = logging.StreamHandler() + console_handler.setLevel(logging.INFO) + console_handler.setFormatter(logging.Formatter( + "%(asctime)s - %(levelname)s - %(funcName)s - %(message)s") + ) + logging.getLogger().addHandler(console_handler) + logging.getLogger("urllib3.connectionpool").setLevel(logging.INFO) + logging.getLogger('charset_normalizer').setLevel(logging.INFO) + logging.getLogger().setLevel(logging.INFO) + + if (error_logger is None): + error_logger = logging.getLogger("ErrorLog") + error_handler = logging.FileHandler("../errors.log") + error_handler.setLevel(logging.ERROR) + error_logger.addHandler(error_handler) + + if (noKeyFound_logger is None): + noKeyFound_logger = logging.getLogger("NoKeyFound") + noKeyFound_handler = logging.FileHandler("../NoKeyFound.log") + noKeyFound_handler.setLevel(logging.ERROR) + noKeyFound_logger.addHandler(noKeyFound_handler) + + if (noGerFound_logger is None): + noGerFound_logger = logging.getLogger("noGerFound") + noGerFound_handler = logging.FileHandler("../noGerFound.log") + noGerFound_handler.setLevel(logging.ERROR) + noGerFound_logger.addHandler(noGerFound_handler) + +setupLogger() \ No newline at end of file diff --git a/Loader.py b/src/Loader.py similarity index 97% rename from Loader.py rename to src/Loader.py index 2724f27..e7d3c98 100644 --- a/Loader.py +++ b/src/Loader.py @@ -11,7 +11,7 @@ from aniworld.parser import arguments timeout = int(os.getenv("DOWNLOAD_TIMEOUT", 600)) download_error_logger = logging.getLogger("DownloadErrors") -download_error_handler = logging.FileHandler("download_errors.log") +download_error_handler = logging.FileHandler("../download_errors.log") download_error_handler.setLevel(logging.ERROR) download_error_logger.addHandler(download_error_handler) diff --git a/src/Serie.py b/src/Serie.py new file mode 100644 index 0000000..90e2782 --- /dev/null +++ b/src/Serie.py @@ -0,0 +1,47 @@ +class Serie: + def __init__(self, key: str, name: str, site: str, folder: str): + self._key = key + self._name = name + self._site = site + self._folder = folder + self._episodeDict = dict[int, list[int]] + + @property + def key(self) -> str: + return self._key + + @key.setter + def key(self, value: str): + self._key = value + + @property + def name(self) -> str: + return self._name + + @name.setter + def name(self, value: str): + self._name = value + + @property + def site(self) -> str: + return self._site + + @site.setter + def site(self, value: str): + self._site = value + + @property + def folder(self) -> str: + return self._folder + + @folder.setter + def folder(self, value: str): + self._folder = value + + @property + def episodeDict(self) -> dict[int, list[int]]: + return self._episodeDict + + @episodeDict.setter + def episodeDict(self, value: dict[int, list[int]]): + self._episodeDict = value diff --git a/src/console.py b/src/console.py new file mode 100644 index 0000000..aa76169 --- /dev/null +++ b/src/console.py @@ -0,0 +1,59 @@ +import sys +import os +import traceback +import re +import logging +from concurrent.futures import ThreadPoolExecutor +from collections import defaultdict +from aniworld.models import Anime, Episode +from aniworld.common import get_season_episode_count, get_movie_episode_count +from aniworld.search import search_anime +from Loader import download + + +# Configure logging +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(funcName)s - %(message)s') +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.INFO) +console_handler.setFormatter(logging.Formatter( + "%(asctime)s - %(levelname)s - %(funcName)s - %(message)s") +) +logging.getLogger().addHandler(console_handler) +logging.getLogger("urllib3.connectionpool").setLevel(logging.INFO) +logging.getLogger('charset_normalizer').setLevel(logging.INFO) +logging.getLogger().setLevel(logging.INFO) + +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) + +noGerFound_logger = logging.getLogger("noGerFound") +noGerFound_handler = logging.FileHandler("../noGerFound.log") +noGerFound_handler.setLevel(logging.ERROR) +noGerFound_logger.addHandler(noGerFound_handler) + +class NoKeyFoundException(Exception): + """Exception raised when an anime key cannot be found.""" + pass +class MatchNotFoundError(Exception): + """Exception raised when an anime key cannot be found.""" + pass + +class ConsoleLoader: + def __init__(self, basePath: str): + self.directory = basePath + logging.info(f"Initialized Loader with base path: {self.directory}") + + + +# 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") + +loader = Loader(directory_to_search) +loader.LoadMissing() \ No newline at end of file diff --git a/main.py b/src/main.py similarity index 92% rename from main.py rename to src/main.py index fdb8d17..01de9c5 100644 --- a/main.py +++ b/src/main.py @@ -1,14 +1,12 @@ -import sys import os import traceback import re import logging -from concurrent.futures import ThreadPoolExecutor from collections import defaultdict from aniworld.models import Anime, Episode -from aniworld.common import get_season_episode_count, get_movie_episode_count +from aniworld.common import get_season_episode_count from aniworld.search import search_anime -from Loader import download +from src.Loader import download # Configure logging @@ -24,17 +22,17 @@ logging.getLogger('charset_normalizer').setLevel(logging.INFO) logging.getLogger().setLevel(logging.INFO) error_logger = logging.getLogger("ErrorLog") -error_handler = logging.FileHandler("errors.log") +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 = logging.FileHandler("../NoKeyFound.log") noKeyFound_handler.setLevel(logging.ERROR) noKeyFound_logger.addHandler(noKeyFound_handler) noGerFound_logger = logging.getLogger("noGerFound") -noGerFound_handler = logging.FileHandler("noGerFound.log") +noGerFound_handler = logging.FileHandler("../noGerFound.log") noGerFound_handler.setLevel(logging.ERROR) noGerFound_logger.addHandler(noGerFound_handler) @@ -167,8 +165,6 @@ class Loader: except Exception as e: logging.error(f"Error downloading episode {episode} of season {season} for anime {key}: {e}") - # Using ThreadPoolExecutor to run downloads in parallel - #with ThreadPoolExecutor(max_workers=1) as executor: # Adjust number of workers as needed for folder, mp4_files in result: try: key = self.__check_and_generate_key(folder) @@ -176,7 +172,6 @@ class Loader: for season, missing_episodes in missings: logging.info(f"Missing episodes for {key}\nSeason {str(season)}: Episodes: " + ",".join(f"{''.join(str(v))}" for v in missing_episodes)) for episode in missing_episodes: - #executor.submit(download_episode, folder, season, episode, key) download_episode(folder, season, episode, key) except NoKeyFoundException as nkfe: noKeyFound_logger.error(f"Error processing folder '{folder}': {nkfe}") @@ -186,7 +181,7 @@ class Loader: # 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", "D:\sss") +#directory_to_search = os.getenv("ANIME_DIRECTORY", "D:\\sss") loader = Loader(directory_to_search) loader.LoadMissing() \ No newline at end of file