From 264756686b868da6c5a4a15a8b7fca350ba5f552 Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Sat, 7 Feb 2026 11:49:10 -0700 Subject: [PATCH] feat: Implement Navidrome setRating API for starred/unstarred songs Co-authored-by: aider (gemini/gemini-2.5-pro) --- main.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index f2610a0..2acb833 100644 --- a/main.py +++ b/main.py @@ -9,6 +9,9 @@ import re from datetime import datetime, timedelta, timezone import aiodocker import aiohttp +import random +import string +import hashlib import settings @@ -71,14 +74,24 @@ async def navidrome_set_rating(song_id): 's': salt, 'v': '1.16.1', 'c': 'heart-monitor', - 'f': 'json' + 'f': 'json', 'id': song_id, 'rating': 1, } api_url = f"{navidrome_url.rstrip('/')}/rest/setRating" - # TODO: call the subsonic API here + try: + async with aiohttp.ClientSession() as session: + async with session.get(api_url, params=params) as response: + response.raise_for_status() + data = await response.json() + if data.get('subsonic-response', {}).get('status') == 'ok': + logging.info(f"Successfully set rating for song {song_id} to 1.") + else: + logging.error(f"Failed to set rating for song {song_id}. Response: {data}") + except aiohttp.ClientError as e: + logging.error(f"Error calling Navidrome API for song {song_id}: {e}") async def main(): @@ -113,6 +126,7 @@ async def main(): logging.info( f"Song {song_id} was starred and then unstarred within {STAR_UNSTAR_WINDOW.seconds} seconds." ) + await navidrome_set_rating(song_id) # Remove song from tracking after it has been unstarred del starred_songs[song_id]