Skip to content

add RTL/Arabic+Persian(new) support, gallery controls, backups, and download improvements - #115

Open
WasewaseX wants to merge 28 commits into
vanloctech:mainfrom
WasewaseX:round4-fixes
Open

add RTL/Arabic+Persian(new) support, gallery controls, backups, and download improvements#115
WasewaseX wants to merge 28 commits into
vanloctech:mainfrom
WasewaseX:round4-fixes

Conversation

@WasewaseX

Copy link
Copy Markdown

Hey man I was working on YouTube downloaders and, after a lot of searching, I came across your project. It was surprisingly close to the kind of project I had in mind, so I got interested in it and wanted to contribute instead of only using it.
I went through the project and noticed some bugs, missing features, and a few things I thought could be improved. I ended up fixing those and adding some features that I felt fit the project.
I’ve tried to keep the existing structure and behavior intact, while fixing the issues I found and adding the improvements.
I hope some of these changes are useful. This is my first contribution to the project, so I’d really appreciate any feedback or suggestions for changes. I also have some more Ideas to share but those are for later

WasewaseX and others added 28 commits August 27, 2026 15:24
…, drop dead legacy-key migration, register cancel_download_item
…ntent

- Batch processing invoked 'execute_ffmpeg_batch' which never existed in
  Rust, so every batch run failed silently at runtime. The ffmpeg job
  runner is now shared and a registered execute_ffmpeg_batch command
  derives the output path and job id server-side.
- The subtitle dialog's 'download_subtitle_content' invoke had no
  backend implementation; it now runs yt-dlp with the configured
  cookies/proxy and returns the subtitle file content.
Auto subtitle mode hardcoded --sub-langs all, discarding the user's
language selection (vanloctech#116). User-selected languages are
now passed through; 'all' remains the fallback when nothing is set.
External ingestion hardcoded mp4/mp3 and ignored the user's global
format choice such as MKV (vanloctech#117). resolveExternalFormat
keeps the user's format when valid for the media type and falls back to
the previous default otherwise.
reqwest Client::new() has no timeouts, so a dead connection could block
the getUpdates long-poll loop forever, making the bot appear broken
(vanloctech#118). All Telegram API calls now share a client with
explicit connect and total timeouts so the polling loop can back off
and recover.
Download failures like 'Unsupported URL' / 'no video formats' now map
to a dedicated 'unsupported' error class with a colored badge and an
action hint: update yt-dlp in Settings > Engines, or use the Gallery
tab for manga/image sites. Keys added for en and fa (authoritative
locales); others fall back to en.
- scripts/check-tauri-commands.mjs statically verifies that every
  frontend invoke() literal resolves to a command registered in
  invoke_handler! and that every #[tauri::command] is registered.
  This catches the cancel_download_item / execute_ffmpeg_batch class
  of bugs at CI time instead of at runtime.
- Dev builds now probe safe, read-only commands at startup and warn
  on failure (production bundles are unaffected).
- Wired into package.json (check:commands) and ci.yml.
- beta-release.yml builds installers for Windows (NSIS/MSI), macOS
  Apple Silicon + Intel (DMG) and Linux (deb/AppImage) on every v* tag
  push and attaches them to an automatically created BETA prerelease
  with SHA256SUMS, SmartScreen/Gatekeeper guidance and beta warnings.
- tauri.beta.conf.json disables updater artifacts so no signing key is
  required on this fork.
- build.yml keeps requiring signing secrets; its tag trigger is
  disabled in favor of beta-release.yml.
download_ffmpeg/download_deno renamed their target-path bindings to
_ffmpeg_path/_deno_path (to silence unused warnings on Windows) but the
unix chmod blocks still referenced the unprefixed names, breaking
Linux/macOS compilation. Bindings are now cfg-split per OS and the unix
blocks consistently use the unprefixed path.
stop_gallery_download can only set the stop flag when no PID is
registered yet; download_gallery then unconditionally cleared that
flag right after registering the PID, losing any stop request that
arrived between spawn() and registration. Clear stale flags before
spawn instead (mirrors download_video clearing CANCEL_ITEM_IDS), and
after registering the PID re-check the flag: kill the fresh child and
re-arm the flag so the run is reported as stopped, not failed.
invoke<string>(`rollback_${engine}`) was invisible to both the
quoted-literal regex and the +-concatenation exemption, so the whole
rollback_* family was uncovered. Extract the static prefix from
template-literal calls and require at least one registered command to
start with it; print the resolved family in the summary.
Keep the (beta) designation and the report-an-issue pointer, but stop
branding releases as untested; also attach the checkout with: block to
its step in the release job.
A redirect written inside a ${var:+word} alternative is not parsed as
a redirection — bash treats '>> RELEASE_BODY.md' as ordinary words, so
the changelog was echoed to the job log instead of being appended and
the 'What's in this beta' section shipped empty on v0.20.4-beta.2.
Use an explicit if + printf '%s\n' "$CHANGELOG" >> file.
Upstream hardcodes --force-overwrites on every download to avoid HTTP 416
from stale .part files. The flag also overwrites .part files, so stopping
a download and starting it again always restarted from zero, and a
finished file was fully re-downloaded when re-queued. yt-dlp resumes
.part files by default and recovers from HTTP 416 by restarting the
affected file itself, so drop the flag and keep yt-dlp's defaults.
YouTube serves auto-generated Farsi subtitles, but the picker list did
not include 'fa' (same list as upstream), so there was no way to select
it from the UI. The backend already passes any language code through to
--sub-langs.
Url::set_query percent-encodes the <redacted> marker into
%3Credacted%3E, so compose the masked URL manually to keep the readable
marker; credentials are still stripped. The non-allowlisted-flag test
used --output, which the blocklist rejects first with a different
message; use --write-subs, which falls through to the allowlist check.

These tests only run in the PR CI job (release builds do not run cargo
test), which is how they slipped past.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant