* feat(cli): locate ffmpeg via ffmpeg_path / host / PATH and start child processes without console windows
- New `tools` module in both crates. `tools::command()` starts external
programs with CREATE_NO_WINDOW on Windows; every ffmpeg, streamlink,
yt-dlp, ytarchive and hook shell process now goes through it.
- ffmpeg is looked up in this order: the new optional `ffmpeg_path`
setting, then `ServeOptions::ffmpeg` (for an ffmpeg shipped by the
embedding host), then `ffmpeg` on PATH. Unset keeps today's behaviour.
- `ffmpeg_path` is global (not overridable per streamer) and visible in
the redacted configuration.
* feat(api): GET /v1/tools reports ffmpeg availability, version and license
Read-only, allowed for every logged-in role. Returns whether the ffmpeg
that would be used runs, where it came from (config / bundled / path),
the first line of `ffmpeg -version` (cached per program; failures are
retried) and the license derived from its configure flags. Errors say
what to fix.
* feat(desktop): bundle ffmpeg in the Windows installer, same BtbN build as Docker
- desktop-publish.yml downloads the BtbN win64 GPL static zip of the tag
and version the Dockerfile pins (read by .github/scripts/ffmpeg-version.sh),
checks its SHA-256 and ships only ffmpeg.exe, LICENSE.txt and a README
with the source links as bundle resources (tauri.ffmpeg.conf.json),
installed under ffmpeg\.
- The shell passes resource_dir()/ffmpeg/ffmpeg.exe to ServeOptions::ffmpeg
when the file exists. The ffmpeg_path setting still wins; builds without
the overlay keep using PATH.
* ci(desktop): attach the FFmpeg corresponding source and download notes to releases
- New ffmpeg-source job: FFmpeg at the pinned commit, the BtbN build
scripts at the pinned tag, and the source of every library those
scripts build (fetched by their own download.sh at the commits pinned
in scripts.d/), plus a README and SHA256SUMS. Uploaded on release
events only; manual runs just list the files.
- On release events, append .github/desktop-release-notes.md to the
release body once: setup.exe is the recommended download, and how to
get past the browser warning and SmartScreen while it is unsigned.
* fix(cli): only use CREATE_NO_WINDOW when biliup has no console
`biliup server` in a Windows terminal keeps sharing its console with the
programs it starts, as before: Ctrl+C and their output still reach the
terminal. Only a process without a console window (the desktop app)
starts them with CREATE_NO_WINDOW. The choice is logged at startup and
covered by a Windows-only test that runs itself as a child with and
without a console.
* ci(desktop): link to the upstream FFmpeg source instead of uploading it to releases
Drop the ffmpeg-source job that packed about 2 GB of FFmpeg and dependency
source into every release. The installer's ffmpeg/README.txt and the release
notes now point to the FFmpeg commit and the BtbN/FFmpeg-Builds tree of the
bundled build (full commit hashes, resolved at build time), whose scripts.d/
pins the version and source URL of every library. The Docker image uses the
same BtbN tag, so the same links cover it.
* 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.
Refactored CLI argument parsing and main entrypoint in both Python and Rust, updated pyo3 and pythonize dependencies, and improved modularization in biliup-cli. Added an 'auth' flag to the server command, fixed several import and ownership issues, and improved plugin and server initialization logic. Also cleaned up unused imports and streamlined code for better maintainability.
Refactored the downloader callback mechanism to use a generic callback instead of direct channel messaging, simplifying the interface for all downloaders. Moved HookStep to its own module and implemented async post-processing hooks (run, move, remove) for video files after successful upload. Enabled login guard in the application controller and updated workspace and version metadata.
* 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.
Enhanced the GitHub Actions workflow for Windows builds, including dynamic sidecar binary handling and updated Node version specification. Upgraded stream-gears crate to version 1.0.0. Refactored Tauri app to improve sidecar process management, including encoding handling, process shutdown, and automatic startup/shutdown integration. Added readme field to pyproject.toml and redirected frontend to localhost in App.tsx.