64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
import os
|
|
import sys
|
|
import signal
|
|
import atexit
|
|
from deezspot.libutils.logging_utils import logger
|
|
|
|
# --- Global tracking of active downloads ---
|
|
ACTIVE_DOWNLOADS = set()
|
|
CLEANUP_LOCK = False
|
|
CURRENT_DOWNLOAD = None
|
|
|
|
def register_active_download(file_path):
|
|
"""Register a file as being actively downloaded"""
|
|
global CURRENT_DOWNLOAD
|
|
ACTIVE_DOWNLOADS.add(file_path)
|
|
CURRENT_DOWNLOAD = file_path
|
|
|
|
def unregister_active_download(file_path):
|
|
"""Remove a file from the active downloads list"""
|
|
global CURRENT_DOWNLOAD
|
|
if file_path in ACTIVE_DOWNLOADS:
|
|
ACTIVE_DOWNLOADS.remove(file_path)
|
|
if CURRENT_DOWNLOAD == file_path:
|
|
CURRENT_DOWNLOAD = None
|
|
|
|
def cleanup_active_downloads():
|
|
"""Clean up any incomplete downloads during process termination"""
|
|
global CLEANUP_LOCK, CURRENT_DOWNLOAD
|
|
if CLEANUP_LOCK:
|
|
return
|
|
|
|
CLEANUP_LOCK = True
|
|
# Only remove the file that was in progress when stopped
|
|
if CURRENT_DOWNLOAD:
|
|
try:
|
|
if os.path.exists(CURRENT_DOWNLOAD):
|
|
logger.info(f"Removing incomplete download: {CURRENT_DOWNLOAD}")
|
|
os.remove(CURRENT_DOWNLOAD)
|
|
# No need to call unregister_active_download here,
|
|
# as the process is terminating.
|
|
except Exception as e:
|
|
logger.error(f"Error cleaning up file {CURRENT_DOWNLOAD}: {str(e)}")
|
|
CLEANUP_LOCK = False
|
|
|
|
# Register the cleanup function to run on exit
|
|
atexit.register(cleanup_active_downloads)
|
|
|
|
# Set up signal handlers
|
|
def signal_handler(sig, frame):
|
|
logger.info(f"Received termination signal {sig}. Cleaning up...")
|
|
cleanup_active_downloads()
|
|
if sig == signal.SIGINT:
|
|
logger.info("CTRL+C received. Exiting...")
|
|
sys.exit(0)
|
|
|
|
# Register signal handlers for common termination signals
|
|
signal.signal(signal.SIGINT, signal_handler) # CTRL+C
|
|
signal.signal(signal.SIGTERM, signal_handler) # Normal termination
|
|
try:
|
|
# These may not be available on all platforms
|
|
signal.signal(signal.SIGHUP, signal_handler) # Terminal closed
|
|
signal.signal(signal.SIGQUIT, signal_handler) # CTRL+\
|
|
except AttributeError:
|
|
pass |