1
0
mirror of https://github.com/home-assistant/core.git synced 2026-02-23 03:17:06 +00:00
Files
core/homeassistant/components/radarr/helpers.py
2026-02-03 11:30:30 +01:00

123 lines
4.1 KiB
Python

"""Helper functions for Radarr."""
from typing import Any
from aiopyarr import RadarrMovie, RadarrQueue
def format_queue_item(item: Any, base_url: str | None = None) -> dict[str, Any]:
"""Format a single queue item."""
remaining = 1 if item.size == 0 else item.sizeleft / item.size
remaining_pct = 100 * (1 - remaining)
movie = item.movie
result: dict[str, Any] = {
"id": item.id,
"movie_id": item.movieId,
"title": movie["title"],
"download_title": item.title,
"progress": f"{remaining_pct:.2f}%",
"size": item.size,
"size_left": item.sizeleft,
"status": item.status,
"tracked_download_status": getattr(item, "trackedDownloadStatus", None),
"tracked_download_state": getattr(item, "trackedDownloadState", None),
"download_client": getattr(item, "downloadClient", None),
"download_id": getattr(item, "downloadId", None),
"indexer": getattr(item, "indexer", None),
"protocol": str(getattr(item, "protocol", None)),
"estimated_completion_time": str(
getattr(item, "estimatedCompletionTime", None)
),
"time_left": str(getattr(item, "timeleft", None)),
}
if quality := getattr(item, "quality", None):
result["quality"] = quality.quality.name
if languages := getattr(item, "languages", None):
result["languages"] = [lang.name for lang in languages]
if custom_format_score := getattr(item, "customFormatScore", None):
result["custom_format_score"] = custom_format_score
# Add movie images if available
# Note: item.movie is a dict (not object), so images are also dicts
if images := movie.get("images"):
result["images"] = {}
for image in images:
cover_type = image.get("coverType")
# Prefer remoteUrl (public TMDB URL) over local path
if remote_url := image.get("remoteUrl"):
result["images"][cover_type] = remote_url
elif base_url and (url := image.get("url")):
result["images"][cover_type] = f"{base_url.rstrip('/')}{url}"
return result
def format_queue(
queue: RadarrQueue, base_url: str | None = None
) -> dict[str, dict[str, Any]]:
"""Format queue for service response."""
movies = {}
for item in queue.records:
movies[item.title] = format_queue_item(item, base_url)
return movies
def format_movie_item(
movie: RadarrMovie, base_url: str | None = None
) -> dict[str, Any]:
"""Format a single movie item."""
result: dict[str, Any] = {
"id": movie.id,
"title": movie.title,
"year": movie.year,
"tmdb_id": movie.tmdbId,
"imdb_id": getattr(movie, "imdbId", None),
"status": movie.status,
"monitored": movie.monitored,
"has_file": movie.hasFile,
"size_on_disk": getattr(movie, "sizeOnDisk", None),
}
# Add path if available
if path := getattr(movie, "path", None):
result["path"] = path
# Add movie statistics if available
if statistics := getattr(movie, "statistics", None):
result["movie_file_count"] = getattr(statistics, "movieFileCount", None)
result["size_on_disk"] = getattr(statistics, "sizeOnDisk", None)
# Add movie images if available
if images := getattr(movie, "images", None):
images_dict: dict[str, str] = {}
for image in images:
cover_type = image.coverType
# Prefer remoteUrl (public TMDB URL) over local path
if remote_url := getattr(image, "remoteUrl", None):
images_dict[cover_type] = remote_url
elif base_url and (url := getattr(image, "url", None)):
images_dict[cover_type] = f"{base_url.rstrip('/')}{url}"
result["images"] = images_dict
return result
def format_movies(
movies: list[RadarrMovie], base_url: str | None = None
) -> dict[str, dict[str, Any]]:
"""Format movies list for service response."""
formatted_movies = {}
for movie in movies:
formatted_movies[movie.title] = format_movie_item(movie, base_url)
return formatted_movies