69 lines
3.0 KiB
Python
69 lines
3.0 KiB
Python
# playlists/playlist_controller.py
|
||
import streamlit as st
|
||
import db
|
||
from playlists.playlist_model import Playlist, RuleSet
|
||
from playlists import playlist_db
|
||
from views.label_views import video_filter_sidebar, video_list_view
|
||
from models import Video
|
||
|
||
def playlist_manual_editor(playlist: Playlist):
|
||
"""Permet de gérer les vidéos d'une playlist manuelle."""
|
||
st.subheader(f"🎞️ Édition manuelle : {playlist.name}")
|
||
filters = video_filter_sidebar()
|
||
videos = video_list_view(filters, editable_labels=False, editable_difficulty=False)
|
||
|
||
existing_videos = db.get_videos_in_playlist(playlist.id)
|
||
existing_names = [v["file_name"] for v in existing_videos]
|
||
|
||
for video in videos:
|
||
in_playlist = video.file_name in existing_names
|
||
button_label = "➕ Ajouter" if not in_playlist else "❌ Retirer"
|
||
if st.button(button_label, key=f"toggle_{playlist.id}_{video.file_name}"):
|
||
if in_playlist:
|
||
db.remove_video_from_playlist(playlist.id, video.file_name)
|
||
st.success(f"Supprimée de {playlist.name}")
|
||
else:
|
||
db.add_video_to_playlist(playlist.id, video.file_name)
|
||
st.success(f"Ajoutée à {playlist.name}")
|
||
st.rerun()
|
||
|
||
def playlist_dynamic_editor(playlist: Playlist):
|
||
"""Édite les règles d'une playlist dynamique et affiche le rendu en temps réel."""
|
||
st.subheader(f"⚙️ Playlist dynamique : {playlist.name}")
|
||
|
||
rules = playlist.rules or RuleSet()
|
||
labels = db.load_labels()
|
||
playlists = [p.name for p in playlist_db.load_all_playlists()]
|
||
|
||
rules.include_labels = st.multiselect("Inclure labels", labels, default=rules.include_labels)
|
||
rules.exclude_labels = st.multiselect("Exclure labels", labels, default=rules.exclude_labels)
|
||
rules.include_playlists = st.multiselect("Inclure playlists", playlists, default=rules.include_playlists)
|
||
rules.exclude_playlists = st.multiselect("Exclure playlists", playlists, default=rules.exclude_playlists)
|
||
|
||
col1, col2 = st.columns(2)
|
||
with col1:
|
||
rules.date_after = st.date_input("📅 Après le", value=rules.date_after or None)
|
||
with col2:
|
||
rules.date_before = st.date_input("📅 Avant le", value=rules.date_before or None)
|
||
|
||
rules.logic = st.radio("Logique de combinaison", ["AND", "OR"], index=0 if rules.logic == "AND" else 1)
|
||
|
||
if st.button("💾 Enregistrer les règles"):
|
||
playlist.rules = rules
|
||
playlist.save()
|
||
st.success("Règles mises à jour ✅")
|
||
st.rerun()
|
||
|
||
st.markdown("---")
|
||
st.subheader("🧩 Rendu de la playlist")
|
||
rows = playlist_db.get_videos_for_playlist(playlist)
|
||
if not rows:
|
||
st.info("Aucune vidéo ne correspond aux règles actuelles.")
|
||
return
|
||
|
||
videos = [Video(**row) for row in rows]
|
||
st.write(f"{len(videos)} vidéo(s) trouvée(s).")
|
||
from views.video_views import show_video_row
|
||
for v in videos[:30]:
|
||
show_video_row(v, db.load_video_labels(v.file_name), editable_labels=False, editable_difficulty=False)
|