diff --git a/cli.py b/cli.py index b707ffd..7cf905e 100644 --- a/cli.py +++ b/cli.py @@ -1,10 +1,7 @@ from src.logic.cli import avail_check, main as cli_main import os import argparse -from src.logic.rename import rename -from src.logic.tag import tag_folder -from src.logic.move import move -from src.logic.detect_chapters import detect_chapters +from src.logic.utils import move, tag_folder, rename, detect_chapters from komconfig import KomConfig cfg = KomConfig() diff --git a/src/logic/utils.py b/src/logic/utils.py new file mode 100644 index 0000000..6b2f648 --- /dev/null +++ b/src/logic/utils.py @@ -0,0 +1,152 @@ +import os +import re +from komconfig import KomConfig +from pathlib import Path +import shutil +import subprocess + +config = KomConfig() + + +def rename(folder: str = "/home/alexander/Downloads/torrents/manga/") -> None: + """Rename the files in a folder according to the template. + Template: [Name] v[nr] #[nr].ext (e.g. "The Flash v1 #1.cbz"). + + Args: + ---- + - folder (str): the string to the folder + """ + # Get the files in the folder + if "~" in folder: + folder = os.path.expanduser(folder) + files = os.listdir(folder) + print(files) + for file in files: + if os.path.isdir(f"{folder}/{file}"): + rename(f"{folder}/{file}") + if not file.endswith(".cbz"): + print(f"Skipping {file}, not a cbz file") + continue + ext = file.split(".")[-1] + + match = re.search(r"v\d{2,4}", file) + if match: + split_start = match.start() + split_end = match.end() + # Split the filename between split_start and split_end + volume = file[split_start:split_end] + # Split the filename at the split index, but keep the "v" and digits in the title + title = file[:split_start].strip() + # add the volume number to the title as a suffix #nr + title = f"{title} {volume} #{volume.replace('v', '')}" + print(title) + # rename the file + os.rename(f"{folder}/{file}", f"{folder}/{title}.{ext}") + + +# rename the folder +def rename_recursive(folder: str) -> None: + # get all directories in the folder and apply the rename function to them + for root, dirs, _files in os.walk(folder): + for dir in dirs: + rename(f"{root}/{dir}") + + +def tag_folder(folder: Path = Path(config.komgrabber.download_location)) -> None: + """ + Recursively tags all the .cbz files in the folder using ComicTagger + + Parameters + ---------- + folder : Path, optional + The path that will be used to tag, by default Path(config.komgrabber.download_location) + """ + # Get the files in the folder + if "~" in str(folder): + folder = os.path.expanduser(folder) + files = os.listdir(folder) + for file in files: + if os.path.isdir(f"{folder}/{file}"): + tag_folder(f"{folder}/{file}") + if not file.endswith(".cbz"): + continue + print("Trying to tag file", file) + subprocess.call( + f'comictagger -s -t cr -f -o "{folder}/{file}" --nosummary --overwrite {"-i" if config.komgrabber.tag_interactive else ""}', + shell=True, + ) + + +def move(src, dest: Path = Path(config.komga.media_path)) -> None: + """ + Moves the files from the source folder to the destination folder. + If the folder already exists in the destination, only move the new files. + + Parameters + ---------- + src : str + The source folder + dest : Path, optional + The destination folder used by Komga, by default Path(config.komga.media_path) + """ + # Get the files in the folder + # +move the folders from src to disc, if folder already exists, only move new files + if "~" in src: + src = os.path.expanduser(src) + folders = os.listdir(src) + for folder in folders: + if not os.path.exists(f"{dest}/{folder}"): + print(f"Moving {folder} to {dest}") + shutil.move(f"{src}/{folder}", dest) + else: + files = os.listdir(f"{src}/{folder}") + for file in files: + if not os.path.exists(f"{dest}/{folder}/{file}"): + print(f"Moving {file} to {dest}/{folder}") + shutil.move(f"{src}/{folder}/{file}", f"{dest}/{folder}") + # Remove empty folders + remove_empty_folders(src) + + +def remove_empty_folders(src): + """ + Recursively removes empty folders in the source folder + + Parameters + ---------- + src : Path, str + The source folder + """ + folders = os.listdir(src) + for folder in folders: + if os.path.isfile(f"{src}/{folder}"): + continue + if not os.listdir(f"{src}/{folder}"): + print(f"Removing {folder}") + os.rmdir(f"{src}/{folder}") + else: + remove_empty_folders(f"{src}/{folder}") + + +def detect_chapters(src: Path = Path(config.komgrabber.download_location)) -> None: + """ + Detects and deletes any non-volume file in the source folder + + Parameters + ---------- + src : Path, optional + The Path to be checked, by default Path(config.komgrabber.download_location) + """ + if "~" in src: + src = os.path.expanduser(src) + for folder in os.listdir(src): + if os.path.isdir(f"{src}/{folder}"): + files = os.listdir(f"{src}/{folder}") + for file in files: + # check for regex "v(d) #(d)" in the file name + regex = re.compile(r"^.* v(\d+) #(\d+(?:-\d+)?)\.cbz$") + if regex.search(file): + print(f"File {file} is a Volume") + else: + print(f"Deleting chapter {file}") + os.remove(f"{src}/{folder}/{file}")