PythonScripts: gallery-dl wrapper with lock handeling & logging
This commit is contained in:
parent
ded4072361
commit
3dedaf949a
1 changed files with 144 additions and 0 deletions
144
PythonScripts/gallery-dl.py
Normal file
144
PythonScripts/gallery-dl.py
Normal file
|
@ -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!")
|
Loading…
Reference in a new issue