For Lidarr searches, implemented 15 sec timeout before falling back to yt-dlp

This commit is contained in:
zebra 2025-06-09 13:33:32 -07:00
parent 6810c0ecbb
commit d186e32c03

View File

@ -5,6 +5,7 @@ import os
import re import re
import subprocess import subprocess
import requests import requests
from requests.exceptions import Timeout
# === CONFIGURATION === # === CONFIGURATION ===
LIDARR_URL = "http://localhost:8686" # Your Lidarr base URL LIDARR_URL = "http://localhost:8686" # Your Lidarr base URL
@ -68,22 +69,33 @@ def yt_dlp_download(url_or_query, target_folder):
url_or_query url_or_query
]) ])
def search_artist(name): def search_artist(name, timeout_seconds=15):
resp = requests.get( try:
f"{LIDARR_URL}/api/v1/artist/lookup", resp = requests.get(
headers=headers, f"{LIDARR_URL}/api/v1/artist/lookup",
params={"term": name} headers=headers,
) params={"term": name},
resp.raise_for_status() timeout=timeout_seconds
results = resp.json() )
return results[0] if results else None resp.raise_for_status()
results = resp.json()
return results[0] if results else None
except Timeout:
print(f"Lidarr artist search timed out after {timeout_seconds} seconds.")
return None
except requests.RequestException as e:
print(f"Lidarr artist search failed: {e}")
return None
def get_existing_artist(name): def get_existing_artist(name):
resp = requests.get(f"{LIDARR_URL}/api/v1/artist", headers=headers) try:
resp.raise_for_status() resp = requests.get(f"{LIDARR_URL}/api/v1/artist", headers=headers)
for artist in resp.json(): resp.raise_for_status()
if artist["artistName"].lower() == name.lower(): for artist in resp.json():
return artist if artist["artistName"].lower() == name.lower():
return artist
except requests.RequestException as e:
print(f"Failed to get existing artists: {e}")
return None return None
def add_artist(metadata_artist): def add_artist(metadata_artist):
@ -156,16 +168,16 @@ def main():
if is_url(input_str): if is_url(input_str):
print("Input is a URL. Extracting metadata to find artist...") print("Input is a URL. Extracting metadata to find artist...")
metadata = run_yt_dlp_get_metadata(input_str) metadata = run_yt_dlp_get_metadata(input_str)
if metadata: if metadata:
artist_name = get_artist_from_metadata(metadata) artist_name = get_artist_from_metadata(metadata)
print(f"Extracted artist name: {artist_name}") print(f"Extracted artist name: {artist_name}")
else: else:
print("Failed to get metadata from URL.") print("Failed to get metadata from URL.")
artist_name = "Unknown Artist" artist_name = "Unknown Artist"
target_folder = os.path.join(ROOT_FOLDER, artist_name, "youtube") target_folder = os.path.join(ROOT_FOLDER, artist_name, "youtube")
yt_dlp_download(input_str, target_folder) yt_dlp_download(input_str, target_folder)
return return
if " - " not in input_str: if " - " not in input_str:
print("Input must be in 'Artist - Track' format.") print("Input must be in 'Artist - Track' format.")
@ -179,10 +191,10 @@ def main():
artist = get_existing_artist(artist_name) artist = get_existing_artist(artist_name)
if not artist: if not artist:
print("Artist not found. Searching Lidarr metadata...") print("Artist not found. Searching Lidarr metadata (with timeout)...")
metadata = search_artist(artist_name) metadata = search_artist(artist_name)
if not metadata: if not metadata:
print("No match found in Lidarr metadata. Falling back to yt-dlp.") print("No match found or search timed out. Falling back to yt-dlp.")
yt_dlp_download(input_str, os.path.join(ROOT_FOLDER, artist_name, "youtube")) yt_dlp_download(input_str, os.path.join(ROOT_FOLDER, artist_name, "youtube"))
return return