Repository navigation
feat(audio): read tracker modules (XM, IT, S3M) through FFmpeg - #1399
Merged
Merged
Conversation
FastTracker 2 .xm, Impulse Tracker .it and Scream Tracker 3 .s3m modules are read-only audio formats that go to every audio target in one FFmpeg step. FFmpeg plays them only through its libopenmpt (or libmodplug) demuxer: the gyan.dev full build and BtbN's Linux GPL builds that Filee downloads have it, Homebrew's FFmpeg on macOS does not. Filee reads `ffmpeg -demuxers` once per executable and, without either demuxer, stops the file with error.tracker_needs_openmpt instead of FFmpeg's "Invalid data found". Settings schema 81 adds the three extensions to existing audio donuts without taking custom claims (80 is claimed by #1390). Amiga .mod stays the camcorder video it already is. Closes #1376 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # src/Filee.Core/Settings/AppSettings.cs # src/Filee.Core/Settings/UserDataStore.cs
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.
What users notice
FastTracker 2 modules (
.xm) open on the audio donut and convert to every audio target (MP3, WAV, FLAC, M4A, OGG, …) through FFmpeg. Impulse Tracker (.it) and Scream Tracker 3 (.s3m) modules come along, since FFmpeg reads all three through the same demuxer. All three are read only.FFmpeg has no tracker demuxer of its own; it needs
libopenmpt(or the olderlibmodplug). I checked the builds Filee downloads instead of assuming:ffmpeg-9.0.2-full_build-shared.zipautobuild-2026-09-30-13-08linux64-gpl/linuxarm64-gplscripts.d/50-openmpt.shat that tag turns it off only forwinarm64ffmpeg.rbhas no libopenmpt or libmodplugSo an FFmpeg without either demuxer now stops a tracker module with a translated message ("This FFmpeg can't read tracker modules (XM, IT, S3M): it was built without libopenmpt. …") instead of FFmpeg's "Invalid data found". Filee asks
ffmpeg -demuxersonce per executable, the same way it already caches-codecs,-encodersand-filters.Amiga
.modis not added: that extension is already the camcorder MOD video.What changed
src/Filee.Core/Formats/FormatRegistry.cs:xm,it,s3mas read-only audio formats.src/Filee.Core/Formats/FormatFields.cs: XM and IT graded specialist (audio-pro + game), S3M legacy (legacy + audio-pro, replaced by IT).src/Filee.Engines/Media/FfmpegConverter.cs:DemuxersOfAsync/ParseDemuxersand the tracker check inConvertAsyncandJoinAsync.src/Filee.Core/Settings/UserDataStore.cs,AppSettings.cs: settings schema 81 adds the three extensions to existing audio donuts; custom claims stay put. 80 is skipped because feat(image): read Windows animated cursors (.ani) #1390 already claims it, so this may need renumbering depending on merge order.src/Filee.App/Assets/i18n/*.json:error.tracker_needs_openmptin all 22 languages.docs/ENGINES.md: the tracker paragraph under FFmpeg's read-only formats.Tests
tests/Filee.Core.Tests/TrackerModuleFormatTests.cs(new): detection, audio donut, schema 81 migration (learns once, leaves a user's own claim, survives a restart).tests/Filee.Core.Tests/FormatFieldsTests.cs: the pinned lists and grade counts.tests/Filee.Engines.Tests/MediaTests.cs: routes for all three modules,-demuxersparsing and the libopenmpt/libmodplug decision, and a real conversion of an XM written by the test (two channels, one pattern, a square-wave sample) to WAV, MP3 and FLAC. That test checks the length and that the WAV isn't silent. Against an FFmpeg without libopenmpt it checks Filee's message instead.Localization*.dotnet format --verify-no-changesis clean on the touched projects.Not covered
Closes #1376
🤖 Generated with Claude Code