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:
1 parent
3db9bdb38b
commit
e5afeb06cc
15 files changed
+945
-8
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user