Paws/PythonScripts/gallery-dl.py

145 lines
4.4 KiB
Python
Raw Normal View History

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