Rebrand: Renamr -> Aurora Curator (new logo/app icon, renamed crate aurora-curator-core, package/identifier/window-title updates, README + in-app text)
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# Renamr
|
||||
# Aurora Curator
|
||||
|
||||
A fast, cross-platform media renamer — a ground-up rewrite of FileBot (via its FB-Mod
|
||||
fork), built from scratch as its own project: new stack, new architecture, new branding.
|
||||
@@ -48,7 +48,7 @@ The original is a ~20k+ line Java/Swing app built with Ant. The goals were: fast
|
||||
startup and UI, faster matching/renaming, a codebase that's actually pleasant to work
|
||||
in, and a genuine rebrand — not a coat of paint.
|
||||
|
||||
Renamr is **Tauri**: a Rust core (`crates/renamr-core`, `src-tauri`) plus a
|
||||
Aurora Curator is **Tauri**: a Rust core (`crates/aurora-curator-core`, `src-tauri`) plus a
|
||||
TypeScript/React frontend (`src`), compiled to a small native binary per platform
|
||||
(Windows/macOS/Linux) with a system webview instead of shipping a bundled browser
|
||||
engine. That's the concrete "faster" win over both the original JVM/Swing app and
|
||||
@@ -69,7 +69,7 @@ template syntax compatible with FileBot conventions, so existing automation most
|
||||
keeps working.
|
||||
|
||||
One deliberate gap: FileBot's `{ }` expressions ran arbitrary **Groovy** code
|
||||
(JVM-only). Renamr's Rust core has no Groovy engine, so expressions are evaluated with
|
||||
(JVM-only). Aurora Curator's Rust core has no Groovy engine, so expressions are evaluated with
|
||||
[Rhai](https://rhai.rs/) instead. Simple bindings (`{n}`, `{s00e00}`, `{t}`) are
|
||||
identical. More complex chained-method expressions will need small syntax tweaks
|
||||
(e.g. Groovy's `.toUpperCase()` → Rhai's `.to_upper()`) — Rhai already ships most of the
|
||||
@@ -79,7 +79,7 @@ translate directly.
|
||||
### Naming scheme syntax
|
||||
|
||||
Every `{ }` token in an expression is resolved in this order
|
||||
(`crates/renamr-core/src/format/expression.rs::compile_scriptlet`):
|
||||
(`crates/aurora-curator-core/src/format/expression.rs::compile_scriptlet`):
|
||||
|
||||
1. **A single bare identifier** (`{n}`, `{season}`) is a direct binding lookup — the
|
||||
fast path, and how FileBot's own short field names keep working unmodified.
|
||||
@@ -109,12 +109,12 @@ a subfolder" rather than rejecting it.
|
||||
A naming scheme that includes `/` (e.g. `{show name}/Season {season number}/{episode
|
||||
number} - {episode name}`) moves the file into that subfolder as part of renaming,
|
||||
creating any missing intermediate folders automatically
|
||||
(`crates/renamr-core/src/rename/mod.rs::rename_one` → `fs::create_dir_all`). This is
|
||||
(`crates/aurora-curator-core/src/rename/mod.rs::rename_one` → `fs::create_dir_all`). This is
|
||||
still always scoped to the file's own directory tree — the target is resolved relative
|
||||
to the source file's parent directory, never as an absolute path, and every path
|
||||
component is validated (`validate_relative_target`) to reject empty segments (a
|
||||
leading, trailing, or doubled `/` — which also catches an absolute-looking
|
||||
`/etc/passwd`-style path), `.`/`..` segments, and backslashes (Renamr always uses `/`
|
||||
`/etc/passwd`-style path), `.`/`..` segments, and backslashes (Aurora Curator always uses `/`
|
||||
for the naming scheme's folder separator regardless of OS). If the resolved target
|
||||
already exists and isn't the same underlying file, what happens next is up to the
|
||||
chosen conflict policy — Skip (default), Auto-number, or Override; see item 6 of the
|
||||
@@ -123,7 +123,7 @@ porting roadmap below for the full behavior of each.
|
||||
## Project layout
|
||||
|
||||
```
|
||||
crates/renamr-core/ Pure Rust core: naming-expression engine (ported), local
|
||||
crates/aurora-curator-core/ Pure Rust core: naming-expression engine (ported), local
|
||||
filename-based season/episode *and movie title/year* matching
|
||||
(ported, `matching/`), plus filename-based release-tag parsing in
|
||||
the same module (`guess_release_info` — resolution, source, video/
|
||||
@@ -141,7 +141,7 @@ crates/renamr-core/ Pure Rust core: naming-expression engine (ported), local
|
||||
action produced each batch). Not yet ported: full media metadata
|
||||
bindings, other web datasource clients (TVDB/AniDB/etc).
|
||||
No Tauri dependency, so it builds and unit-tests standalone.
|
||||
src-tauri/ Tauri app shell: exposes renamr-core as commands to the frontend
|
||||
src-tauri/ Tauri app shell: exposes aurora-curator-core as commands to the frontend
|
||||
(naming-scheme rendering, filename matching for both TV and
|
||||
movies, TMDB metadata fetch — `metadata.rs` for TV episodes,
|
||||
plus a movie-fetch command alongside it — executing a rename
|
||||
@@ -172,7 +172,7 @@ toolchain; macOS/Windows need Xcode / the VS Build Tools + WebView2 respectively
|
||||
|
||||
```sh
|
||||
# Rust core (no UI deps needed):
|
||||
cargo test -p renamr-core
|
||||
cargo test -p aurora-curator-core
|
||||
|
||||
# Full app in dev mode (opens a native window):
|
||||
npm install
|
||||
@@ -182,10 +182,10 @@ npm run tauri dev
|
||||
npm run tauri build
|
||||
```
|
||||
|
||||
Verified in the environment this was built in: `cargo test -p renamr-core` (all
|
||||
Verified in the environment this was built in: `cargo test -p aurora-curator-core` (all
|
||||
passing, including the TMDB client tests — those run against a local mock HTTP server
|
||||
via `mockito`, no live network or API key needed to build/test), `cargo check -p
|
||||
renamr` (compiles clean against real Tauri + GTK/WebKit system libraries), and `npm run
|
||||
aurora-curator` (compiles clean against real Tauri + GTK/WebKit system libraries), and `npm run
|
||||
build` (TypeScript type-checks, Vite bundles). The actual GUI window has **not** been
|
||||
visually verified anywhere yet — that sandbox has no display. Run `npm run tauri dev`
|
||||
on your machine to see and click through it for the first time.
|
||||
@@ -196,7 +196,7 @@ Everything else in the app works fully offline; "Fetch Data" is the one feature
|
||||
needs a (free) [TMDB](https://www.themoviedb.org/) account:
|
||||
|
||||
1. Create a TMDB account, then go to Settings → API in your account and generate an
|
||||
**API Read Access Token** (not the older numeric "API Key" — Renamr uses the Bearer
|
||||
**API Read Access Token** (not the older numeric "API Key" — Aurora Curator uses the Bearer
|
||||
token method TMDB documents as the default).
|
||||
2. In the app, click the key icon ("TMDB Settings") next to Fetch Data and paste the
|
||||
token in. It's saved locally in the OS app-config directory and only ever sent to
|
||||
@@ -210,38 +210,38 @@ ported from, for anyone picking this up:
|
||||
1. **Full naming-scheme bindings** — `net.filebot.format.MediaBindingBean` (1354 lines):
|
||||
all the `{n}`, `{s00e00}`, `{airdate}`, `{vf}` (video format), etc. binding
|
||||
properties. A filename-tag-based subset is now ported and wired to "Match"
|
||||
(`guess_release_info` in `crates/renamr-core/src/matching`): `{vf}`/`{resolution}`,
|
||||
(`guess_release_info` in `crates/aurora-curator-core/src/matching`): `{vf}`/`{resolution}`,
|
||||
`{source}`, `{vc}`/`{video codec}`, `{ac}`/`{audio codec}`, `{group}`/`{release
|
||||
group}`. What's still missing is everything MediaBindingBean derives from actually
|
||||
*probing* the media file (real video/audio stream resolution, duration, bitrate,
|
||||
frame rate, file size/hash, etc.) — Renamr ships no ffprobe/MediaInfo dependency, so
|
||||
frame rate, file size/hash, etc.) — Aurora Curator ships no ffprobe/MediaInfo dependency, so
|
||||
those bindings only work when a release name happens to carry the info as text.
|
||||
2. **String/expression helper methods** — `net.filebot.format.ExpressionFormatMethods`
|
||||
(636 lines): FileBot-specific Groovy string extensions like `.pad()`, `.sortName()`.
|
||||
Only a small subset (`any`, `all_of`, `concat`) is ported so far
|
||||
(`crates/renamr-core/src/format/functions.rs`); Rhai's built-ins cover some of the
|
||||
(`crates/aurora-curator-core/src/format/functions.rs`); Rhai's built-ins cover some of the
|
||||
rest already.
|
||||
3. **Matching/similarity engine** — `net.filebot.similarity.*`. Local filename-based
|
||||
season/episode detection is done (`crates/renamr-core/src/matching`, ported from the
|
||||
season/episode detection is done (`crates/aurora-curator-core/src/matching`, ported from the
|
||||
pattern-matching half of `SeasonEpisodeMatcher.java`, adapted to Rust's `regex` crate
|
||||
which lacks lookahead/lookbehind — wired to the "Match" button), and so is a local
|
||||
movie title/year heuristic (`guess_movie` in the same module) used as a fallback
|
||||
whenever a filename carries no season/episode marker — a release name is either a TV
|
||||
episode or a movie, never both. Title disambiguation is also done
|
||||
(`crates/renamr-core/src/similarity`, a partial port of the *scoring* idea behind
|
||||
(`crates/aurora-curator-core/src/similarity`, a partial port of the *scoring* idea behind
|
||||
`EpisodeMetrics.java`'s fuzzy title-matching cascade — Sorensen-Dice similarity over
|
||||
normalized-title character bigrams), shared by both the TV and movie TMDB lookups:
|
||||
"Fetch Data" picks whichever TMDB search result is textually closest to the local
|
||||
guess rather than just trusting TMDB's relevance/popularity-ranked first hit, and
|
||||
reports "not found" instead of guessing when nothing in the results is a plausible
|
||||
match at all. `DateMatcher` (numbering/air-date-based identification, the other half
|
||||
of the original `EpisodeMetrics`) is not ported — Renamr doesn't do date-based
|
||||
of the original `EpisodeMetrics`) is not ported — Aurora Curator doesn't do date-based
|
||||
episode identification.
|
||||
4. **Media detection** — `net.filebot.media.MediaDetection` (1356 lines): ties file-name
|
||||
parsing + matching together to auto-identify what a file is.
|
||||
5. **Web datasource clients** — `net.filebot.web.*` (~40 files): TheMovieDB, TheTVDB,
|
||||
AniDB, OMDb, TVmaze, OpenSubtitles, etc. TMDB is done for both TV and movies
|
||||
(`crates/renamr-core/src/web/tmdb.rs`, `reqwest` + `serde_json`, Bearer-token auth) —
|
||||
(`crates/aurora-curator-core/src/web/tmdb.rs`, `reqwest` + `serde_json`, Bearer-token auth) —
|
||||
search-by-name plus per-season episode lookup for TV, search-by-title (optionally
|
||||
narrowed by release year via TMDB's own `primary_release_year` filter) for movies —
|
||||
both wired to "Fetch Data", disambiguating multi-result searches via the
|
||||
@@ -251,7 +251,7 @@ ported from, for anyone picking this up:
|
||||
6. **Rename engine + CLI** — `net.filebot.cli.CmdlineOperations` (1235 lines) and
|
||||
`ArgumentBean` (415 lines, the full flag surface: `-rename`, `--db`, `--format`,
|
||||
`--action`, `--conflict`, `-get-subtitles`, `-script`, etc.). The rename operation is
|
||||
done (`crates/renamr-core/src/rename`, wired to the UI's Rename button behind a
|
||||
done (`crates/aurora-curator-core/src/rename`, wired to the UI's Rename button behind a
|
||||
confirmation step) including the `move`-into-subfolder `--action` variant — a naming
|
||||
scheme like `{n}/{s00e00}` organizes files into subfolders, creating any missing
|
||||
folders automatically, always scoped to the file's own directory tree. The
|
||||
@@ -275,7 +275,7 @@ ported from, for anyone picking this up:
|
||||
not the original's drag-and-drop-within-a-list interaction.
|
||||
8. **Undo/history for renames** — done, as a flat JSON-backed undo stack rather than a
|
||||
full port of `net.filebot.HistoryDialog`'s session/element log
|
||||
(`crates/renamr-core/src/history`, `src-tauri/src/history.rs`). Every successful
|
||||
(`crates/aurora-curator-core/src/history`, `src-tauri/src/history.rs`). Every successful
|
||||
rename is recorded to a `history.json` in the OS app-config directory (same location
|
||||
as `settings.json`); the History panel lists past batches and can revert one back to
|
||||
its original paths, skipping (never overwriting) any file whose original path now
|
||||
|
||||
Reference in New Issue
Block a user