diff --git a/PythonScripts/gallery-dl.py b/PythonScripts/gallery-dl.py new file mode 100644 index 0000000..2083439 --- /dev/null +++ b/PythonScripts/gallery-dl.py @@ -0,0 +1,144 @@ +#!/bin/python3 +import os +import sys +import subprocess +from datetime import datetime +import requests +import hashlib +from urllib.parse import urlparse +import signal +import argparse + +# Default Constants +DEFAULT_WORKDIR = "/mnt/Apps/Syncthing/UserData/Aroy/Pictures/Reference/gallery-dl" +CONFIG = "gallery-dl.conf" +DATETIME = datetime.now().strftime("%F_%H-%M-%S") + + +# Handle Ctrl-C +def handle_sigint(signal_received, frame): + print("\nProcess interrupted. Cleaning up...") + sys.exit(1) + + +signal.signal(signal.SIGINT, handle_sigint) + + +# Function to check if lock file exists +def check_lock(site, workdir): + lock_file = os.path.join(workdir, f".gallery-dl-{site}.lock") + if os.path.isfile(lock_file): + print(f"Lock file exists for {site}. Skipping...") + return False + else: + open(lock_file, "w").close() + return True + + +# Function to remove lock file +def remove_lock(site, workdir): + lock_file = os.path.join(workdir, f".gallery-dl-{site}.lock") + if os.path.isfile(lock_file): + os.remove(lock_file) + print(f"Removed lock file: {lock_file}") + + +# Function to send a push notification +def push_notice(site): + title = f"Run done for {site}" + data = f"Run done for {site}." + headers = {"Title": title, "Priority": "normal", "Tags": "info"} + requests.post( + "https://ntfy.aroy-art.com/g11M8PwuAYBTDYCi", headers=headers, data=data + ) + + +# Generate descriptive sitename from URL +def generate_site_name_from_url(url): + parsed_url = urlparse(url) + hostname = parsed_url.hostname or "unknown-site" + path_hash = hashlib.md5(parsed_url.path.encode("utf-8")).hexdigest()[:8] + return f"{hostname}-{path_hash}" + + +# Function to execute gallery-dl command +def execute_gallery_dl(input_source, log_file, sitename, workdir, extra_args=None): + if check_lock(sitename, workdir): + log_path = os.path.join(workdir, "logs", sitename, f"{log_file}-{DATETIME}.log") + command = [ + "/home/aroy/.local/bin/gallery-dl", + "-c", + os.path.join(workdir, CONFIG), + "-d", + workdir, + "--mtime-from-date", + "--write-metadata", + "--write-log", + log_path, + ] + if os.path.isfile(input_source): + command.extend(["--input-file", input_source]) + else: + command.append(input_source) + + if extra_args: + for arg in extra_args: + command.extend(["-o", arg]) + + subprocess.run(command) + remove_lock(sitename, workdir) + push_notice(sitename) + + +# Main execution block +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Run gallery-dl with specified input and options." + ) + parser.add_argument( + "-i", "--input_source", help="Sitename, URL, or input file", required=False + ) + parser.add_argument( + "--workdir", default=DEFAULT_WORKDIR, help="Override the working directory" + ) + parser.add_argument( + "-o", + "--option", + action="append", + help="Additional arguments for gallery-dl, can be used multiple times", + ) + + args, remaining = parser.parse_known_args() + + # If input_source is not given with -i, treat the last argument as input_source + input_source = ( + args.input_source + if args.input_source + else (remaining[-1] if remaining else None) + ) + extra_args = args.option if args.option else [] + workdir = args.workdir + + if not input_source: + print("Error: No input source provided.") + sys.exit(1) + + if input_source.startswith("http://") or input_source.startswith("https://"): + sitename = generate_site_name_from_url(input_source) + elif os.path.isfile(input_source): + sitename = os.path.splitext(os.path.basename(input_source))[0] + else: + potential_file = os.path.join(workdir, f"user-urls-{input_source.lower()}.txt") + if os.path.isfile(potential_file): + input_source = potential_file + sitename = input_source.lower().split("-")[-1].split(".")[0] + else: + print( + f"Error: Input '{input_source}' is not a valid URL, file, or predefined source." + ) + sys.exit(1) + + execute_gallery_dl(input_source, f"log-{sitename}", sitename, workdir, extra_args) + + print(f"Done at {datetime.now().strftime('%F_%H-%M-%S')}") + print("Purr Done!")