# 更新日志 (Changelog) 所有关于 **Ting Reader** 的重要变更都将记录在此文件中。 ## [1.5.8] - 2026-07-30 ### 🛠️ 修复与优化 - **路由库升级**:将 `react-router-dom` v7 替换为 `react-router` v8,所有页面组件的导入路径统一更新。 - **React 版本升级**:React 和 React DOM 升级到 19.2.8。 - **播放器播放可靠性提升**:提取 `requestAudioPlayback` 函数统一处理播放请求,新增 `canplay` 事件重试机制,修复章节切换时音频源变更导致的播放中断问题;章节切换时重置跳过片尾状态。 - **构建环境升级**:Node.js 版本从 22 升级到 24(Dockerfile 和 CI workflows),原生发布流程改用 `npm ci` 确保依赖安装一致性。 ## [1.5.7] - 2026-07-28 ### ✨ 新功能 - **封面比例默认值调整**:书架封面比例默认从 3:4 改为 1:1 方形,用户设置会同步到服务端,未设置过的新用户默认使用方形封面。 ### 🛠️ 修复与优化 - **章节元数据对齐修复**:修复旧版本写入的 metadata.json 中正文与番外章节交错导致章节顺序与音频文件不匹配的问题,扫描时会按文件名自动对齐章节元数据。 - **Audiobookshelf 章节顺序修正**:生成 metadata.json 时按音频文件路径自然排序而非按显示序号排序,确保番外章节不会插入正文中间。 - **搜索页筛选滚动优化**:搜索页筛选标签行增加左右滚动按钮,标签过多时可以快速滚动查看。 - **React 状态更新警告修复**:修复多处 useEffect 中的状态更新警告,将状态更新延迟到下一帧执行。 - **本地库路径校验**:添加本地存储库路径非空校验,防止保存空路径。 - **播放器流 URL 生成重构**:将流播放 URL 生成逻辑从组件顶层移到函数内部,避免闭包捕获过期状态。 ## [1.5.6] - 2026-07-27 ### ✨ 新功能 - **用户权限接口兼容 PUT**:`/api/users/:id` 在保留 `PATCH` 的同时新增 `PUT` 请求支持,两种方法共用相同的管理员鉴权、参数校验和权限更新逻辑。 ### 🛠️ 修复与优化 - **Web 按集数睡眠修复**:修复章节自然结束或跳过片尾切换下一集时,按集数睡眠可能无法阻止下一集自动播放的问题,并避免同一章节重复触发跳集。 - **睡眠倒计时跟随播放状态**:Web 端播放暂停时同步暂停按分钟倒计时,恢复播放后继续计时。 - **首页 Hero 视觉对齐**:Web 首页 Hero 使用当前封面生成圆形裁切背景,与 Flutter 客户端的展示方式保持一致。 ## [1.5.5] - 2026-07-26 ### ✨ 新功能 - **按集数睡眠定时**:播放器睡眠定时器新增"按集数"模式,支持设定播完当前集、播完 N 集后自动停止,与原有的按分钟定时并存,方便睡前听书场景。 - **Flutter 风格自动隐藏滚动条**:书籍详情页新增滚动时显示、停止后自动隐藏的滚动条,提升沉浸式浏览体验。 ### 🛠️ 修复与优化 - **睡眠定时界面优化**:定时面板改为按分钟/按集数双 Tab 布局,预设按钮样式统一,自定义输入更紧凑。 ## [1.5.4] - 2026-07-13 ### ✨ 新功能 - **存储库番外章节提取设置**:存储库配置新增“提取番外章节”开关,支持在 Web 和 Flutter 客户端中配置;开启时根据章节标题自动识别番外并与正文分组,关闭后自动识别到的番外按正文处理,本地库与 WebDAV 库的扫描和重扫均会遵循该设置。 ### 🛠️ 修复与优化 - **旧版本章节路径升级兼容**:本地库从旧版相对路径升级到绝对路径后,扫描器会通过文件系统规范路径识别同一音频文件,自动清理相对路径与绝对路径造成的重复章节,并保留原章节记录和播放进度。 - **播放开始 Webhook 触发修正**:`playback.play` 与播放审计统一由客户端明确上报的 `playback_start` 触发,并在 10 秒窗口内去重;普通定时进度同步不再误触发或漏触发播放开始事件。 ## [1.5.3] - 2026-07-10 ### ✨ 新功能 - **音频真实格式识别**:写入章节音频元数据前会读取文件头识别 MP3、M4A/MP4、FLAC、Ogg、WAV 与 WMA 容器,不再仅依赖文件扩展名;即使音频被错误命名,也能自动选择正确的格式处理插件。 - **写操作幂等保护**:新增通用幂等中间件,添加/删除存储库、创建/更新/删除系列以及其他写操作会自动合并相同的进行中请求,并缓存短期成功响应,降低弱网超时和连续点击造成的重复创建、重复删除等风险。 ### 🛠️ 修复与优化 - **播放进度写入降载**:Web 播放器在 WebSocket 可用时不再同时执行 HTTP 定时上报,断线后才自动降级到 HTTP,减少重复同步和数据库写入。 - **收听统计长期聚合**:原始进度心跳升级为“每日统计桶+生命周期总计”模型;历史数据迁移时自动压缩,最近 90 天日统计保留趋势查询,累计更新次数、收听时长、活跃用户与热门书籍统计保持完整。 - **SQLite 写入稳定性**:进度更新、每日统计和生命周期总计改为事务写入,降低高频播放同步引起的 WAL 膨胀、锁竞争和数据库繁忙问题。 - **弱网交互防重复**:Web 端存储库保存/删除、系列创建/更新/删除等关键操作增加提交锁、加载状态和按钮禁用,防止请求未返回时连续操作。 ## [1.5.2] - 2026-07-09 ### ✨ 新功能 - **本地存储库授权目录检查与管理**:支持多路径授权本地存储库。 - **存储权限与安全校验**:自动检测本地库写权限(特别是需要刮削写入元数据时),并强制校验目录不超出授权根目录,提升系统安全性。 - **插件加载安全性增强**:扫描插件目录时,如发现缺少 `plugin.yml`/`plugin.yaml` 或签名元数据,将直接跳过并记录加载失败,防止加载无效或未授权插件。 - **书架批量操作**:新增书架批量操作功能,支持批量创建系列、删除等操作。 ### 🛠️ 修复与优化 - **章节管理显示路径优化**:规范化章节列表中本地和远程(如 WebDAV)音频文件的展示路径。 - **缓存管理入口调整**:Web 端缓存管理移入“我的 > 设置与管理”,仅管理员可见,并在页面内增加返回按钮。 ## [1.5.1] - 2026-07-06 ### ✨ 新功能 - **插件管理员专属**:插件可以标记为仅管理员可用,标记后插件的界面入口、工具和能力对普通用户完全隐藏。 ## [1.5.0] - 2026-07-06 ### ✨ 新功能 - **插件公共路由签名**:插件可以为外部应用生成带签名的访问链接(如 RSS 订阅链接),无需分享账号密码即可让外部阅读器访问馆藏内容。 - **插件扩展自定义图标**:插件界面入口支持自定义图标,书架和详情页中的插件按钮更直观。 ### 🛠️ 修复与优化 - **登录页面优化**:改进登录页面布局。 - **书籍详情页优化**:改进书籍详情页头部展示。 ## [1.4.9] - 2026-07-03 ### ✨ 新功能 - **插件个人数据 HostGateway 接口**:插件现在可以通过 HostGateway 访问当前用户的个人数据,新增 `playlists.*`(列表/详情/创建/更新/删除/添加条目/移除条目)、`favorites.*`(列表/添加/移除)和 `user_settings.*`(读取/写入)三组接口,并配套新增 `playlists_read/write`、`favorites_read/write`、`user_settings_read/write` 六项权限,方便插件做收藏、书单和个性化设置的联动。 - **插件升级配置自动迁移**:插件重新加载或重新安装到新版本时,会先保留旧配置,再以新版本 config schema 的默认值为基础,把旧配置中仍然存在的字段合并进来,避免升级插件后自定义配置丢失。 ### 🛠️ 修复与优化 - **播放列表条目写入接口**:PlaylistRepository 新增 `add_item` / `remove_item` 方法,添加条目时按用户库与书籍访问权限做校验,并同步维护 `playlist_items` 与 `playlist_books` 的顺序和更新时间。 ## [1.4.8] - 2026-07-01 ### ✨ 新功能 - **RSS 存储库**:新增“RSS/播客”类型的存储库,可直接订阅公开播客源,自动抓取节目列表和封面,无需下载文件到本地。 - **官方插件商店**:内置连接官方插件源的“Ting Reader Plugin Store”,安装包已预置该商店插件,首次进入插件管理即可看到官方推荐插件列表并一键安装。 - **AI 元数据刮削插件**:新增 AI Metadata Scraper(聚合刮削)。开启后会汇总各普通刮削插件的结果,由 AI 选出最合适的书名/作者/演播/简介/标签,还可选择用 AI 清洗章节名。 - **插件签名与来源校验**:安装 .tr 插件包时会校验数字签名,未经官方验证的插件会弹出显式的“来源未知”确认,需要用户主动同意才可继续安装。 - **多语言界面(i18n)**:Web 端支持简体中文 / 英文界面切换,插件描述、配置项、通知等元信息按当前语言显示;插件也可以随主界面语言变化。 ### 🛠️ 修复与优化 - **播放与转码稳定性**:改进 HLS 转码启动、strm 直链探测、FFprobe 时长获取的日志与错误提示;strm/远程音频统一支持 Range/Seek 和封面读取。 - **通知系统**:新增作品入库、作品删除、媒体库新增/删除、Webhook 增删改等事件的应用内通知与审计日志,日志详情按语言展示。 ## [1.4.7] - 2026-06-25 ### 🛠️ 修复与优化 - **章节管理界面重做**:Web 端章节管理改为响应式弹窗,标题旁直接切换正文/番外,章节列表默认保持轻量展示,点编辑后再进入单章编辑。 - **移动端章节管理优化**:小屏下选择、全选、移动、重排和跳转按钮重新排布,避免“已选”等控件挤占整行或撑破布局。 - **分组与标签显示优化**:正文/番外仅在实际存在番外时显示;100 章以内不再显示分组标签行,分组行也不再重复提供跳转入口。 - **章节位置展示优化**:章节编辑时展示存储库与相对路径,方便确认音频文件来源,同时保留列表快速扫描体验。 ## [1.4.6] - 2026-06-24 ### ✨ 新功能 - **章节级收听历史**:历史记录改为按“书籍 - 章节”分组展示所有有进度的章节,包括已播完章节;书籍和章节均按最近更新时间排序。 - **历史记录选择删除**:Web 端历史页支持进入选择模式,可按章节、整本书或全选隐藏历史记录,小屏下删除按钮文案自动压缩。 ### 🛠️ 修复与优化 - **历史记录与章节进度解耦**:清除历史现在只隐藏可见历史,不再删除章节进度;隐藏后的章节重新播放会自动回到历史列表。 - **最近收听数据修正**:最近收听接口返回完整可见章节历史,首页和我的页面按书籍去重统计,避免同一本书多章节导致计数错误。 ## [1.4.5] - 2026-06-22 ### 🛠️ 修复与优化 - **播放开始日志更精准**:移除流接口里的 `stream_start` 审计日志,改由进度上报(WebSocket 与 HTTP `/api/progress`)携带 `playback_start` 字段触发,预加载、流探测、HLS 分片请求不再被误记为播放开始;同一次起播事件在 10 秒窗口内自动去重。 - **真实 IP 解析适配 IPv4 映射的 IPv6**:`x-forwarded-for`、`x-real-ip`、`Forwarded` 头以及对端地址中的 `::ffff:192.168.1.17` 等 IPv4-mapped IPv6 地址会被规范化为 IPv4,登录、播放日志记录的 IP 与设备指纹更准确。 - **前端起播标记**:播放器仅在真正开始或恢复播放时发送 `playback_start`,周期性的 2 秒 WS 心跳与 15 秒 HTTP 兜底同步不再携带该字段,避免重复触发播放审计与 Webhook。 ## [1.4.4] - 2026-06-21 ### ✨ 新功能 - **可定制 Webhook 请求**:支持为每个通知配置独立的请求头和 Body 模板,可对接企业微信、ntfy、Gotify 及其他兼容 HTTP Webhook 的服务。 - **常见服务模板**:内置企业微信 Markdown/文本、ntfy JSON、Gotify JSON、原始事件 JSON 和纯文本模板。 - **Webhook 测试发送**:保存前即可发送测试通知,并查看 HTTP 状态、服务响应与实际渲染的请求体。 ### 🛠️ 修复与优化 - **章节列表**:修复番外与正文切换问题。 ## [1.4.3] - 2026-06-18 ### ✨ 新功能 - **首页、书架、我的三栏导航**:重做首页听书推荐与个人听书数据展示,常用功能统一从“我的”进入。 - **我的书单**:支持创建书单、添加书籍或系列、搜索、手动排序,并保留系列作为系列条目。 - **通知与事件**:管理员可配置 Webhook,监听登录、播放、入库、删除、扫描等事件。 - **数据统计报表**:管理员可查看用户使用情况、热门作品和馆藏统计。 - **flutter客户端**:客户端全面迁移到flutter。 ### 🛠️ 修复与优化 - **书架、系列、书单展示设置优化**:统一展示设置入口,系列与书单设置独立保存,封面比例同步书架设置。 - **收听历史优化**:历史记录改为完整列表,显示最后收听时间,并支持清空用户可见历史。 - **日志系统优化**:新增通知记录,日志详情支持展开,播放日志记录更精细的播放位置、真实 IP 和设备信息。 - **存储库同步优化**:同步菜单支持增量/全量同步,并自动识别同一目录下的卷、季、S01 等系列结构。 - **播放界面优化**:沉浸式播放布局、控制按钮和快进快退显示更贴近移动端使用。 - **IPv6支持修复**:修复fpk安装方式对IPv6的支持。 ## [1.4.2] - 2026-06-07 ### ✨ 新功能 - **分段目录自动识别**:扫描存储库时,`书名/1-500`、`501-1000` 这类章节范围子目录会归为同一本书,本地目录和 WebDAV 均支持。 ### 🛠️ 修复与优化 - **WebDAV 目录识别更稳**:按 URL 单段解码目录名,避免编码字符影响分段目录判断。 - **音频拖动兼容性优化**:本地音频流支持更完整的 Range 请求响应,提升部分播放器拖动定位稳定性。 - **安装包许可说明更新**:补充 FPK 与原生 FPK 安装包的许可说明文件。 ## [1.4.1] - 2026-06-06 ### ✨ 新功能 - **手动刮削多插件搜索**:手动刮削弹窗支持按插件声明的搜索字段分别填写参数,并可同时启用多个插件搜索。 - **刮削结果字段级采用**:搜索结果支持先浏览列表再进入详情,从不同结果中单独采用书名、作者、演播、封面、简介、标签等字段。 - **刮削插件能力声明**:插件可声明 `search_fields`、`result_fields` 与 `auto_scrape`,自动刮削插件必须声明必填书名字段,纯手动插件只需至少一个搜索字段。 ### 🛠️ 修复与优化 - **手动刮削弹窗优化**:改为搜索条件、结果选择、确认应用的多步骤流程,避免单页信息过载,并改善小屏布局。 ## [1.4.0] - 2026-05-31 ### ✨ 新功能 - **网盘模式(Cloud Mode)**:新增"网盘模式"配置项,适用于 WebDAV 和本地存储库。开启后跳过远程音频探测,仅使用 book.nfo / metadata.json / 封面等侧边刮削文件提取元数据,大幅降低网盘风控风险。 - **转码流 Seek 拖动跳转**:转码播放(FFmpeg 管道输出)支持通过服务端 `&seek=` 参数实现精确拖动跳转,解决转码流因不支持 Range 请求而无法 Seek 的问题。 - **Safari/iOS STRM 智能代理**:Safari 及 iOS 浏览器访问 STRM 文件时,先通过 HEAD 请求探测上游是否支持 Range。仅在上游不支持 `Accept-Ranges` 时才走代理,其余情况(包括支持 Range 的源站)仍走 302 重定向,最大限度降低带宽成本。 ### 🛠️ 修复与优化 - **WebDAV 封面下载优化**:封面图片下载到本地临时目录后通过代理提供,解决前端无法直接访问带认证 WebDAV URL 的封面显示问题。 - **WebDAV 扫描侧边文件支持**:扫描时将元数据文件(封面图、metadata.json、book.nfo 等)纳入分组,确保刮削时侧边文件可用;无音频文件的目录不再创建空书籍。 - **WebDAV STRM 文件元数据提取**:扫描 WebDAV 中的 .strm 文件时,下载并读取内部 URL,通过 FFprobe 获取真实远程音频时长。 - **转码音频时长自动获取**:转码流因 chunked transfer 导致浏览器报告 Infinity 时长时,自动从服务端拉取 FFprobe 已探测的章节时长并更新数据库记录。 ## [1.3.9] - 2026-05-21 ### ✨ 新功能 - **HLS 实时转码流支持**:新增 HLS 转码模块,将音频实时转码为 HLS 分片流(`.m3u8`),支持通过转码流进行精确 Seek 跳转,大幅提升大文件和长音频的播放体验。 - **Android 客户端转码播放 Seek 支持**:通过 HLS 转码实现 Android 端转码流播放的精确拖动跳转,解决原有转码流无法 Seek 的问题。 ## [1.3.8] - 2026-05-15 ### 🛠️ 修复与优化 - **修复 lint 错误**:清理所有前端未使用变量和循环引用警告(Web、桌面客户端、Android)。 - **修复 Android 后台播放进度丢失**:将 WebSocket 实时同步迁移至 Android 原生层,后台播放时进度由前台服务直接同步,不再依赖 JS 层。 - **修复 Android 章节切换时进度标记错误**:原生层在章节切换后用旧章节时长(100%)保存进度,修复已播完章节被错误标记为 6%-7% 的问题。 - **修复 Android 应用恢复时进度覆盖**:从后台恢复时自动从原生播放器同步当前章节和位置。 ## [1.3.7] - 2026-05-14 ### ✨ 新功能 - **WebSocket 实时进度同步**:新增 WS 模块,播放进度每 2 秒实时同步到服务器,防止页面关闭导致进度丢失。 - **Android 端静默转码重试**:播放遇到不兼容的音频格式时,自动切换为 MP3 转码流重试(最多 3 次),全程静默不弹窗。 ### 🛠️ 修复与优化 - **修复已播完章节点击行为**:点击进度 ≥95% 的已播完章节,自动清除播放记录并从头开始播放,不再从末尾瞬间跳到下一章。 - **暂停时自动保存进度**:暂停播放时立即通过 WS + HTTP 双通道保存进度,防止关闭标签页导致进度丢失。 - **后端模块重构**:将大型单文件模块拆分为目录模块(audio_streamer、event_bus、plugin、nfo_manager 等),提升代码可维护性。 ## [1.3.6] - 2026-04-22 ### 🛠️ 修复与优化 - **修复部分webdav不允许预测根目录的问题,测试连接时带上地址参数** ## [1.3.5] - 2026-04-19 ### 🛠️ 修复与优化 - **安全性修复** - **增加JWT密钥自动配置,不再需要手动配置** ## [1.3.4] - 2026-04-18 ### 🛠️ 修复与优化 - **优化 WebDAV 和 strm 文件的扫描与播放** ## [1.3.3] - 2026-04-17 ### 🛠️ 修复与优化 - **优化 WebDAV 和 strm 文件的扫描与播放** ## [1.3.2] - 2026-04-15 ### 🛠️ 修复与优化 - **优化 WebDAV 音频时长获取机制,降低网盘风控风险,提升扫描效率。**: #### 1. 智能音频时长获取 - **MP3 文件**:优先使用 ID3 标签(TLEN),避免 FFprobe 调用 - **其他格式**:ID3 时长与文件大小估算比对,差距 >15% 时才使用 FFprobe #### 2. 网盘风控优化 - **User-Agent 统一**:所有 WebDAV 请求使用真实浏览器 UA - **请求频率控制** #### 3. 新增 WebDavClient 模块 - **统一的 WebDAV 请求管理** - **内置频率限制和并发控制** - **自动重试和错误处理** #### 4. STRM 文件优化 - **添加 FFprobe 调用延迟(200ms)** - **改进错误处理和日志输出** - **strm文件可以优先读取metadata.json文件中的时长等信息,如果网盘风控严格可准备好metadata.json元数据文件,避免刮削风控。** ## [1.3.1] - 2026-04-12 ### 🛠️ 修复与优化 - **调整封面大小比例** - **增加年份元数据,书架增加按年份排序** - **修复普通用户搜索筛选的标签越权问题** ### ✨ 新功能 - **增加插件源缓存功能** ## [1.3.0] - 2026-04-11 ### 🛠️ 修复与优化 - **修复webdav库增量同步问题和封面提取问题** ## [1.2.9] - 2026-04-10 ### 🛠️ 修复与优化 - **修复js插件加载导致的崩溃** - **修复strm时长获取错误** ## [1.2.8] - 2026-04-08 ### 🛠️ 修复与优化 - **修复js插件加载导致的崩溃** - **修复strm无法播放** ## [1.2.7] - 2026-04-07 ### 🛠️ 修复与优化 - **优化日志系统** - **普通用户权限问题**:解决普通用户系列书籍权限边界问题。 ## [1.2.6] - 2026-04-04 ### 🛠️ 修复与优化 - **增加对旧浏览器内核支持ES5**:将现代 JS 语法(如可选链 ?. 、箭头函数等)降级为老浏览器能看懂的 ES5 语法,防止页面白屏崩溃。 - **“隐私模式”或“受限 Webview”的环境中兼容性问题**:创建了安全的 Storage 包装器,拦截所有的 LocalStorage 操作,将原生 localStorage 替换为 safeStorage 。 ## [1.2.5] - 2026-04-03 - **增加对刮削插件的支持**:WASM插件支持自定义HTTP请求。 - **新增刮削插件** ## [1.2.4] - 2026-04-01 - **增加对刮削插件的支持** - **新增刮削插件** ## [1.2.3] - 2026-03-31 - **修复苹果平台兼容性问题**:ios和mac下safari内核web端播放无法开始的现象修复。 ## [1.2.2] - 2026-03-31 - **修复一些问题** ## [1.2.1] - 2026-03-30 ### 🛠️ 修复与优化 - **存储库扫描修复**:修复了开启「自动检测变更」功能后,在特定场景下可能导致扫描任务陷入死循环的问题,提升了同步机制的稳定性。 - **主题色适配优化**:修复了封面图片过白时,提取的主题色(如背景、按钮)过浅导致界面文字看不清的问题,优化了对比度算法,确保文字清晰可读。 - **iOS PWA 计时器修复**:修复了在 iOS 设备上以 PWA 模式运行时,睡眠定时器不准确的问题,确保倒计时功能与真实时间同步。 ### ✨ 新功能 - **全新日志系统**:重做了后端日志记录与前端展示模块。现在,用户可在前端界面查看详细的运行日志,包括登录记录、播放行为等关键操作,方便排查问题和了解系统状态。 ## [1.2.0] - 2026-03-20 ### 🛠️ 修复与优化 - **播放进度修复**:修复播放结束后无法正确记录播放进度的问题。 ### ✨ 新功能 - **播放小窗折叠**:新增播放小窗的折叠功能。 ## [1.1.10] - 2026-03-18 ### ✨ 新功能 - **媒体库自动检测**:新增本地媒体库自动检测功能。开启后,系统将实时监控媒体库目录的文件变化,并在文件修改完成(防抖 10 秒)后自动触发后台扫描任务,无需手动刷新。 - **.strm 文件支持**:全面支持 `.strm` 流媒体文件。系统可自动识别 `.strm` 文件,在客户端请求播放时,直接通过 HTTP 302 重定向到文件内包含的真实播放地址,实现外部流媒体的无缝接入。 - **WebDAV 连接测试**:在添加或编辑 WebDAV 存储库时,新增「测试连接」按钮,支持在保存前一键验证服务器地址、用户名及密码的连通性。 - **封面比例选择**:新增封面形状选择功能,用户可在书架页面选择封面的显示比例(3:4 或 1:1 方形)。 ### 🛠️ 修复与优化 - **刮削器优化**:优化了搜索词清洗逻辑,支持智能解析 `作者 - 书名` 格式的目录,显著提高了自动刮削的命中率。 - **元数据写入修复**:修复了在增量扫描时,如果音频文件未修改,会导致刮削结果无法更新到数据库,且 NFO/JSON 文件不会被写入的问题。 - **章节排序修复**:移除了默认的章节数字提取逻辑,强制使用自然排序(文件名排序),解决了部分文件名数字导致的排序混乱问题。 - **书架显示修复**:修复了删除存储库后书架页面仍尝试加载旧存储库导致请求失败的问题,增加了自动重置无效存储库 ID 的机制。 - **系列功能增强**: - 支持解析和写入 `metadata.json` 中的系列序号(格式:`系列名 #序号`)。 - 优化系列排序逻辑,未指定序号时默认按书名自然排序。 - **元数据同步增强**: - **优先级修复**:修复了本地元数据(封面、NFO)优先级逻辑,确保本地文件优先于网络刮削结果。 - **增量同步**:优化了增量扫描逻辑,自动检测并移除已删除的音频章节,同时同步更新 `metadata.json`。 - **文件恢复**:增强了文件恢复机制,扫描时若发现 NFO/JSON 文件缺失会自动从数据库恢复。 - **强制同步**:无论是否开启手动锁定,编辑元数据时只要开启写入配置,均会强制同步更新本地文件。 - **系列排重修复**:重构了存储库扫描时系列匹配的底层数据库查询,加入 `LOWER` 和 `TRIM` 处理,并且**跨所有存储库进行全局排重匹配**,引入了原子事务 `find_or_create`,彻底解决了因并发同步或跨库同步导致的“重复创建同名系列”问题。 ## [1.1.9] - 2026-03-15 ### 🚀 重大更新 ### ✨ 新功能 - **多格式元数据读取**:支持读取非 MP3 格式的音频元数据。 - **元数据写入**:新增音频元数据写入功能(非 MP3 格式需安装插件支持)。 - **服务端转码播放**:支持将客户端无法直接播放的格式(如 WMA)在服务端转码后输出(需安装插件支持)。 - **Audiobookshelf 适配**:支持解析 Audiobookshelf 的 JSON 元数据格式。 ### 🛠️ 修复 - **倍速播放修复**:修复了播放器倍速设置无效的问题。 - **增量/减量扫描**:优化了存储库扫描机制,支持增量与减量扫描,大幅提升了变更检测效率。 - **章节名正则提取被截断问题修复**:取消默认正则规则,每本书可以单独配置正则提取规则。 ### 🔌 新插件 - **Native Audio Support**:通过 FFmpeg 提供原生音频格式支持(含元数据提取/写入与流式传输)。 - **FFmpeg Provider**:为其他插件提供 FFmpeg 二进制文件。 ## [1.1.8] - 2026-03-07 ### 🛠️ 修复与优化 - **书架页面前端优化**。 - **修改了自动合并逻辑**:在后台自动合并任务中,增加了路径检查,避免合并错误的文件。 - **优化ID3标签提取**:修复了一些ID3标签提取的问题,确保元数据的准确性。 ## [1.1.7] - 2026-03-07 ### 🛠️ 优化 - **优化插件刮削流程**。 ### ✨ 新功能 - **增加系列书籍,可以手动添加系列书籍**。 ## [1.1.6] - 2026-03-05 ### 🛠️ 修复与优化 - **MP3播放与ID3标签提取优化**。 ## [1.1.5] - 2026-03-04 ### 🛠️ 修复与优化 - **fpk安装修复**:修复fpk安装修改端口无法启动应用。 ## [1.1.4] - 2026-03-04 ### 🛠️ 修复与优化 - **前端修复**:修复设置界面无法打开。 ## [1.1.3] - 2026-03-04 ### 🛠️ 修复与优化 - **其他问题修复**:修复了若干已知的小问题,优化了整体使用体验。 ## [1.1.2] - 2026-03-04 ### 🛠️ 修复与优化 - **内存泄漏修复**:修复了在特定场景下(如长时间扫描或处理大文件)可能导致的内存泄漏问题,进一步提升了系统的稳定性。 - **刮削功能修复**:修复了元数据刮削过程中可能出现的解析错误,提高了刮削的成功率和准确性。 - **其他问题修复**:修复了若干已知的小问题,优化了整体使用体验。 ## [1.1.1] - 2026-03-02 ### 🛠️ 修复与优化 - **内存泄漏修复**:修复了在特定场景下(如长时间扫描或处理大文件)可能导致的内存泄漏问题,进一步提升了系统的稳定性。 - **刮削功能修复**:修复了元数据刮削过程中可能出现的解析错误,提高了刮削的成功率和准确性。 - **其他问题修复**:修复了若干已知的小问题,优化了整体使用体验。 ## [1.1.0] - 2026-03-01 ### 🏗️ 架构重构 (Rust Edition) - **后端完全重写**:核心后端服务已从 Node.js 迁移至 **Rust**,带来极致的性能提升和内存优化。 - **内存占用降低 90%**:得益于 Rust 的零成本抽象和无 GC 特性,空闲内存占用仅需约 20MB。 - **扫描速度提升 10x**:利用 Rust 的并发能力,大规模音频库的元数据扫描和文件处理速度实现了质的飞跃。 - **单体可执行文件**:后端编译为单一二进制文件,部署更加轻量便捷。 - **SPA 静态托管**:Rust 后端内置了对 React 前端的静态文件托管支持,现在只需部署一个容器即可运行完整的全栈应用。 ### 🔌 插件系统 (New) - **多语言插件支持**:引入了全新的插件架构,支持多种类型的插件开发,满足不同场景需求: - **JavaScript 插件**:基于内置轻量级 JS 运行时,开发简单,适合快速编写元数据刮削逻辑。 - **WASM 插件**:支持加载 WebAssembly 模块,兼顾性能与安全,适合复杂的计算任务。 - **Native 插件**:支持加载动态链接库 (.dll/.so),拥有底层系统访问权限,适合处理高性能解码或加密文件。 - **热插拔管理**:支持在运行时动态加载、卸载和更新插件,无需重启服务。 - **安全沙箱**:JS 和 WASM 插件运行在受限沙箱环境中,确保系统安全。 ### ✨ 新特性与优化 - **全格式支持升级**:借助 Rust 的 `symphonia` 和 `ffmpeg` 绑定,音频解码能力进一步增强,原生支持 MP3, M4A, M4B, FLAC, OGG, OPUS, WAV 等主流格式。 - **配置系统重构**:引入了层级化的配置系统(`config.toml`),支持通过环境变量覆盖任意配置项,更符合 Docker 和云原生部署习惯。 - **Docker 镜像优化**: - 采用多阶段构建,镜像体积大幅减小。 - 基础镜像切换至 `debian-slim`,确保运行环境精简且安全。 - 重新规划了容器目录结构(`/app/data`, `/app/storage`, `/app/plugins`),映射更加直观。 ### 🛠️ 破坏性变更 - **数据迁移**:由于数据库结构微调,旧版本(Node.js 版)的 `ting-reader.db` 可能需要手动迁移或重新扫描媒体库。 - **配置路径**:配置文件统一移动至容器内的 `/app/config.toml`,旧的环境变量名称可能有变化,请参考最新的 `README.md`。 ## [1.0.10] - 2026-02-16 ### 🚀 性能与刮削优化 - **特殊格式扫描性能大幅提升**:重构了加密等特殊格式文件的扫描逻辑,实现了**文件头按需读取**(Partial Read),不再将整个大文件加载到内存中。对于 50MB+ 的音频文件,扫描时的内存占用降低了 95% 以上,显著提高了大批量扫描的稳定性。 - **智能文件名刮削**:新增了**文件名元数据提取**功能。当音频文件(如 `.m4a`)缺失内置标签且文件夹名称为 "Unknown Book" 时,系统会自动分析文件名(支持 `作者 - 书名 - 章节` 等多种格式),精准提取书名和作者,解决了格式转换后书籍无法识别的问题。 - **章节名称清洗增强**:优化了章节标题的清洗算法,能够智能识别并去除文件名中的冗余信息(如重复的书名、作者名),仅保留核心章节名称,让章节列表更加清爽易读。 ### 🎨 前端体验优化 - **操作逻辑改进**:优化了前端交互逻辑,提升了用户操作的流畅度。 ## [1.0.9] - 2026-02-15 ### 🚀 优化与改进 - **缓存逻辑优化**:优化了服务端缓存处理逻辑。 - **界面优化**:同步优化了 Web 前端书架和收藏页面的空状态显示。 ## [1.0.8] - 2026-02-11 ### 🚀 性能与内存优化 - **智能内存管理**:大幅优化了解密和扫描过程中的内存占用。 - **WASM 按需加载**:重构了解密核心,从全局单例改为按需实例化,彻底解决了处理大文件后内存无法回落的问题(内存泄漏修复)。 - **主动垃圾回收**:在扫描和播放流程中引入了激进的内存释放策略,处理完文件后立即释放缓冲区,显著降低了并发峰值。 - **扫描精准度提升**:将全量读取的阈值从 10MB 提升至 20MB,确保部分非标准编码的 MP3/M4A 文件能被准确读取时长和元数据。 ## [1.0.7] - 2026-02-10 ### 📱 Android 客户端适配 - **网络权限修复**:修复了 Android 9.0+ 设备默认禁止明文 HTTP 流量导致无法连接局域网服务器的问题(已在 App 侧添加 `usesCleartextTraffic` 配置)。 ### 🛠️ 扫描器稳定性与逻辑升级 - **无缝路径迁移**:支持**“智能身份找回”**功能。当您修改存储库的根目录(例如从 `/` 改为 `/Book`)或移动书籍位置时,系统会自动识别同名书籍,**保留所有阅读进度和收藏记录**,无需重新刮削。 - **并发控制修复**: - 彻底解决了“双重任务”问题,确保每次配置修改只触发一个扫描任务。 - 引入了 `AbortController` 深度中断机制,旧任务会在毫秒级内被新任务终止,杜绝数据库冲突。 - **容错增强**:修复了 `FOREIGN KEY constraint failed` 数据库崩溃问题,优化了删除逻辑的顺序,确保在清理无效数据时系统依然稳定。 ## [1.0.6] - 2026-02-08 ### 🛠️ 修复与优化 - **前端路由修复**:修复了在非根路径下刷新页面导致白屏(`MIME type error`)的问题,将前端构建 `base` 路径调整为绝对路径 `/`。 ## [1.0.5] - 2026-02-06 - **架构升级**:完全分离桌面端代码到独立项目 `ting-reader-client`,主项目专注于服务端和 Web 前端。 - **桌面端支持**:为新的纯客户端桌面应用提供 API 支持(包括 302 重定向解析、跨域头优化等)。 - **清理**:移除了主项目中遗留的 Electron 相关构建脚本和依赖。 ## [1.0.4] - 2026-02-05 ### 🎵 音频兼容性增强 - **全格式支持**:除了基础的 MP3/M4A,现在完美支持 **WMA, FLAC, OGG, OPUS, AAC, M4B** 等格式。 - **实时转码**:引入 **FFmpeg** 实时转码引擎。当检测到浏览器不支持的音频格式(如 WMA/FLAC)时,后端会自动将其转码为 MP3 流进行播放,无需预先处理文件。 - **环境升级**:Docker 镜像现已预装 FFmpeg,开箱即用,无需额外配置。 ### ✨ 新特性 - **书架筛选**:书架页面新增了**媒体库选择器**,支持按来源库快速筛选展示书籍,管理多库资源更便捷。 - **高级筛选**:重构了搜索页面的筛选体验,引入**聚合筛选面板**,支持按媒体库、标签、作者及演播者进行多维度组合筛选,并优化了移动端/桌面端的交互体验。 ### 🛠️ 修复与优化 - **扫描器升级**:优化了文件扫描逻辑,将 .m4b, .ogg, .opus, .wma 等格式加入白名单,支持元数据解析。 ## [1.0.3] - 2026-02-05 ### ✨ 外挂组件 (Widget) - **多模式嵌入**:新增外挂播放器组件,支持“私有模式”(带 Token 免登录)和“公开模式”(需登录)。 - **灵活布局**: - **标准嵌入**:随文档流展示。 - **吸底模式**:固定在屏幕底部。 - **悬浮模式**:右下角胶囊悬浮,支持响应式垂直布局(手机端自动适配)。 - **沉浸式体验**: - 支持点击 Widget 封面进入全屏沉浸式播放界面。 - 优化了全屏/小窗切换动画及状态同步。 - **高度定制**: - 支持在设置页面一键复制包含定位样式的完整 HTML 代码。 - 支持注入自定义 CSS 以修改 Widget 内部样式(如透明背景、隐藏按钮等)。 ### 🛠️ 体验优化 - **播放器逻辑**:重构了播放器响应式布局逻辑,移除了不稳定的 JS 监听,改用纯 CSS 媒体查询,彻底解决了白屏和布局挤压问题。 - **文档更新**:新增了 [Widget 集成指南](https://github.com/dqsq2e2/ting-reader/wiki/WIDGET_GUIDE)。 ## [1.0.2] - 2026-02-03 ### ✨ 播放器功能优化 - **自定义睡眠定时**:支持设置任意分钟数的倒计时,并优化了 UI 布局,解决了按钮挤压问题。 - **定时器智能同步**:倒计时现在会随播放状态自动暂停/恢复。 - **输入安全性**:限制自定义定时输入为正整数,禁止负数输入。 ### 🚀 UI/UX 修复 - **沉浸式进度条**:修复了进度指示器(时间药丸)固定不移动的问题,现在会随播放进度平滑滑动。 - **播放状态同步**:通过监听底层音频事件,确保图标状态(播放/暂停)与实际播放情况实时同步,修复了中断后图标不更新的问题。 ## [1.0.1] - 2026-02-03 ### ✨ 新特性 - **媒体库同步清理**:同步时自动检测并清理磁盘上已不存在的书籍和章节记录。 - **单本书籍管理**: - 支持从书架手动删除书籍。 - 本地源支持在删除时同步物理删除源文件。 - 删除书籍时自动清理关联的所有缓存(`.bin`)和预加载文件。 - **智能合并去重**:扫描时支持根据音频标签(Album)跨文件夹合并同一专辑,避免重复创建书籍。 - **自动初始化扫描**:首次添加媒体库后自动触发一次同步任务,无需手动点击。 ### 🚀 优化与改进 - **缓存机制优化**:本地存储源(非加密文件)改为直接流式传输,不再占用额外的缓存空间。 - **刮削逻辑增强**:优化了刮削器,支持更精准的描述清理和元数据提取。 - **UI 改进**: - 后台管理菜单顺序调整:任务日志移动至库管理之后,方便查看同步状态。 - 增加删除书籍确认弹窗及危险操作提示。 - **版本管理**:项目整体版本更新至 1.0.1。 ## [1.0.0] - 2026-02-03 - 初始版本发布。