Repository navigation
v0.7.3
·
1281 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Install
Arroxy's website has a new address: https://arroxy.com/. The About, Share and update "Download" links open it.
Highlights
- 19 new languages. Arroxy now speaks Basque, Bulgarian, Catalan, Croatian, Czech, Danish, Dutch, Estonian, Finnish, Galician, Hebrew, Hungarian, Latvian, Lithuanian, Norwegian, Romanian, Slovak, Slovenian and Swedish, and opens in them on first launch when your system uses them. The feedback form is translated into each of them too.
- Paste button. The empty URL field has a Paste button that puts in the link you copied, even one Arroxy already filled in earlier. Several copied links open Bulk URLs.
- More filename tokens. Name files and folders after
{year},{site},{categories},{artist},{album}and{track}, for example{artist}/{album}/{track} [{id}].
Fixes
- A download folder named like
$HOMEor%USERPROFILE%, or ending in a space, now gets the files, instead of a folder elsewhere with the name expanded. - Playlist subtitles, and subtitles from sites other than YouTube, are the exact tracks you asked for, never a machine translation. A subtitles-only download is named after its video.
- With Explore's ad blocker on, YouTube results and grids show view counts and upload dates again.
- Signing in to Facebook, Instagram or Threads in Explore works with the ad blocker on, instead of returning to the login page or stopping at a security check.
- The feedback form opens in full over Explore, instead of being hidden behind the page.
- File and folder names keep
$,%and~as in the title, instead of look-alike characters. - On first launch, Arroxy opens in your system language even when it is Khmer, Burmese, Uzbek, Pashto or Oromo, instead of English. If you prefer a language Arroxy lacks, it takes the next one in your system's list.
- When a video no longer offers the format you picked, Arroxy says so and asks you to pick again, instead of calling the video private, deleted or region-locked.
- Your own yt-dlp settings no longer change Arroxy's downloads: a yt-dlp config file or plugin you set up for yt-dlp on its own, or a
yt-dlp.confleft in your download folder, is now ignored. - Videos added several links at a time keep more of a long title in their file name. A long-titled playlist video from Vimeo no longer fails with "File name too long".
- Embedded subtitles carry their track's name, such as "English (United Kingdom)", so players list them by name rather than by a bare language code.
- A subtitles-only download whose video has none of the chosen languages now fails and names them, instead of finishing with nothing saved. A video download says which subtitle languages the video lacks.
- The URL tab's hints, profile summary and save location show in your language instead of English.
- A profile that saves video without audio as MP4 or MKV can embed the thumbnail as cover art.
- A video-only download that could not have its sound removed now says so in the queue instead of finishing as a plain success.
- YouTube show links (
youtube.com/show/…) download as the playlist they are, with its real name and every video, and Explore offers to download them. - The file name on the Review step now has the same token buttons, preview and error messages as profiles, and Download waits until the name is valid.
- The subtitle picker names every language in the app's language, so uploaded subtitles and automatic captions no longer mix English and translated names.
- Cancelling a download on Windows now stops it right away instead of letting it finish in the background.
- The audio language list names every language in the app's language and marks the original track, instead of showing YouTube's English labels or bare language codes.
- Explore no longer shows a stale or blank page after unloading while you were away or when a page closes itself.
- The subtitle language picker in playlists and download profiles starts every language name with a capital letter, as the subtitle list does.
- Cancelling a download on macOS and Linux no longer leaves a large temporary folder behind.
- A link with a comma or semicolon in it is no longer cut short when copied, pasted or added in Bulk URLs, and Bulk URLs skips links that aren't valid.
- The QuickTime warning for VP9 or AV1 in an MP4 now shows only on a Mac, and the AV1 one no longer shows on Macs that play AV1.
- Built-in download profiles show their names in the app's language, including ones you edited without renaming them.
- Tooltips no longer get in the way: they close as soon as the pointer leaves what they describe, never catch the pointer or select their text, and match the light or dark theme instead of showing white in dark mode.
- Lists of languages and extras read naturally in every language ("English and German"), "1 item" is no longer "1 items", and the playlist limit dialog is translated.
- A new download profile starts with an empty name and asks for subtitles in the app's language, and a profile whose folder isn't set explains the problem in the app's language.
- Profile lists show just the names; hover a profile to see what it does, in your language. Downloads list a profile's format in your language too.
- On a link to a video inside a playlist, the dialog now starts on just that video, names the kind of list (album, uploads, Watch later and more), and keeps the number of videos you chose when you retry.
- Download kind labels read the same everywhere in each language, and the playlist quality options sit under a "Quality" heading.
- Saving a codec, HDR or audio choice back to a profile is offered as an update, and a profile's hint and download rows name those settings when the profile overrides them.
- When a profile can't be saved, from the Format step, the Profiles tab or a playlist, the editor stays open with your changes and says so, and nothing switches to the unsaved profile.
- Clicking Save profile twice in quick succession no longer creates the same profile twice.
- Saving a download's edited settings as a profile no longer reports success when the settings couldn't be written, and works when the profile it started from has a long name.
- A link sent to Downloads keeps the profile and folder it was added with, even if the window reloads or Arroxy restarts before it is ready.
- The global hotkey's follow-up notification still arrives if the window reloads while the link is being prepared.
What's Changed
- feat(heartbeat): log each sent heartbeat with its day and install age by @antonio-orionus in #406
- chore(screenshots): take README shots in any locale, six at a time by @antonio-orionus in #407
- fix(i18n): translate the URL tab's hints, profile summary and destination line by @antonio-orionus in #408
- fix(i18n): translate the profile editor's destination badges, notes and errors by @antonio-orionus in #410
- fix(i18n): pick the first-launch language from the OS's preferred languages by @antonio-orionus in #409
- refactor(download): drop VideoPhase's unused in-run subtitle embed path by @antonio-orionus in #411
- fix(queue): name placeholder rows from the info-json title, not the filename by @antonio-orionus in #412
- fix(profiles): embed the thumbnail into video without audio by container by @antonio-orionus in #413
- fix(startup): close the previous release only after its warmup settles by @antonio-orionus in #415
- test(download): pause held-mint jobs once the mint starts, not after a 20 ms sleep by @antonio-orionus in #418
- fix(download): tell the user when a video-only download kept its sound by @antonio-orionus in #416
- fix(subtitles): embed each track's name as its title, as yt-dlp does by @antonio-orionus in #414
- fix(bridge): escape % in caller directories that reach -o by @antonio-orionus in #419
- fix(formats): name tracks by language, show the copy yt-dlp takes by @antonio-orionus in #417
- fix(renderer): keep keys pressed while a keyboard drag is still picking up by @antonio-orionus in #420
- test(e2e): pin the Explore page the quick-download test stands in for by @antonio-orionus in #421
- build(check): run the filename parity oracle in the gate by @antonio-orionus in #422
- refactor(bridge): compose every path flag in one output-target module by @antonio-orionus in #423
- refactor(subtitles): plan subtitle tracks once, in shared by @antonio-orionus in #424
- fix(main): ignore the user's yt-dlp config files and plugins by @antonio-orionus in #425
- refactor(subtitles): a job carries a subtitle request, planned once at run time by @antonio-orionus in #426
- feat(ytdlp-errors): classify no subtitles in the requested languages by @antonio-orionus in #427
- refactor(main): spawn yt-dlp in the folder its plan names by @antonio-orionus in #428
- fix(links): open the website at arroxy.com; keep feedback uploads on orionus.dev by @antonio-orionus in #429
- feat(review): fall back to a second-pass reviewer when Codex is unavailable by @antonio-orionus in #430
- fix: restore #426, #427 and the README links that #430's squash reverted by @antonio-orionus in #433
- fix(subtitles): say which subtitle languages a video lacks, and fail a subtitles-only job with none by @antonio-orionus in #431
- feat(i18n): add 19 languages, Hebrew right to left by @antonio-orionus in #432
- fix(i18n): translate #431's subtitle strings into the 19 languages from #432 by @antonio-orionus in #436
- fix(tooling): refuse a push that undoes main's work or is not the reviewed change by @antonio-orionus in #437
- feat(bridge): run every yt-dlp plan inside its output folder by @antonio-orionus in #434
- docs(readme): move locale READMEs from the root into docs/readme by @antonio-orionus in #439
- feat(feedback): open each language's own Tally form, with no English fallback by @antonio-orionus in #438
- release(packages): ytdlp-errors 1.4.0 by @antonio-orionus in #435
- fix(download): keep $, % and ~ in names, and a folder's trailing space by @antonio-orionus in #441
- feat(bridge): plan caller subtitles from tracks, and list a video's subtitles by @antonio-orionus in #440
- fix(subtitles): list a video's subtitles when no info-json has them, and fetch exactly the planned tracks by @antonio-orionus in #442
- release(packages): yt-dlp-bridge 0.6.0 by @antonio-orionus in #444
- fix(profiles): keep an auto-only profile's caption when saving it under a shared key by @antonio-orionus in #443
- feat(ytdlp-errors): tell a requested format that matched nothing from an unavailable video by @antonio-orionus in #445
- fix(queue): name missing subtitle languages beside a kept-sound or quality notice by @antonio-orionus in #447
- release(packages): ytdlp-errors 1.5.0 by @antonio-orionus in #448
- fix(selection): Smart TV takes H.264 first in the selector, not with -S vcodec:h264 by @antonio-orionus in #450
- fix(download): budget a playlist row's name from its probed formats by @antonio-orionus in #449
- fix(bridge): weigh progress by bitrate and fragments, and never move the bar back by @antonio-orionus in #446
- release(packages): yt-dlp-bridge 0.6.1 by @antonio-orionus in #452
- fix(intake): take YouTube show links as the playlist they are by @antonio-orionus in #453
- feat(readme): show each README the screenshots in its own language by @antonio-orionus in #454
- feat(menu): add a Language submenu to the macOS View menu by @antonio-orionus in #456
- fix(readme): rebase srcset images in translated READMEs by @antonio-orionus in #455
- feat(filename): add {year}, {site}, {categories}, {artist}, {album} and {track} tokens by @antonio-orionus in #451
- fix(dialog): wrap footer actions so long labels stay inside the dialog by @antonio-orionus in #457
- chore(github): collapse generated files in PR diffs and label PRs by path by @antonio-orionus in #458
- fix(queue): add filter chips for rows waiting on a choice or fetching details by @antonio-orionus in #459
- feat(queue): title the selection actions like the All items group by @antonio-orionus in #460
- fix(i18n): translate strings left in English or the wrong language by @antonio-orionus in #462
- ci(e2e): gate every tests/e2e spec, not only fixture-* by @antonio-orionus in #463
- fix(review): pin the reviewed commit and check the reviewed change by exact tree by @antonio-orionus in #464
- fix(subtitles): load the probe's info-json from a copy in the job's temp folder by @antonio-orionus in #461
- fix(i18n): fail the catalog check on English left in non-Latin-script locales by @antonio-orionus in #465
- ci(dev-smoke): cache the embedded ffmpeg payload across runs by @antonio-orionus in #466
- fix(review): run the Claude lanes with hooks off so they can read the diff by @antonio-orionus in #467
- fix(subtitles): a listing the disk refuses no longer hard-fails a saved video by @antonio-orionus in #468
- fix(explore): hide the page under the Tally feedback popup by @antonio-orionus in #470
- test(queue): wait for the escalated job to finalize before removing its folder by @antonio-orionus in #474
- fix(wizard): name no .mp4 for Audio mode audio whose codec only extraction finds by @antonio-orionus in #473
- chore(i18n): keep locale JSON sorted, one key per line by @antonio-orionus in #475
- fix(smoke): check playlist preset argv against the planned media intent by @antonio-orionus in #469
- fix(queue): measure virtual rows so taller rows stop the table jumping by @antonio-orionus in #476
- fix(explore): run no ad-blocker scriptlets on YouTube by @antonio-orionus in #477
- fix(bridge): keep in-folder path flags unexpanded and resolve caller paths by @antonio-orionus in #472
- release(packages): yt-dlp-bridge 0.6.2 by @antonio-orionus in #481
- feat(release): release flags for work meant for a later release by @antonio-orionus in #482
- fix(filenames): budget the name as it will be written by @antonio-orionus in #471
- fix(profiles): never save a profile whose filename template does not validate by @antonio-orionus in #479
- fix(explore): spare Meta's sign-in pages from the ad blocker by @antonio-orionus in #483
- ci(release): stop notifying the archived arroxy-web repo by @antonio-orionus in #486
- feat(release): tag the release commit once its checks pass; never cancel CI on main by @antonio-orionus in #480
- chore(review): give CodeRabbit the local review's scope and rules by @antonio-orionus in #487
- build(changelog): PRs add changelog fragments, the release assembles them by @antonio-orionus in #478
- feat(i18n): PRs change English only; translation completeness gates the release by @antonio-orionus in #484
- chore(review): state the security scope rule once, in review-learnings.md by @antonio-orionus in #488
- test(e2e): wait for the startup splash to leave before driving the app by @antonio-orionus in #489
- feat(review): edit the file name with the shared template field by @antonio-orionus in #485
- fix(quick-download): show the preparing dialog's progress on a calm inset panel by @antonio-orionus in #490
- fix(wizard): name every subtitle track in the UI language by @antonio-orionus in #491
- i18n: sync translations by @antonio-orionus in #492
- chore(release-flags): guard the flag lifecycle with tests by @antonio-orionus in #493
- ci(publish): fail the bridge publish while its ytdlp-errors pin is unpublished by @antonio-orionus in #494
- fix(download): kill the whole yt-dlp tree on cancel on Windows by @antonio-orionus in #500
- test(e2e): hold slow fixture media until the test releases it by @antonio-orionus in #497
- fix(release): let a failed release commit be redone, and drop the tag of a rejected push by @antonio-orionus in #499
- ci(main-health): open a "main is red" issue when a required check fails on main by @antonio-orionus in #498
- fix(wizard): name audio tracks in the UI language by @antonio-orionus in #495
- ci(pr-policy): check each PR's diff against the PR rules by @antonio-orionus in #496
- fix(release): refuse a stable tag with no release notes in CHANGELOG.md by @antonio-orionus in #501
- test(e2e): run the suite under xvfb on Linux, and stop waiting on the splash fade by @antonio-orionus in #505
- ci(pr-policy): only the package release PR writes a package's changelog by @antonio-orionus in #504
- test(download): await job completion instead of polling with a 1s deadline by @antonio-orionus in #508
- fix(explore): release an idle-unloaded view whose contents are already gone by @antonio-orionus in #502
- test(e2e): add ARROXY_E2E_OUTPUT_ROOT to move only the fixture download folder by @antonio-orionus in #510
- fix(release): publish the release notes from main's CHANGELOG.md by @antonio-orionus in #507
- fix(wizard): capitalize language names in the subtitle language picker by @antonio-orionus in #506
- fix(queue): join subtitle language lists with each language's separators by @antonio-orionus in #503
- fix(subtitles): join missing languages with "or" and the asked-for ones with "and" by @antonio-orionus in #512
- refactor(intake): move quick download's pure logic into src/shared by @antonio-orionus in #513
- fix(explore): release the view when its page's contents go away outside idle unload by @antonio-orionus in #511
- i18n: sync translations by @antonio-orionus in #514
- fix(download): stop yt-dlp with SIGTERM before SIGKILL on Unix by @antonio-orionus in #509
- feat(url): paste the copied link with a button, and keep commas and semicolons inside links by @antonio-orionus in #515
- fix(readme): translate the README intro and Last updated line by @antonio-orionus in #518
- fix(format): show the QuickTime MP4 warning only on a Mac that needs it by @antonio-orionus in #520
- feat(profiles): show built-in profile names in the app language by @antonio-orionus in #519
- feat(agents): load the maintainer's .internal/AGENTS.md in every agent tool by @antonio-orionus in #521
- i18n: sync translations by @antonio-orionus in #522
- feat(queue): report per-item outcomes from pauseAll and resumeAll by @antonio-orionus in #517
- fix(ui): tooltips let the pointer through and follow the theme by @antonio-orionus in #523
- refactor(i18n): one owner for each profile setting label by @antonio-orionus in #524
- fix(i18n): plural counts, native list separators, saves-as word order, cap dialog copy by @antonio-orionus in #525
- feat(arroxy-control): add the Control API v1 schema package by @antonio-orionus in #516
- fix(profiles): new-profile defaults and the missing-folder error in the app language by @antonio-orionus in #527
- ci(issues): flag maintainer issues that miss a kind label or a location by @antonio-orionus in #530
- feat(profiles): profile summaries in the app language, in a hint beside each profile by @antonio-orionus in #529
- feat(intake): ask only what on a video-in-a-list link, with the count kept on the row by @antonio-orionus in #526
- fix(i18n): one key per media kind label, and profile wording in two strings by @antonio-orionus in #558
- fix(profiles): an advanced-only edit counts as an update, and summaries name advanced overrides by @antonio-orionus in #559
- fix(profiles): five profile-save failures, as one batch by @antonio-orionus in #562
- chore(land): keep a commit per issue and merge-commit a batch PR by @antonio-orionus in #564
- feat(arroxy-mcp): add the MCP bridge and CLI for the Control API by @antonio-orionus in #563
- i18n: sync translations by @antonio-orionus in #568
- feat(intake): run link intake in main by @antonio-orionus in #528
- feat(intake): run the global hotkey's intake in main by @antonio-orionus in #572
- refactor(arroxy-control): name relative imports with their .js extension by @antonio-orionus in #576
- feat(link): arroxy:// links fill the URL field behind linkScheme by @antonio-orionus in #577
- chore(packages): keep arroxy-control and arroxy-mcp in the repo, unpublished by @antonio-orionus in #578
- i18n: sync translations by @antonio-orionus in #580
Full Changelog: v0.7.2...v0.7.3