137 lines
4.4 KiB
SQL
137 lines
4.4 KiB
SQL
CREATE TABLE IF NOT EXISTS video_summary AS
|
|
SELECT
|
|
v.file_name,
|
|
v.raw_file,
|
|
v.mp4_file,
|
|
v.record_datetime,
|
|
v.day_of_week,
|
|
v.difficulty_level,
|
|
v.address,
|
|
GROUP_CONCAT(DISTINCT l.name) AS labels,
|
|
GROUP_CONCAT(DISTINCT p.name) AS playlists
|
|
FROM videos v
|
|
LEFT JOIN video_labels vl ON vl.video_file_name = v.file_name
|
|
LEFT JOIN labels l ON l.id = vl.label_id
|
|
LEFT JOIN video_playlists vp ON vp.video_file_name = v.file_name
|
|
LEFT JOIN playlists p ON p.id = vp.playlist_id
|
|
GROUP BY v.file_name;
|
|
|
|
DROP VIEW playlist_videos;
|
|
CREATE VIEW playlist_videos AS
|
|
WITH
|
|
-- Sous-requête pour les playlists manuelles
|
|
manual_playlist_videos AS (
|
|
SELECT
|
|
p.id AS playlist_id,
|
|
p.name AS playlist_name,
|
|
vp.video_file_name,
|
|
v.*,
|
|
'manual' AS playlist_type
|
|
FROM playlists p
|
|
JOIN video_playlists vp ON p.id = vp.playlist_id
|
|
JOIN videos v ON vp.video_file_name = v.file_name
|
|
WHERE p.type = 'manual'
|
|
),
|
|
|
|
-- Sous-requête pour les playlists dynamiques
|
|
dynamic_playlist_videos AS (
|
|
SELECT DISTINCT
|
|
p.id AS playlist_id,
|
|
p.name AS playlist_name,
|
|
v.file_name AS video_file_name,
|
|
v.*,
|
|
'dynamic' AS playlist_type
|
|
FROM playlists p
|
|
JOIN videos v
|
|
WHERE p.type = 'dynamic'
|
|
-- Inclure les vidéos qui ont les labels requis
|
|
AND (
|
|
json_array_length(json_extract(p.rules_json, '$.include_labels')) = 0
|
|
OR EXISTS (
|
|
SELECT 1 FROM labels l
|
|
JOIN video_labels vl ON l.id = vl.label_id
|
|
WHERE vl.video_file_name = v.file_name
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM (
|
|
SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
|
|
-- Ajoute plus de lignes si tes tableaux JSON ont plus de 5 éléments
|
|
) n
|
|
WHERE n.n < json_array_length(json_extract(p.rules_json, '$.include_labels'))
|
|
AND l.name = json_extract(
|
|
json_extract(p.rules_json, '$.include_labels'),
|
|
'$[' || n.n || ']'
|
|
)
|
|
)
|
|
)
|
|
)
|
|
-- Exclure les vidéos qui ont les labels exclus
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM labels l
|
|
JOIN video_labels vl ON l.id = vl.label_id
|
|
WHERE vl.video_file_name = v.file_name
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM (
|
|
SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
|
|
) n
|
|
WHERE n.n < json_array_length(json_extract(p.rules_json, '$.exclude_labels'))
|
|
AND l.name = json_extract(
|
|
json_extract(p.rules_json, '$.exclude_labels'),
|
|
'$[' || n.n || ']'
|
|
)
|
|
)
|
|
)
|
|
-- Inclure les vidéos qui sont dans les playlists requises
|
|
AND (
|
|
json_array_length(json_extract(p.rules_json, '$.include_playlists')) = 0
|
|
OR EXISTS (
|
|
SELECT 1 FROM playlists pl
|
|
JOIN video_playlists vp ON pl.id = vp.playlist_id
|
|
WHERE vp.video_file_name = v.file_name
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM (
|
|
SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
|
|
) n
|
|
WHERE n.n < json_array_length(json_extract(p.rules_json, '$.include_playlists'))
|
|
AND pl.name = json_extract(
|
|
json_extract(p.rules_json, '$.include_playlists'),
|
|
'$[' || n.n || ']'
|
|
)
|
|
)
|
|
)
|
|
)
|
|
-- Exclure les vidéos qui sont dans les playlists exclues
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM playlists pl
|
|
JOIN video_playlists vp ON pl.id = vp.playlist_id
|
|
WHERE vp.video_file_name = v.file_name
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM (
|
|
SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
|
|
) n
|
|
WHERE n.n < json_array_length(json_extract(p.rules_json, '$.exclude_playlists'))
|
|
AND pl.name = json_extract(
|
|
json_extract(p.rules_json, '$.exclude_playlists'),
|
|
'$[' || n.n || ']'
|
|
)
|
|
)
|
|
)
|
|
-- Filtrer par date si nécessaire
|
|
AND (
|
|
json_extract(p.rules_json, '$.date_after') IS NULL
|
|
OR v.record_datetime >= json_extract(p.rules_json, '$.date_after')
|
|
)
|
|
AND (
|
|
json_extract(p.rules_json, '$.date_before') IS NULL
|
|
OR v.record_datetime <= json_extract(p.rules_json, '$.date_before')
|
|
)
|
|
)
|
|
|
|
-- Union des deux types de playlists
|
|
SELECT * FROM manual_playlist_videos
|
|
UNION ALL
|
|
SELECT * FROM dynamic_playlist_videos;
|