A docker container for downloading VODs off of certain freemediaheckyeah sites.
Warning
This software is currently in alpha stages, there may be bugs and breaking changes to the API.
- VOD Indexing from various freemediaheckyeah sites. // TODO
- (Bulk) VOD Downloading from freemediaheckyeah sites.
- Easy navigatable WebUI
- VOD Validation // TODO
- Prowlarr indexer API // TODO
Pre-built images are published to the GitHub Container Registry at
ghcr.io/vod-downloaders/fmhy-downloader.
Available tags: latest (newest release), nightly (latest dev build), and per-version tags (e.g. 0.1.0-alpha2).
The recommended way to run is with Docker Compose. Create a compose.yaml:
services:
fmhy_downloader:
image: ghcr.io/vod-downloaders/fmhy-downloader:latest
container_name: fmhy_downloader
volumes:
- ./config:/config
- ./output:/output
environment:
- LOG_LEVEL=info
- FLARESOLVERR_URL=http://flaresolverr:8191/v1
ports:
- 8080:8080
depends_on:
flaresolverr:
condition: service_healthy
restart: unless-stopped
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
container_name: flaresolverr
environment:
- LOG_LEVEL=info
healthcheck:
test: sh -c "curl https://www.google.com && curl http://localhost:8191 && curl http://localhost:8191/health"
interval: 5s
timeout: 10s
retries: 3
start_period: 10s
restart: unless-stoppedThen start it:
docker compose up -dNote
flaresolverr is only required for Cloudflare-protected sites. If you don't need it, remove the service,
the depends_on block, and the FLARESOLVERR_URL environment variable.
The WebUI is served on http://localhost:8080.
Use the sidebar to navigate between pages:
- Search – // TODO: Search for a series
- Streams – Shows available streams for selected episode or movie.
- Downloads – Shows the downloads you've started. Finished files land in the
./outputdirectory.
The container is configured through environment variables:
| Variable | Default | Description |
|---|---|---|
LOG_LEVEL |
info |
Log verbosity: debug / info / warning / error |
WEBUI_PORT |
8080 |
Port the WebUI/API listens on |
FLARESOLVERR_URL |
- | FlareSolverr endpoint (may be empty) |
The docker container exposes an HTTP server with callable API functions, listed below:
| Type | Endpoint | Description | Input | Output |
|---|---|---|---|---|
GET |
/health |
Healthcheck endpoint | - | { health } |
GET |
/api/indexers |
Retrieve active indexers | - | { indexers } |
POST |
/api/indexers/create |
Create an active indexer from a specification | { indexer } |
- |
POST |
/api/indexers/delete |
Delete an active indexer | { name } |
- |
GET |
/api/indexers/specifications |
Retrieve usable indexer specifications | - | { indexers } |
POST |
/api/indexers/specifications/refresh |
Refetch indexer specifications from GitHub | - | { indexers } |
POST |
/api/streams |
Analyze a URL and list the available streams | { indexer_name, input_url } |
{ streams } |
POST |
/api/download |
Start a VOD download | { indexer_name, stream, output_file } |
{ id } |
Contributions are highly appreciated (especially to the fronted and documentation).
To contribute to the backend follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-change) - Make your changes and ensure everything compiles (
cargo build&&docker build .) - Run tests (
cargo test) - Run the linter (
cargo clippy) - Format your code (
cargo +nightly fmtfromrustfmt) - Open a pull request with a clear description of what you changed and why
Contributions to the WebUI are highly appreciated.
To contribute to the fronted follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-change) - Make your changes
- Open a pull request with a clear description of what you changed and why
Contributions to the Documentation are highly appreciated, add your files to the doc/ folder.
| Crate | Version | License | Purpose |
|---|---|---|---|
| colored | 3.1 | MPL-2.0 | Coloured printing |
| thiserror | 2.0 | MIT / Apache-2.0 | Easy error creation |
| chrono | 0.4 | MIT / Apache-2.0 | Timestamp handling |
| tokio | 1 | MIT | A runtime for writing reliable asynchronous applications |
| serde | 1 | MIT / Apache-2.0 | Serialization/deserialization framework |
| serde_json | 1 | MIT / Apache-2.0 | JSON parsing for API payloads |
| axum | 0.8 | MIT | HTTP routing and request-handling |
| tower_http | 0.6 | MIT | Easy web file serving |
| base64 | 0.22 | MIT / Apache-2.0 | Base64 encoder and decoder |
| rand | 0.10 | MIT / Apache-2.0 | Random number generator |
| url | 2.5 | MIT / Apache-2.0 | Rust implementation of the URL standard. |
| async_trait | 0.1 | MIT / Apache-2.0 | Allow async functions in traits |
| chromiumoxide | 0.9 | MIT / Apache-2.0 | A high-level API for interacting with the Chrome DevTools. |
| futures | 0.3 | MIT / Apache-2.0 | Abstractions for asynchronous programming. |
| reqwest | 0.13 | MIT / Apache-2.0 | Blocking HTTP client for Dispatcharr API communication |
| symphonia | 0.6 | MPL-2.0 | Audio/video container handling (MKV, MP4/ISO) |
This project is licensed under the GNU Affero General Public License v3.0. See LICENSE for the full license text.