sestudio
Download episodes from fstream — via CLI or a local web UI.
Casting from a phone
Casting, in general, need the receiving TV to have access to the network address of the sestudio server.
If you are outside of your network, and use tailscale to access to your server, you will need to set up a port forwarding from your phone on your incoming wlan connections to your server's tailscale address.
Then, you will have to connect on your phone browser to your your phone's local network address (that will be forwarded to your server).
By doing this, the TV will connect to your phone's local network address, and your phone will forward the stream to your server, making the cast work.
The server serves HTTPS by default (self-signed) on port 8443, which is what
Chromecast/AirPlay require — no Caddy or reverse proxy needed. The certificate is
self-signed, so trust it once on the casting device (see HTTPS built in below).
To sum this up, here are the steps to follow to have full casting functionality:
- Be connected to tailscale
- Having port
8443forwarded from your phone lan ip to the server's tailscale address - Connect to https://:8443 from your phone browser
The phone ip address can be easily found on Android by long pressing the wifi widget, and then clicking on "advanced info" icon next to the current wifi name.
Requirements
- uv — that's the only thing you install.
Everything else is bundled: uv provides Python, and yt-dlp plus a static
ffmpeg ship as dependencies (a system ffmpeg on PATH is preferred when
present, giving a real ffprobe and fuller codecs). Node 18+ is only needed to
rebuild the frontend during development.
Supported platforms
The wheel bundles a static ffmpeg, so it targets the platforms
imageio-ffmpeg ships wheels for:
| OS | Arch |
|---|---|
| Linux | x86_64, arm64 |
| macOS | arm64 |
| Windows | x86_64 |
Install / run
Run it directly, without installing (recommended):
uvx sestudio serve # web UI
uvx sestudio download <url> # CLI
Or set up a source checkout for development:
uv sync
Usage
CLI — download a season
# All episodes, VF (default)
uv run sestudio download <season-page-url>
# Specific episodes, VOSTFR, custom output folder
uv run sestudio download <url> -e 1,3,5-8 --lang vostfr -o ~/Videos
# Dry-run: resolve URLs without downloading
uv run sestudio download <url> --dry-run
| Option | Default | Description |
|---|---|---|
-e, --episodes |
all | Episodes to download, e.g. 1,3,5-8 |
--lang |
vf |
Language (vf or vostfr) |
-o, --output |
. |
Output directory |
-c, --concurrency |
20 |
Parallel downloads |
--provider |
uqload |
Stream provider |
--dry-run |
off | Print resolved URLs, don't download |
--no-resolve |
off | Skip live-domain auto-resolution |
-v, --verbose |
off | Debug logging |
Web UI
uv run sestudio serve
Opens at https://<host>:8443 — HTTPS with a self-signed cert by default (so Chromecast/AirPlay work; trust the cert once, see below). The server keeps running in the terminal — downloads continue in the background even if you close the browser tab. Stop it with Ctrl-C.
| Option | Default | Description |
|---|---|---|
--host |
0.0.0.0 |
Bind address (0.0.0.0 = reachable from other devices on your LAN) |
--port |
8443 |
HTTPS port |
--http-port |
8080 |
Plain-HTTP port served alongside HTTPS, for cast media (DLNA / Chromecast fetch media over HTTP) |
--no-https |
off | Serve plain HTTP only, on --port |
--no-resolve |
off | Skip live-domain auto-resolution |
The default
0.0.0.0binding makes the UI reachable from other devices on your network — needed for casting. There is no authentication, so run it only on a trusted home network. Pass--host 127.0.0.1to restrict it to the local machine.
Features:
- Search fstream, browse season cards with posters and language badges
- Expand seasons to episode level; cascading checkboxes (series → season → episode)
- Global language and output folder settings (persisted to
~/.config/sestudio/config.json) - Per-episode progress bars via SSE; downloads keep running after closing the browser tab
- Play an episode in the browser (▶ per row) — streams through the server, so provider referer/TLS quirks are handled for you, with automatic fallback across providers
- Cast to a TV (⧉ per row) — send an episode to any DLNA renderer on your network; Chromecast and AirPlay are available from the player when served over HTTPS (see below)
Downloads are organised automatically, with a per-language subfolder (VF / VOSTFR / VO):
<output_root>/<Series Name>/Season 01/VOSTFR/S01E01 - Title.mp4
<output_root>/fstream_films/VF/<Film Title>.mp4
The "already downloaded" check is per-language, so the same episode in VF and VOSTFR are tracked separately.
Watch & cast on your network
Start the server so other devices can reach it (this is the default bind):
uvx sestudio serve --host 0.0.0.0
- Google Cast (Chromecast) and AirPlay need a secure context (HTTPS) — the Cast Web Sender SDK refuses to run over plain HTTP. sestudio serves HTTPS by default, so this works out of the box once you trust the cert (below).
- In-browser player and DLNA "Cast to TV" also work; the ⧉ button scans for renderers (a ~4 s SSDP scan) and pushes the stream to the one you pick. DLNA renderers fetch the media over plain HTTP, which the server always exposes on
--http-port(8080) alongside HTTPS — so casting works without any extra flags.
HTTPS built in (default)
sestudio terminates HTTPS itself with a self-signed certificate covering your LAN IP — no extra tools:
uvx sestudio serve # HTTPS on :8443 by default (change with --port)
uvx sestudio serve --no-https # plain HTTP instead
It prints the https://<lan-ip>:8443 URL. The certificate is self-signed
(cached at ~/.config/sestudio/cert.pem), so the casting device must trust it
once:
- Desktop browser: open the URL and accept the certificate warning, or import
~/.config/sestudio/cert.peminto the system trust store. - Android phone driving the cast: install
~/.config/sestudio/cert.pemas a user CA (Settings → Security → Encryption & credentials → Install a certificate → CA certificate). Without trusting it, the Cast button won't list devices.
Development
# Run tests
uv run pytest
# Backend for the dev proxy: plain HTTP on 8080 (the Vite proxy target)
uv run sestudio serve --no-https --port 8080
# Frontend dev server (proxies /api to localhost:8080)
cd frontend && npm install && npm run dev
# Rebuild frontend (commit the result — frontend/dist ships in the wheel)
cd frontend && npm run build
Providers
| Provider | Status |
|---|---|
| uqload | supported |
| vidzy | planned |
| netu / voe | out of scope (session-token protected) |
Metadata
Release files for sestudio 0.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sestudio-0.4.1.tar.gz | 37.3 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sestudio-0.4.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 37.5 MB
Release files / sestudio-0.4.1.tar.gz
| Download URL | sestudio-0.4.1.tar.gz |
|---|---|
| Size | 37.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6a62e464364d69d92ebb6e3de6cd46e9307b60989fe40cfcf8382d428348b4ac
|
|
BLAKE2b-256 checksum How to use checksums |
42b6a2e04c5dc74e7ccf7543f5daefab06969d3a8d7678aa7d5b8607215302a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / sestudio-0.4.1-py3-none-any.whl
| Download URL | sestudio-0.4.1-py3-none-any.whl |
|---|---|
| Size | 266.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a95a53dcbbfeb3e2fb6a3b0ed69b7dff4574fea6d9677b6fb134ed92e1b88698
|
|
BLAKE2b-256 checksum How to use checksums |
56ff074d52bd0272bb4170b8a686ec04a16a4bf6dbdd400dc0803dc747e979d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|