Commit Graph

2788 Commits

Author SHA1 Message Date
jxxghp
a0e27c4424 feat(indexer): map Piggo resource labels
Resolve site labels from the Piggo catalog and dispatch connectivity, ticket parsing, and throttling through indexer capabilities.
2026-11-12 06:45:16 +08:00
Huyvux12
1fd1743667 fix(scraping): CAA front-500 404 时回退请求 /front 原图
front-500 缩略图派生文件缺失时 Cover Art Archive 返回 404,
旧逻辑直接把 (None, "image/jpeg") 写入缓存且无日志,重刮无法恢复。
改为 404 时回退请求 /front 原图并记录 info 日志;缓存 TTL 与
下载链路均不改动。

Fixes #7367
2026-11-11 15:43:48 +00:00
jxxghp
f488023b63 Merge pull request #7366 from Huyvux12/fix/issue-7363-music-online-tags-overwrite 2026-11-11 22:20:24 +08:00
jxxghp
18fe2ea387 feat(indexer): support HDArea REST API
Refs #7370
2026-11-11 21:53:16 +08:00
jxxghp
123b201ba9 test(architecture): record Piggo dependency graph 2026-11-11 18:54:37 +08:00
jxxghp
8dc4b08114 fix(indexer): support Piggo laboratory API (#7274) 2026-11-11 18:32:59 +08:00
Huyvux12
2e0fc48646 fix(music): prefer online disc/track structure for manually selected release
When a MusicBrainz release is explicitly selected, the aligned track
already carries the release structure, but _merge_music_track_context
only filled missing local fields, so dirty local total_discs/disc_number
kept producing a spurious Disc layer (e.g. total_discs=2 on a 1-disc
release) and wrong track positions. Let online values win for
disc_number/track_number/total_tracks/total_discs on the selected-release
path only; auto-match keeps the fill-only behaviour.

Album scrape merge now prefers online total_discs as well, and forces
disc_number=1 for confirmed single-disc albums so a dirty local disc
number cannot pair with total_discs=1 as "2/1" in tags.

Fixes #7363
2026-11-11 07:15:29 +00:00
jxxghp
ba034b20f0 test(agent): document regression test contracts 2026-11-11 13:55:27 +08:00
jxxghp
9323f00510 docs(agent): clarify config safeguards 2026-11-11 13:51:21 +08:00
jxxghp
6bc19a59cc fix(agent): protect plugin config and replay receipts (#7360) 2026-11-11 13:39:35 +08:00
ChantXu64
0200642746 fix(download): 完整覆盖整包只下载订阅范围内的剧集 (#7361) 2026-11-11 13:36:17 +08:00
jxxghp
1ec2bff817 Trae/agent s2h0 df (#7359) 2026-11-11 13:15:46 +08:00
Penguin Secret Agency
8be08ee773 feat(llm): 新增 UberLLM provider (#7302)
* feat(llm): 新增 UberLLM provider

* fix(llm): 调整 UberLLM 排序值

与 cheapaimodel 的排序修复协同:cheapaimodel 使用 60、GitHub Copilot 顺延为 61 后,UberLLM 顺延为 62,保持目录排序值唯一。

---------

Co-authored-by: sang nguyen <sangnguyen@sangs-MacBook-Pro-5.local>
Co-authored-by: jxxghp <jxxghp@gmail.com>
2026-11-11 10:45:46 +08:00
Nicho Deng
192bd7d5b8 feat(llm): 新增 cheapaimodel provider (#7303)
* feat(llm): 新增 cheapaimodel provider

* fix(llm): 修正 cheapaimodel 排序冲突

cheapaimodel 与 Obscurify.ai 同为 59,合并后会留下重复排序值。将 cheapaimodel 调整为 60,GitHub Copilot 顺延为 61,保持新预设位于 Obscurify.ai 之后。

---------

Co-authored-by: jxxghp <jxxghp@gmail.com>
2026-11-11 10:44:50 +08:00
gntv456
6166968f4c feat(indexer): 支持 FluxTorrent 兼容层站点搜索与用户数据 (#7355)
* feat(indexer): 支持 FluxTorrent 兼容层站点搜索与用户数据

好学(hxpt.org)已由 NexusPHP 迁移到 FluxTorrent,原有页面刮削全部失效。
FluxTorrent 提供 /api/v1/compat/nexusphp/* 只读 JSON 兼容层,本提交按该契约
新增索引器与用户数据解析器,并在分发层加入能力探测,使未在站点资源中登记
专站协议的站点也能被自动识别(站点清单是闭源发布资源,主仓无法新增条目)。

- 新增 FluxTorrentSpider:调用兼容层 torrents.json 搜索,按 category_newznab
  映射媒体类型,按 promotion 换算下载与上传量系数,下载地址携带开放 API 令牌
- 新增 FluxTorrentSiteUserInfo:解析兼容层 user.json 的用户资料与流量
- 新增同步与异步能力探测:站点未登记专站协议时,用站点令牌请求一次
  user.json,响应符合 {code, message, data, request_id} 信封即判定为 FluxTorrent
- 探测要求站点已配置令牌,并用命中 24 小时、未命中 30 分钟的双层 TTL 缓存
- 不下发分类与媒体类型筛选:兼容层的 category 只接受站内分类 ID,且客户端
  过滤会破坏分页续拉契约,分类筛选待站点资源发布链路补齐后再放开

* fix(indexer): 抽出用户数据模型解析,消除复杂度增长

CI 复杂度门禁报 IndexerModule.refresh_userdata 圈复杂度 15->16(上限 15)。
把 FluxTorrent 能力探测与模型选择抽成模块级函数 _resolve_userdata_schema,
refresh_userdata 的方法体不再因新增分支而增长。

* refactor(indexer): FluxTorrent 模块文件改为单词命名

命名门禁 test_new_host_production_modules_use_single_word_filenames 要求
app 下的模块文件名满足 [a-z][a-z0-9]*,flux_torrent.py 不合规 ⇒ 两个模块
改名为 fluxtorrent.py,同步更新导入与测试打桩路径。

* test(indexer): 修正发布时间断言并同步架构依赖基线

- 发布时间断言原先写死本机时区渲染结果,在 UTC 的 CI 上必然失败 ⇒ 改为对同一
  转换函数取期望值,只验证 Unix 时间戳经由 format_timestamp 输出
- dependency-baseline.json 新增 app.modules.indexer.spider.fluxtorrent 与
  app.modules.indexer.parser.fluxtorrent 的模块与导入边(edge_count 9973→9990、
  module_count 1151→1153),结构与既有 haidan 等专站模块一致,边界未越权

* docs(architecture): 同步架构快照的模块与导入边数量

架构依赖基线新增两个索引器模块后,docs/architecture-overview.md 的
快照表需同步:Python 模块 1151→1153、内部导入边 9,973→9,990。

* test(indexer): 补齐异步探测与失败路径用例,满足新文件覆盖率门槛

新增文件的覆盖率低水位要求 80%,补齐后 spider 90.81%、parser 92.21%:
- 异步能力探测命中与请求异常两条路径
- 站点无响应、响应不是 JSON 时的降级判定
- 异步搜索缺少令牌时的直接失败
- 用户接口空响应 / 非 JSON / 结构异常 / 业务错误码的错误信息
- 站点地址缺协议与空白地址的归一

* test(indexer): 覆盖协议解析的三条分支

存量文件覆盖率低水位要求未覆盖语句数不增长,补齐协议解析的已登记协议、
探测命中、未识别三种情况(同步与异步),以及用户数据模型名的两条分支。

* refactor(indexer): 按站点资源路由 FluxTorrent 协议

删除运行时能力探测与 TTL 缓存,搜索和用户数据直接使用站点资源声明的 parser/schema;保留 FluxTorrent spider 与用户数据解析器的注册,由站点构建配置决定路由。

---------

Co-authored-by: gntv456 <gntv456@users.noreply.github.com>
Co-authored-by: jxxghp <jxxghp@gmail.com>
2026-11-11 10:27:52 +08:00
Huyvux12
dcdebe366a fix(module): report filter and subtitle modules as available without probing (#7357) 2026-11-11 07:00:01 +08:00
jxxghp
c1c505358d chore(test): preserve ruff debt baseline 2026-11-10 19:51:38 +08:00
jxxghp
d5f1745d8e test(formatting): cover configured lyric extensions 2026-11-10 19:47:51 +08:00
jxxghp
7e1ac758d7 fix(transfer): make lyric suffixes configurable 2026-11-10 19:38:27 +08:00
jxxghp
8d4c6eb7c1 fix(transfer): unify media sidecar handling 2026-11-10 18:43:31 +08:00
jxxghp
ab608d45b9 fix(browser): use pre-license CloakBrowser release 2026-11-10 18:26:57 +08:00
jxxghp
48b20d3dfb fix(transfer): keep music companions in manual batches (#7350) 2026-11-10 17:43:35 +08:00
jxxghp
d0fb0a21a8 fix(agent): make session_search sort Gemini compatible 2026-11-10 17:24:53 +08:00
jxxghp
af963b47b3 test(music): cover strm track parsing branches 2026-11-10 07:22:35 +08:00
jxxghp
a4ccd86d85 fix(torrent): support traditional first-download prompts 2026-11-10 07:05:07 +08:00
Huyvux12
02856727dd fix(download): resume paused magnet to fetch metadata before episode selection (#7348) 2026-11-10 06:56:10 +08:00
jxxghp
6d9cf06085 fix(download): accept unique video for mapped single episode
## 问题
识别阶段把累计集号换算为季集后,单集种子的物理文件仍可能保留原始集号。qBittorrent 和 Transmission 只按文件名解析集号,导致唯一视频文件被判定为未找到目标集数,任务停留在暂停状态。

## 修复
- 当本次只请求一集且种子只有一个视频文件时,按唯一视频文件兜底选集;多视频文件和多集视频继续严格按解析集号匹配。
- 下载历史结算沿用相同边界,避免任务启动后原始累计集号再次被过滤为空明细。
- 覆盖 qBittorrent、Transmission,以及 durable/普通下载历史写入路径。

## 验证
- 相关下载与历史回归:244 passed, 12 skipped
- 完整测试:19427 passed, 21 skipped;22 个既有基线失败与本次改动无关,已在干净 v3 checkout 复跑确认
- Pylint(3 个生产文件):10.00/10
2026-11-09 22:52:37 +08:00
Huyvux12
55da2238df fix(jellyfin): 混合内容库使用 mixed 路由而非不存在的 library 路由 (#7344) 2026-11-09 22:12:20 +08:00
jxxghp
549f3f32d1 fix(subscribe): retry identity conversion during metadata checks 2026-11-09 19:56:13 +08:00
jxxghp
db0730f65f fix(music): accept multi-file album release names 2026-11-09 18:41:43 +08:00
jxxghp
252d05767f feat(browser): add queued CloakBrowser watchdog recovery 2026-11-09 17:24:32 +08:00
pyss56
b44af19e8d fix(agent): 空字符串联合参数归一为 null (#7339) 2026-11-09 15:06:15 +08:00
alexcastgonz
7baa3b6f94 fix(wechatclawbot): 仅有标题的图片通知也发送图片 (#7338) 2026-11-09 15:05:30 +08:00
ChantXu64
4620ceacda feat(mediaserver): 入库查询返回条目所属服务器 (#7332) 2026-11-08 11:56:02 +08:00
ChantXu64
7ff4244b3c feat(tmdb): 季集列表返回 TMDB 单集 ID (#7331) 2026-11-08 11:40:23 +08:00
jxxghp
a3c8280d14 fix(telegram): retry poster uploads before text fallback (#7330) 2026-11-08 10:37:03 +08:00
@huluohu
307da754b7 fix(plugin): 分身身份重定向按点号边界匹配包名,修复延迟相对导入 (#7327) 2026-11-08 07:09:08 +08:00
jxxghp
8e9e89c636 fix(image): request media thumbnails with identity-aware caching (#7326) 2026-11-07 20:51:05 +08:00
jxxghp
41516bbc29 fix(plugin): cache static resources and rating snapshots (#7324) 2026-11-07 19:44:33 +08:00
jxxghp
379ef94c9c fix(transfer): 修复硬链接覆盖整理误留暂存与备份 (#7322)
从已落账操作回执更新共享 inode 的状态时间,并保留外部改写与未知结果的副本保护。关联 #7321。
2026-11-07 18:33:23 +08:00
jxxghp
cd0a87cb43 Merge pull request #7318 from jxxghp/fix/issue-7312-llm-timeouts
fix(llm): 为同步辅助识别保留有限的供应商请求超时
2026-11-07 06:07:32 +08:00
jxxghp
82e2ea52c9 fix(site): preserve cookies when redirecting to HTTPS 2026-11-07 06:03:07 +08:00
jxxghp
aa16d17a5a test(cache): isolate the composed Redis probe instance 2026-11-07 06:01:51 +08:00
jxxghp
263ae3fbc7 fix(llm): retain finite provider request timeouts 2026-11-07 05:52:11 +08:00
jxxghp
db07e6ff0f fix(agent): preserve choice receipt timestamps
Refs #7314
2026-11-06 22:23:37 +08:00
jxxghp
0e93eda0e8 Merge pull request #7313 from Derrors/fix/browser-session-idle-reaper 2026-11-06 21:04:31 +08:00
jxxghp
4821953bde Merge pull request #7307 from TimoYoung/fix/gapped-torrent-episode-ghost 2026-11-06 21:03:35 +08:00
Derrors
17478f7825 fix(browser): reap idle sessions without subsequent requests
Register a lifecycle-owned periodic reaper and close expired sessions on their original workers. Guard pending operations and retain closing resources until actual completion, including owner shutdown races. Add isolated concurrency and lifecycle regressions and synchronize browser documentation.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-11-06 20:37:40 +08:00
jxxghp
d0f590ded5 Merge pull request #7311 from jxxghp/fix/issue-7306-generic-remote-overwrite
fix(transfer): 统一非本地覆盖整理临时文件名
2026-11-06 13:01:57 +08:00
jxxghp
9719948ad6 fix(transmission): retry transient RPC failures 2026-11-06 12:59:19 +08:00