diff --git a/Backlog.md b/Backlog.md index 66089f2..5670710 100644 --- a/Backlog.md +++ b/Backlog.md @@ -294,18 +294,19 @@ Goal: Replace FileRenamer workflows. - [x] Counter padding - [x] Case conversion - [x] Extension handling -- [ ] Metadata placeholders +- [x] Metadata placeholders Potential placeholders: - `{CreatedDate}` +- `{TakenDate}` - `{ModifiedDate}` - `{Counter}` - `{Width}` - `{Height}` - `{Artist}` - `{Title}` -- `{Project}` +- `{Project}` (Git repo folder, else parent) - `{Extension}` ## Workflow @@ -318,6 +319,25 @@ Potential placeholders: - [x] Add Rename operations to File Operations Queue - [x] Store `OldPath -> NewPath` - [x] Support Undo for completed rename batches +- [x] Tags from filename +- [x] Filename from tags +- [x] Tag editor (Artist, Title, Album, Track, Year, Genre) +- [x] Queue tag writes +- [x] Saved name patterns +- [x] EXIF Date Taken on photos +- [x] `{Project}` from Git repo / parent folder + +--- + +# Move to + +Patterned move with per-file destination folders (Plex-style movie folders, dated backups, and similar). + +- [x] Destination pattern popup +- [x] `%filename%` `%filename_noext%` `%ext%` `%year%` `%month%` `%parent%` `%source_drive%` +- [x] Create missing destination folders +- [x] History / saved patterns +- [x] Preview and queue through File Operations Queue --- @@ -440,7 +460,7 @@ Goal: Understand what files and folders represent rather than relying only on ex - [ ] MIME/content signature - [x] Folder structure - [x] Git metadata -- [ ] Media metadata +- [x] Media metadata - [x] Known application structures (`node_modules`, `bin`, `obj`, `.vs`) - [x] File age (old installers flagged in preview) - [ ] File relationships diff --git a/docs/Documentation.md b/docs/Documentation.md index 9f8ea79..70be125 100644 --- a/docs/Documentation.md +++ b/docs/Documentation.md @@ -44,7 +44,7 @@ Specialized tools still do specialized jobs. 7-Zip compresses. FFmpeg converts a | --- | --- | | `%LocalAppData%\ExplorerWorkbench\index.db` | Index, queue, profiles | | `%LocalAppData%\ExplorerWorkbench\logs\` | Rolling logs | -| `%LocalAppData%\ExplorerWorkbench\ui-preferences.txt` | Theme, layout, tool paths, organize destinations, favorite folders | +| `%LocalAppData%\ExplorerWorkbench\ui-preferences.txt` | Theme, layout, tool paths, organize destinations, favorite folders, saved name patterns, Move to history | --- @@ -226,9 +226,34 @@ Auto-clear when done is a setting. Failed items stay until you dismiss or retry Workflow: configure → preview → validate → queue. -Rules: search/replace, regex, prefix, suffix, counter (with padding), case, extension. Collisions and illegal Windows names are caught before enqueue. Completed batches can be undone (**Tools → File Operations → Undo last rename batch**). +Rules: search/replace, regex, prefix, suffix, counter (with padding), case, extension. An optional **name pattern** can replace the current name using placeholders: `{Artist}`, `{Title}`, `{Album}`, `{Track}`, `{Year}`, `{Genre}`, `{CreatedDate}`, `{TakenDate}`, `{ModifiedDate}`, `{Width}`, `{Height}`, `{Name}`, `{Extension}`, `{Parent}`, `{Project}`, `{Counter}`. Dates accept a format (`{TakenDate:yyyyMMdd}`). `{CreatedDate}` uses EXIF Date Taken when that was already read; `{TakenDate}` is the token that reads photo metadata. `{Project}` is the Git repository folder, or the parent folder if the file is not in a repo. **Save pattern** stores a custom pattern in `ui-preferences.txt` (built-in patterns stay in the list: `{Artist} - {Title}`, `{Track:00} - {Title}`, `{TakenDate}_{Name}`, `{CreatedDate}_{Name}`, `{Project}_{Name}`). Collisions and illegal Windows names are caught before enqueue. Completed batches can be undone (**Tools → File Operations → Undo last rename batch**). -Metadata placeholders such as `{CreatedDate}` or `{Width}` are not implemented yet. `{Counter}` and `{Extension}` work. +**Tags…** (select files first) is the Tag&Rename-style editor. **Filename → tags** fills Artist/Title/… from the current names using the same pattern. **Tags → filename** builds new names from tags. **Queue tags** writes ID3 on audio and EXIF (title, comment, creator, date taken) on photos through the File Operations Queue; **Queue rename** queues the new names. Online-only cloud files are skipped so they are not downloaded. + +--- + +## Move to + +**Tools → File Operations → Move to…** or **Move to…** on the item context menu (select items first). + +Not a plain “move into this folder”. The destination is a **pattern**. Placeholders expand per file, missing folders are created, then the move is queued. + +| Token | Meaning | +| --- | --- | +| `%filename%` | Name including extension | +| `%filename_noext%` | Name without extension | +| `%ext%` | Extension without the dot | +| `%year%` / `%month%` | Last-write time (`2024` / `08`) | +| `%parent%` | Parent folder name | +| `%source_drive%` | Drive (`D:`) or UNC share (`\\10.0.0.31\media`) | + +`{filename_noext}` and the other `{…}` forms work the same. + +Plex-style movies: `\\10.0.0.31\media\movies\%filename_noext%` creates `movies\Inception\` and places `Inception.mkv` inside it. If the last segment is `%filename%` or `%ext%`, the pattern is the full destination file path. + +Type the path in the text box (or **Browse…**), then click a token to insert it at the caret. **Recent** lists saved patterns; the `\\host\share\…` row is only an example and is rejected if you queue it. **Queue** and **Save** store real patterns in `ui-preferences.txt` (`move-to=`). + +If a UNC share or mapped drive is disconnected, Workbench tries to reconnect it (same credentials, no extra prompt). Jobs that still cannot reach the destination wait in the queue; **Retry** re-probes and reconnects. Online-only cloud files are skipped. --- @@ -387,7 +412,6 @@ Left open on purpose: - Scheduled profiles and folder-watcher triggers - MIME/EXIF classification - Duplicate “backup copy” auto-tagging -- Rename placeholders from EXIF or dates --- diff --git a/src/Explorer.App/BatchRenameWindow.xaml b/src/Explorer.App/BatchRenameWindow.xaml index cf97a24..3d453bd 100644 --- a/src/Explorer.App/BatchRenameWindow.xaml +++ b/src/Explorer.App/BatchRenameWindow.xaml @@ -68,7 +68,14 @@ + IsEnabled="{Binding ChangeExtension}" Margin="0,0,0,16"/> + + + +