Repository navigation
Releases: yangjian1412/OneNAS
Release list
v1.0.6
平板 / 折叠屏 / 横屏适配,以及由此暴露的三个必修 bug。
主程序升级
- 增加平板适配,优化折叠屏、横屏显示
- 平板 / 横屏(expanded)时,底部 tab 变为常驻左侧导航栏(图标 + 文字),使用 react-navigation v7 原生的
tabBarPosition="left"+tabBarVariant="material",未自绘组件;窄屏保持底部 tab - 新增
src/lib/useLayout.ts作为全项目唯一窗口尺寸来源
komga模块升级至1.0.3
- 高分率及宽屏适配优化
- 优化条漫模式切换模式后强制 reloadKey 重载
- 优化菜单点击坐标修复
v1.0.5-aria2(1.0.1)
Aria2 模块升级到 1.0.1:磁力链接与种子下载(纯下载模式,不做种)。App 版本仍 1.0.5。
v1.0.5beta2
Jellyfin Live TV channel list + playback fix: official POST /Items/{id}/PlaybackInfo flow; absolutize relative stream URLs (fixes ExoPlayer FileDataSource query error); remove debug logs.
v1.0.5
设置新增各服务独立版本与更新内容查看(关于 → 版本号)。App 版本固定为 1.0.5,此后仅大调整时更新;各服务独立排版(1.0.0 起,功能更新递增)。
One NAS v1.0.5beta
feat(navidrome): song/album/playlist row actions + multi-select + playlist CRUD; bump to 1.0.5beta
歌曲行 ⋮:播放 / 下一首播放 / 加入队列末尾 / 加入歌单… / 前往专辑 / 查看艺术家 / 收藏 / 从队列或歌单移除。
播放详情 header ⋮(与 ❤️ 同列右上角)。
专辑/歌单详情:⋯ 菜单(全部播放/全部加入队列/全部加入歌单/收藏/重命名/删除歌单)+ ☑ 多选模式 + 底部操作条(播放 N 首 / 加入队列 / 加入歌单 / 取消)。
歌单时长显示修 bug:m:ss。
新增 Subsonic 端点:createPlaylist / updatePlaylist / deletePlaylist / savePlayQueue / getPlayQueue。
复用 FileBrowser ⋮ 视觉(3 个小圆点 View)+ ☑ 视觉(外框 + 内填),无新 SVG。
One NAS v1.0.4alpha
feat(talebook): inline login UI in ConfigModal + MyBooks node compatibility; bump to 1.0.4alpha
API 层:talebookUnlockSite / GetShelf / ToggleShelf 按 serverType 分支;MyBooks captcha 端点返回 none。
UI 层:ConfigModal 新增「服务类型」选择器 (Talebook/MyBooks),登录/解锁/验证码 UI 内嵌到配置页。
Store:新增 initServerFromService 同步 server 配置;登录不再需要事先进入 TalebookScreen。
One NAS v1.0.3
One NAS v1.0.3
适配 Jellyfin v12.0(2026-09-08 发布的强制 auth 变更)。登录、看库、播放、投屏等全部接口在升级到 Jellyfin v12 后回归正常。
修复
fix(jellyfin): migrate auth to v12 single-header MediaBrowser scheme
Jellyfin v12 默认关闭 EnableLegacyAuthorization,仅保留:
- 单一
Authorization: MediaBrowser Client="...", Device="...", DeviceId="...", Version="...", Token="..."header(与官方 jellyfin-sdk-typescript v1.0 一致) ?ApiKey=<token>query 参数
旧代码同时发 X-Emby-Authorization + X-Emby-Token + Authorization: MediaBrowser Token=...,v12 全部弃用。结果就是登录 /Users/AuthenticateByName 时服务端从 Authorization 解析不到 client/device/deviceId/version,session 创建失败,返回 400。
改动:
src/lib/api/jellyfin.ts/jellyfinPlayback.ts:重写 fetch 头。buildAuthHeader(server)统一生成 SDK v1.0 风格的单一 header。登录端点无 token 时Token=""占位api_key=→ApiKey=:共 6 处(jellyfinGetImageUrl/jellyfinGetStreamUrl/jellyfinPlayback.tsgetStream /upnp/streamUrl.ts)
安装
- 版本:v1.0.3 / versionCode 15
- 附件:
app-release.apk(~38 MB,arm64-v8a) - adb:
adb install -r app-release.apk
One NAS v1.0.2beta11
v1.0.2beta11
fix(filebrowser): per-segment URL encoding for literal ? in filenames
resourceUrl / requestResource 拆出 path / query 两个参数:
- path 段:按
/切分后逐段encodeURIComponent,含字面?(U+003F) 的文件名会编码为%3F,不再与?action=rename&...的 query 分隔符冲突 - query 段:原样透传(caller 已经
encodeURIComponent编过)
修复的两个 bug:
- 字面
?文件名 rename 失败:encodeURI不编码?(保留字符),原 URL.../Na?ve...mp3?action=rename&...出现两个?,服务端把第一个当 query 分隔符,src被截断到/folder/Na,找不到目标文件 → rename 失败 destination二次编码:encodeURIComponent(destination)之后encodeURI又把%编成%25,服务端收destination=%252F...,反编码后变成含字面%2F的"路径",不在文件系统上 → rename 失败
调用点更新(4 处):
renameResource/copyResource:把 query 改成单独参数传uploadResource:?override=truegetFileChecksum:?checksum=...
安装
- 版本:v1.0.2beta11 / versionCode 14
- 附件:
app-release.apk(~38 MB,arm64-v8a) - adb:
adb install -r app-release.apk
One NAS v1.0.2beta10
v1.0.2 beta10
FileBrowser 子目录搜索结果 404 修复
之前在子目录里搜索结果点击会报 404,但根目录搜索正常。
根因:
FileBrowser 的 /api/search/<scope>?query=... 端点返回的路径是相对 <scope> 的:
- 根目录搜(scope=
/):返回/folder/file.txt(碰巧等于绝对路径)→ 打开正常 - 子目录
/documents里搜(scope=/documents):返回subdir/file.txt(相对 scope)→loadDir拼出/api/resources/subdir/file.txt,而真实资源在/api/resources/documents/subdir/file.txt→ 404
修复:
在 src/lib/api/filebrowser.ts 的 searchFilesStream 内新增 normalizePath(rawPath, scope):当 raw.path 不以 / 开头时,自动拼接 scope 前缀。
应用在 3 个结果构造点:
- NDJSON streaming path
- JSON array streaming path
- 纯文本 fallback path
注意 mapFileItem(普通列表端点,结果已经是绝对路径)保持不动。
附带修复:搜索结果点击文件的父目录推断。文件点开后会跳到父目录,原代码从相对路径算 parentDir 也会丢 scope 前缀,现在和 path 一起归一化后正确。
验证场景
- 根目录搜索 → 点结果 → 打开正常(不变)
- 子目录
/documents搜索 → 点文件 → 打开父目录/documents/xxx正确 - 子目录
/documents搜索 → 点文件夹 → 进入/documents/xxx正确
版本
versionCode: 12 → 13versionName: 1.0.2beta9 → 1.0.2beta10
安装
直接覆盖安装(release 复用 debug.keystore 签名)
One NAS v1.0.2beta9
v1.0.2 beta9
Jellyfin 库内文件分页加载
之前库内超过 50 个项目时只显示前 50 个,且无任何方式加载剩余内容。根因:
- API 硬编码
limit=50 - FlatList 没有
onEndReached,滚动到底不会触发加载
API 层 (src/lib/api/jellyfin.ts)
jellyfinGetLibraryItems新增startIndex参数(默认 0)- 返回类型加
totalRecordCount?: number(从/Items响应里取)
状态层 (src/screens/JellyfinScreen.tsx)
- 新增
hasMore/loadingMore状态 - 4 个初次加载点(
handleLibraryPress、handleItemPressFolder 分支、handleSortFieldChange、handleToggleSortOrder)统一改用startIndex=0,并根据items.length < totalRecordCount计算hasMore - 新增
loadMore回调:用currentItems.length作为下一段startIndex拉下一页,append 到列表;用loadingMore || !hasMore防止重复触发 - 缓存结构调整为
{ items, totalRecordCount }(兼容 60s TTL)
渲染层 (src/components/jellyfin/JellyfinItemGrid.tsx)
- FlatList 加
onEndReached(threshold 0.5)+ListFooterComponent - 加载中显示 spinner + "加载更多..."
- 已无更多显示 "没有更多了"
验证场景
- 100 部电影库 → 滚到底自动加载第 51-100 → 底部显示"没有更多了"
- 切换排序 → 自动重置并重算 hasMore
- 快速滚动 → loadMore 防抖,不重复发请求
- 网络失败 → loadingMore 正确清除,可重试
版本
versionCode: 11 → 12versionName: 1.0.2beta8 → 1.0.2beta9
安装
直接覆盖安装(release 复用 debug.keystore 签名)