feat: 网页端完整浏览/播放远程 Emby 挂载库

- 后端新增远程库→本地结构映射(emby_remote_web.go):Library/Media/SeriesCard
  与本地完全同构,前端无感知
- /api/libraries(含 with_preview)、/api/libraries/:id、/api/libraries/:id/media、
  /api/libraries/:id/series、/api/libraries/:id/series/episodes、/api/media/:id、
  /api/media/:id/episodes 全部支持远程伪装 ID 透传映射
- /api/stream/:id 对远程条目 302 直连远程 Emby 原地址(播放不经过本机)
- 库内容按 CollectionType 过滤(电影库取 Movie、剧集库取 Series),
  RecursiveItemCount 作为系列集数;修复伪装 ID 双重编码导致的图片/详情 500
- SPA fallback 放行 /library/embyremote~ 前缀(不再被当作 Emby API 路由 404)
- 前端:远程库/条目标记 is_remote_emby,隐藏扫描/刮削/编辑/NFO/回收站/
  HLS 转码等不适用操作;后台管理面板过滤远程库
This commit is contained in:
truewhile
2026-09-01 11:32:54 +08:00
parent 6af0e5fdcf
commit 4dc9cbe2e7
12 changed files with 774 additions and 25 deletions
+4 -1
View File
@@ -18,7 +18,10 @@ export function useAdminLibraryPanel() {
function useAdminLibraryList() {
const [libs, setLibs] = useState<Library[]>([])
const refresh = () => libraryAPI.list({ includeHidden: true }).then(setLibs)
const refresh = () =>
libraryAPI
.list({ includeHidden: true })
.then((libs) => setLibs(libs.filter((l) => !l.is_remote_emby))) // 远程挂载库只读,不在后台管理列表内
useEffect(() => {
refresh().catch(() => undefined)