https://github.com/dlepaux/multilinguarr
Multi-language audio enforcement for the *arr media stack
https://github.com/dlepaux/multilinguarr
arr-stack bilingual docker ffprobe jellyfin media-server multilingual plex radarr rust self-hosted sonarr
Last synced: 14 days ago
JSON representation
Multi-language audio enforcement for the *arr media stack
- Host: GitHub
- URL: https://github.com/dlepaux/multilinguarr
- Owner: dlepaux
- License: mit
- Created: 2026-04-10T17:13:04.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-06-03T08:44:00.000Z (24 days ago)
- Last Synced: 2026-06-03T10:22:27.996Z (24 days ago)
- Topics: arr-stack, bilingual, docker, ffprobe, jellyfin, media-server, multilingual, plex, radarr, rust, self-hosted, sonarr
- Language: Rust
- Homepage: https://dlepaux.github.io/multilinguarr/
- Size: 414 KB
- Stars: 6
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- Changelog: changelog.md
- Contributing: contributing.md
- License: license.md
Awesome Lists containing this project
README
multilinguarr
Multi-language audio enforcement for the *arr media stack.
---
## Why?
Media files are messy. Audio language metadata is unreliable — mislabeled tracks, missing tags, inconsistent naming across indexers. Radarr and Sonarr do a great job managing downloads, but they have no concept of per-language media libraries.
If you want separate Jellyfin/Plex libraries for each language (e.g. French movies, English movies), you're on your own. Manual sorting doesn't scale, and metadata-based smart playlists break the moment a file has the wrong tag.
**multilinguarr** solves this by sitting between your *arr instances and your media player. It intercepts download webhooks, detects actual audio languages via ffprobe, and creates symlinks (or hardlinks) into language-specific library directories. Your media player sees clean, per-language libraries. Your *arr instances keep managing the real files. Nothing gets moved or modified.
## Quick start
```yaml
services:
multilinguarr:
image: ghcr.io/dlepaux/multilinguarr:latest
environment:
- MULTILINGUARR_API_KEY=your-secret
- MULTILINGUARR_MEDIA_BASE_PATH=/srv/media
volumes:
- ./data:/data # SQLite database
- /srv/media:/srv/media # media tree (same mount as arr instances)
ports:
- "3100:3100"
```
Configure languages, instances, and webhooks via the REST API — see the **[documentation](https://dlepaux.github.io/multilinguarr/)** for the full setup guide.
## Documentation
Full documentation is available at **[dlepaux.github.io/multilinguarr](https://dlepaux.github.io/multilinguarr/)**:
- [Introduction](https://dlepaux.github.io/multilinguarr/guide/introduction) — how it works, architecture overview
- [Installation](https://dlepaux.github.io/multilinguarr/guide/installation) — Docker setup, configuration
- [Directory structure](https://dlepaux.github.io/multilinguarr/guide/directory-structure) — required media layout
- [API reference](https://dlepaux.github.io/multilinguarr/api/) — interactive OpenAPI docs
## Compatibility
| Service | Version |
|---------|---------|
| Radarr | v3+ |
| Sonarr | v3+ |
| Jellyfin | any |
| Plex | any |
## License
[MIT](license.md)