mirror of https://github.com/Nezreka/SoulSync.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.5 KiB
52 lines
1.5 KiB
"""Wishlist reporting helpers."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Iterable
|
|
|
|
from core.wishlist.classification import classify_wishlist_track
|
|
from core.wishlist.selection import sanitize_and_dedupe_wishlist_tracks
|
|
|
|
|
|
def count_wishlist_tracks_by_category(raw_tracks: Iterable[dict[str, Any]]) -> dict[str, int]:
|
|
"""Count deduped wishlist tracks by category."""
|
|
sanitized_tracks, _ = sanitize_and_dedupe_wishlist_tracks(raw_tracks)
|
|
|
|
singles_count = 0
|
|
albums_count = 0
|
|
|
|
for track in sanitized_tracks:
|
|
if classify_wishlist_track(track) == 'singles':
|
|
singles_count += 1
|
|
else:
|
|
albums_count += 1
|
|
|
|
total = singles_count + albums_count
|
|
return {
|
|
'singles': singles_count,
|
|
'albums': albums_count,
|
|
'total': total,
|
|
}
|
|
|
|
|
|
def build_wishlist_stats_payload(
|
|
raw_tracks: Iterable[dict[str, Any]],
|
|
*,
|
|
next_run_in_seconds: int,
|
|
is_auto_processing: bool,
|
|
current_cycle: str,
|
|
) -> dict[str, Any]:
|
|
"""Build the API payload used by the wishlist stats endpoint."""
|
|
counts = count_wishlist_tracks_by_category(raw_tracks)
|
|
return {
|
|
"singles": counts["singles"],
|
|
"albums": counts["albums"],
|
|
"total": counts["total"],
|
|
"next_run_in_seconds": next_run_in_seconds,
|
|
"is_auto_processing": is_auto_processing,
|
|
"current_cycle": current_cycle,
|
|
}
|
|
|
|
|
|
__all__ = ["count_wishlist_tracks_by_category", "build_wishlist_stats_payload"]
|