ShukeBta
82df266c4e
refactor: split license client
2026-06-24 23:51:01 +08:00
ShukeBta
a7c8d46589
fix: show latest discover posters
2026-06-24 20:17:38 +08:00
ShukeBta
aa506d6566
fix: harden discover artwork caching
2026-06-24 19:26:32 +08:00
ShukeBta
d93a28f18f
fix: retry failed discover artwork
2026-06-24 17:24:15 +08:00
ShukeBta
520b99d50f
refactor: split emby handler compatibility tests
2026-06-24 16:37:11 +08:00
ShukeBta
6be3409e3e
fix: improve discover and series special handling
2026-06-24 14:49:26 +08:00
ShukeBta
a7fea2a0f5
refactor: split emby playback route tests
2026-06-24 12:54:18 +08:00
ShukeBta
192f35d9fa
refactor: split modules and harden scraping workflows
2026-06-24 11:59:18 +08:00
ShukeBta
efca3cbe69
fix media playback and library workflows
2026-06-21 12:53:52 +08:00
ShukeBta
6e61c8b545
feat(telegram): 订阅/下载补齐 year/rating/genres/原名/语言 富通知字段
...
- 模型: Subscription/DownloadTask 新增 OriginalName/OriginalLanguage/Year/
Rating/Genres 列(GORM AutoMigrate 自动建列, 无需手写迁移)
- enrich 链路: displayMetadata 与 DownloadTaskMeta 携带新字段, 从
SearchExternalMedia(TMDb/豆瓣/Bangumi)结果回填并持久化; 放宽提前返回
门槛, 已有海报但缺新字段时仍补齐
- 通知: 订阅/下载完成事件 data 注入 year/rating/genres/original_title/
original_language, 喂给作者富模板 formatTelegramMediaNotification
- 测试: 新增端到端断言, 验证补齐字段透传进 Telegram caption
2026-06-20 01:45:40 +08:00
ShukeBta
dff19801b6
fix(series): 彻底修复剧集被按单集显示且无法修复
...
根因(用真实数据确诊, 两个互相独立):
- Web 端拆集: episode NFO 的 <uniqueid type=tmdb> 是【单集 episode id】、
<title> 是【单集名】, mergeEpisodeMetadata 却无条件覆盖了整剧 tm_db_id /
original_name → 同剧每集 id/原名各不相同, 被 getSeriesKey 按 tmdb_id 拆成
N 张单集卡(实测「遮天」90 集 = 89 个不同 tmdb_id)。
- Emby 散装单集: 电影库混入按 Season/SxxE 整理的剧集结构内容, 被判成 Episode
却因 movie 库不聚 Series 而漏成散装单集。
- 无法修复: EnrichLibrary 只处理 pending/no_match, 跳过 matched 脏行。
修复:
- local_metadata.mergeEpisodeMetadata: 单集 NFO 的外部 id 不再写入整剧字段,
单集名不再污染 original_name; 整剧 id/原名只认 tvshow.nfo。
- groupSeries.ts: 剧集分组改「库+路径剧名」优先(整剧目录对全剧一致), 外部 id
仅作回退, 对存量脏数据也能合并。
- emby_compat: 电影库常规浏览新增 movieLibraryItems, 把剧集结构内容聚成 Series
卡片与真电影并列(方案 B), 不再漏散装单集。
- cloud_path_repair: 「修复+重刮」先把脏的 matched 剧集行重置为 pending 再重刮,
使其能被重新刮削; 结果新增 reset 计数。
- 新增 NormalizePollutedEpisodeMetadata 启动迁移(幂等): 按整剧目录聚合, 清洗
tmdb/原名散乱的剧组并重置 pending。
测试: local_metadata/emby_compat/cloud_path_repair/episode_metadata_cleanup
新增或更新断言; 修正 scanner_cloud_test 中依赖旧错误行为的用例。
2026-06-20 01:04:19 +08:00
ShukeBta
9b4884359b
fix(scrape): 单集名不再覆盖整剧 original_name 修复合集被拆集 + 媒体库页新增单库修复重刮
...
- 根因: 单集刮削把 TMDB episode.Name 写入 original_name(应为整剧原名),
导致同剧每集 original_name 不同, 合集分组键回退到标题时被拆成多集无法合并。
移除该覆盖, 保留单集 overview/剧照/评分/时长回填(不影响合集键)。
- 新增 RepairAndRescrapeLibrary 服务方法 + POST /admin/libraries/:id/repair-rescrape
路由 + 媒体库页「修复+重刮本库」按钮, 可按库单独触发修复(回填占位符外部 ID)并重刮,
既修空 ID 又借重刮覆盖此前被单集名污染的 original_name。
2026-06-19 21:29:02 +08:00
ShukeBta
87bb94d4df
feat(repair): 新增全库修复+重刮入口,剧集类路径正确归类
...
- 服务层 RepairAndRescrapeAllLibraries:先从路径占位符回填缺失/错误外部ID,再逐库重刮(含 no_match 重试)
- 新增 handler 与路由 POST /api/admin/media/repair-rescrape,异步执行经 WS 推送进度
- 前端媒体库页新增「全库修复+重刮」按钮调用该接口
- groupSeries:路径落在剧集类目录(电视剧/动漫/特别篇等)时按剧集卡处理,跳转分类视图
2026-06-19 12:23:56 +08:00
ShukeBta
b44c7f860b
fix(media): 修复emby电影库混入剧集/特别篇识别/剧集合集 + 新增手动编辑元数据
...
emby 兼容层(hills/yamby 等客户端):
- 电影库不再混入剧集:filterLikelyEpisodicPathsFromMovieQuery 按路径
特征(Season/S0x/Specials/电视剧/日番/国漫等)剔除误入电影库的剧集
- itemPayload 改用 mediaShouldBeEpisode:有季集号且(属剧集库或路径像剧集)
才标记为 Episode,修正电影库里剧集被当成 Movie
特别篇识别:
- episode_parser 新增 patSpecialSeason,识别 S0/Season 0/Specials/SP/OVA/
OAD/番外/特别篇/特典 文件夹 → 第0季;seasonFromParents 返回 found 标志,
区分"明确第0季"与"未识别默认第1季"
- emby seasonDir 正则同步支持 Specials/SP/OVA/特别篇 等
剧集合集:
- groupSeries 抽出 isSeriesCard,卡片链接按是否剧集判定,修复剧集卡片
跳转;每集分离的根因(季集号/分组key)随入库识别修复一并改善
手动编辑元数据(自采集视频无TMDB信息时可自定义封面/标题/简介/分类):
- 新增 MediaService.UpdateMetadata + PATCH /media/:id/metadata(需admin)
- 前端 MetadataEditDialog 接入 LibraryPage 与 MediaDetailPage
其他:scanner/scraper/nfo/local+cloud_metadata/adult 元数据识别配套改进;
.gitignore 忽略本地 .dev-cache/.dev-data 运行产物。
2026-06-19 12:23:56 +08:00
ShukeBta
0a3748e564
Fix subscription restore and media library entry links
2026-06-18 10:54:10 +08:00
ShukeBta
b492d9f867
Fix license sync and cloud scan scheduling
2026-06-18 01:39:39 +08:00
ShukeBta
e4b1488e11
Fix manual scrape apply for cloud media
2026-06-18 00:27:26 +08:00
ShukeBta
29ac7765d2
Fix logo assets and license heartbeat
2026-06-17 23:30:31 +08:00
ShukeBta
fb362e1fec
Backfill license usage and restore bot proxy fallbacks
2026-06-17 22:22:46 +08:00
ShukeBta
a0aeb07f03
Fix notification event toggles and license heartbeat
2026-06-17 20:35:11 +08:00
ShukeBta
850d3db811
Fix scraping workflows subscriptions bot and recycle bin
2026-06-17 19:48:17 +08:00
ShukeBta
ab4637beed
Update MediaStationGo branding and deployment docs
2026-06-17 16:01:16 +08:00
ShukeBta
8e5bf73edc
Fix Emby handler tests on clean CI
2026-06-17 00:23:59 +08:00
ShukeBta
801af37462
Harden cleanup and client compatibility
2026-06-17 00:06:51 +08:00
ShukeBta
866b75f644
fix: refresh license status from server edits
2026-06-16 13:19:42 +08:00
ShukeBta
5fc907e51b
Fix subscription dedupe and scan throughput
2026-06-16 11:32:48 +08:00
ShukeBta
a5bf4bfdd4
Improve large library storage backends and scans
2026-06-15 18:16:34 +08:00
ShukeBta
ea44f21fcf
Unify Telegram bot retention rules
2026-06-15 02:11:46 +08:00
ShukeBta
479a06f008
Unify organize ingest pipeline
2026-06-14 23:17:52 +08:00
ShukeBta
c76c72966a
Fix organize targets and cloud transfer controls
2026-06-14 00:27:39 +08:00
ShukeBta
52b772ea45
Fix cloud playback and organize ingest pipeline
2026-06-13 23:21:56 +08:00
ShukeBta
b6047af9fb
add cloud playback diagnostics
2026-06-13 17:26:49 +08:00
ShukeBta
5f42836bbf
fix organize trigger task flow
2026-06-13 17:08:56 +08:00
ShukeBta
4e0929bbca
fix organize path mapping and task flow
2026-06-13 16:32:38 +08:00
ShukeBta
a177dc61dd
fix emby clients and cloud playback controls
2026-06-13 12:08:57 +08:00
ShukeBta
ba43117a57
fix: honor STRM playback mode for cloud clients
2026-06-13 00:17:39 +08:00
ShukeBta
5d942f2c42
fix: stabilize STRM and cloud playback
2026-06-12 22:57:50 +08:00
ShukeBta
d270e9034f
fix: 防止启动整理扫描阻塞登录
2026-06-12 19:06:47 +08:00
ShukeBta
91df7521ce
fix: 资源占用/登录稳定性/QB整理入库/第三方播放404 综合修复
...
资源占用(Docker 部署 CPU/内存长期居高):
- 云盘探测预算改为按尝试扣减,杜绝队列满时对每个文件反复入队
并刷出数万条 WARN(实测日志 41165 条)
- 探测队列满时给文件挂 30 分钟退避 + 告警限速为每分钟一条
- 扫描时每个文件的海报/背景图由同步下载(单张最长 20s)改为
后台预取队列,云盘大库扫描不再串行拉图数小时
- PlaybackInfo 的云盘 ffprobe 探测改异步(原同步最长 8s,
既拖慢起播又放大云盘流量),带单飞去重
- 访问日志跳过 /api/health 与静态资源;logging.level/format
配置真正生效(此前是死配置)
登录稳定性(经常登录报错):
- refresh token 未及时落库期间,刷新请求可识别「待落库令牌」,
不再把用户踢回登录页;轮换/登出后取消后台补写,防止旧令牌复活
QB 下载整理入库:
- 新增 download.path_mappings 设置:自定义下载器→本程序路径映射
(每行 客户端路径=本地路径),并复用 compose 环境变量映射规则
- 应用重启后补整理最近 24h 内完成的种子(此前重启即永久漏掉)
- 下载客户端初始化失败仍注册并惰性重连(容器启动顺序免疫)
- 硬链接跨文件系统(EXDEV)自动降级为复制,保种语义不变
第三方播放器 404:
- 播放处理器不再把所有错误吞成 404:媒体不存在→404,
云盘解析失败/STRM 关闭→502+原因
- 存库的云盘播放 URL 规范化为相对路径,免疫扫描时固化的旧 host
- 云盘媒体 SupportsDirectPlay=false,强制走带鉴权的 DirectStream
2026-06-12 04:31:34 +00:00
ShukeBta
a13aba1d9f
fix: validate downloader RPC endpoints
2026-06-11 22:58:06 +08:00
ShukeBta
0e28d07122
fix: restore storage endpoint for smoke test
2026-06-11 21:11:05 +08:00
ShukeBta
52d75171b2
fix: allow login during sqlite write pressure
2026-06-11 20:06:55 +08:00
ShukeBta
2ad9606ad5
fix full library display and cloud search visibility
2026-06-11 18:50:05 +08:00
ShukeBta
23d1fbfddb
fix cloud library scale and playback compatibility
...
Root cause: display-only cloud library filtering was reused by scan jobs, merged cloud mounts could be skipped, and OpenList listing relied on WebDAV/first-page behavior that could cap huge directories around 100 items. Cloud scans also let new items consume probe budget before existing rows with missing track/artwork metadata.\n\nChanges:\n- split display filtering from scannable cloud filtering so merged cloud mounts still scan\n- add OpenList API pagination with WebDAV fallback\n- prioritize existing cloud media missing metadata before new imports\n- restrict automatic cloud sync to one successful 19:00-21:00 daily window and keep manual scan immediate\n- disable startup cloud full-scan by default, with an explicit opt-in setting\n- improve Emby/cloud playback compatibility and cache/search/test coverage from the continued work
2026-06-11 18:31:01 +08:00
ShukeBta
95794f7bbc
fix: add storage deletion with library cleanup and scan validation
...
- Delete storage config now properly removes related libraries and media
- Scanner validates storage config exists before starting cloud scan
- Prevents orphaned scans when storage is removed
- Added repository methods: DeleteByType, FindByID for storage config
- Remove unused storageHandler route to fix compilation
2026-06-11 12:48:32 +08:00
ShukeBta
e99d70b017
feat: improve cloud media playback and Emby compatibility
...
Based on nowen-video and MoviePilot implementations:
- Mark STRM media as IsRemote=true in Emby MediaSource
- Improve cloud media identification using STRMURL field
- Clean up unused cloud play service scaffolding
- Ensure third-party players (Infuse/Emby) recognize cloud media correctly
2026-06-11 12:17:14 +08:00
ShukeBta
62b204367c
fix: auto-scan cloud libraries on boot + allow CORS for media playback
...
- Add BootCloudLibraries() to auto-scan all cloud libraries on startup
- Delay 3s to avoid conflict with system init, scan without auto-scrape
- Enable CORS for /api/cloud/play/* and /api/img to support 3rd-party players
- Fixes issue where each user triggers separate cloud library scans
- Fixes issue where Infuse/Emby apps cannot play cloud resources
2026-06-11 11:25:43 +08:00
ShukeBta
d90b58ba22
fix: cache cloud artwork before library import
2026-06-11 00:54:29 +08:00
ShukeBta
542e85a067
fix: reduce emby load and stabilize strm scan
2026-06-11 00:18:51 +08:00
ShukeBta
859d6e9d24
implement automatic strm generation
2026-06-10 21:36:55 +08:00