在 Homepage 中集成 Stash 媒体库统计 Widget:配置、字段与 GraphQL 数据链路解析

发布时间:2026/9/11 13:06:57

在 Homepage 中集成 Stash 媒体库统计 Widget:配置、字段与 GraphQL 数据链路解析 在 Homepage 中集成 Stash 媒体库统计 Widget配置、字段与 GraphQL 数据链路解析【免费下载链接】homepageA highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations.项目地址: https://gitcode.com/GitHub_Trending/ho/homepageStash 是一款自托管的媒体管理器Homepage 为其提供了专用服务 Widget可直接在首页展示场景Scenes、图片Images、演员Performers、播放时长等核心统计数据。本文以 Stash Widget 配置文档 为主体结合仓库中的 Widget 定义源码、展示组件 与测试用例完整讲解如何获取 API Key、编写配置、理解全部可用字段并深入剖析数据从配置到 Stash GraphQL API 再到前端渲染的完整链路。前置准备在 Stash 中获取 API Key在配置 Widget 之前需要先从 Stash 实例中获取 API Key打开 Stash 的Settings设置 Security安全 API Key页面复制生成的 Key 值。注意仅当你的 Stash 实例启用了登录凭据时才必须提供 API Key若实例未开启登录认证可省略key字段。该 Key 在 Homepage 请求 Stash 时以查询参数的形式携带。从 widget.js 的 API 模板可以看到完整调用约定api: {url}/{endpoint}?apikey{key},即 Homepage 会用 Widget 配置中的url、key以及具体端点Endpoint拼接出形如http://stash.host.or.ip/graphql?apikeystashapikey的请求地址。因此请勿在 Key 中混入多余空格或换行否则请求会被 Stash 拒绝。最小可运行配置将以下片段放入 Homepage 的services.yaml或 Docker 环境下的 docker.yaml对应服务条目中widget: type: stash url: http://stash.host.or.ip key: stashapikey fields: [scenes, images] # optional - default fields shown各参数说明参数必填说明type是固定为stash用于匹配仓库中注册的 Widget 定义url是Stash 实例的地址如http://192.168.1.100:9999需可从运行 Homepage 的主机访问key否Stash 的 API Key仅当实例开启登录认证时必需fields否要展示的统计字段列表不填时使用默认字段[scenes, images]全部可用字段与底层数据映射原文档声明允许的字段完整列表为[scenes, scenesPlayed, playCount, playDuration, sceneSize, sceneDuration, images, imageSize, galleries, performers, studios, movies, tags, oCount]这 14 个字段并非 Stash API 的原始返回键而是 Homepage 前端展示层的标签Label。从 component.jsx 可以看出每个字段通过Block组件绑定到 GraphQLstats查询结果的具体属性Widget 字段界面文案en对应 stats 数据键格式化方式scenesScenesscene_count数值numberscenesPlayedScenes Playedscenes_played数值playCountTotal Playstotal_play_count数值playDurationTime Watchedtotal_play_duration时长durationsceneSizeScenes Sizescenes_size字节1 位小数sceneDurationScenes Durationscenes_duration时长imagesImagesimage_count数值imageSizeImages Sizeimages_size字节1 位小数galleriesGalleriesgallery_count数值performersPerformersperformer_count数值studiosStudiosstudio_count数值moviesMoviesmovie_count数值tagsTagstag_count数值oCountO Counttotal_o_count数值字段的中英文标签定义可在 public/locales/en/common.json 的stash节点中查到其他语言的翻译文件如 zh-Hans/common.json结构一致Homepage 会依据浏览器语言自动选择。展示规则默认字段与 4 字段上限Widget 的展示遵循两条明确规则文档声明 组件实现双重印证未配置fields时使用默认值组件在渲染前检查widget.fields若未设置则回退为[scenes, images]与初始加载时的占位符Placeholder一致见 component.jsx。最多只展示 4 个字段若配置的字段超过 4 个仅保留前 4 个见 component.jsxif (widget.fields.length 4) { widget.fields widget.fields.slice(0, 4); }需要注意的是该截断发生在组件内部并未改动用户配置文件中fields的原有顺序——因此fields的书写顺序决定了优先展示哪些字段。例如想展示总播放次数 观看时长 场景数 图片数应写成widget: type: stash url: http://stash.host.or.ip key: stashapikey fields: [playCount, playDuration, scenes, images]数据链路剖析从配置到 GraphQL 查询Stash Widget 的数据获取并非简单的 REST 调用而是经过 Homepage 通用代理generic proxy handler向 Stash 的 GraphQL 端点发起 POST 查询。全链路如下1. 前端发起代理请求组件挂载后通过formatProxyUrl生成代理地址并发送 POST 请求component.jsxconst url formatProxyUrl(widget, stats); const res await fetch(url, { method: POST });formatProxyUrl定义在 utils/proxy/api-helpers.js最终指向/api/services/proxy端点。2. 通用代理拼接目标地址generic.js 中Homepage 用 Widget 定义的api模板替换占位符{url}→ 配置中的url{endpoint}→graphqlstats 映射中指定{key}→ 配置中的key得到http://stash.host.or.ip/graphql?apikeystashapikey。3. 构造 GraphQL 查询体widget.js 中stats映射定义了POST方法与请求体一次性向 Stash 查询全部统计字段mappings: { stats: { method: POST, endpoint: graphql, headers: { content-type: application/json, }, body: JSON.stringify({ query: { stats { scene_count scenes_size scenes_duration image_count images_size gallery_count performer_count studio_count movie_count tag_count total_o_count total_play_duration total_play_count scenes_played } }, }), map: (data) asJson(data).data.stats, }, },4. 响应映射与前端渲染代理返回后map函数取出 GraphQL 响应中的data.stats对象返回给前端组件收到后按fields顺序渲染对应Block。测试用例 component.test.jsx 完整模拟了这一流程先渲染stash.scenes、stash.images两个占位符随后断言 fetch 返回的scene_count: 1、image_count: 7正确渲染为 Block 数值。而 widget.test.js 则验证了 Widget 定义api、proxyHandler、mappings结构合法可被 Homepage 的 Widget 注册体系正确加载。常见问题与排查思路页面只显示占位符、数值不出现多为请求失败或返回结构不符。可先确认url在浏览器可直接访问并检查key是否正确开启登录认证时必须填写。fields超过 4 个但顺序不对Widget 只取前 4 个请调整fields书写顺序以控制展示优先级。返回 Invalid data 错误代理在validateWidgetData校验失败时会返回该错误见 generic.js通常意味着 Stash 版本较旧、GraphQLstats查询结果缺失字段或 API Key 鉴权失败导致响应非预期结构。小结Stash Widget 是 Homepage 服务型 Widget 中典型的代理 GraphQL 映射实现配置侧只需url、key、fields三个核心参数底层则由 widget.js 定义 API 模板与查询体、component.jsx 负责字段渲染与数量限制前后端配合完成从 Stash 实例到首页看板的完整数据流。掌握字段映射表与 4 字段上限规则后即可按需组合出最贴合自己媒体库的统计面板。【免费下载链接】homepageA highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations.项目地址: https://gitcode.com/GitHub_Trending/ho/homepage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/11 13:06:57

qemu-img 实战指南:虚拟磁盘镜像管理全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 14:12:07

GPT-6 Astra提示词指南:如何用slop词黑名单消除AI味

这周圈子里最热闹的事,莫过于OpenAI把GPT-6 Astra带到了台前。我更新模型后的第一件事,就是拿它把我去年攒的那堆旧提示词全部跑了一遍。结果很分裂:文章框架、逻辑、信息密度都比以前好太多,但读起来还是那副熟悉的味道——"…

2026/9/11 14:12:07

Python+Pygame复刻《燃烧的蔬菜》游戏开发全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 14:12:07

从神经元到世界模型:大模型全栈构建操作手册

1. 这不是一本“讲大模型”的书,而是一本“造大模型”的操作手册“从神经元写到世界模型”——光看标题,很多人第一反应是:又一本讲Transformer、讲LLaMA、讲RLHF的科普读物?不。这本书的底层逻辑根本不在“解释”,而在…

2026/9/11 14:07:06

QTabBar拖入拖出:实现可分离标签窗口的完整状态机与索引算法

简介:针对Qt开发者的QTabBar增强功能示例代码包,重点解决选项卡拖出为独立窗口、拖回主窗口以及拖回后重新排序标签页的交互实现。工程适用于需要自定义标签页拖放行为的桌面应用开发场景,适合具备一定Qt基础的读者参考。压缩包共82个文件&am…

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码