Add automatic skip detection for playlist playback

Background poller monitors HA media_player state during playlist sessions.
When a track transition occurs and the previous track was played < 40% of
its duration, automatically records "skip" feedback. Also includes the
previously uncommitted delete_feedback endpoint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-23 09:17:52 -06:00
parent 9f301497df
commit af6159a297
8 changed files with 400 additions and 8 deletions

View File

@@ -6,7 +6,7 @@ from sqlalchemy.orm import joinedload
from haunt_fm.db import get_session
from haunt_fm.models.track import FeedbackEvent, Track
from haunt_fm.services.feedback import compute_contextual_score, record_feedback
from haunt_fm.services.feedback import compute_contextual_score, delete_feedback, record_feedback
router = APIRouter(prefix="/api/feedback")
@@ -41,6 +41,24 @@ async def submit_feedback(req: FeedbackRequest, session: AsyncSession = Depends(
}
@router.delete("/{event_id}")
async def retract_feedback(event_id: int, session: AsyncSession = Depends(get_session)):
"""Delete a feedback event entirely, removing its influence on scoring."""
event = await delete_feedback(session, event_id)
if event is None:
raise HTTPException(status_code=404, detail=f"Feedback event {event_id} not found")
return {
"id": event.id,
"playlist_id": event.playlist_id,
"track_id": event.track_id,
"signal": event.signal,
"signal_weight": event.signal_weight,
"vibe_text": event.vibe_text,
"created_at": event.created_at.isoformat(),
}
@router.post("/score")
async def get_score(req: ScoreRequest, session: AsyncSession = Depends(get_session)):
"""Compute the contextual feedback score for a track given a vibe description."""