https://github.com/gabrielmagno/crab-dlna
A minimal UPnP/DLNA media streamer written in Rust
https://github.com/gabrielmagno/crab-dlna
cli dlna play rust streaming streaming-video upnp video
Last synced: 10 months ago
JSON representation
A minimal UPnP/DLNA media streamer written in Rust
- Host: GitHub
- URL: https://github.com/gabrielmagno/crab-dlna
- Owner: gabrielmagno
- License: other
- Created: 2022-05-03T18:05:50.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2024-09-04T13:11:54.000Z (almost 2 years ago)
- Last Synced: 2025-07-18T00:36:55.581Z (11 months ago)
- Topics: cli, dlna, play, rust, streaming, streaming-video, upnp, video
- Language: Rust
- Homepage:
- Size: 86.9 KB
- Stars: 82
- Watchers: 4
- Forks: 4
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE-APACHE
Awesome Lists containing this project
README
# crab-dlna
[](https://github.com/gabrielmagno/crab-dlna/actions/workflows/CICD.yml)
[](https://crates.io/crates/crab-dlna)
crab-dlna is a minimal UPnP/DLNA media streamer, available both as a standlone CLI (command line interface) application and a Rust library.
It allows you to play a local video file in your TV (or any other DLNA compatible device).
## Features
- Searching available DLNA devices in the local network
- Streaming audio
- Streaming video, with subtitle support
## Installation
In the GitHub Releases of this repository we provide [archives of precompiled binaries](https://github.com/gabrielmagno/crab-dlna/releases) of crab-dlna, available for **Linux**, **Windows**, and **macOS**.
### cargo
Installation via cargo is done by installing the `crab-dlna` crate:
```bash
# If required, update Rust on the stable channel
rustup update stable
cargo install crab-dlna
# Alternatively, --locked may be required due to how cargo install works
cargo install crab-dlna --locked
```
## Usage (CLI)
You can list all the CLI commands by running:
```
crab-dlna --help
```
### List
Scan compatible devices and list the available ones:
```bash
crab-dlna list
```
If your device is not being listed, you might need to increase the search timeout:
```bash
crab-dlna -t 20 list
```
### Play
Play a video, automatically loading the subtitles if available, selecting a random device:
```bash
crab-dlna play That.Movie.mkv
```
Play a video, specifying the device through query (scan devices before playing):
```bash
crab-dlna play That.Movie.mkv -q "osmc"
```
Play a video, specifying the device through its exact location (no scan, faster):
```bash
crab-dlna play That.Movie.mkv -d "http://192.168.1.13:1082/"
```
## Usage (library)
Add `crab-dlna` and `tokio` to your dependencies:
```toml
[dependencies]
tokio = { version = "1", features = ["full"] }
crab-dlna = "0.2"
```
### Example: discover and list devices
crab-dlna provides a function to discover a list devices in the network.
```rust
use crab_dlna::Render;
#[tokio::main]
async fn main() {
let discover_timeout_secs = 5;
let renders_discovered = Render::discover(discover_timeout_secs).await.unwrap();
for render in renders_discovered {
println!("{}", render);
}
}
```
### Example: play a video in a device
We can specify a DLNA device render trough a query string,
and then play a certain video in it, automatically detecting
the subtitle file.
```rust
use std::path::PathBuf;
use crab_dlna::{
Render,
RenderSpec,
MediaStreamingServer,
STREAMING_PORT_DEFAULT,
get_local_ip,
infer_subtitle_from_video,
Error,
play,
};
#[tokio::main]
async fn main() -> Result<(), Error> {
let discover_timeout_secs = 5;
let render_spec = RenderSpec::Query(discover_timeout_secs, "Kodi".to_string());
let render = Render::new(render_spec).await?;
let host_ip = get_local_ip().await?;
let host_port = STREAMING_PORT_DEFAULT;
let video_path = PathBuf::from("/home/crab/Videos/my_video.mp4");
let inferred_subtitle_path = infer_subtitle_from_video(&video_path);
let media_streaming_server = MediaStreamingServer::new(
&video_path,
&inferred_subtitle_path,
&host_ip,
&host_port,
)?;
play(render, media_streaming_server).await
}
```
You can access the full [documentation](https://docs.rs/crab-dlna/) to see more details about the library.
## License
Copyright (c) 2022 Gabriel Magno.
`crab-dlna` is made available under the terms of either the MIT License or the Apache License 2.0, at your option.
See the [LICENSE-APACHE](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT) files for license details.