172 Commits
Author SHA1 Message Date
Noah 024254a288 fix(build): restore editable installs after stream_gears packaging change (#1734)
* fix(build): restore editable installs after stream_gears packaging change

Editable installs only put python-source (crates/stream-gears) on sys.path and skip include, so the root biliup/ package was unimportable after maturin develop / pip install -e . Add crates/stream-gears/biliup/__init__.py, which loads the root package under the same name. Wheels are unchanged: maturin only walks stream_gears/ and the include globs, which match the root biliup/ first.

* test(stream-gears): cover editable installs

test_wheel_ships_stubs only checks RECORD for regular installs, since an editable install's RECORD lists the .pth. A new test puts only python-source on PYTHONPATH and checks that biliup and biliup.__main__ resolve to the root package.

* build: move biliup/ and pyproject.toml into crates/stream-gears

Editable installs (`maturin develop`, `pip install -e`) only put
`python-source` on sys.path and skip `include`, so with `biliup/` at the
repository root they could not import it. With `pyproject.toml`,
`biliup/` and `stream_gears/` in the same directory, `biliup` goes in
through `python-packages`, which editable installs honour.

- `biliup/` is moved unchanged; the loader added earlier in this PR is
  removed because that path is now the real package.
- `readme` and `license` point at the repository root, so the wheel's
  METADATA and `licenses/LICENSE` stay the same.
- CI, Termux and the Dockerfile build with
  `-m crates/stream-gears/Cargo.toml`.

Ref #1732

* docs: point source install commands at crates/stream-gears
2026-09-24 09:30:04 +00:00
Noah 6c06b85b1c feat(desktop): run biliup server in-process, drop PyInstaller sidecar (#1731)
* feat(cli): let serve run on a host-bound listener with a host-owned shutdown

ServeOptions gains two optional fields for embedding hosts:

- listener: serve on an already-bound socket, so the host knows the
  actual port (e.g. after falling back to port 0);
- shutdown: stop when the given future completes instead of installing
  Ctrl+C / SIGTERM handlers, which would otherwise take those signals
  away from the host process.

The CLI path is unchanged apart from binding the port before opening the
database, so a busy port now fails before data/ is touched.

Ref #1721

* feat(desktop): run biliup server in-process, drop PyInstaller sidecar

The Tauri app now depends on biliup-cli as a library and runs
entry::serve on its own tokio runtime instead of spawning
binaries/biliup.exe:

- listens on 127.0.0.1:19159, or a free port when that one is taken;
  the window shows a bundled startup page and switches to the Web UI
  once GET / answers 200 (startup failures are shown on that page);
- data/, ds_update.log, cookies.json and recordings live in
  app_data_dir(); on first start, data/ left in the install directory
  by the old sidecar is copied over and the original is kept;
- closing the window stops the server and waits for it (up to 10 s);
  no expect() on exit;
- a second launch focuses the running window instead of starting a
  second server on the same data.

Removed: the greet command, the Vite + React scaffold under
tauri-app/src, the shell:allow-execute capability, tauri-plugin-shell,
tauri-plugin-opener, GBK decoding of sidecar stdout and the bundled
binaries/ resource. The Web UI itself is unchanged.

Ref #1721

* ci(desktop): build the Tauri app directly, remove biliup.spec

The Windows desktop workflow no longer builds a wheel, installs it and
runs PyInstaller: it builds the Web UI (embedded into biliup-cli by
rust-embed) and then the Tauri app with tauri-action. Renamed
pyinstaller-publish.yml to desktop-publish.yml.

On release it uploads to the release as before; a manual
workflow_dispatch run only builds and uploads the installers as an
artifact, without touching any release.

The Dockerfile used biliup.spec to tell whether it was built from a
checkout (otherwise it clones master); it now checks pyproject.toml.

Ref #1721

* ci(desktop): smoke-test the installer on manual runs

Only on workflow_dispatch: pretend an old install left data/ in the
install directory, install the NSIS package silently, start the app and
require GET http://127.0.0.1:19159/ to return 200, the database to be
created in the app data directory, the old data/ to be copied there and
kept in place, and the server to stop when the window is closed.

Ref #1721

* feat(desktop): keep data next to the exe unless it is on the system drive

On Windows the data directory is the install directory again, as with the
old sidecar, when the executable is not on %SystemDrive%. When it is, the
first start asks the user (tauri-plugin-dialog): the app data directory
(default), the install directory, or another folder. The choice is saved
as {"data_dir": ...} in desktop.json under the app config directory and
not asked again; a saved directory that cannot be used is reported on the
startup page instead of silently creating a new one. Closing the dialog
quits.

Other platforms have no drive letters and install into read-only
locations, so they keep using the app data directory (or data_dir from
desktop.json) without asking.

When the chosen directory has no data/ yet, data/ left by an older
version is copied there and kept in place. Besides the install directory,
Windows also looks where the old bbup-app installers put the app (their
registry keys and %LOCALAPPDATA%\bbup-app), since a new product name
installs into a new directory.

The data directory is resolved on a separate thread because the dialog
blocks. The migration helpers move to data_dir.rs unchanged.

Ref #1721

* chore(desktop): replace the template names with biliup

- productName bbup-app -> biliup (installers biliup_<version>_x64-setup.exe
  and biliup_<version>_x64_en-US.msi, NSIS default install directory
  %LOCALAPPDATA%\biliup, Start menu entry biliup)
- identifier com.tauri-app.app -> com.biliup.desktop (app data directory
  %APPDATA%\com.biliup.desktop, which is the default data directory
  offered on the system drive)
- Cargo package tauri-app -> biliup-desktop (executable
  biliup-desktop.exe, so it is not confused with the biliup CLI), lib
  tauri_app_lib -> biliup_desktop_lib, drop the template authors
- npm package name, workflow artifact name and the README download link

Tauri derives the NSIS uninstall/registry keys and the MSI upgrade code
from the product name, so the new installers do not replace an installed
bbup-app; both show up in Apps & features. The app copies data/ from the
old bbup-app install directory on first start (see the previous commit),
after which bbup-app can be uninstalled; its uninstaller does not delete
data/.

Ref #1721

* ci(desktop): bump the workflow actions to their latest majors

actions/checkout v4 -> v7, actions/setup-node v4 -> v7,
actions/upload-artifact v4 -> v7 (Node 24 runtimes; the other breaking
changes are about fork checkouts in pull_request_target, caching driven by
a packageManager field and single-file uploads, none of which this
workflow uses). Swatinem/rust-cache@v2 and dtolnay/rust-toolchain@stable
already track the latest release.

tauri-apps/tauri-action v0 -> v1. v1 updates the name and body of an
existing published release it finds by tagName with releaseName and
releaseBody, which are empty here and would wipe the release notes, so
the release job now passes releaseId from the release event instead;
with releaseId the action uploads to that release without looking it up.

Ref #1721

* ci(desktop): smoke-test the new data directory rules on manual runs

Replaces the manual-run smoke step from the earlier smoke-test commit and
can be dropped together with it. On the Windows runner:

- install the v1.2.8 bbup-app NSIS package into C:\old-bbup-app and leave
  a data/ there;
- install biliup into its default directory on the system drive (with an
  old data/ in it); both products stay installed side by side;
- first start shows the data directory dialog and does not start the
  server; UI Automation clicks the default button (the dialog text and a
  screenshot are kept as evidence), then GET / must return 200, the
  database and the copied data/ must be in %APPDATA%\com.biliup.desktop,
  the original kept and the choice saved in desktop.json;
- a second start must not ask again; a preset desktop.json pointing at
  another directory stands in for "choose another folder";
- reinstall on D: (or a subst drive when the runner has none): no dialog,
  database and log in the install directory, data/ copied from the old
  bbup-app directory found through its registry key;
- uninstalling bbup-app keeps its data/.

Ref #1721

* Revert "ci(desktop): smoke-test the new data directory rules on manual runs"

This reverts commit 860c45e89f8e5dab11468c83db7c623b7304e4dd.

* Revert "ci(desktop): smoke-test the installer on manual runs"

This reverts commit b3831f014a2b37f81b71c96e8229a6254bee1b9c.
2026-09-24 07:28:02 +00:00
Noah 67e49354ad fix(recorder): stop stream-gears losing the tail, default to mesio (#1733)
* fix(stream-gears): write the cached GOP on disconnect, flush before the segment hook

The httpflv loop kept the current GOP in `flv_tags_cache` and only wrote it
when the next keyframe arrived. On EOF, a 30 s read timeout or a parse error
the function returned and the cache was dropped, so every disconnect,
reconnect and stream end lost the last 1-10 s. The loop now runs in an inner
function; whatever way it exits, the complete tags in the cache are written
before the original result (including the error) is returned.

`FlvFile` / `TsFile` renamed the `.part` file and ran the segment hook before
the old `BufWriter` was flushed, so the hook (FileValidator, upload) could see
a truncated file, and a failed final flush (disk full) was swallowed. Both now
go through `finish()`: flush and check the error, then rename, then run the
hook. `create_new` returns the flush error; `Drop` logs it with `error!`.

Tests: the rolling-segment test now expects 120 keyframes on disk (was 119)
and checks the size seen by the hook equals the final size; new cases for a
stream that ends cleanly, a read that times out and a parse error; a TS hook
size test; a failed-flush test.

Ref #1726

* feat(recorder): default to mesio when no downloader is configured

Rooms without a `downloader` setting followed the plugin hint, which is
stream-gears for almost every platform. They now use mesio: its FLV output
carries `onMetaData.keyframes` and every segment starts at timestamp 0, so
players can seek; it also records HEVC / Enhanced-FLV and HLS fMP4, which
stream-gears cannot. Only the hint mapping in `core/live.rs` changes; an
explicit `stream-gears` keeps using stream-gears, and plugins that hint
streamlink / yt-dlp are unaffected.

`DownloaderRuntime::from_type` no longer has a catch-all arm. `ffmpeg-external`
and `ffmpeg-internal` used to fall into it and silently run stream-gears; both
now run ffmpeg (external segmenting, same as `ffmpeg`). The arm for
streamlink / yt-dlp / ytarchive, which need the live stream and are built in
`downloader_runtime`, is listed explicitly and logs a warning.

WebUI, README, sample configs and CHANGELOG now say mesio is the default and
list the behaviour differences: the container follows the source (HLS fMP4 is
saved as .mp4), files are written under their final name without `.part`, and
Douyu Wangsu reconnects leave a 2.6-5.8 s overlap between segments.

Ref #1726

* feat(mesio): pass segment duration and size to the segment callback

mesio's segment-complete callback reports the duration and byte size of each
closed file, but biliup only logged them and built `SegmentInfo` with the path
and index. `SegmentInfo` gains `duration_secs` / `size_bytes` (None for the
other downloaders) and mesio fills them in. The end-to-end mesio test checks
the reported size equals the file size on disk.

Ref #1726

* fix(recorder): parse segment_time the same way in every downloader

`segment_time` was read three different ways. stream-gears indexed
`parts[1]` / `parts[2]` directly, so "3600" or "01:00" panicked the download
task (and an unparsable hour silently became 1); mesio returned 0 for anything
that was not HH:MM:SS and silently recorded without time splits; ffmpeg got
the raw string and accepted both forms.

`parse_segment_time` follows ffmpeg's duration syntax (`[HH:]MM:SS[.frac]`
or plain seconds; minutes and seconds below 60 when colons are used), so all
three downloaders now agree. stream-gears and mesio share
`DownloadConfig::segment_time_limit`: 0 means no time split for both (mesio
already did this; stream-gears used to split at every keyframe), and a value
that still cannot be parsed logs a warning and records without time splits
instead of panicking or being ignored silently. The time-range clamp uses the
same parser, so "3600" is shortened near the window end like "01:00:00".

Ref #1726

* feat(webui): enter file_size as a number with an MB/GB unit

The config still stores bytes. The control converts with 1024 (the same
sizes Windows Explorer shows), keeps an untouched value byte-exact even
when it is not a round MB/GB, and re-picks the unit when the form value
is replaced from outside.

In the streamer override, clearing a value that was already set now
saves null (no size split for that streamer); before, Semi dropped the
emptied key and the old value stayed. Clearing something typed in the
same session still falls back to inheriting the global setting.

* fix(webui): keep the file_size unit beside the number in narrow modals
2026-09-24 06:24:17 +00:00
Noah bff8815be4 feat(cli): biliup season subcommands (#1730)
* feat(uploader): public season API handle and BV lookup for archive view

- `SeasonApi` becomes public: `BiliBili::season_api()` returns it, and a
  `#[doc(hidden)]` `SeasonApi::with_hosts` points it at other hosts so
  callers outside the crate (the CLI tests) can use a local fake server.
  The `BiliBili` struct itself is unchanged.
- `archive_view_by_vid(&Vid)` queries the public view endpoint with either
  `aid` or `bvid`, so a BV number does not need a separate lookup.

Ref #1721

* feat(cli): biliup season subcommands

`biliup season list | sections <season_id> | add <section_id> --vid … |
remove <episode_id> | sort <section_id> [episode_id…] [--reverse]`, all with
`--json`. `add` fetches cid and title through the public view endpoint.
`sort` puts the listed episodes first and keeps the rest in their current
order, since B站 requires every episode of the section in the request.

The logic lives in `season_cli.rs`; dispatch only gains one match arm in
`main.rs` and in the copy in `stream-gears/src/server.rs`.

Ref #1721

* docs: list season and user subcommands in README and SKILL.md

Ref #1721
2026-09-24 05:30:01 +00:00
Noah 486676db29 feat(ui): 直播预览阶段三——录制中房间实时码率折线图 (#1714)
* feat(api): GET /v1/live-rates 录制中房间的每秒写盘速率瘦端点

/v1/streamers 每次查全表、拼齐全部字段,10 s 一次的节奏不适合调快;码率曲线需要 1 s 粒度,
新加一个只读内存的瘦端点:扫一遍 worker,对每个 Working 的房间读一次阶段一 RateMeter 的窗口均值,
返回 [{id, bytes_per_sec, ts}]。与 /v1/streamers 的 live_bytes_per_sec 同源同值;不新增采样任务、
服务端不存历史、Cache-Control: no-store;注册在 router() 内,--auth 时同一道登录校验。

Part of #1708

* feat(ui): 实时码率数据层与 uPlot 折线组件

- app/lib/use-live-rates.ts:页面内唯一的一份采样源。有订阅者时每秒拉一次 /v1/live-rates,
  全部卸载 / 标签页隐藏即停;历史放模块级环形缓冲(每房间最近 3 分钟),组件卸载不清,
  切走再切回曲线还在;帧里没有的房间补 null 成断口。useSyncExternalStore 订阅,无新帧不重渲染。
- app/ui/RateChart.tsx:uPlot 折线,full(带时间轴 / Y 轴,单位按窗口最大值自动选 KB/s / MB/s,
  Y 从 0 起)与 sparkline(无坐标轴,hover 读数)两种形态;实例在 effect 里建 / 销毁,渲染期不碰 ref,
  StrictMode 双次 effect 不留多余 canvas;配色每次绘制时读 Semi CSS 变量,深浅色切换不重建。
  无采样 / 未录制只显示「—」占位,不画空图。
- app/ui/LiveRateChart.tsx:next/dynamic 懒加载入口 + 当前 / 峰值 / 均值统计条;
  uPlot 与其 CSS 打进独立 chunk(约 23 KB gzip),首屏不含。
- 新依赖 uplot ^1.6.32(本 PR 唯一新依赖)。

Part of #1708

* feat(ui): 三处接入码率折线——弹层可折叠折线、卡片与监视器 sparkline

- 卡片弹层底部新增「写盘速率 · 最近 3 分钟」可折叠区(默认展开,折叠态记 localStorage
  biliup.preview.rateChart):标题行带当前 / 峰值 / 均值,展开时才轮询与加载 uPlot。
- 控制台 / 直播管理页录制中卡片:名称行下一条 60 s sparkline(28 px,hover 显示时刻与数值)。
- 历史记录页「实时监视」:工具栏新增「码率图」开关(默认关,记 biliup.monitor.rateChart),
  开启后每路小窗下方一条 60 s sparkline;所有小窗共用同一次每秒请求。

Part of #1708

* style(api): live_rates 测试按 rustfmt 换行

* fix(ui): sparkline 的 hover 读数浮在折线上方,不再被容器裁掉

* docs(readme): 功能列表补充直播预览(封面 / 播放器 / 弹幕 / 码率曲线)

#1708 三个阶段至此完整,在 README 的功能列表里加一条说明。

Closes #1708

* feat(api): GET /v1/ws/live-rates 用 WebSocket 每秒推送码率帧

review 1(ForgQi):复用现有的 WebSocket 机制推送而不是每秒轮询。WebSocket 不占浏览器对同一主机
HTTP/1.1 的六个并发连接(监视器 4 路视频 + 1 条弹幕 SSE 已用掉五个,这正是当初不用 SSE 的原因),
与日志页 /v1/ws/logs 同款:Origin 与 Host 同源校验、进程内连接数上限(16)、Ping 回 Pong、Close 即止。
连上立刻发一帧,之后每秒一帧,形状与 GET /v1/live-rates 相同;HTTP 版保留给 WebSocket 连不上时回退与 curl 核对。
两个路由都在 router() 内,--auth 下同一道登录校验。单测用手写的最小 WebSocket 客户端走完握手 + 两帧,不引新依赖。

* feat(ui): 码率数据改走 WebSocket;卡片 sparkline 加开关并叠在封面上

review 1(ForgQi):
- use-live-rates.ts 首选一条 WebSocket /v1/ws/live-rates(服务端每秒推一帧,所有图表共用),
  一帧都没收到就断开(反代没放行 upgrade、401)时回退到每秒 GET /v1/live-rates 轮询;中途断开退避重连,
  标签页隐藏时断开、可见时重连;快照新增 transport: 'ws' | 'poll'。
- 控制台「进行中」区块头与直播管理页工具栏新增「码率图」开关(默认关,记 localStorage biliup.cards.rateChart,
  两页共用);开启后录制中卡片的 sparkline 叠在封面底部(深色渐变垫底、读数条在图区内;点击仍冒泡到封面打开预览),
  封面没有 / 加载失败时退到名称行下方。

* test(api): 码率 WebSocket 连接上限测试改用独立信号量

CI 上与同一二进制里并发跑的 WebSocket 推送测试争用进程级信号量(后者占着一个许可),
上限测试拿不满 16 个而失败;改为像 ws.rs 的日志连接测试那样传入独立的 Semaphore。
2026-09-23 03:44:43 +00:00
ForgQi ea3298340f Bump workspace version to 1.2.6 and update docs
Update workspace package version from 1.2.5 to 1.2.6 in Cargo.toml and synchronize package versions in Cargo.lock (biliup, biliup-cli, danmaku, stream-gears). Also add a README bullet noting streaming-upload without local save (边录边传 0 落盘).
2026-09-21 23:07:55 +08:00
Noahandransxd 86bcaffd2a fix(sync): AUTO 测速超时与 file_size 覆写占位 null (#1693)
- AUTO 线路探测为列表请求与单线路测速增加 15s 硬超时,失败只跳过该线路
- POST 探测体按服务端 probe.post(默认 0.1MB)发送,避免固定 10MB 拖慢选线
- ConfigPatch 序列化跳过未设置的 file_size,避免落库/回传把全局值清成 None
- 迁移清理历史 override 中的 file_size: null 占位
- 同步保留边录边传管线健壮性修复(取消保留分段、错误提示、分段顺序等)

Co-authored-by: ransxd <ransxd@users.noreply.github.com>
2026-09-13 15:29:12 +00:00
Noah 906e0f6fdb docs: 依据代码实现重写 README,迁移弃用域名并修正失效信息 (#1681)
* docs: 依据代码实现重写 README,修正失效信息并补充平台与开发说明

保持原有结构、标题与徽章排版不变,按当前代码逐项校对内容。

修正与实现不符之处:
- 登录信息文件名写作 cookie.json,实际 CLI 默认值为 cookies.json
  (crates/biliup-cli/src/cli.rs 及其单测均为 cookies.json)
- Windows 下载链接硬编码 bbup-app_0.1.0_x64,随发版即失效,改为
  指向 Release 页
- Python 徽章链接 http://www.python.org/download 返回 404,改为
  https://www.python.org/downloads/
- Node.js 要求由 ≥ 18 修正为 ≥ 18.17(Next.js 14 的实际下限)

新增内容:
- 支持平台表:依据 builtin_plugins() 的 19 个平台适配器与通用兜底
  适配器,站点域名取自各适配器正则;弹幕列依据 danmaku
  create_platform() 支持的 7 个平台
- download 子命令用法示例与分段参数说明
- 外部依赖说明:默认 stream-gears 为纯 Rust 实现无需外部程序,
  ffmpeg 下载器与后处理需 ffmpeg,YouTube/niconico 及通用适配器
  需 yt-dlp 或 streamlink
- 目录结构表,以及 cargo 构建前必须先 npm run build 的说明
  (biliup-cli 经 rust-embed 内嵌 out/,缺失会导致编译失败)
- 测试命令与 Docker /opt 持久化、首次访问尽快初始化管理员的提示

校验:CLI 帮助文本与 target/debug/biliup --help、server --help 实际
输出逐字一致;远程访问拒绝启动的报错取自实际运行输出;mermaid
架构图经 mermaid-cli 渲染通过;README 全部外链已联网检查。

* docs: 迁移已弃用的 biliup.rs 文档域名,移除失效的 winget 安装方式

README:
- 顶部 logo 原引用 docs.biliup.rs/home.png,该域名已弃用且无法访问,
  改为仓库内 public/logo.png 的 raw 链接。README 同时用作 PyPI 长描述
  (pyproject.toml readme = "README.md"),故使用绝对地址而非相对路径
- 「使用文档」链接改为新域名
  https://biliup.github.io/biliup/docs/guide/introduction/

SKILL.md:
- 删除 Windows winget 安装段落。winget 上不存在名为 biliup 的包,
  该命令返回 No package found matching input criteria;现有的
  ForgQi.biliup-app(0.6.7)、ForgQi.biliup-rs(0.2.4) 均已停止更新,
  远落后于当前 1.2.4。Windows 用户仍可通过既有的 GitHub Releases
  段落(含 PowerShell 脚本)安装

校验:README 全部 29 个链接联网复查,除 GitHub 对未登录请求的
/stargazers 统一返回 404(rust-lang/rust 同样如此,属反爬行为)外
均为 200;新 logo 地址返回 200、image/png、65525 字节。
2026-09-01 13:49:39 +00:00
ForgQi 03b7a84f55 Allow remote Web UI bootstrap with auth
This change updates the server default bind to 127.0.0.1 for safer local-only access while documenting how to expose the Web UI via --bind 0.0.0.0 --auth for remote or Docker use. It also removes the previous restriction that blocked first-time admin bootstrap on non-loopback addresses, allowing authenticated remote initialization and bumping the workspace version to 1.2.4.
2026-08-24 01:13:29 +08:00
PingouinFerreux 0c3bbe2ec1 fix: switch star history chart to a working provider (#1659)
The star history chart in the README is no longer loading because the upstream API it depended on stopped working. Point the chart and its link to the star-history service hosted at star-history.dera.page, which uses a different data source and requires no API key, so the chart renders again for everyone.

This keeps the same query and hash parameters as before, so only the domain in the two URLs changes.
2026-08-14 07:59:58 +00:00
ForgQi b2ab974431 Update README with new features and cleanup
Reorganize features and remove command line tool section.
2026-06-08 01:32:00 +08:00
ForgQi b5ddff0564 Refactor Python package and simplify entry
Remove legacy engine and many plugin modules, refactor upload plugins to standalone classes, and simplify package entry points. __init__.py now provides a safe __version__ fallback; __main__.py directly invokes stream_gears.main_loop. BiliWeb/BiliWebAsync plugins were adapted to use a FileInfo NamedTuple and no longer depend on engine.UploadBase/Plugin decorator. Documentation updated (README expanded with new commands and CLI/SKILL integration) and a new SKILL.md added. Workspace version bumped to 1.2.1 in Cargo.toml (lock updated accordingly).
2026-06-06 03:22:54 +08:00
ForgQi b57dc29e96 Add cover downloader and update dependencies
Introduced a new cover_downloader module in the downloader core. Updated several dependencies in Cargo.toml and Cargo.lock, including major upgrades to image processing, HTTP, and async libraries. Adjusted related code in util, download, plugin, and uploader modules to support new features and dependency changes.
2025-12-15 00:41:34 +08:00
ForgQi 4fa4b90a37 Update README.md 2025-12-01 03:04:56 +08:00
ForgQi 9837d39d24 Update README.md 2025-12-01 03:00:35 +08:00
ForgQi eefbacd89f Update README.md 2025-12-01 02:53:37 +08:00
ForgQi 07da196a9d Add frontend build step to release workflow
Updated the GitHub Actions release workflow to include Node.js setup and frontend build steps. Also updated the README to clarify the Windows release download link and removed extra blank lines in the disclaimer section.
2025-11-29 23:37:33 +08:00
ForgQi 9e9c9617d4 Refactor plugin config handling and add release workflow
Removed biliup/config.py and refactored all plugin and downloader classes to accept a config parameter, passing configuration explicitly instead of relying on a global import. Updated Rust backend to pass config objects to Python plugins and added a OnceConfig Python class for config access. Introduced a GitHub Actions release workflow. Updated version to 1.1.26 and added a disclaimer to the README. Minor bug fixes and improvements in Rust uploader and config handling.
2025-11-29 23:24:53 +08:00
ForgQi b497749744 Update download task execution and improve docs
Refactored the DownloadTask::execute method to return DownloadStatus and adjusted its visibility. Enhanced DActor message handling to update stream info after download execution. Updated README and introduction guide with improved instructions for background running and systemd service configuration.
2025-10-27 02:05:23 +08:00
ForgQi f5f2998d16 Add streamer file info API and improve file listing
Introduces a new API endpoint `/v1/streamer-info/files/{id}` to fetch file lists for a specific streamer, and updates the frontend to fetch file lists dynamically per row. Also updates serialization for streamer date fields, improves comments and error handling, and changes the default downloader type for plugins. Minor documentation and code cleanup included.
2025-10-27 01:28:08 +08:00
ForgQi 2ede5cda33 Refactor YY plugin to Rust and update downloader logic
Migrates the YY plugin from Python to Rust, implementing it under crates/biliup-cli/src/server/core/plugin/yy.rs and registering it in the service register. Removes the old Python plugin. Refactors downloader instantiation logic into DownloadPlugin, and updates header construction utility. Updates CLI and README to clarify the --auth option. Cleans up duplicate code in stream-gears and synchronizes workspace version numbers.
2025-10-26 17:01:45 +08:00
ForgQi 3ad7c6ac0f Move tracing initialization to server entry point
Refactored tracing initialization from lib.rs to server.rs, ensuring logging setup occurs only when the server starts. Updated README and docker-compose.yml to reflect new server startup command and options for authentication.
2025-10-24 23:07:43 +08:00
ForgQi 3e76841206 Update README.md 2025-09-30 00:07:39 +08:00
ForgQi fb4dc2b50a Refactor server code and migrate modules to biliup-cli
Moved and refactored server-related modules from stream-gears to biliup-cli, including API endpoints, configuration, core logic, and infrastructure. Replaced usage of anyhow with error-stack and custom AppError/AppResult types throughout the codebase. Updated dependencies in Cargo.toml and Cargo.lock, and adjusted code to use new error handling and module paths. Removed obsolete modules and files from stream-gears, and updated README and workspace version.
2025-09-21 16:29:33 +08:00
ForgQi 2f309ba8a0 Add PUT /v1/configuration endpoint for config updates
Introduces a new put_configuration handler to allow updating configuration via the /v1/configuration endpoint. Updates the router to support PUT requests, modifies the README to improve image rendering, and bumps the workspace version to 1.1.3.
2025-09-20 23:10:36 +08:00
ForgQi a5faefb533 Add QR code login and user management endpoints
Introduces endpoints for QR code-based login and user management in the stream-gears server. Adds support for creating, deleting, and listing users, as well as endpoints for QR code generation and login via QR code. Refactors configuration management to use a global LazyLock, updates model serialization for streamer hooks, and improves context and service registration to support stateless clients. Also updates the frontend to handle new user and QR code flows, and adds an image resource for donation display in the README.
2025-09-20 21:43:51 +08:00
ForgQi 448d26eb92 Bump stream-gears to v1.0.7 and update install docs
Updated stream-gears crate version to 1.0.7 in Cargo.toml and Cargo.lock. Revised README to use 'uv' for installation and updated backend dependency installation instructions to use 'maturin dev'.
2025-08-14 01:47:39 +08:00
ForgQi a03e270a89 Bump stream-gears to version 1.0.6 and update README image URL
Updated stream-gears crate version from 1.0.5 to 1.0.6 in Cargo.toml and Cargo.lock. Also changed the image URL in README.md from docs.biliup.me to docs.biliup.rs.
2025-08-09 14:14:12 +08:00
Heporis 3537a6bde7 更改Termux的wheel发布至Release (#1371)
增加Termux使用教程链接
由于PyPI不支持Termux的platform tag,改为发布至Release
2025-07-26 09:58:39 +08:00
ForgQi 0eeb35918f Update README and remove quickjs dependency
Added a forum link to the README for user reference. Removed the 'quickjs' package from the dependencies in pyproject.toml, likely because it is no longer required.
2025-07-25 00:15:35 +08:00
Heporis fd776a8207 为aarch64架构termux平台自动构建 (#1369)
* Update pyproject.toml

添加quickjs作为斗鱼平台js解释器

* Update ci.yml

增加aarch64架构termux平台自动构建

* Update README.md
2025-07-24 02:32:03 +00:00
某摆烂咸鱼 bd69b76124 feat: 新增上传重试次数限制和上传结果webhook通知 (#1355)
* feat: 新增重试上传次数限制

* feat: 新增上传后WebHook设置选项

* feat: 新增上传webhook逻辑

* mod: 将功能配置移至直播配置中的更多设置

* mod: 修改webhook传输的信息

* mod: 修正错误的数据类型

Refactor webhook upload logic and update build configs

Replaces the 'uploaded_webhook' field with a 'webhook' postprocessor in the upload workflow, updating both backend and frontend to support this change. Updates the Tauri app to use the correct resource path for the sidecar binary, adjusts process management, and modifies build and workflow scripts for improved compatibility. Also bumps the 'stream-gears' crate version to 1.0.1 and adds '_internal' to .gitignore.

Update pyinstaller-publish.yml

Fix pyinstaller copy metadata (#1357)

* Update tauri.conf.json

* Update biliup.spec

Update pyinstaller-publish.yml

feat: 新增上传重试次数限制和上传结果webhook通知 (#1355)

* feat: 新增重试上传次数限制

* feat: 新增上传后WebHook设置选项

* feat: 新增上传webhook逻辑

* mod: 将功能配置移至直播配置中的更多设置

* mod: 修改webhook传输的信息

* mod: 修正错误的数据类型

Refactor webhook upload logic and update build configs

Replaces the 'uploaded_webhook' field with a 'webhook' postprocessor in the upload workflow, updating both backend and frontend to support this change. Updates the Tauri app to use the correct resource path for the sidecar binary, adjusts process management, and modifies build and workflow scripts for improved compatibility. Also bumps the 'stream-gears' crate version to 1.0.1 and adds '_internal' to .gitignore.
2025-07-22 02:02:23 +08:00
Gweesin Chan 4769d1d7c1 docs: 修复开发环境缺失步骤 (#1262) 2025-04-25 01:58:53 +00:00
ava anwan 5d1efb64f6 Update README.md (#1205)
* Update README.md

* Update README.md
2025-03-30 11:23:14 +00:00
ava anwanandForgQi 193f8a231f logo readme up (#1164)
* logo readme up

* Update __init__.py

---------

Co-authored-by: ForgQi <34411314+ForgQi@users.noreply.github.com>
2025-03-11 06:48:08 +00:00
ava anwan 3b246974ec README changelog Update (#1153)
* README U

* Update README.md
2025-02-06 12:02:57 +00:00
安晚 2ea43f579c Update README.md Docker (#1080) 2024-10-26 08:31:37 +00:00
ForgQi a27344dc28 Bumping version 2024-08-01 00:21:15 +08:00
XuanRan_Nyan d4e5fe3140 update Readme (#992) 2024-07-10 10:52:16 +00:00
安晚 c07443afff Add (#976) 2024-06-27 08:19:18 +00:00
XuanRan_Nyan 1ad6522cb5 feat(download): Support hls for huya, douyin (#958)
* feat(download): Support hls for huya, douyin

* update webui

* add global filename_prefix

* update webui

* fix errors

* Update variable names

* update
2024-06-19 15:33:39 +00:00
ForgQi 31e830b5b0 Bumping version 2024-06-02 21:42:02 +08:00
ForgQi cd353f609d update README.md 2024-06-02 21:33:07 +08:00
vionsn 03ae908832 适配白色背景 (#931) 2024-05-18 09:41:38 +00:00
vionsn cca390c7c7 Update README.md (#930) 2024-05-18 08:22:01 +00:00
ikun1993 eb11a96d34 Update README.md (#926)
更新链接  新链接带视频  图文原来的
2024-05-11 14:06:43 +00:00
vionsn 1593968e66 Update README.md (#899)
* Update README.md

* Update README.md
2024-04-25 15:57:07 +00:00
vionsn c84fc355f2 优化排版/链接 (#891)
* 优化排版/链接

* Update README.md
2024-04-23 16:24:45 +00:00
vionsn 69a0ff85d4 小小美化一下 (#888)
* Update README.md

* Update README.md

* Update README.md
2024-04-22 11:51:33 +00:00
Kataick 524af08bd3 remove some shields (#886) 2024-04-21 08:40:36 +00:00