|
|
|
|
import psycopg2.extras
|
|
|
|
|
from config import get_local_db_connection # centralize DB connection
|
|
|
|
|
|
|
|
|
|
# ───────── FAVORITES ───────── #
|
|
|
|
|
def db_init_favorites_table():
|
|
|
|
|
conn, cur = get_local_db_connection()
|
|
|
|
|
cur = conn.cursor()
|
|
|
|
|
cur.execute("""
|
|
|
|
|
CREATE TABLE IF NOT EXISTS favorites (
|
|
|
|
|
video_id UUID PRIMARY KEY, -- better: store as uuid
|
|
|
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
|
|
|
)
|
|
|
|
|
""")
|
|
|
|
|
conn.commit()
|
|
|
|
|
cur.close(); conn.close()
|
|
|
|
|
|
|
|
|
|
def db_get_fav_set():
|
|
|
|
|
conn, cur = get_local_db_connection()
|
|
|
|
|
cur = conn.cursor()
|
|
|
|
|
cur.execute("SELECT video_id FROM favorites")
|
|
|
|
|
favs = {str(row[0]) for row in cur.fetchall()}
|
|
|
|
|
cur.close(); conn.close()
|
|
|
|
|
return favs
|
|
|
|
|
|
|
|
|
|
def db_toggle_fav(video_id: str):
|
|
|
|
|
conn, cur = get_local_db_connection()
|
|
|
|
|
cur = conn.cursor()
|
|
|
|
|
cur.execute("DELETE FROM favorites WHERE video_id = %s", (video_id,))
|
|
|
|
|
if cur.rowcount == 0:
|
|
|
|
|
cur.execute("INSERT INTO favorites (video_id) VALUES (%s)", (video_id,))
|
|
|
|
|
conn.commit()
|
|
|
|
|
cur.close(); conn.close()
|
|
|
|
|
return True # now favorited
|
|
|
|
|
conn.commit()
|
|
|
|
|
cur.close(); conn.close()
|
|
|
|
|
return False # now unfavorited
|
|
|
|
|
|
|
|
|
|
def mark_favorites(videos: list[dict]):
|
|
|
|
|
"""Adds is_favorite: bool to each video dict in-place."""
|
|
|
|
|
favs = db_get_fav_set()
|
|
|
|
|
for v in videos:
|
|
|
|
|
vid = str(v.get("video_id"))
|
|
|
|
|
v["is_favorite"] = (vid in favs)
|
|
|
|
|
return videos
|
|
|
|
|
|
|
|
|
|
def db_get_favorites(page: int, per_page: int):
|
|
|
|
|
offset = (page - 1) * per_page
|
|
|
|
|
conn, cur = get_local_db_connection()
|
|
|
|
|
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
|
|
|
|
|
|
|
|
|
cur.execute("""
|
|
|
|
|
SELECT
|
|
|
|
|
v.video_id, v.username, v.site AS platform,
|
|
|
|
|
v.filepath, v.size, v.duration, v.gender,
|
|
|
|
|
v.created_at, v.updated_at, v.thumbnail
|
|
|
|
|
FROM favorites f
|
|
|
|
|
JOIN videos v ON v.video_id = f.video_id
|
|
|
|
|
WHERE v.status != 'missing'
|
|
|
|
|
ORDER BY f.created_at DESC NULLS LAST, v.created_at DESC NULLS LAST
|
|
|
|
|
LIMIT %s OFFSET %s
|
|
|
|
|
""", (per_page, offset))
|
|
|
|
|
rows = [dict(r) for r in cur.fetchall()]
|
|
|
|
|
|
|
|
|
|
cur.execute("""
|
|
|
|
|
SELECT COUNT(*)
|
|
|
|
|
FROM favorites f
|
|
|
|
|
JOIN videos v ON v.video_id = f.video_id
|
|
|
|
|
WHERE v.status != 'missing'
|
|
|
|
|
""")
|
|
|
|
|
total = cur.fetchone()[0]
|
|
|
|
|
|
|
|
|
|
cur.close(); conn.close()
|
|
|
|
|
return rows, total
|
|
|
|
|
|
|
|
|
|
def db_get_favorite_users():
|
|
|
|
|
conn, cur = get_local_db_connection()
|
|
|
|
|
cur.execute("SELECT username FROM favorite_users")
|
|
|
|
|
favorite_users = [r['username'] for r in cur.fetchall()]
|
|
|
|
|
cur.close(); conn.close()
|
|
|
|
|
return favorite_users
|