#!/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!")