From 0ae51402f6c866744c0cc77acf8e1cde6439734f Mon Sep 17 00:00:00 2001 From: tigeren Date: Tue, 26 Aug 2025 16:18:01 +0000 Subject: [PATCH] feat: enhance media retrieval and bookmarks functionality - Updated the media retrieval query to include bookmark counts and average ratings for photos. - Refactored the bookmarks page to support both videos and photos, improving state management and UI consistency. - Added search functionality to the photos page, allowing users to filter photos by title or path. - Implemented a photo viewer modal for enhanced viewing experience, including navigation and bookmarking features. --- media.db | Bin 77824 -> 258048 bytes src/app/api/photos/route.ts | 23 ++- src/app/bookmarks/page.tsx | 82 ++++---- src/app/photos/page.tsx | 367 +++++++++++++++++++++++++++++------- 4 files changed, 364 insertions(+), 108 deletions(-) diff --git a/media.db b/media.db index f3d3c646f51b8cfc4559a90df030de9c50706494..07b7ff4851fa30b7c1332ec7d9b17706a90928fd 100644 GIT binary patch literal 258048 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 g=t>Sc13KsQe+0DNXuanU19bNMUys~ z*2#VtsMEe!QC(D2!~8_qxiCtytC=9;6f#B^MWqojj#7-{Ff}mSVCb%kuDV(9uEh(B z^}MU|iR^qLj^%5toH3S@j+HB{ytn?m)F8*09Lt0|N2EU%of+tHCdUK)Toz5^^No1x z&OPzQd?WvoujFWGB$QAGMX_=nwY}*wWNMd3UB9$C-#?n&>W@}`RxR&M8K%p7 zN=iAQ+*JPNP5hbY5rgUq^^R7g^@qZtZ}mF8Tfc2^BW3(*{BHJ`kF0L%mECB+bZVSK z&NVmTUXe>=v%Hi}uc1Fo)Kis-v(#bWE>#kqK<#b43?zi{c!O&c;q^ zpN-v`$3>R`zhY$vOgdDE7O{k<;4fcO0-fd+qLhA)pq+{%_=bKeKo|dlx6+jYvw~U zJup$ZQLkeWc8Xb5)_2yBz1Y5HKX7)rGu4y?YMv>&@<30EaUe*@UKcTX?0~4u!T0Ky!i&PM{Btc9Qjd)!O;|`% zm4zQl&4A4ey_?A!vQy@}{q70pU+1F3?BjOSI%$=dZ_GR924m1zZ$$JVy}LKPQSS?& oel3Lee`flE1Z`HPPkpLt4l{Yg$=VsK-y9AI-Z%S(7ot%8516kkHvj+t diff --git a/src/app/api/photos/route.ts b/src/app/api/photos/route.ts index d1019a9..141a85c 100644 --- a/src/app/api/photos/route.ts +++ b/src/app/api/photos/route.ts @@ -2,6 +2,27 @@ import { NextResponse } from 'next/server'; import db from '@/db'; export async function GET() { - const photos = db.prepare('SELECT * FROM media WHERE type = ?').all('photo'); + const photos = db.prepare(` + SELECT + m.*, + COALESCE(b.bookmark_count, 0) as bookmark_count, + COALESCE(s.avg_rating, 0) as avg_rating, + COALESCE(s.star_count, 0) as star_count + FROM media m + LEFT JOIN ( + SELECT media_id, COUNT(*) as bookmark_count + FROM bookmarks + GROUP BY media_id + ) b ON m.id = b.media_id + LEFT JOIN ( + SELECT + media_id, + AVG(rating) as avg_rating, + COUNT(*) as star_count + FROM stars + GROUP BY media_id + ) s ON m.id = s.media_id + WHERE m.type = ? + `).all('photo'); return NextResponse.json(photos); } \ No newline at end of file diff --git a/src/app/bookmarks/page.tsx b/src/app/bookmarks/page.tsx index 5a2766d..55b1699 100644 --- a/src/app/bookmarks/page.tsx +++ b/src/app/bookmarks/page.tsx @@ -3,9 +3,9 @@ import { useState, useEffect } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import InlineVideoPlayer from "@/components/inline-video-player"; -import { Bookmark, Heart, Star, Film } from 'lucide-react'; +import { Bookmark, Heart, Star, Film, Image as ImageIcon } from 'lucide-react'; -interface Video { +interface MediaItem { id: number; title: string; path: string; @@ -19,23 +19,23 @@ interface Video { } export default function BookmarksPage() { - const [videos, setVideos] = useState([]); + const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); - const [selectedVideo, setSelectedVideo] = useState