feat: Phase 3 AI Radio (DJ Host & interleaved playlist) and Like/Dislike/Delete actions

- Add Like button: promotes wave track to permanent library and refills buffer
- Add Dislike button: blacklists track in SQLite disliked_tracks, removes audio, refills buffer
- Add Delete button in history table for library file removal
- Add AI Radio module: wttr.in weather, Qwen 2.5 host monologues, speech synthesis, ID3 tags
- Generate interleaved 'AI Радио.m3u8' alongside clean 'Моя Волна.m3u8'
- Update Web UI with Radio DJ card, voice selection, and track actions
This commit is contained in:
Antigravity committed 2026-10-12 16:34:46 +03:00
1 parent 3db9bdb38b
commit e5afeb06cc
15 files changed
+945 -8

No files matched your search

+9 -1
View File
@@ -124,8 +124,16 @@ class WaveCollector:
return profile
def get_existing_track_keys(self) -> Set[str]:
"""Returns set of normalized 'artist|title' of all songs already in Navidrome library."""
"""Returns set of normalized 'artist|title' of all songs already in Navidrome library and disliked tracks."""
keys: Set[str] = set()
# Exclude disliked / blacklisted tracks
try:
from app.db import get_disliked_track_keys
keys.update(get_disliked_track_keys())
except Exception as e:
print(f"[WaveCollector] Warning reading disliked keys: {e}")
conn = self._get_connection()
if not conn:
return keys