Repository navigation
Releases
Releases · spaulll/AriaFlow
v0.11.3
Changed
- Version is now baked into the source (
internal/version, default
v0.11.3, bumped on each release). Docker builds report the correct
version with zero configuration — theVERSIONbuild-arg /
ARIAFLOW_VERSIONenv is now an optional override instead of a
requirement. /startversion line can also append the short VCS commit when available
(local/git builds).
v0.11.2
Added
- Bot version in the
/startwelcome message — shows the build version
(injected via-ldflags "-X ariaflow/internal/version.Version=…"),
host uptime, storage free/total, and aria2 active/stopped counts. Docker
builds acceptVERSIONbuild-arg (compose:ARIAFLOW_VERSION).
v0.11.1
Added
- Recovery for interrupted Telegram-forwarded downloads. If the bot dies
after the local Bot API server finished fetching a forwarded file but
before it was staged/organized, startup recovery now finishes it: it
matches leftover server temp files to the task by exact expected size
(persisted at registration time) and a stable age of ≥2 minutes, then
stages + organizes them. Partial or size-unknown downloads are never
touched.
Fixed
- Blank line between GID and the system footer in yt-dlp live messages —
the CPU/DISK/RAM + DL/UL footer now sits one empty line below the task
block, exactly like the aria2 task list.
v0.11.0
Changed
- Unified live download message structure. Telegram-forwarded files and
yt-dlp downloads now render the exact same progress frame as normal direct
URLs in the aria2 task list:
Filename→ progress bar + percent →Downloaded→Speed→ETA→
GID, followed by the CPU/DISK/RAM + DL/UL system line.- Telegram-forwarded files (local engine) use the frame in the "Downloading"
view, including the system footer when no aria2 tasks are shown. - yt-dlp live messages now use the same frame (previously a free-form
"⬇️ Downloading / bar / URL" block), rendered with Markdown like the
aria2 list, with the source URL as the Filename and the task GID shown. - Processing stage shows the same envelope with a Status line.
- Telegram-forwarded files (local engine) use the frame in the "Downloading"
- System-info footer is cached for 5 s (
cpu.Percentsamples for 1 s;
recomputing every tick would stall progress updates).
v0.10.0
Fixed
- Magnet
.torrentmetadata files are now cleaned up reliably. aria2
writes<infohash>.torrentinto the download folder
(--bt-save-metadata); cleanup previously depended on the in-memory task
record surviving, so after a restart the file lingered forever even with
keepTorrent=false. Cleanup now falls back to aria2's owninfoHash, and
startup recovery sweeps orphaned<infohash>.torrentfiles for completed
downloads. - Task store is now actually persisted (
tasks.json) —persist()was
a no-op, so ownership, links and download history vanished on every
restart. Tasks now survive restarts (atomic temp+rename writes). monitorcan no longer panic the bot —GetDiskPercentdereferenced
a nildisk.Usageresult (e.g. USB/NAS mount hiccup) and
GetCpuPercentindexed an empty slice; both now return 0 safely.TMAllowDownloadsmap race fixed — the torrent file-selection map was
written from the Telegram handler and read from thetestTMStop
goroutine without a lock; Go maps are not concurrent-safe and could fatal
with "concurrent map read and map write". Now mutex-guarded.- Websocket RPC write errors are surfaced — a failed
WriteJSONnow
triggers the reconnect loop instead of silently waiting out timeouts. - Removed dead
tool/controllercode — legacyCopyFiles/RemoveFiles
(panic-on-error, weak path guard) were referenced by nothing. runOrganizeDualdeletes its "Download completed" messages when
organizing is disabled instead of leaving them in the chat.- Vet-clean RPC client —
Callvalue receivers containingsync.Once
flaggedcopylocks; switched to pointer receivers.
v0.9.0
Fixed
- Bot no longer crashes on transient aria2 RPC timeouts — the 5-second
live progress poll used topanicon any RPC error (e.g. aria2 busy
finalising a large file on a slow disk), killing the whole bot. RPC/data
errors are now logged and the view degrades gracefully instead. - Crash-recovery now covers all completed downloads, not just archives —
if the bot dies after a download completes but before the organize pipeline
moves it, the startup recovery re-runs the media pipeline for every
completed aria2 task whose files are still in the download folder (torrent
folders included), with a 7-day recency guard so old intentional leftovers
are never touched. - BitTorrent completion now triggers the organize pipeline — previously
onlyonDownloadCompletedid, so a torrent that finished and stopped
seeding (e.g.seed-time=0) would silently stay in the download folder. - Deduplicated organize runs —
onDownloadComplete/onBtDownloadComplete
and startup recovery can no longer process the same download twice. - Release-group folder naming follows the media pipeline — movie release
directories with site/group prefixes (www.Site.org - Title ...) now land
inMovies/Title (Year)/Title (Year).extderived from the video file,
instead of polluting the folder name with the prefix. - Log rendering of fatal errors fixed —
%wis not supported by zap;
panics now log a readable message instead of%!w(....). - Torrent upload failures are non-fatal — a failed fetch of an uploaded
.torrentfile logs and skips instead of killing the process.
v0.8.0
Added
- Jellyfin/Plex library refresh — after organizing a download into a
media-library category (movies/series/anime/music), the bot can now
optionally trigger an on-demand rescan on Jellyfin and/or Plex so the new
content appears immediately instead of waiting for the periodic scan. Both
targets run concurrently with a short timeout; the outcome (success or
failure) is shown on the final "All done!" summary. Configure via
organize.refreshJellyfin/jellyfinUrl/jellyfinApiKeyand
organize.refreshPlex/plexUrl/plexToken(env:REFRESH_JELLYFIN,
JELLYFIN_*,REFRESH_PLEX,PLEX_*).
v0.7.0
Added
- Docker Compose deployment — now the recommended path. A
docker-compose.ymlplusdocker/stack runs the bot, anaria2c
daemon, and an optional local Bot API server as containers sharing one
media volume; no manual binary or dependency installation. - Project renamed to AriaFlow: the Go module, binary, and release
artifacts are nowariaflow(ariaflow-linux-amd64/-arm64), and the
GitHub repository moved tospaulll/AriaFlow. - Docker image bundles the full runtime toolset, including
unrar(non-free)
alongside yt-dlp, ffmpeg/ffprobe, 7z and unzip.
Changed
- README restructured to lead with the Docker quick start; the prebuilt-binary
path is documented as the alternative. - Containerized build no longer silently drops
unrar(non-free repo enabled).
v0.6.1
Fixed
- Percent-encoded filenames (e.g.
%20for spaces) are URL-decoded before
media routing: previously the trailing20of an encoded space could glue
to thex264/x265codec tag, faking an episode marker and mis-sorting a
movie intoSeries/.../Season 20. Codec tags never count as episode
markers now, and cleaned movie names carry no percent-escapes.
v0.6.0
Added
- Disk guard: links whose size is known via HEAD are refused up front
with⚠️ Not enough disk spacewhen they provably don't fit the download
filesystem. Unknown sizes (magnets, torrents) always allowed. - Orphan sweeper: startup + hourly scan of the download folder deletes
stale*.aria2debris and their partials (no referencing task, older than
30 min). Directories, lone data files, and anything live are never touched. - Duplicate guard: warns before re-downloading — same link already active,
or normalized show+season / episode / movie already in the library — with
override buttons (never blocks: quality upgrades are legit). Opaque links
(e.g. googleusercontent) are re-checked once the real filename arrives;
on a hit the download pauses and asks to keep or stop+delete.