Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
11c8d00
feat(engines): WeasyPrint as an optional engine for HTML, Markdown an…
claude Nov 12, 2026
f801fb4
test(engines): keep WeasyPrint out of the built-in-only route tests
claude Nov 12, 2026
a30bbe4
fix(engines): address WeasyPrint review
claude Nov 12, 2026
448bfb1
feat(clip): cut clips from sounds and pick the iPhone ringtone part i…
adnan-bhaldar Nov 12, 2026
c2bcab4
i18n: add strings for the ringtone part and the sound clip limit in a…
adnan-bhaldar Nov 12, 2026
afc315f
feat(image): read and write GIMP .xcf files, keeping layers with PDN …
Ugoyo Nov 12, 2026
d07c4c4
test(engines): check the built-in Markdown PDF route without WeasyPrint
claude Nov 12, 2026
a1e1a63
fix(toolbar): the donut's look sliders save without re-applying every…
lightscape-jm Nov 10, 2026
d3d8753
feat(toolbar): the editor's donut fits its column, and groups open li…
lightscape-jm Nov 10, 2026
d6feef3
feat(toolbar): Edit Donut Size shows the real donut on screen
lightscape-jm Nov 10, 2026
8bb1782
feat(toolbar): the donut on screen holds a group open while its ring …
lightscape-jm Nov 10, 2026
b73b60a
fix(toolbar): the donut on screen stays clear of the window; findings…
lightscape-jm Nov 12, 2026
385fa95
fix(toolbar): the donut on screen and the window stay apart; findings…
lightscape-jm Nov 12, 2026
0d3c4aa
fix(toolbar): Copy to folder keeps the group rule, and a drag ends wh…
lightscape-jm Nov 12, 2026
769f946
fix(toolbar): a drag ends with Windows' move loop, and the example ri…
lightscape-jm Nov 12, 2026
055f361
fix(toolbar): a drag of the donut on screen ends when the button is u…
lightscape-jm Nov 12, 2026
b72e7bb
fix(toolbar): the pointer leaving the donut on screen ends its drag t…
lightscape-jm Nov 12, 2026
b079d9a
fix(toolbar): on Windows too, the donut's drag ends with the button-u…
lightscape-jm Nov 12, 2026
bb62c93
fix(toolbar): a repaint doesn't end the drag, and the window's size a…
lightscape-jm Nov 12, 2026
72697da
fix(toolbar): the donut on screen stays put while dragged, and a prof…
lightscape-jm Nov 12, 2026
8bdb971
fix(toolbar): the donut on screen follows Mixed selection and a renam…
lightscape-jm Nov 12, 2026
9996b87
fix(toolbar): a place the user moves the window to while the donut is…
lightscape-jm Nov 12, 2026
f082388
fix(toolbar): one record of where the window landed; a narrowed windo…
lightscape-jm Nov 12, 2026
3a59ecb
fix(toolbar): back on screen mid-slide, the window stops there; Group…
lightscape-jm Nov 12, 2026
bfb9a87
fix(toolbar): the window's own width and place come back at any scali…
lightscape-jm Nov 12, 2026
e44926f
fix(toolbar): a donut taller than its screen goes to one with room; f…
lightscape-jm Nov 12, 2026
11b800d
fix(toolbar): the drag test holds on Windows too, and a restored wind…
lightscape-jm Nov 12, 2026
81d613b
fix(toolbar): a narrowed window left maximized gets its width back; s…
lightscape-jm Nov 12, 2026
f4249e7
feat(vector): read Obsidian canvases (JSON Canvas) to SVG, PDF, PNG a…
Ugoyo Nov 12, 2026
b9a50b7
style(vector): dotnet format the canvas reader and pass the test token
Ugoyo Nov 12, 2026
36448f5
feat(cad): read Gerber PCB layers (RS-274X / X2) to SVG, PDF and images
Ugoyo Nov 12, 2026
5a6f03d
fix(cad): Gerber budgets for nested blocks and macros, dotnet format
Ugoyo Nov 12, 2026
31dd264
feat(cad): draw G-code toolpaths of 3D printers and CNC machines
Ugoyo Nov 12, 2026
6878a5f
fix(cad): close the path data of G-code SVGs
Ugoyo Nov 12, 2026
925a5a0
feat(media): read Wisenet WAVE / Nx Witness exports (.nov)
Ugoyo Nov 12, 2026
dfc9329
feat(subtitles): read KuGou .krc lyrics (#1296)
cre8ive-marketing Nov 13, 2026
248c0ee
style(engines): color the engine status pills
adnan-bhaldar Nov 13, 2026
7accf35
feat(engines): color the status dot in the All engines list
adnan-bhaldar Nov 13, 2026
50b4829
style(engines): fix line endings in the engine status files
adnan-bhaldar Nov 13, 2026
7ff6eb7
Merge main; renumber krc settings step to schema 88 (main took 87 for…
cre8ive-marketing Nov 13, 2026
bdad994
KRC: list it in README and engine status; apply [offset:] to every li…
cre8ive-marketing Nov 13, 2026
c3f1ff2
Merge main (#1462) into the .nov branch
Ugoyo Nov 13, 2026
86e7606
feat(archive): read NuGet and Android packages like JAR
KnifeLemon Nov 13, 2026
4943d8a
fix(cad): address review on the G-code PR
Ugoyo Nov 13, 2026
9e1ea5d
fix(vector): cap canvas lookups and share embedded pictures (review)
Ugoyo Nov 13, 2026
25ee149
fix(clip): keep the keyboard and place the ringtone window, cap the p…
adnan-bhaldar Nov 13, 2026
4fdae95
fix(cad): address review on Gerber reader (#1458)
Ugoyo Nov 13, 2026
d7d4f28
Resolve FFmpeg's input in one place for every action (MediaInput)
Ugoyo Nov 13, 2026
1a63686
fix(image): close hostile-xcf budget gaps and cancel merging
Ugoyo Nov 13, 2026
f45ae59
Read only four bytes of a file that can't be a Hikvision recording
Ugoyo Nov 13, 2026
e88ffc2
fix(engines): address review feedback on the status tags
adnan-bhaldar Nov 13, 2026
fa01f93
feat(i18n): add Mongolian translation
xGARIDx Nov 13, 2026
93c5a4f
test(engines): run the ExifTool memory test on its own
KnifeLemon Nov 13, 2026
22f9008
Merge pull request #1441 from lightscape-jm/claude/donut-editor-873-1…
KnifeLemon Nov 13, 2026
7f61057
Merge pull request #1470 from KnifeLemon/feat/package-archives
KnifeLemon Nov 13, 2026
62fc97f
Merge main; krc settings step moves to schema 89 (main took 88 for .n…
cre8ive-marketing Nov 13, 2026
3c293d7
Merge pull request #1412 from Ugoyo/claude/weasyprint-1403
KnifeLemon Nov 13, 2026
2067a4a
Merge main; the Gerber migration moves to schema 89
Ugoyo Nov 13, 2026
19fd9ce
Merge main into the .nov branch
Ugoyo Nov 13, 2026
3344f57
Merge main; the G-code migration moves to schema 89
Ugoyo Nov 13, 2026
6aa1312
Merge KnifeLemon/main into claude/json-canvas
Ugoyo Nov 13, 2026
673bb60
fix(engines): download LibreOffice from its permanent archive
KnifeLemon Nov 13, 2026
dcbbc59
Merge pull request #1456 from cre8ive-marketing/feature/krc-lyrics
KnifeLemon Nov 13, 2026
92f58e7
Merge pull request #1440 from Ugoyo/claude/xcf-layers
KnifeLemon Nov 13, 2026
1c62ff5
Merge pull request #1459 from adnan-bhaldar/ui/engine-status-tags
KnifeLemon Nov 13, 2026
dca97e6
Merge pull request #1430 from adnan-bhaldar/feat/clip-sound
KnifeLemon Nov 13, 2026
570cfca
Merge remote-tracking branch 'origin/main' into fill-1471
KnifeLemon Nov 13, 2026
08704be
i18n(mn): add the keys main gained since this branch was cut
KnifeLemon Nov 13, 2026
bbbaa94
i18n(mn): list Mongolian last and leave the traditional script on the…
KnifeLemon Nov 13, 2026
cc31827
Write the shared Hikvision header to Filee's work folder, not /tmp
Ugoyo Nov 13, 2026
8661c08
Merge main into the .nov branch
Ugoyo Nov 13, 2026
9a6dff6
fix(image): let every picture reader cancel an XCF merge
Ugoyo Nov 13, 2026
791b1e5
feat(engines): take a download from Filee's mirror when its URL fails
KnifeLemon Nov 13, 2026
4136631
feat(image): read and write Valve textures (VTF) for Garry's Mod and …
ltsammy Nov 13, 2026
66c7dfc
fix(image): keep VTF reading within a pixel budget and 64-bit sizes
ltsammy Nov 13, 2026
b813ae4
build: put a README with each file's source next to the mirrored engines
KnifeLemon Nov 13, 2026
335a711
Merge pull request #1463 from Ugoyo/claude/wisenet-nov
KnifeLemon Nov 13, 2026
071cf68
Merge pull request #1472 from KnifeLemon/fix/exiftool-memory-test-alone
KnifeLemon Nov 13, 2026
bb72dfc
Merge #1458 (Gerber) into the format integration; its migration becom…
KnifeLemon Nov 13, 2026
9d191b0
Merge #1445 (JSON Canvas) into the format integration; its migration …
KnifeLemon Nov 13, 2026
4e02603
Merge #1461 (G-code) into the format integration; its migration becom…
KnifeLemon Nov 13, 2026
ccf3325
Merge pull request #1484 from KnifeLemon/fix/libreoffice-archive-url
KnifeLemon Nov 13, 2026
f500c2b
Merge pull request #1485 from Ugoyo/claude/xcf-layers
KnifeLemon Nov 13, 2026
4d2bbfa
feat(pdf): fit every page of a merged PDF to one paper size
SeoJCalive Nov 13, 2026
3fa14b6
fix(pdf): keep annotation links and refuse over-budget pages when fit…
SeoJCalive Nov 14, 2026
ca3b277
build(macos): pin the disk image tool's dependencies
SeoJCalive Nov 14, 2026
c5aacfd
Merge pull request #1487 from KnifeLemon/feat/engine-download-mirror
KnifeLemon Nov 14, 2026
317a903
i18n(mn): a shorter Gradient label that fits the Add background window
KnifeLemon Nov 14, 2026
7b35068
feat(toolbar): show when extraction presets use ordinary conversion
SeoJCalive Nov 12, 2026
6d029be
fix(toolbar): keep the donut guidance readable in a small centre
SeoJCalive Nov 13, 2026
343081c
fix(toolbar): fit centre notices with bundled script fonts
SeoJCalive Nov 13, 2026
909822e
fix(toolbar): reject unplaceable centre notice layouts
SeoJCalive Nov 13, 2026
e559e87
fix(toolbar): leave platform margin for centre notices
SeoJCalive Nov 14, 2026
8038ffd
Merge pull request #1493 from KnifeLemon/integrate/ugoyo-formats
KnifeLemon Nov 14, 2026
76afa7b
Merge main into feat/vtf; VTF migration moves to schema 94
KnifeLemon Nov 14, 2026
ba187a9
feat(engines): one Ready status that says where each engine comes from
lightscape-jm Nov 13, 2026
1466964
fix(engines): review follow-ups for the Ready status (#867)
lightscape-jm Nov 14, 2026
7641889
fix(engines): the status colours of #1459 on the one Ready status (#867)
lightscape-jm Nov 14, 2026
7fdb936
fix(toolbar): screen-reader names on the toolbar page; CHANGELOG poin…
lightscape-jm Nov 14, 2026
ce3afc5
fix(engines): no WeasyPrint from the PC on the Engines page; drop the…
lightscape-jm Nov 14, 2026
9233997
Merge branch 'main' of https://github.com/KnifeLemon/Filee into feat/…
KnifeLemon Nov 14, 2026
0739346
i18n(mn): the keys main added since (Wisenet exports, G-code, Obsidia…
KnifeLemon Nov 14, 2026
a516004
fix(pdf): keep links and markup that only lack the print flag when ma…
SeoJCalive Nov 14, 2026
a5d025d
Merge pull request #1483 from ltsammy/feat/vtf
KnifeLemon Nov 14, 2026
749402b
Merge pull request #1471 from xGARIDx/feat/mongolian-localization
KnifeLemon Nov 14, 2026
ca9dda6
Merge pull request #1504 from KnifeLemon/fix/pdfa-keep-links
KnifeLemon Nov 14, 2026
f23d9fc
Merge pull request #1503 from lightscape-jm/claude/engines-ready-867-…
KnifeLemon Nov 14, 2026
2a1a004
Merge pull request #1420 from KnifeLemon/feat/1091-ordinary-conversio…
KnifeLemon Nov 14, 2026
5089a1a
Merge pull request #1451 from KnifeLemon/feat/pdf-merge-paper-size
KnifeLemon Nov 14, 2026
770e982
Merge pull request #1497 from KnifeLemon/build/dmg-requirements
KnifeLemon Nov 14, 2026
1de42e7
Merge main into builtin-engines (2026-11-15)
KnifeLemon Nov 14, 2026
1b28449
fix(archives): refuse a ZIP cut off before its directory
KnifeLemon Nov 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -171,11 +171,11 @@ jobs:
path: build/.cache/zig-x86_64-windows-0.16.0
key: zig-0.16.0-x86_64-windows

# rhwp, Pandoc, 7-Zip and ExifTool are small; with them the HWP/HWPX, archive and metadata engine tests run too
# (LibreOffice is skipped to save time).
- name: Fetch rhwp, Pandoc, 7-Zip and ExifTool for engine tests
# rhwp, Pandoc, 7-Zip, ExifTool and WeasyPrint are small; with them the HWP/HWPX, archive, metadata and WeasyPrint
# engine tests run too, WeasyPrint's against the pinned Windows build (LibreOffice is skipped to save time).
- name: Fetch rhwp, Pandoc, 7-Zip, ExifTool and WeasyPrint for engine tests
shell: pwsh
run: ./build/fetch-engines.ps1 -Only rhwp,pandoc,7zip,exiftool
run: ./build/fetch-engines.ps1 -Only rhwp,pandoc,7zip,exiftool,weasyprint

# The UI tests on their own first, as the release runs them (there they crashed with 0xC0000005): a crash
# names the test that was running and leaves a dump in TestResults.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/portable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ jobs:

- name: Disk image tool
if: runner.os == 'macOS'
run: python3 -m pip install dmgbuild==1.6.7
run: python3 -m pip install -r installer/macos/dmg/requirements.txt

- name: Linux desktop dependencies
if: runner.os == 'Linux'
Expand Down
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ Fixes for two advisories, [GHSA-gw2f-hq9g-3jc2](https://github.com/KnifeLemon/Fi
- **OCR in several languages:** a preset's OCR can read more than one language at once, for scans that mix them (Simplified Chinese and English, for example).
- **Subtitles and transcripts to TXT:** subtitle files (SRT, ASS, WebVTT, SAMI, LRC, TTML and more) convert to plain text with one line per cue and no times. With *Generate subtitles (Whisper)* turned on, a TXT preset turns speech in a video or sound file into text.
- **Animated AVIF:** animated GIF, WebP, APNG and MNG keep every frame in AVIF, and an animated AVIF converts as an animation. With the FFmpeg engine installed, writing is much faster and can be cancelled.
- **Show output format** (*Settings → Donut toolbar → Appearance*; by @lightscape-jm): turn it off to show only the slice names. It's on by default.
- **Show output format** (*Settings → Donut toolbar → Edit Donut Size*; by @lightscape-jm): turn it off to show only the slice names. It's on by default.
- **New languages:** বাংলা (Bengali, by @fluentmoheshwar) and فارسی (Persian, by @nimazerobit).
- **Engines page** (by @adnan-bhaldar): dragging an engine card is animated, with an outlined slot and a smaller copy that follows the pointer, and only the drag handle shows the move cursor. It follows *Reduce animations*.
- **Settings → General** (by @adnan-bhaldar): the Settings folder card says what Filee keeps there, and each button of the Presets and toolbars card has an icon and a short description. *Clear history* and *Clear* on the Triggers page use the danger style.
Expand Down
14 changes: 12 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,18 @@ dotnet test Filee.slnx -c Release
pwsh build/build-portable.ps1 -Runtime linux-x64
```

Use the matching runtime on a Mac or ARM64 Linux machine. A Mac also needs dmgbuild for the disk image
(`python3 -m pip install dmgbuild==1.6.7`). Magick.NET has no ImageMagick library for Intel Macs: there,
Use the matching runtime on a Mac or ARM64 Linux machine. A Mac also needs dmgbuild for the disk image. Homebrew's
Python refuses `pip install` outside a virtual environment (PEP 668), so install it into one and run the build from
a shell where that environment is active:

```sh
python3 -m venv ~/.venvs/filee-dmg
source ~/.venvs/filee-dmg/bin/activate
python3 -m pip install -r installer/macos/dmg/requirements.txt
```

`build-portable.ps1` checks for it with `python3 -c 'import dmgbuild'`, so a pipx install isn't found.
Magick.NET has no ImageMagick library for Intel Macs: there,
put Filee's own next to each build after building, e.g.
`pwsh build/fetch-magick-native.ps1 -Runtime osx-x64 -Destination src/Filee.App/bin/Debug/net10.0`. Packaging runs on Linux/macOS so archives retain
executable permissions. Each archive contains the app, CLI, rhwp, installation instructions and per-user
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,8 +166,8 @@ To undo it, remove the entries in Windows Security → App & browser control →

| From | To |
|---|---|
| **Images**: JPG, PNG, WEBP, AVIF, TIFF, BMP, GIF, APNG, ICO, ICNS, JPEG XL, JPEG 2000, PSD/PSB, TGA, PPM, HEIC, QOI, DDS, PCX, MNG, CUR, …;<br>GIMP XCF, camera RAW (CR2, CR3, NEF, ARW, DNG, …), DICOM, OpenEXR, HDR, FITS, JPEG XR (Windows), iPhone Live Photo (LIVP), Paint.NET PDN (↔ PSD with its layers), animated cursor (ANI) read | any of these (HEIC⁵), Paint.NET PDN, PDF, SVG (traced), resized, grayscale;<br>Live/Motion Photos (iPhone, Android) → their video (MP4, MOV⁵), and a video → Live Photo (iPhone) or Motion Photo (Android)⁵, experimental |
| **Vector**: SVG, SVGZ, EMF, WMF, AI, Visio VSDX, ODG, FODG<br>EPS, PS¹<br>CDR, binary Visio VSD, CGM² | PDF (vector), PNG and other images,<br>SVG ↔ SVGZ, SVG → DXF/DWG, PDF → EPS/PS, SVG → EMF, WMF, ODG² |
| **Images**: JPG, PNG, WEBP, AVIF, TIFF, BMP, GIF, APNG, ICO, ICNS, JPEG XL, JPEG 2000, PSD/PSB, TGA, PPM, HEIC, QOI, DDS, PCX, MNG, CUR, …;<br>camera RAW (CR2, CR3, NEF, ARW, DNG, …), DICOM, OpenEXR, HDR, FITS, JPEG XR (Windows), iPhone Live Photo (LIVP), Valve Texture VTF (Source engine, Garry's Mod), animated cursor (ANI) read;<br>GIMP XCF and Paint.NET PDN (layers kept between XCF, PDN and PSD) | any of these (HEIC⁵), GIMP XCF, Paint.NET PDN, VTF, PDF, SVG (traced), resized, grayscale;<br>Live/Motion Photos (iPhone, Android) → their video (MP4, MOV⁵), and a video → Live Photo (iPhone) or Motion Photo (Android)⁵, experimental |
| **Vector**: SVG, SVGZ, EMF, WMF, AI, Visio VSDX, ODG, FODG<br>EPS, PS¹<br>CDR, binary Visio VSD, CGM²<br>Obsidian Canvas (JSON Canvas) read | PDF (vector), PNG and other images,<br>SVG ↔ SVGZ, SVG → DXF/DWG, PDF → EPS/PS, SVG → EMF, WMF, ODG²;<br>Obsidian Canvas → its text as Markdown |
| **PDF** | DOCX, HWPX, TXT, PNG, JPG, TIFF, CBZ, PPTX (a picture of each page), SVG²;<br>merge (in an order you choose first), split, page ranges, compress (smaller PDFs) |
| **Documents**: DOCX, DOCM, DOTX, DOC, DOT, ODT, EML, Outlook MSG;<br>OFD (Chinese e-invoices, official documents) read<br>FODT, OTT, RTF, WPS, WPD, Pages, ClarisWorks, MacWrite, T602, …² | PDF, DOCX, ODT, HWPX, EPUB, TXT, HTML, PPTX and ODP slides;<br>MSG → EML<br>FODT, OTT² |
| **Spreadsheets**: XLSX, XLSM, XLS, XLT, ODS, CSV, TSV<br>OTS, FODS, Numbers, ET² | PDF, XLSX, ODS, CSV, TSV, JSON, HWPX, HTML<br>XLT, OTS² |
Expand All @@ -177,9 +177,9 @@ To undo it, remove the entries in Windows Security → App & browser control →
| **E-books**: EPUB, KEPUB, MOBI, AZW3, AZW, AZW4, FB2, CBZ, CBR, CB7, HTMLZ, TXTZ, CHM, PDB, PML, TCR, RB, SNB, OEB<br>LIT, LRF⁴ | PDF, EPUB, KEPUB (Kobo), DOCX, TXT, HTML, HWPX<br>MOBI, AZW3 |
| **Video**⁵: MP4, MOV, MKV, WEBM, AVI, WMV, FLV, MPEG, Video CD (DAT), TS, M2TS, 3GP, OGV, VOB, … | MP4 (H.264, HEVC, AV1), WEBM, MOV, MKV, AVI, GIF, APNG, MP3, M4A, 720p,<br>subtitles (SRT, ASS, WebVTT) |
| **Audio**⁵: MP3, M4A, AAC, WAV, FLAC, OGG, OPUS, WMA, AIFF, AMR, APE, WavPack, TTA, DSD (DSF, DFF), DTS, AC3, E-AC3, … | MP3, M4A (AAC, ALAC), WAV, FLAC, OGG, OPUS, AAC, WavPack, TTA, W64, AC3, E-AC3 |
| **Subtitles**: SRT, ASS/SSA, WebVTT, SAMI (SMI), LRC, TTML, MicroDVD, SCC | each other as UTF-8 (Korean CP949 files read correctly) |
| **Subtitles**: SRT, ASS/SSA, WebVTT, SAMI (SMI), LRC, KRC, TTML, MicroDVD, SCC | each other as UTF-8 (Korean CP949 files read correctly) |
| **Archives**: ZIP, ANSYS Workbench (WBPZ), 7Z, RAR, TAR, TAR.GZ, TAR.BZ2, TAR.XZ, GZ, XZ, ISO, UDF, IMG, DMG, CAB, LHA, ARJ, ALZ, EGG, … | extract, ZIP, 7Z, TAR, TAR.GZ, TAR.XZ, XZ;<br>any files → one ZIP |
| **CAD**: DWG, DXF | PDF, SVG, PNG, DWG ↔ DXF |
| **CAD**: DWG, DXF<br>Gerber PCB layers (GBR, GTL, GBL, GTO, …) read;<br>G-code of 3D printers and CNC machines (GCODE, GCO, NGC) read | PDF, SVG, PNG, DWG ↔ DXF;<br>G-code → toolpath (from above or isometric) or the slicer's preview |
| **Fonts**: TTF, OTF, WOFF, WOFF2, EOT;<br>FON (Windows bitmap fonts) read | each other;<br>FON → one font per size |
| **Data**: JSON, JSON Lines, YAML, TOML, XML<br>vCard, iCalendar | each other, CSV and XLSX (tables);<br>vCard, iCalendar ↔ CSV |
| **3D models**: GLB, glTF, STL, OBJ (+ MTL), 3MF, PLY;<br>FBX read | each other, PNG preview |
Expand Down
1 change: 1 addition & 0 deletions THIRD-PARTY-NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ Downloaded from their official release pages when the user chooses to install th
| Microsoft Visual C++ Redistributable (for Ghostscript and Upscayl, conda-forge `vc14_runtime` and `vcomp14`) | Microsoft Visual C++ Redistributable license | https://github.com/conda-forge/vc-feedstock |
| FFmpeg 9.0.2 (gyan.dev "full_build-shared" Windows build; ffmpeg.exe, ffprobe.exe and their libraries, incl. x264, x265, libvpx, LAME, Opus, Vorbis, Theora, OpenCORE AMR) | GPL-3.0-or-later (the build is configured with `--enable-gpl --enable-version3`); FFmpeg itself LGPL-2.1-or-later | https://ffmpeg.org, build: https://www.gyan.dev/ffmpeg/builds/ (source: https://github.com/GyanD/codexffmpeg) |
| calibre (ebook-convert) | GPL-3.0 | https://calibre-ebook.com |
| WeasyPrint 70.0 (Windows "onedir" build, `weasyprint-windows-onedir.zip`: `weasyprint.exe` with its `_internal` folder, built with PyInstaller on MSYS2 UCRT64; it embeds Python 3.14, Pango, HarfBuzz, FreeType, Fontconfig, FriBidi, GLib, libthai, Pillow, fontTools, Pyphen, pydyf, tinycss2, cssselect2, Brotli, Zopfli, OpenSSL, zlib, libpng, Expat and the MinGW runtime) | BSD-3-Clause (WeasyPrint); PSF-2.0 (Python); LGPL-2.1-or-later (Pango, GLib, FriBidi, libthai); MIT (HarfBuzz, Fontconfig, fontTools, Brotli, Expat); FreeType License; HPND (Pillow); GPL/LGPL/MPL tri-licence (Pyphen); BSD-3-Clause (pydyf, tinycss2, cssselect2); Apache-2.0 (Zopfli, OpenSSL); GCC Runtime Library Exception (MinGW runtime); zlib and libpng licences | https://github.com/Kozea/WeasyPrint |
| Tesseract OCR 5.4 (UB Mannheim Windows build, with Leptonica and the MinGW libraries it ships; their notices are in its `doc` folder) | Apache-2.0 (Tesseract); Leptonica BSD-2-Clause; others as listed in the build | https://github.com/tesseract-ocr/tesseract, build: https://github.com/UB-Mannheim/tesseract |
| Tesseract language data (tessdata_fast 4.1.0), downloaded per language when used | Apache-2.0 | https://github.com/tesseract-ocr/tessdata_fast |
| whisper.cpp (whisper-cli.exe Windows build) | MIT | https://github.com/ggml-org/whisper.cpp |
Expand Down
8 changes: 5 additions & 3 deletions build/build-portable.ps1
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Builds the Linux or macOS portable package (tar.gz + SHA256SUMS) on its own operating system. macOS also gets a
# disk image (the signed Filee.app next to an Applications link, to drag it there, on the background and window
# layout of installer/macos/dmg, built with dmgbuild: python3 -m pip install dmgbuild==1.6.7). The image itself is not
# signed, and neither it nor the app is notarized here.
# layout of installer/macos/dmg, built with dmgbuild, pinned in installer/macos/dmg/requirements.txt). The image
# itself is not signed, and neither it nor the app is notarized here.
#
# Linux packages must run on Ubuntu 22.04 (glibc 2.35). rhwp's Linux release needs a newer glibc, so CI builds it from
# source on Ubuntu 22.04 (build/build-native.py) and passes it in:
Expand Down Expand Up @@ -36,7 +36,9 @@ if (($Runtime.StartsWith('osx-') -and -not $IsMacOS) -or ($Runtime.StartsWith('l
}
if ($Runtime.StartsWith('osx-')) {
python3 -c 'import dmgbuild' 2>$null
if ($LASTEXITCODE -ne 0) { throw 'The disk image needs dmgbuild: python3 -m pip install dmgbuild==1.6.7' }
if ($LASTEXITCODE -ne 0) {
throw 'The disk image needs dmgbuild: install installer/macos/dmg/requirements.txt into an active virtual environment (CONTRIBUTING.md).'
}
}
if ($RhwpOverride -and -not $Runtime.StartsWith('linux-')) {
throw '-RhwpOverride is for Linux packages.'
Expand Down
44 changes: 37 additions & 7 deletions build/fetch-engines.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
can't call without building Filee); the language data is downloaded by the app when needed
exiftool/ ExifTool (Perl's licence, separate program), the Windows build: exiftool(-k).exe renamed
exiftool.exe (the "-k" makes it wait for a key), with its exiftool_files/ beside it
weasyprint/ WeasyPrint (BSD-3-Clause, separate program), its Windows "onedir" build: weasyprint.exe with
its _internal/ folder (Python, Pango, HarfBuzz, ...) and LICENSE, HTML -> PDF

Every download is pinned to a version and verified with SHA-256 (src/Filee.Engines/Infrastructure/engines.json,
shared with the app). Downloads are cached in build/.cache.
Expand Down Expand Up @@ -129,15 +131,26 @@ function Get-Engine([string]$name, [switch]$X64) {
Write-Host "ok $name (cached)"
return $file
}
Write-Host "get $name $($info.Url)"
# GitHub's release downloads answer 504 for minutes at a time, which stopped whole CI runs: try again a few times.
Invoke-WebRequest -Uri $info.Url -OutFile $file -UseBasicParsing -UserAgent 'Filee-build' -MaximumRetryCount 5 -RetryIntervalSec 20
$hash = (Get-FileHash $file -Algorithm SHA256).Hash
if ($hash -ne $info.Sha256) {
# Filee's own copy (EngineDownloads.MirrorUrl), for when the pinned URL is gone, e.g. a retired LibreOffice (#1474).
$mirror = 'https://dl.filee.sh/engines/' + $info.Sha256.ToLowerInvariant() + '/' + [Uri]::EscapeDataString([Uri]::UnescapeDataString(($info.Url -split '/')[-1]))
foreach ($url in @($info.Url, $mirror)) {
Write-Host "get $name $url"
try {
# GitHub's release downloads answer 504 for minutes at a time, which stopped whole CI runs: try again a few times.
Invoke-WebRequest -Uri $url -OutFile $file -UseBasicParsing -UserAgent 'Filee-build' -MaximumRetryCount 5 -RetryIntervalSec 20
}
catch {
Write-Warning "$name could not be downloaded from $url ($($_.Exception.Message))"
continue
}
$hash = (Get-FileHash $file -Algorithm SHA256).Hash
if ($hash -eq $info.Sha256) {
return $file
}
Remove-Item $file
throw "Checksum mismatch for $name. Expected $($info.Sha256), got $hash."
Write-Warning "Checksum mismatch for $name from $url. Expected $($info.Sha256), got $hash."
}
return $file
throw "$name could not be downloaded with its pinned SHA-256 ($($info.Sha256)) from $($info.Url) or $mirror."
}

function Reset-Folder([string]$path) {
Expand Down Expand Up @@ -337,6 +350,23 @@ if ('exiftool' -in $selected) {
if (-not (Test-Path (Join-Path $target 'exiftool.exe'))) { throw 'exiftool.exe not found in the archive.' }
}

if ('weasyprint' -in $selected) {
# As EngineInstaller.WeasyPrintFolder does: the folder with weasyprint.exe (onedir/weasyprint), with the licence
# from the top of the zip moved into it.
$tmp = Join-Path $cache ('w-' + [Guid]::NewGuid().ToString('N').Substring(0, 8))
Expand-Archive -Path (Get-Engine 'weasyprint') -DestinationPath $tmp
$exe = Get-ChildItem $tmp -Recurse -Filter 'weasyprint.exe' | Select-Object -First 1
if (-not $exe) { throw 'weasyprint.exe not found in the archive.' }
$target = Join-Path $Destination 'weasyprint'
Reset-Folder $target
Get-ChildItem $exe.DirectoryName -Force | Move-Item -Destination $target
foreach ($name in 'LICENSE', 'README.rst') {
$file = Join-Path $tmp $name
if (Test-Path $file) { Move-Item -LiteralPath $file -Destination $target -Force }
}
Remove-Item $tmp -Recurse -Force
}

if ('calibre' -in $selected) {
$msi = Get-Engine 'calibre'
$tmp = Join-Path $cache 'calibre-admin'
Expand Down
Loading
Loading