Skip to content

Merge #393, #432, #381 and #349 with their settings migrations renumbered - #464

Merged
KnifeLemon merged 24 commits into
mainfrom
merge/schema-batch
Oct 23, 2026
Merged

KnifeLemon merged 24 commits into
mainfrom
merge/schema-batch

Conversation

@KnifeLemon

Copy link
Copy Markdown
Owner

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-ff in the order below, and our fixes follow as a separate commit after each merge.

Order PR Schema
1 #393 .lua / .css as text, crop frame snaps to the centre 34
2 #432 Excel print title rows in PDF, HP-GL plot files (.plt) 35
3 #381 iCalendar (.ics) ↔ CSV 36
4 #349 Everyday media tools 37

Merging this PR marks #393, #432, #381 and #349 as merged, because their head commits are in this branch.

Conflicts

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.description now 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)

  • The everyday-tools step is renumbered to v37 (Version37Offers), and its tests start from 36.
  • French, Traditional Chinese and Nepali get the 12 new strings, in en.json's order.
  • The images donut's built-in back face had 13 slices once main's "Trim transparent borders" was on it, one over ToolbarProfile.MaxSlices (12). "Extract Live Photo video" comes off the face and stays in the preset library, which matches what its doc comment and docs/ENGINES.md already said ("on no donut").
  • The v37 step already adds a tool only while a back face has room. New tests check two cases: a schema-36 images face takes "Compress image" and stops at 12, and an upgraded library ends up with the new built-in face.
  • OnlyIfSmaller now 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.
  • The "Too many pictures" detail now shows the same count the check uses, so downloads that failed are left out. The existing test now asserts the detail, and a new test covers a failed download.
  • 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: clean
  • dotnet build Filee.slnx -c Release: 0 errors
  • Filee.Core.Tests (all): 498 passed, 3 skipped, 0 failed
  • Filee.App.Tests (Localization, UserDataStore, Preset, Toolbar, DonutFlip, Crop, BackFace, WhatsNew): 289 passed, 0 failed
  • Filee.Engines.Tests run with the local FFmpeg / rhwp engines (ScriptText, Hpgl, OfficeTests, Tracing, ICalendar, MediaJoining, MediaToolReal, MediaTests, NewExtensionsReal, Data, PdfCompression, MediaEncoding, TrimTransparent, Har): 391 passed, 1 skipped, 0 failed

🤖 Generated with Claude Code

cre8ive-marketing and others added 23 commits October 21, 2026 16:54
…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.
… snap the crop frame to the centre (schema 34)

# Conflicts:
#	src/Filee.Core/Settings/UserDataStore.cs
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
The HP-GL plot-file step becomes v35 after #393's v34, AppSettings.CurrentSchemaVersion
goes to 35 and the migration test starts from 34. #432 adds no UI strings; all 13
language files already match en.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…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>
@KnifeLemon KnifeLemon added the feature New features label Oct 23, 2026
@KnifeLemon KnifeLemon self-assigned this Oct 23, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@KnifeLemon
KnifeLemon merged commit 61fd350 into main Oct 23, 2026
9 checks passed
@KnifeLemon
KnifeLemon deleted the merge/schema-batch branch October 23, 2026 01:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature New features

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants