123 lines
3.7 KiB
Markdown
123 lines
3.7 KiB
Markdown
# mov-renamarr :clapper:
|
|
|
|
Fast, safe CLI to rename movie files into Radarr-compatible folders and filenames on Linux. It uses `ffprobe` for media details, filename parsing for hints, and optional online metadata (TMDb/OMDb) with caching. Default action is copy; move/rename-in-place are opt-in.
|
|
|
|
## Features :sparkles:
|
|
- Radarr-style output: `Title (Year)/Title (Year) [quality] [id].ext`
|
|
- Safe defaults: copy by default, skip on collision (opt-in overwrite/suffix)
|
|
- Metadata providers: TMDb, OMDb, or both (auto picks TMDb if available)
|
|
- Optional local LLM (Ollama) for filename parsing and lookup assist
|
|
- SQLite cache to reduce repeated lookups
|
|
- Reports in text/json/csv (stdout by default)
|
|
- Concurrency controls with sensible defaults
|
|
|
|
## Requirements :clipboard:
|
|
- Linux
|
|
- `ffprobe` in `PATH` (install via ffmpeg)
|
|
|
|
## Install :package:
|
|
From source:
|
|
```bash
|
|
cargo build --release
|
|
```
|
|
Binary will be at `target/release/mov-renamarr`.
|
|
|
|
Install with Cargo:
|
|
```bash
|
|
# From a git repo
|
|
cargo install --git <repo-url> --locked
|
|
|
|
# From a local checkout
|
|
cargo install --path . --locked
|
|
```
|
|
|
|
## Quick start :rocket:
|
|
Create a default config (with comments) and see the config path:
|
|
```bash
|
|
mov-renamarr
|
|
```
|
|
|
|
Dry-run with TMDb:
|
|
```bash
|
|
mov-renamarr --input /path/to/in --output /path/to/out --dry-run --provider tmdb
|
|
```
|
|
|
|
Rename in place (no network lookups):
|
|
```bash
|
|
mov-renamarr --input /path/to/in --rename-in-place --no-lookup
|
|
```
|
|
|
|
## Usage :keyboard:
|
|
```
|
|
mov-renamarr --input <dir> --output <dir> [flags]
|
|
```
|
|
|
|
Common flags:
|
|
- `--move` or `--rename-in-place` (default is copy)
|
|
- `--provider auto|tmdb|omdb|both`
|
|
- `--no-lookup` (skip external lookups)
|
|
- `--report [path]` and `--report-format text|json|csv`
|
|
- `--sidecars` (copy/move subtitle/nfo/etc files)
|
|
- `--quality-tags resolution,codec,source`
|
|
- `--min-score 0-100` (match threshold)
|
|
- `--jobs auto|N` and `--net-jobs auto|N`
|
|
|
|
## Configuration :gear:
|
|
Default config location:
|
|
`$XDG_CONFIG_HOME/mov-renamarr/config.toml` (fallback `~/.config/mov-renamarr/config.toml`)
|
|
|
|
Cache location:
|
|
`$XDG_CACHE_HOME/mov-renamarr/cache.db` (fallback `~/.cache/mov-renamarr/cache.db`)
|
|
|
|
The app creates a commented default config on first run and prints the path.
|
|
|
|
Key options (TOML):
|
|
- `provider = "auto"|"tmdb"|"omdb"|"both"`
|
|
- `tmdb.api_key` or `tmdb.bearer_token` (TMDb read access token supported)
|
|
- `omdb.api_key`
|
|
- `quality_tags = ["resolution"]` (or add `codec`, `source`)
|
|
- `llm.mode = "off"|"parse"|"assist"`
|
|
- `llm.endpoint = "http://localhost:11434"`
|
|
- `llm.model = "Qwen2.5:latest"` (recommended for accuracy: `Qwen2.5:14b`)
|
|
- `jobs = "auto"|N`, `net_jobs = "auto"|N`
|
|
- `sidecars = false` (copy/move sidecars when true)
|
|
|
|
CLI flags override config, and env vars override config as well.
|
|
Full reference: [docs/CONFIG.md](docs/CONFIG.md)
|
|
|
|
## Providers :globe_with_meridians:
|
|
- **TMDb**: preferred when available. Supports API key or read-access bearer token.
|
|
- **OMDb**: optional, API key required.
|
|
- **Auto**: uses TMDb if configured, else OMDb.
|
|
- **No-lookup**: `--no-lookup` (or `--offline`) uses filename/LLM only.
|
|
|
|
## LLM (optional) :robot:
|
|
If enabled, Ollama is used for:
|
|
- filename parsing (`llm.mode = "parse"`)
|
|
- lookup assistance (`llm.mode = "assist"`)
|
|
|
|
LLM output is treated as hints; provider results (when enabled) remain the source of truth.
|
|
|
|
## Reports :memo:
|
|
By default, output is printed to stdout.
|
|
To write a report file:
|
|
```bash
|
|
mov-renamarr --input ... --output ... --report
|
|
```
|
|
This creates `mov-renamarr-report-YYYYMMDD-HHMMSS.txt` in the current directory.
|
|
|
|
Formats: `--report-format text|json|csv`
|
|
|
|
## Safety and collisions :shield:
|
|
Default is **skip** if the destination exists. Options:
|
|
- `--overwrite` to overwrite
|
|
- `--suffix` to append ` (1)`, ` (2)`, ...
|
|
|
|
## Testing :test_tube:
|
|
```bash
|
|
cargo test
|
|
```
|
|
|
|
## License :scroll:
|
|
MIT (see `LICENSE`).
|