Repository navigation
Merge #393, #432, #381 and #349 with their settings migrations renumbered - #464
Merged
Merged
Conversation
…remove metadata New built-in presets (settings schema 33), offered on the back faces of the images, PDF, video and audio donuts where they have room: - Compress image: same format, quality 75 (never above a JPEG's own), zlib level 9 for PNG, ZIP for TIFF. - Compress video: H.264 MP4 at the Small quality, at most 1080p. - Video from images: pictures as a 1080p MP4, 3 s each, with 1 s crossfades (seconds and crossfade on/off in the preset editor). - Extract audio: a video's sound as M4A, copied when the codec allows (MediaOptions.CopyAudioWhenPossible). - Merge videos / Merge audio: clips joined in the order picked in the merge order window; same-codec clips are copied, others encoded to match the first clip; audio is decoded and joined without gaps. - Remove metadata: same format; images drop EXIF/XMP/ICC (JPEG kept at its own quality), videos and audio copy their streams without tags, chapters or data tracks, PDFs drop document info and XMP. JobQueue joins files through a new IMediaJoiner (FFmpeg); MediaJoining holds the pure command lines. Strings in all nine languages. Unit tests for the presets, migration, queue and command lines, and real FFmpeg tests for every tool. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Schema 33 replaces the plain M4A slice of the video donut's back face with Extract audio (the same M4A, the sound copied where it can be), or adds it with the other tools when there is room. Real FFmpeg tests pass the test's cancellation token to file calls (xUnit1051, dotnet format). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pt-BR translation merged since gets the new preset names, the slideshow options and the error for too many pictures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ss never bigger - Merge videos copies clips only when their codec setup (ffprobe's extradata hash), frame rate and size match; others are encoded. FFmpeg puts a changed header in-band, but the MP4 keeps one sample description, which stricter players may not follow. - Video from images: the PNG step reports into the first 30% only, so late progress reports no longer show the job as done while the video is made. - Compress image / video / audio keep the source when the copy in the same format isn't smaller (OutputRule.OnlyIfSmaller), with the notice Compress PDF already shows. - Remove metadata keeps an MKV's attachments (subtitle fonts) with their file name and type tags; MKV refuses an attachment without them. - Removed IMediaJoiner.CanJoinInto (never called) and the slideshow size and fade length options nobody could set (now constants). Tests: stricter copy check, progress at join time, keep-if-not-smaller, and real FFmpeg runs for mixed-profile merges, MKV fonts and a portrait video. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Read VEVENT and VTODO into 14 CSV columns: ISO 8601 times with the original offset, all-day as dates, TZID in its own column, RRULE, EXDATE and RECURRENCE-ID kept raw; JSON and other data formats via CSV. - Resolve offsets from a same-calendar VTIMEZONE without RRULE first, then the system time-zone database, else keep floating time. - Write CSV back to iCalendar (VEVENT/VTODO, VTIMEZONE built from the zone's real transitions, 75-octet folding, no BOM). - Register ics/ical on the data donut, add an "iCalendar" preset on the back of the spreadsheets donut (settings schema 33), update the data engine description in every UI language and the docs. Closes #340
Windows has no history for Nepal Standard Time (always +05:45), so the 1985 +05:30 case failed there. Moscow (+04:00 in 2013, +03:00 now) has the same history on Windows and in the IANA database.
Like the scripts and logs 2.0.0 added: the TXT format takes .lua and .css, so they convert to PDF, Markdown, DOCX and the other text targets, read and never run. Settings schema 33 teaches existing text donuts the extensions unless a donut of the user already claims them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When the moved frame's centre comes within 8 screen pixels of the picture's vertical or horizontal centre line, it snaps onto it and a dashed accent guide shows that line across the picture until the drag ends. A frame as wide (or tall) as the picture never counts as snapped. Keyboard nudges stay pixel-exact and don't snap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ENGINES.md lists LUA and CSS with the plain-text formats; ARCHITECTURE.md describes the snap to the picture's centre lines in the crop overlay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rly picture limit 1. FfmpegConverter.JoinAsync no longer deletes the output: probing, the picture limit and preparing the slides happen before FFmpeg writes, and a join that fails or is cancelled is undone by the queue's allocator, which deletes only paths that were the job's own. With "Overwrite", a probe failure left the user's existing a_merged.mp4 deleted before. 2. RunJoinedMediaAsync uses a one-file allocator (oneFile: true, like the PDF merge) and discards it on failure or cancel: the name is free again (no "a_merged (2)" on a retry), a subfolder it made goes, and "subfolder only for several files" puts the merged file next to the source. 3. OnlyIfSmaller is its own step before ZIP / next-to-source, so a kept original moves next to its source like a compressed copy. 4. The 300-picture limit (now MediaOptions.MaxSlides) is checked before any picture is converted; the engine keeps it as a backstop for multi-page pictures. Tests for each case, and docs: ARCHITECTURE.md for IMediaJoiner, ENGINES.md for the FFmpeg and PDFsharp parts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A CSV cell could break out of its property when converting CSV to ICS: a line break in UID or RRULE, or extra lines in the EXDATE and Recurrence ID columns, became content lines of their own (an extra VEVENT, an unclosed VALARM). - UID, RRULE and Time zone with CR or LF are dropped (UID falls back to the generated one); a time zone with ':', ';' or '"' is dropped too. - EXDATE and Recurrence ID columns keep only EXDATE / RECURRENCE-ID lines. - Organizer and attendee cells lose CR/LF, and quotes are removed from the CN display name. Filee's own ICS -> CSV output writes those three cells on one line, so round trips are unchanged.
XLSX keeps its rows to repeat at the top (the _xlnm.Print_Titles name) and the HWPX tables start every page with them, as frozen rows did. Rows above the titles come once, before them.
HpglPlot reads HP-GL and HP-GL/2 (also the packed PE polylines printer drivers write, inside PJL / PCL) and draws the pen moves as SVG at real size; the vector engine renders PDF and images from there. Settings schema 33 teaches the vector donut .plt, .hpgl, .hpg and .hgl.
Device-control sequences (ESC . …) are skipped, a CO comment's quoted text stays its argument, and any command may come first, so plots opening with ESC .(, IP / SC, ETX or a comment are read. The header no longer names the project only read to check PE.
Main took settings schema 33 for #351, so the Lua / CSS text-donut step becomes v34 after it, AppSettings.CurrentSchemaVersion goes to 34 and the migration test starts from 33. #393 adds no UI strings; all 13 language files already match en.json. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s in PDF, read HP-GL plot files (.plt) (schema 35) # Conflicts: # src/Filee.Core/Settings/AppSettings.cs # src/Filee.Core/Settings/UserDataStore.cs
…ack (#340) (schema 36) # Conflicts: # src/Filee.Core/Formats/FormatRegistry.cs # src/Filee.Core/Settings/AppSettings.cs # src/Filee.Core/Settings/UserDataStore.cs # src/Filee.Engines/Data/DataConverter.cs
…r fr, zh-TW, ne The iCalendar step becomes v36 after #432's v35, AppSettings.CurrentSchemaVersion goes to 36 and the iCalendar migration test starts from 35. engine.data.description now names iCalendar events in English; French and Traditional Chinese still said vCard only, and Nepali had an older one-line text. All three now say what the English one says. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…xes (schema 37) # Conflicts: # src/Filee.App/Services/PresetAvailability.cs # src/Filee.Core/Conversion/JobQueue.cs # src/Filee.Core/Presets/BuiltInData.cs # src/Filee.Core/Settings/AppSettings.cs # src/Filee.Core/Settings/UserDataStore.cs # src/Filee.Engines/Media/MediaInfo.cs
The everyday-tools step becomes v37 after #381's v36, AppSettings.CurrentSchemaVersion goes to 37, its offers table is Version37Offers, and the migration tests start from 36. French, Traditional Chinese and Nepali get the twelve new strings (the media tool preset names, the slideshow options and the too-many-pictures error) in en.json's order, using each file's existing terms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The images donut's built-in back face holds 12 slices (ToolbarProfile.MaxSlices) again: with main's "Trim transparent borders" on it, #349's two tools made 13. "Extract Live Photo video" leaves it and stays in the preset library, as its doc and docs/ENGINES.md already said. The v37 step already adds a tool only while a back face has room; new tests check a schema-36 images face (it takes "Compress image" and stays at 12) and that an upgraded library's face is the new built-in one. - OnlyIfSmaller also applies under "Save as ZIP": the output there is still in the work folder, so the source is copied over it and goes into the ZIP. - "Too many pictures" shows the number of pictures it counted (downloads that failed are left out), not every dropped file. - docs/ENGINES.md: Video from images is in the library only, crossfades are at most half a picture's time, PDFsharp writes its own XMP packet after the metadata is removed, and the ZIP case above. CHANGELOG's back-face line no longer lists Live Photo video on the image donut. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 tasks done
4 tasks done
This was referenced Oct 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Merges four contributor PRs onto main in one branch so a single CI run covers them. Each one claimed settings schema 33 for its migration, and main already took 33 for #351. Each PR is merged with
--no-ffin the order below, and our fixes follow as a separate commit after each merge.Merging this PR marks #393, #432, #381 and #349 as merged, because their head commits are in this branch.
Conflicts
UserDataStore.cs/AppSettings.cs: every PR added afrom < 33step and set the version to 33. Main's v33 step (HAR / H.265 extensions and "Trim transparent borders") stays as it is. Each PR's step comes after it in ascending order, andCurrentSchemaVersionis 37.FormatRegistry(HAR and iCalendar entries) andDataConverter(HAR → trees and ICS ↔ CSV edges, both in the header comments and summary).MediaInfokeeps bothRawStream(main) andHasAttachments(Everyday media tools on 2.0.0, with audit fixes #349).JobQueuekeeps main'sScanScriptsnext to Everyday media tools on 2.0.0, with audit fixes #349'sCopyIfNotSmaller.PresetAvailabilitykeeps the trim check and the join check.BuiltInDatakeeps bothTrimPresetsandMediaToolPresets.Our fixes per PR
#393 (schema 34): the Lua / CSS step is renumbered to v34, and its test starts from 33. No new strings.
#432 (schema 35): the HP-GL step is renumbered to v35, and its test starts from 34. No new strings.
#381 (schema 36): the iCalendar step is renumbered to v36, and its UserDataStore test starts from 35.
engine.data.descriptionnow names iCalendar events. French and Traditional Chinese still mentioned vCard only, and Nepali had an older one-line text. All three now match the English.#349 (schema 37)
Version37Offers), and its tests start from 36.ToolbarProfile.MaxSlices(12). "Extract Live Photo video" comes off the face and stays in the preset library, which matches what its doc comment anddocs/ENGINES.mdalready said ("on no donut").OnlyIfSmallernow also applies under "Save as ZIP". The output there is still in the work folder, so the source is copied over it and that copy goes into the ZIP. There is a new test for this.docs/ENGINES.md: "Video from images" is in the library only, crossfades last at most half a picture's time, PDFsharp writes its own small XMP packet after the metadata is removed, and the ZIP case is documented. In CHANGELOG, the back-face line no longer lists Live Photo video on the image donut.All 13 language files have every en.json key in en.json's order.
Tests
dotnet format --verify-no-changes: cleandotnet build Filee.slnx -c Release: 0 errors🤖 Generated with Claude Code