• v1.7.1 929a780e8c

    serrebi released this 2026-07-29 17:03:09 -07:00 | 1 commits to main since this release

    A settings file that cannot be written no longer costs you the tool update it was trying
    to record.

    Tool updates survive a read-only settings file. When RequestCast installs or updates
    yt-dlp or Deno, it writes down where the new copy landed. If the settings file cannot be
    written — a service confined to a few writable paths, a portable copy on read-only media —
    that write failed loudly enough to take the update with it: the background updater thread
    died the first time it succeeded at anything, so yt-dlp was never checked again for as long
    as the program stayed running, and the "check for updates now" button returned an error
    after having updated the tools. Installing a missing tool mid-download failed the same way,
    reporting that the tool could not be installed when it just had been.

    The tool is installed either way, and RequestCast looks in its own tools folder before
    PATH, so an unwritable settings file now costs nothing but the note of where the tool went.

    Downloads
  • v1.7.0 4a83233c8d

    serrebi released this 2026-07-29 15:30:18 -07:00 | 3 commits to main since this release

    Searches bring back much more, refused downloads recover on their own, and the download
    tools install and update themselves.

    Deno is installed automatically, and YouTube works again. YouTube now answers with
    JavaScript challenges yt-dlp cannot solve by itself; it hands them to an external
    JavaScript runtime, and enables Deno by default. Without one, YouTube downloads lose the
    better formats and fail with 403 errors no amount of retrying clears. RequestCast now
    treats Deno as a required tool: it is fetched into the tools folder alongside yt-dlp and
    ffmpeg, kept current, and passed to yt-dlp explicitly, since our copy is not on PATH. A
    403 with no Deno present now says so instead of blaming rate limiting.

    The download tools set themselves up. yt-dlp, ffmpeg, and Deno are installed in the
    background as soon as RequestCast is configured — nobody has to find a button first — and
    a download that arrives before they are ready waits for the install rather than failing.

    yt-dlp and musicdl keep themselves up to date. Both stop working as the sites they
    read change, and an out-of-date yt-dlp is the most common cause of downloads that fail
    while the same track plays fine in a browser. RequestCast checks daily by default and
    installs what is newer. The interval is configurable, automatic updating can be turned
    off, and Preferences has a "check for updates now" button that reports what each tool did.

    Searches pull in much more. Result counts were fixed at 25 from YouTube and 12 per
    type from Deezer. The number is now a setting, defaulting to 50 per source and per result
    type, and every search page has a "results per source" control, so one search can ask for
    200 without changing anything permanently. Deezer results are paged rather than truncated
    at the API's 100-row ceiling. musicdl can also join searches now — its platforms carry
    plenty that YouTube and Deezer do not — either always, or per search from the source list.

    Failed downloads have real retry settings. Bulk runs — a channel, a discography, a
    playlist import — get refused in batches with 403 or "video unavailable" even though the
    same tracks download fine later. That is rate limiting, and there was no way to tune it.
    Now there is:

    • Extra attempts per track, each asking YouTube as a different client, which is what
      usually clears a 403 outright.
    • A gap between tracks, which is the most effective way to avoid being rate limited to
      begin with.
    • A cooldown after several refusals in a row, and again before a final pass over
      everything that failed, so a batch that was refused is retried once the site has settled
      instead of being written off.
    • A requeue limit for a whole download that fails outright.
    • A "try this download again" button on every finished download. Tracks already in the
      library are recognised and skipped, so a retry only fetches what is missing.

    Failures are also explained now: a bare HTTP Error 403: Forbidden in the history says
    what it means and what to change.

    Downloads
  • v1.6.1 da5c563e30

    serrebi released this 2026-07-28 17:42:33 -07:00 | 9 commits to main since this release

    Two fixes for the musicdl integration from 1.6.0.

    Single-track pages now work on every musicdl platform. Pasting a bare track URL —
    soundcloud.com/artist/song, not just a playlist or set — used to fail with "That URL
    did not produce any tracks musicdl recognizes", because musicdl's URL parser only
    understands collections. RequestCast now reads the page for an artist and title and
    resolves the track by searching that platform's own musicdl client. Tracks whose
    streams cannot be stored up front (HLS streams, short-lived URLs) are re-resolved the
    same way when the download runs instead of being dropped.

    musicdl no longer fails on hardened Linux services. A service running with a
    read-only home directory (systemd ProtectSystem=strict) got
    [Errno 30] Read-only file system on any musicdl lookup, because musicdl creates its
    log directory under the account's home. RequestCast now points the XDG directories
    musicdl uses at its own state directory; XDG values you set yourself still win.

    Downloads
  • v1.6.0 e01d92c79d

    serrebi released this 2026-07-28 17:04:34 -07:00 | 13 commits to main since this release

    musicdl joins the download chain, and its platforms' URLs now work.

    A second fallback before YouTube. When Deezer cannot supply a track — or no Deezer
    ARL is configured — RequestCast now asks musicdl
    before resorting to YouTube: it searches the configured platforms for a clean
    artist/title match and downloads the best result. YouTube via yt-dlp remains the last
    resort, so nothing that worked before is lost. The fallback is on by default; turn it
    off in Settings or with REQUESTCAST_MUSICDL_ENABLED=0, and choose which platforms it
    searches with REQUESTCAST_MUSICDL_SOURCES (the default is musicdl's own reliable
    five: Migu, NetEase, QQ, Kuwo, and Qianqian).

    URLs from twenty more platforms. Paste a track or playlist URL from NetEase,
    QQ Music, Kugou, Kuwo, Migu, Qianqian, Spotify, SoundCloud, TIDAL, Qobuz, Apple Music,
    JOOX, JioSaavn, Jamendo, Soda, StreetVoice, FMA, Suno, MOOV, 5SING, Bodian, or Bilibili
    and RequestCast downloads it through musicdl directly — same tagging, same quality
    checks, same destination as everything else. The same URLs work inside uploaded TXT,
    XLSX, PDF, and playlist files.

    Downloaded files keep the same treatment. However the audio arrives, it is tagged
    with the track's metadata, verified with ffprobe, and made readable by every account
    on the machine before it lands in the download folder or the AzuraCast library.

    Note: musicdl is licensed for non-commercial use; see its repository for the terms.

    Downloads
  • v1.5.0 d224b57547

    serrebi released this 2026-07-27 14:39:24 -07:00 | 20 commits to main since this release

    Whole-library lists now fit. The upload limits were far too small.

    250,000 entries per file, up from 10,000. Plenty of people keep lists longer than ten
    thousand rows, and there was no good reason for the old ceiling — indexing was never the
    slow part. On an ordinary machine, 250,000 rows takes about a second to index from a TXT
    file and about eleven seconds from an XLSX workbook, and a PDF page costs roughly three
    milliseconds. The new limits are set by what that work actually costs.

    Bigger files are accepted. Uploads may now be 64 MB rather than 16 MB, PDFs may run to
    5,000 pages rather than 500, and an import may resolve up to 250,000 tracks rather than
    25,000. A file past the ceiling is still refused, and now fails as soon as it goes over
    instead of being read into memory in full first.

    The main page stays fast. A large import stores every indexed entry with its job, so
    listing recent downloads no longer reads those payloads back — it reads only the few
    columns it shows. Without that, drawing the home page after a few whole-library imports
    would have meant loading hundreds of megabytes.

    If you run RequestCast behind nginx, raise client_max_body_size to 64m and keep a
    generous proxy_read_timeout, since indexing happens inside the upload request.

    Downloads
  • v1.4.0 444ce39d74

    serrebi released this 2026-07-27 14:27:29 -07:00 | 22 commits to main since this release

    Uses your own default browser, stops wasting disk space, and lets you choose what to download.

    Your default browser, and no browser downloads. Earlier builds launched a separate
    Chromium window against a private user-data directory, which copied a whole Microsoft Edge
    profile — frequently hundreds of megabytes — into RequestCast's own folder. That is gone.
    RequestCast now hands the address to Windows, and whichever browser you have set as your
    default opens it. On startup it also deletes any browser profile folder an older version
    left behind, so the space comes back.

    Diagnostics are off by default. The full support bundle used to write a request log and
    collect tens of megabytes of Windows networking evidence every time the program started. It
    is now a preference, off unless you turn it on: tick it under Preferences, start with
    RequestCast.exe --diagnostics, or set REQUESTCAST_DIAGNOSTICS=1. --diagnose still
    collects one bundle on demand when someone asks you for it.

    Downloads are readable by everyone. Finished files kept the private permissions of the
    temporary folder they were built in, so they had to be fixed by hand every time. RequestCast
    now resets each finished file, and the download folder itself, to be readable by every
    account on the machine.

    Clear your download history. Clear finished downloads, or the whole history, from the
    main page, and remove a single entry from its status page. Downloads still in progress are
    kept, and no music files are ever deleted.

    Pick what you want from an artist or channel. Enter an artist, or paste a YouTube
    channel, and open it to see its releases, albums, singles, songs, and videos. Take all of it
    with one button, or tick only the parts you want.

    Upload the playlists you already have. M3U, M3U8, PLS, XSPF, WPL, ASX, CUE, and
    foobar2000 FPL are read alongside TXT, XLSX, and PDF lists. RequestCast reads the artist and
    title each playlist names and fetches those tracks, so the original files do not need to be
    present on this machine.

    Downloads
  • v1.3.12 3d87ccba78

    serrebi released this 2026-07-26 18:07:37 -07:00 | 28 commits to main since this release

    Fixes RequestCast on Windows 11 where localhost connections received HTTP headers but the page body never arrived. The root cause was Werkzeug's post-response request-socket drain blocking on an empty-but-readably-reported loopback socket. RequestCast now bypasses that drain entirely: the custom request handler writes the complete HTTP/1.0 response in a single socket.sendall() call, immediately shuts down the write side, and closes the connection. Responses remain fully buffered with exact Content-Length and Connection: close.

    Downloads
  • v1.3.11 02ce51a2b8

    serrebi released this 2026-07-26 17:03:03 -07:00 | 30 commits to main since this release

    Fixes Windows clients receiving RequestCast status codes but waiting forever for the response to finish. RequestCast now fully buffers each local response, removes chunked transfer encoding, calculates an exact Content-Length, sends it as HTTP/1.0, and forces Connection: close. This avoids persistent-loopback and response-framing problems caused by Windows network filters. The packaged executable test now rejects the release unless /setup is received completely with HTTP/1.0, the exact byte length, no Transfer-Encoding header, and a closed connection.

    Downloads
  • v1.3.9 cc5004be55

    serrebi released this 2026-07-26 16:32:46 -07:00 | 34 commits to main since this release

    Replaces Waitress with Werkzeug's threaded WSGI server on Windows 11. A second diagnostic bundle confirmed that RequestCast 1.3.8 used send_bytes=1 but clients still timed out while reading even the 16-byte health response. The new backend avoids the Waitress socket path entirely. RequestCast now also detects any process already holding its port before starting, so diagnostic mode cannot create a second server on port 8797. The packaged Windows build must still download the complete setup page before release.

    Downloads
  • v1.3.8 76934e3527

    serrebi released this 2026-07-26 16:14:28 -07:00 | 36 commits to main since this release

    Fixes the web interface hanging after RequestCast returned HTTP 200. The diagnostics showed that curl.exe and PowerShell reached /setup but timed out with zero body bytes while Waitress reported that Flask had generated the complete 4 KB page. RequestCast had overridden Waitress send_bytes to 18,000, causing small responses to remain buffered. This release restores immediate one-byte flushing and adds a packaged end-to-end test that starts RequestCast and must download the complete setup page before a Windows release can be published.

    Downloads