feat: 播放页按来源列表切换,新增作者/搜索/hashtag 侧栏

- 播放上下文:作品链接带上来源(搜索、标签、作者、hashtag),上一条/下一条
  在该列表内移动;当前作品不在列表中时退回全部作品的发布时间顺序
- 顶部提示标签显示当前列表与位置,点击打开侧栏列表,✕ 退出
- 侧栏改为「评论 | TA的作品 | 搜索结果/#hashtag」标签页,作品封面网格可就地切换
- 作者模式:打开「TA的作品」进入,关闭侧栏不退出,点提示 ✕ 后回到原来的列表
- 从搜索结果进入或点 hashtag 时自动打开对应列表
- 描述中的 hashtag 可点击,按完整 hashtag 精确匹配(#丰川祥子 不含 #丰川祥子cos)
- 新增 /api/playlist;搜索 SQL 抽到 lib/search-query.ts 与播放页共用,保证顺序一致
- 移动端:底部抽屉、点作品后收起,媒体区支持上下滑切换

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-09 00:50:09 +08:00
co-authored by Claude Opus 5.5
parent 182ca9cf05
commit b84fcec77b
28 changed files with 1592 additions and 282 deletions
+5 -1
View File
@@ -1,8 +1,9 @@
import type { Metadata } from "next";
import Link from "next/link";
import { VIDEO_CONTENT_TAGS, isVideoContentTag } from "@/lib/video-tags";
import { getFileUrl } from "@/lib/minio";
import { playbackContextQuery } from "@/lib/playback-context";
import { prisma } from "@/lib/prisma";
import { isVideoContentTag, VIDEO_CONTENT_TAGS } from "@/lib/video-tags";
import FeedMasonry from "./components/FeedMasonry";
import SearchBox from "./components/SearchBox";
import type { FeedItem } from "./types/feed";
@@ -142,6 +143,9 @@ export default async function Home({
key={selectedTag ?? "all"}
initialItems={initial}
initialCursor={cursor}
linkQuery={playbackContextQuery(
selectedTag ? { kind: "tag", tag: selectedTag } : null,
)}
fetchUrl={
selectedTag
? `/api/feed?tag=${encodeURIComponent(selectedTag)}`