diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f017a0..9e35e13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,9 +19,13 @@ Each version entry uses these sections (include only those that apply): - Always update this file before bumping the version in `pyproject.toml` - Document changes as they are made, not all at once at release time -## Unreleased +## 1.13.0 — 2026-10-12 ### Changed +- **Custom attributes are gone from the GUI.** The attribute table in + *Upravit film* and *Filmy → "Nastavit atribut…"* (menu and context menu) are + removed. Values already stored keep working in miniDLNA filename templates + (`File.name_context`); they just can't be edited from the app anymore. - **The pool index is keyed by the movie, not by a file path** (index **v2**, `src/core/movie.py`). A record used to describe one *file*, so a movie's metadata was a passenger on one particular file — which is why the "primary @@ -54,8 +58,106 @@ Each version entry uses these sections (include only those that apply): **migrates a v1 index on first open** — metadata only, **no file is moved** (a v1 movie already sits where v2 wants it), with the old index copied to `.Curator.!index.v1.bak` first. +- **"Odebrat z poolu" removes the whole movie** (`FileManager.remove_movie`): + on a multi-version row it deletes every version, their subtitles and the + version folder — it used to delete only the file shown in the table and + leave the rest behind as a half-empty group. Subtitles of a flat movie are + removed too now. ### Added +- **Upravit film: one "Média filmu" section with a folder mode.** A flat + movie (one file in the library root, plus subtitles) shows as "Samostatný + film"; adding a second medium moves it into its own folder automatically. + The folder has two modes, chosen with a **"Verze / Díly"** switch: + **versions** — alternatives, each with its own popisek (free text such as + "kinoverze", "zkrácená verze", or a 3D preset via **"✏️ Popisek / 3D…"**); + **parts** — pieces played back to back, listed in order and reordered with + **↑ / ↓**. "➕ Přidat médium…" adds by the chosen mode (for a flat movie the + switch decides what the second file becomes). Switching an existing folder + converts it: to parts numbers the files in their current order; to versions + makes the first file the default and asks a popisek for each other one. + New `FileManager.movie_group_mode`, `ordered_media` (parts sorted + numerically, `part2` before `part10`), `move_movie_part`, + `set_movie_group_mode`; all of them relabel the folder through temporary + names, so swapping two parts never overwrites a file. +- **Movie parts (Jellyfin multi-part / stacking)** — a film that TMDb lists + as one movie but that you have as several files. *Upravit film* gets + **"➕ Přidat díl…"**: the film moves into its own folder (Jellyfin requires + it for parts, even with no other versions) as `Folder-part1.ext`, + `Folder-part2.ext`, … and Jellyfin plays them back to back as one movie — + unlike versions, which it offers as alternatives. Under the hood a part is + a version whose popisek is `partN`, so everything that handles versions + handles parts too (removing down to one demotes to flat, subtitles follow + each part, renaming works). Any Jellyfin spelling typed as a popisek + (`part2`, `CD2`, `pt 2`, `disc-2`) is written back as `-part2` and the + existing file becomes `part1` — so the import collision dialog's "Přidat + jako verzi" with popisek `CD2` works the same way. The version table shows + "díl N", the main table "Film · N díly". Parts and versions can't be + combined in one folder yet (`add_movie_part` refuses). New + `FileManager.add_movie_part`, `movie.normalize_part_label` / `part_label`. +- **Upravit seriál: TMDb lookup, optionally from a movie id.** The series + editor gets a **"🔎 Dohledat"** button (title + year from TMDb, by the typed + id or by the title) and a **"Metadata projednou z ID filmu (ne seriálu)"** + checkbox for series that TMDb lists only as a movie (a miniseries cut + together, a documentary in parts): ticked, the lookup uses the movie + endpoints instead of the TV ones. The movie id is then **not** written into + the series folder's `[tmdbid-N]` — Jellyfin's TV provider would resolve it as + a TV id and match an unrelated show — so Jellyfin matches the series by + title and year instead (`SeriesEditDialog._lookup`, `.tmdb_id`). +- **Import movies: assign a version right in the batch** (e.g. a 2D + a 3D + file of the same film picked together). A row's new **"🔗 Přiřadit jako + verzi…"** button picks which other row in the dialog it's a version of and + a popisek (pre-filled with the 3D formát detected in its filename via + `naming.three_d_format_from_filename` — e.g. `Avatar.2009.3D.HSBS.mkv` → + `3D HSBS` — free text otherwise, same `VersionLabelDialog` as *Upravit + film → Verze*); its own název/rok/TMDb ID/ČSFD fields grey out since they + come from the film it's a version of. On import the target row lands + first via `import_movie`, then every linked row is added onto it via + `FileManager.add_movie_version` — one movie with several versions instead + of two separate (duplicate) movies. Removing a row it points to un-links + it back to standalone; a row already pointed at by others can't itself + become a version (no chains). +- **Import movies: "3D formát" per row**, for the opposite case — a film + whose *only* file is entirely 3D, with no plain version to make it a + version *of*. A combo box (pre-filled from the filename, same detection as + the popisek above) tags a standalone row's import straight to + `Title (rok) [tmdbid].3D.