correct application of playlists rules
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
# playlists/playlist_db.py
|
||||
import db
|
||||
import json
|
||||
import pandas as pd
|
||||
from playlists.playlist_model import Playlist, RuleSet
|
||||
from playlists.sql_builder import build_sql_from_rules
|
||||
|
||||
def load_all_playlists():
|
||||
"""Retourne une liste de Playlist (Pydantic) — tolérant aux rules_json nuls / vides."""
|
||||
@@ -28,12 +30,16 @@ def load_all_playlists():
|
||||
row_dict = dict(zip(cols, row))
|
||||
|
||||
try:
|
||||
created_at = str(row["created_at"]) if row["created_at"] is not None else None
|
||||
updated_at = str(row["updated_at"]) if row["updated_at"] is not None else None
|
||||
pl = Playlist(
|
||||
id=row_dict.get("id"),
|
||||
name=row_dict.get("name") or "",
|
||||
description=row_dict.get("description") or "",
|
||||
type=row_dict.get("type") or "manual",
|
||||
rules=row_dict.get("rules_json")
|
||||
id=row["id"],
|
||||
name=row["name"],
|
||||
description=row["description"],
|
||||
type=row["type"],
|
||||
rules=row["rules_json"],
|
||||
created_at=created_at,
|
||||
updated_at=updated_at
|
||||
)
|
||||
playlists.append(pl)
|
||||
except Exception as e:
|
||||
@@ -47,50 +53,31 @@ def delete_playlist(playlist_id: int):
|
||||
conn.execute("DELETE FROM video_playlists WHERE playlist_id = ?", (playlist_id,))
|
||||
conn.commit()
|
||||
|
||||
def get_videos_for_playlist(playlist: Playlist):
|
||||
"""Retourne les vidéos selon le type"""
|
||||
with db.get_conn() as conn:
|
||||
if playlist.type == "manual":
|
||||
q = """
|
||||
def get_videos_for_playlist(playlist):
|
||||
"""Retourne les vidéos correspondant aux règles d'une playlist dynamique."""
|
||||
if playlist.type == "manual":
|
||||
with db.get_conn() as conn:
|
||||
query = """
|
||||
SELECT v.*
|
||||
FROM videos v
|
||||
JOIN video_playlists vp ON vp.video_file_name = v.file_name
|
||||
WHERE vp.playlist_id = ?
|
||||
ORDER BY vp.position
|
||||
"""
|
||||
return conn.execute(q, (playlist.id,)).fetchall()
|
||||
else:
|
||||
rules = playlist.rules
|
||||
clauses = []
|
||||
params = []
|
||||
return conn.execute(query, (playlist.id,)).fetchall()
|
||||
else:
|
||||
sql, params = build_sql_from_rules(playlist.rules)
|
||||
with db.get_conn() as conn:
|
||||
return conn.execute(sql, params).fetchall()
|
||||
|
||||
if rules.include_labels:
|
||||
placeholders = ",".join("?" * len(rules.include_labels))
|
||||
clauses.append(f"v.file_name IN (SELECT vl.video_file_name FROM video_labels vl JOIN labels l ON l.id=vl.label_id WHERE l.name IN ({placeholders}))")
|
||||
params += rules.include_labels
|
||||
|
||||
if rules.exclude_labels:
|
||||
placeholders = ",".join("?" * len(rules.exclude_labels))
|
||||
clauses.append(f"v.file_name NOT IN (SELECT vl.video_file_name FROM video_labels vl JOIN labels l ON l.id=vl.label_id WHERE l.name IN ({placeholders}))")
|
||||
params += rules.exclude_labels
|
||||
|
||||
if rules.include_playlists:
|
||||
placeholders = ",".join("?" * len(rules.include_playlists))
|
||||
clauses.append(f"v.file_name IN (SELECT vp.video_file_name FROM video_playlists vp JOIN playlists p ON vp.playlist_id=p.id WHERE p.name IN ({placeholders}))")
|
||||
params += rules.include_playlists
|
||||
|
||||
if rules.exclude_playlists:
|
||||
placeholders = ",".join("?" * len(rules.exclude_playlists))
|
||||
clauses.append(f"v.file_name NOT IN (SELECT vp.video_file_name FROM video_playlists vp JOIN playlists p ON vp.playlist_id=p.id WHERE p.name IN ({placeholders}))")
|
||||
params += rules.exclude_playlists
|
||||
|
||||
if rules.date_after:
|
||||
clauses.append("v.record_datetime >= ?")
|
||||
params.append(rules.date_after)
|
||||
if rules.date_before:
|
||||
clauses.append("v.record_datetime <= ?")
|
||||
params.append(rules.date_before)
|
||||
|
||||
where_clause = f" {' AND ' if rules.logic == 'AND' else ' OR '} ".join(clauses) if clauses else "1=1"
|
||||
q = f"SELECT v.* FROM videos v WHERE {where_clause} ORDER BY v.record_datetime DESC"
|
||||
return conn.execute(q, params).fetchall()
|
||||
def load_video_summary_map():
|
||||
"""Retourne un dict {file_name: {'labels': [...], 'playlists': [...]}} depuis la vue video_summary."""
|
||||
with db.get_conn() as conn:
|
||||
df = pd.read_sql_query("SELECT file_name, labels, playlists FROM video_summary", conn)
|
||||
summary = {}
|
||||
for _, row in df.iterrows():
|
||||
summary[row["file_name"]] = {
|
||||
"labels": row["labels"].split(",") if row["labels"] else [],
|
||||
"playlists": row["playlists"].split(",") if row["playlists"] else [],
|
||||
}
|
||||
return summary
|
||||
Reference in New Issue
Block a user