# 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)