43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
import os
|
|
import json
|
|
from app.config import settings
|
|
|
|
def ensure_smart_playlist(playlist_name: str = "Моя Волна") -> str:
|
|
"""Ensure Navidrome .nsp Smart Playlist exists in library."""
|
|
playlists_dir = os.path.join(settings.MUSIC_DIR, "playlists")
|
|
os.makedirs(playlists_dir, exist_ok=True)
|
|
|
|
nsp_path = os.path.join(playlists_dir, f"{playlist_name}.nsp")
|
|
|
|
# Path inside Navidrome is relative to /music
|
|
nsp_content = {
|
|
"all": [
|
|
{
|
|
"path": {
|
|
"contains": "AI Recommendations/Моя Волна"
|
|
}
|
|
}
|
|
],
|
|
"sort": "random",
|
|
"limit": 100
|
|
}
|
|
|
|
with open(nsp_path, "w", encoding="utf-8") as f:
|
|
json.dump(nsp_content, f, ensure_ascii=False, indent=2)
|
|
|
|
# Also generate M3U8 playlist at music root for universal Subsonic auto-import
|
|
wave_dir = os.path.join(settings.MUSIC_DIR, "AI Recommendations", "Моя Волна")
|
|
m3u_path = os.path.join(settings.MUSIC_DIR, f"{playlist_name}.m3u8")
|
|
|
|
lines = ["#EXTM3U\n"]
|
|
if os.path.exists(wave_dir):
|
|
for f in sorted(os.listdir(wave_dir)):
|
|
if f.lower().endswith(".mp3"):
|
|
lines.append(f"#EXTINF:-1,{os.path.splitext(f)[0]}\n")
|
|
lines.append(f"AI Recommendations/Моя Волна/{f}\n")
|
|
|
|
with open(m3u_path, "w", encoding="utf-8") as f:
|
|
f.writelines(lines)
|
|
|
|
return nsp_path
|