Skip to content

Latest commit

 

History

History
473 lines (349 loc) · 49.7 KB

File metadata and controls

473 lines (349 loc) · 49.7 KB

Changelog

All notable changes to futureburn will land here. Format roughly follows Keep a Changelog, versioning is SemVer — though while we're pre-1.0 the rules are loose: minor version = a milestone from the README roadmap, patch version = everything else.

[Unreleased]

[0.0.56] — 2026-08-09

Added — optical image toolkit (rip / convert / mount / erase)

Folds the non-driver value of DAEMON Tools (adware now) into futureburn, which already owned the optical layer. The guiding rule — avoid the kernel driver, ship the documented-API cousin — means the virtual-SCSI driver DAEMON Tools sells is deliberately skipped; everything here is plain user-mode work:

  • rip <drive> <out.iso> — grab a finalized data disc (CD/DVD/BD) to an ISO via SPTI READ (10). Unreadable sectors are retried, then zero-filled and counted so a rip completes on a scratched disc. Verified end-to-end: ripped the burned Dalmatians BD-R back to a 2,460,288-sector ISO that re-mounts clean.
  • convert <image> <out.iso> — BIN/CUE, MDF/MDS, and NRG → ISO. NRG's data extent is read from its NERO/NER5 footer; MDF/NRG sector layout (cooked 2048 vs raw 2352 Mode 1/2) is detected from the CD-ROM sync mark and the 2048-byte payload extracted. Round-trip verified byte-identical for all three formats.
  • mount <image> / unmount <image | X:> — mount via Windows' native AttachVirtualDisk (the Tier-A cousin — no driver). ISO/IMG/VHD mount directly; BIN/CUE/MDF/NRG auto-convert to a temp ISO first. futureburn keeps a small mount ledger so unmount <letter> works (Windows exposes no clean letter→image reverse lookup) and cleans up temp ISOs on unmount.
  • erase <drive> [--full] — blank a rewritable: BLANK for CD-RW/DVD-RW, FORMAT UNIT for DVD+RW/DVD-RAM/BD-RE. Built and wired, but not yet verified on hardware (no rewritable disc on the bench — the test drive only had write-once BD-R). Confirm on a CD-RW/BD-RE before trusting it.
  • New Core: DiscRipper, ImageConverter, DiscEraser, DiskImageMounter, plus SPTI Read10 / ReadCapacity10 / Blank / FormatUnit.

Added — GUI "Image Tools" tile

Fifth main-window tile surfacing rip / convert / mount / unmount / erase, with a drive picker, live progress + log, and background-threaded operations. Tile subtitles now wrap instead of clipping. Tiles carry AutomationProperties.Name (accessibility + drives the screenshot harness).

Added — screenshot harness

scripts/capture-screenshots.ps1 launches the GUI, invokes each tile via UI Automation, and captures every window to docs/screenshots/*.png with PrintWindow (per-monitor-DPI-aware, so scaled displays capture at full res).

[0.0.55] — 2026-07-15

Added — Blu-ray support: BD-R burning + bd-author (MKV → BDMV)

First real Blu-ray milestone, developed and verified end-to-end on a Pioneer BDR-206 with blank BD-R media:

  • BD-R / BD-RE image burning. SptiDataBurner now recognises the Blu-ray profiles (0x0041 BD-R SRM, 0x0042 BD-R RRM, 0x0043 BD-RE) and burns them through the DVD-R Sequential path (RESERVE TRACK → WRITE 12 → CLOSE), with BD's 1× = 4390 KB/s speed unit and a tolerant MODE SELECT (BD-R records sequentially by profile; the CD/DVD Write Parameters page is skipped if the drive refuses it). burn-iso and burn-folder both get BD for free.
  • BD-R finalization fix. BD-R SRM finalizes with CLOSE TRACK/SESSION function 6 ("finalize disc"), not function 2 — function 2 is a no-op on BD-R and leaves the disc Incomplete forever. Verified on the BDR-206: fn 2 → still Incomplete after 5 min; fn 6 → Finalized in ~2 s. finalize <drive> now auto-picks the right function from the loaded profile (with an optional numeric override for probing).
  • bd-author <input> <out.iso> — author a playable Blu-ray (BD-Video) from any video file. BD-legal streams (H.264 ≤L4.1 at a legal frame size, AC-3/DTS/LPCM/TrueHD audio) are muxed with no re-encode; anything else is conformed with ffmpeg (re-encode to H.264 High@4.1 with padding to a legal frame size, transcode non-BD audio to AC-3). Text subtitles are rendered to PGS and chapters are carried over. Output is a UDF 2.50 Blu-ray ISO; --burn <drive> chains straight into the BD-R burn. Muxing/BDMV/UDF work is delegated to tsMuxeR (located, not bundled — Apache-licensed but a portable download); bd-author-info checks the toolchain.
  • New MkvBdPipeline, TsMuxerLocator, TsMuxerRunner.

Fixed

  • FfprobeRunner.TryInt threw on 64-bit chapter IDs. MKV chapters carry a 64-bit ChapterUID that ffprobe reports as id; JsonElement.GetInt32() threw FormatException on any value past Int32, killing every probe of such a file — which also affected dvdv-author. Now uses TryGetInt32 and falls back gracefully.

CI — GitHub Actions release pipeline

  • Ported .gitlab-ci.yml to .github/workflows/release.yml. On each push to main a windows-latest job builds the solution, runs the xUnit suite, and publishes the two self-contained single-file x86 .exes (CLI + GUI) as the assets of a rolling latest pre-release. GitHub-hosted standard runners are free with unlimited minutes on public repos, so this can stand in for the self-hosted buildforever runners. The GitLab SMB deploy step has no cloud equivalent (runners can't reach the LAN share) — the binaries live on the GitHub Release instead.

[0.0.54] — 2026-05-22

Added — app icon, how-it-works docs, leaner README

Housekeeping pass, no behaviour changes:

  • Mascot icon. The cool-CD character (src/Futureburn.Gui/app.ico) is now the program/taskbar icon, wired in via <ApplicationIcon>. The source art's white background was flood-filled to transparency from the edges — so the character's own whites (sneakers, disc highlights) survive while the background drops out — then squared and rendered into a 16–256 px multi-resolution .ico.
  • docs/ folder. New how-it-works documentation: architecture, burn engines, audio CDs, data discs, video discs, LightScribe, the CD-Text/gapless situation, and a full CLI reference. docs/README.md is the index.
  • README cleanup. The bloated 27-bullet "What works today" list is now a concise grouped feature list. CD-Text and --gapless moved to a new "Coming later" section (they need an SAO-capable drive — see docs/cd-text-and-gapless.md). Fixed stale text claiming three GUI tiles are placeholders (all four are live) and corrected the outdated repository-layout tree.
  • Refreshed screenshots. All four window screenshots updated to v0.0.54 (mascot icon now visible in the title bars), plus a new Burn Label (LightScribe) screenshot in the README.
  • CI/CD on the project's own GitLab. Added .gitlab-ci.yml for buildforever.cloud — Windows-runner pipeline that builds, runs the xUnit suite, publishes self-contained single-file x86 CLI and GUI .exes per push to main, and drops them on the releases SMB share at /mnt/releases/futureburn/<ref>/ via the dedicated gitlab-ci SMB user (creds via masked CI variables, mounted with New-PSDrive -Credential). Bypassed a PublishSingleFile + WPF + x86 landmine — SetWindowLongWndProc DllNotFoundException — with IncludeAllContentForSelfExtract=true. New scripts/install_dotnet8_windows_runner.py automates the runner-side machine-wide .NET SDK install via Proxmox qm guest exec. origin is wired to fan-push to both GitHub and buildforever from one command.

[0.0.53] — 2026-05-22

Fixed — SEND CUE SHEET cue sheet format (binary, no pointer entries)

The DAO/SAO cue-sheet builder (SptiCueSheet) had three format bugs that made a drive reject SEND CUE SHEET with sense 0x5/0x26/0x00 (INVALID FIELD IN PARAMETER LIST) — so --gapless and CD-Text never actually worked:

  • It BCD-encoded track numbers and MSF times. The SEND CUE SHEET parameter list is plain binary — the v0.0.41 "BCD fix" was backwards. (cdrecord and libburn both emit binary; confirmed against MMC-5 §6.26.)
  • It emitted A0/A1/A2 pointer descriptors. A cue sheet has none — the drive derives first/last track and the lead-out from the descriptor stream. The sheet is now: one lead-in entry, two per track, one lead-out entry.
  • DATA FORM on the lead-in and lead-out entries was 0x00; it must be 0x01 (audio pause).

The cue sheet now matches what cdrecord/libburn emit, byte for byte (worked example covered by a test). New cuesheet-probe <drive> diagnostic sends cue sheets to a drive and reports acceptance — SEND CUE SHEET writes nothing, so it's free to run against a blank disc.

Note — CD-Text needs an SAO-capable drive; the LG GE20LU10 isn't one

With the corrected cue sheet, the test-bench GE20LU10 (FE06) still rejects SEND CUE SHEET — and rejects all seven structurally-different cue sheets cuesheet-probe tries, down to a single-track minimal one. This drive doesn't do DAO/SAO cue-sheet recording. CD-Text rides in the SAO lead-in, so it can't be burned on this drive; it needs an SAO-capable writer. The cue-sheet fix is spec-correct (MMC-5 + cdrecord + libburn) but consequently can't be hardware-validated here. No CD-R was consumed — SEND CUE SHEET writes nothing.

[0.0.52] — 2026-05-22

Fixed — multi-track audio CDs now finalize

Multi-track audio CD-Rs played everywhere they were tested, but READ DISC INFORMATION reported them as Incomplete/appendable, never Finalized. Root cause: the Write Parameters mode page (0x05) set the Multi-session field to 11b — "next session allowed, leave the disc appendable" — under a code comment that wrongly claimed 11b meant "final session." It's the inverse; finalizing a CD-R needs 11b's opposite, 00b. There is no separate CD "close disc" command — the Multi-session bits are what decide whether CLOSE SESSION finalizes or leaves the disc appendable. Fixed to 00b, verified against the MMC-5 Write Parameters page and libburn's mmc_compose_mode_page_5.

Hardware validation pending the next audio-CD burn — but it's a one-byte inverted-flag fix, cross-checked against libburn's source.

[0.0.51] — 2026-05-22

Changed — merged the Drives view into CD Info

v0.0.50's separate Drives tile overlapped almost entirely with CD Info, which already enumerates every drive and inspects the loaded disc. So they're merged: CD Info now also shows a one-line suggested action per drive (blank → ready to burn, finalized → ready to rip, has-data → ...) — the one genuinely new bit Drives had. The standalone Drives window is gone and the main-window tile grid is back to a clean 2×2.

[0.0.50] — 2026-05-22

Added — Drives tile (what's loaded, at a glance)

A new Drives tile on the main window opens a dashboard listing every optical drive, the disc currently in it, its state (blank / finalized / has-data / erasable, read straight from the drive over SCSI), and a suggested next action. CD Info does the deep single-disc inspection; this is the quick all-drives overview. The main-window tile grid grew from 2×2 to 3×2 to fit it.

[0.0.49] — 2026-05-22

Added — fuzzy MusicBrainz lookup in cd-lookup

cd-lookup now falls back to MusicBrainz's fuzzy TOC search when the exact disc-ID lookup misses. A burned disc almost never reproduces a pressed CD's TOC exactly, so the exact-ID lookup failed on most home-burned and many older discs; the discid/-?toc= endpoint matches releases whose track layout is close and identifies far more of them. Results are labelled as fuzzy matches and capped at the first few pressings (a fuzzy search can return dozens).

Verified against the live MusicBrainz API: a 12-track TOC fuzzy-matched Nirvana's Nevermind, response parsed cleanly.

[0.0.48] — 2026-05-22

Added — bitmap subtitles in the MKV→DVD pipeline

Bitmap subtitle tracks (VobSub, PGS) are now carried into the DVD instead of being detected-and-skipped. ffmpeg re-encodes them straight to the DVD subpicture format in the transcode (-c:s dvdsub) — bitmap→bitmap, which ffmpeg allows; text→bitmap it doesn't, so text subtitles still go via spumux. The dvdauthor <subpicture> declarations are ordered bitmap-then-text to match the muxed stream order, and the 32-subpicture DVD limit is shared across both kinds.

Verified end-to-end: a DVD rip's VobSub track → dvdv-author → a validate-folder-confirmed DVD-Video whose VOB carries the dvd_subtitle stream.

[0.0.47] — 2026-05-21

Added — DVD menus

dvdv-author --menu (and a "DVD menu" checkbox on the GUI's Burn Blu-ray / DVD tile) authors a navigable menu instead of auto-playing the disc:

  • A root menu — "Play Movie", plus "Scene Selection" when the disc has chapters.
  • A scene-selection menu — one button per chapter (up to 12) plus a Back button.
  • DvdMenuBuilder renders the menu art with System.Drawing: the full-colour background, and the transparent highlight/select overlays (identical shapes, ≤3 colours, anti-aliasing off — honouring the DVD 4-colour subpicture rule, the thing most likely to fail on a first attempt).
  • Menu backgrounds become short MPEG-2 stills via ffmpeg; spumux -m dvd muxes the button-highlight subpictures; DvdauthorRunner.BuildMenuXml emits the VMGM root menu + VTSM scene menu with the navigation commands (jump titleset 1 title 1, jump title 1 chapter N, call vmgm menu, ...).
  • Auto-chapters — when --menu is used on a rip with no chapters, ~8 evenly-spaced chapter marks are generated so the scene menu is actually useful.

Tests

  • 6 new DvdMenuTests. 183 tests pass. Verified end-to-end: a 3-chapter MKV → dvdv-author --menu → a validate-folder-confirmed DVD-Video whose root and scene menu VOBs both carry the button-highlight subpicture stream.

Honestly experimental

Menu authoring is verified to produce a well-formed disc; on-TV menu navigation hasn't had a dedicated set-top-player run yet.

[0.0.46] — 2026-05-21

Fixed — GUI file dialogs hung after the first one

Every common file dialog in the WPF GUI (Add files, Choose ISO/folder/video, Choose image, Save M3U8) hung hard after the first one opened in a session — the second OpenFileDialog / OpenFolderDialog / SaveFileDialog shown on the WPF UI thread froze inside the native dialog (CommonItemDialog.RunDialog → native, never returning; Windows reported AppHangB1). A captured stack of the frozen UI thread confirmed the freeze sat in the native common-item-dialog modal loop.

  • New FileDialogs helper runs every common dialog on its own fresh STA thread, so each one is "the first" on a clean thread; the UI thread just awaits and keeps pumping. All seven dialog call sites across the three windows now route through it.

Changed

  • README screenshots refreshed — the four-tile main window, plus a new shot of the Burn Blu-ray / DVD window with its MKV→DVD "Choose video" workflow.

[0.0.45] — 2026-05-21

Added — recent features wired into the WPF GUI

The CD-Text, gapless, and MKV→DVD work was all CLI-only. Now it's clickable.

  • MkvDvdPipeline — the MKV→DVD orchestration (probe → transcode → spumux → dvdauthor) was extracted out of the CLI into Futureburn.Core.Authoring, with log + 0..1 progress callbacks, so the CLI and GUI drive the same code. dvdv-author is now a thin wrapper over it.
  • Burn Blu-ray / DVD tile → "Choose video..." — pick an MKV/MP4/AVI and the window transcodes + authors a real DVD-Video, builds the UDF image, and is ready to burn. The tile's "drop your movie" promise is finally true.
  • Burn Audio CD tile → Gapless + CD-Text — a checkbox row with Gapless (DAO) and CD-Text, plus album/artist fields. Ticking CD-Text enables the fields and implies gapless. Track titles come from the playlist.

Tests

  • 15 new tests for the extracted pipeline helpers (subtitle classification, aspect guessing, ffmpeg progress parsing). 177 tests pass.

[0.0.44] — 2026-05-21

Fixed — two burn-path bugs, found burning a real DVD-Video

First end-to-end hardware run of the MKV→DVD pipeline (Wallace & Gromit's The Wrong Trousers MKV → a finalized DVD-R) surfaced two real bugs:

  • FsImageBuilder capped image size at CD capacity. IMAPI2FS defaults its image-size limit to a CD, so building a UDF image larger than ~700 MB failed with "...larger than the current configured limit" — every DVD-Video or large data DVD would have hit this. Now sets FreeMediaBlocks past Blu-ray capacity; the burn step enforces the actual disc's real capacity.
  • SptiDataBurner reported a false failure on DVD finalization. It trusted CLOSE SESSION's return code, but the GE20LU10 keeps returning sense 0x5/0x72/0x03 (session fixation error — incomplete track) while it finalizes the lead-out asynchronously, which can take minutes. The burn was reported FAILED on a disc that had in fact finalized seconds later. Now polls READ DISC INFORMATION until the disc reports Finalized — the same proven pattern the audio burner uses.

Validated

The MKV→DVD pipeline is now hardware-proven: a 30-minute 1080p MKV transcoded, subtitle-muxed, authored, imaged, and burned to a DVD-R that reads back as a well-formed, finalized DVD-Video. 162 tests pass.

[0.0.43] — 2026-05-21

Added — MKV → DVD-Video pipeline

dvdv-author graduated from "transcode one title" into a real pipeline: feed it an MKV (or MP4, AVI, ...) and it carries the structure through to a hardware-playable DVD-Video — chapters, every audio track, and subtitles — optionally burning the disc in the same command.

  • ChaptersFfprobeRunner now runs -show_chapters and parses chapter markers; they're authored as real DVD chapter stops (next/previous-chapter works on the remote).
  • Multiple audio tracks — the transcode maps every audio stream (up to the DVD limit of 8) to AC-3; each is declared in the dvdauthor XML with its language so players show language labels.
  • Subtitles — text subtitle tracks are extracted to SRT and muxed into the program stream as DVD subpicture streams via spumux (new SpumuxRunner). Bitmap subtitles (VobSub/PGS) are detected and skipped for now.
  • One-command burndvdv-author <in> <out> --burn <drive> authors then builds a UDF image and burns it. The whole MKV-to-disc path in one step.
  • DvdauthorRunner gained a DvdTitleSpec + BuildXml that emit chapter lists, per-stream <audio>/<subpicture> language declarations; IsoLanguage maps ISO 639-2 (eng) to the two-letter codes (en) DVD-Video wants.

Fixed

  • DvdauthorLocator never found DVDStyler's bundled dvdauthor.exe: the CLI builds as x86, so under WOW64 SpecialFolder.ProgramFiles resolves to "Program Files (x86)" and the 64-bit C:\Program Files\DVDStyler\ was never checked. Now also consults %ProgramW6432%.

Tests

  • 30 new tests: ffprobe chapter/stream parsing, dvdauthor chapter-time formatting + XML generation, spumux XML, ISO language mapping. 162 tests pass. Pipeline validated end-to-end on a synthesized MKV (3 chapters, 2 audio, 1 subtitle) → validate-folder confirms a well-formed DVD-Video with all streams present.

Honestly experimental

Authoring is verified against real tools and a real MKV. The --burn step reuses the already-proven data-burn path but hasn't had a dedicated DVD-R hardware run. Bitmap subtitles and DVD menus aren't supported yet.

[0.0.42] — 2026-05-21

Added — CD-Text writing

Encode artist + album + per-track titles into the disc lead-in so car stereos and standalone players show "Whatever You Want" instead of "Track 16".

  • Futureburn.Core/Spti/SptiCdText.cs — the CD-Text pack encoder. Builds the 18-byte packs (4-byte header + 12-byte text + CRC-16), splits the per-track text streams into 12-byte payloads with correct track-number and character-position fields, and emits the mandatory three 0x8F size-info packs. CRC-16 is the CCITT variant (poly 0x1021, init 0x0000, complemented, big-endian) verified against a cataloged known-answer. Also does the 18→24-byte 6-bit subchannel expansion and builds the full lead-in image (packs cycled to fill every 96-byte lead-in sector) — both matching libburn's burn_write_leadin_cdtext().
  • SptiCueSheet.BuildAudioCd gained a cdText flag — when set, the A0/A1/A2 lead-in pointer entries carry DATA FORM 0x41 (the 0x40 bit tells the drive CD-Text is coming).
  • SptiDeviceReadAtipLeadInStartLba() (READ TOC/PMA/ATIP format 0100b → the negative lead-in start LBA) and WriteCdTextLeadIn() (WRITE 10 of 96-byte blocks to negative lead-in LBAs).
  • SptiAudioCdBurner.ExecuteBurn — a CD-Text lead-in write phase, inserted after SEND CUE SHEET and before the audio, using the libburn-style cooked-SAO approach (no DataBlockType switching; the audio phase is byte-for-byte unchanged).
  • CLI: burn ... --engine spti --cdtext --album NAME --artist NAME (auto-enables --gapless; track titles come from the playlist's #EXTINF lines). New cdtext-dump <playlist> command prints the encoded packs offline — no drive, no disc — for verification before a real burn.

Tests

  • 23 new tests (SptiCdTextTests + 2 in SptiCueSheetTests): CRC known-answer, the byte-level worked example, 0x8F pack-count correctness, 6-bit expansion against libburn's worked example, lead-in image cycling, decode round-trip. 133 tests pass.

Honestly experimental

The pack encoder is fully verifiable offline and well-tested. The lead-in transport — negative-LBA 96-byte WRITEs — has not yet been validated on real hardware; CD-Text-in-SAO support is drive-dependent. Burn-ready, not burn-proven. Use cdtext-dump and a reference tool to sanity-check the packs first.

[0.0.22] — 2026-05-07

Added — proper DVD-Video authoring via dvdauthor

DVD-Video discs that play in standalone hardware DVD players (PS4 etc.) require fully spec-compliant IFO files with TT_SRPT, VTS_PGCI, VTS_C_ADT, and VTS_VOBU_ADMAP — the last of which requires scanning the VOB for NAV packets to find every VOBU boundary. That's its own multi-session subsystem. Pragmatic answer for "make discs that work today": detect and shell out to dvdauthor, the canonical open-source DVD-Video authoring tool.

  • Futureburn.Core/Tools/DvdauthorLocator.cs — finds dvdauthor on PATH, Chocolatey, Scoop, common manual install paths.
  • Futureburn.Core/Tools/DvdauthorRunner.cs — invokes dvdauthor with a small XML control file describing one title (jumppad on, vmgm jump-to-title-1 trigger so the disc auto-plays on insert).
  • CLI dvdauthor command — reports presence/version (parallel to ffmpeg).
  • dvdv-author is now bifurcated:
    • dvdauthor mode (default when dvdauthor is detected): ffmpeg → MPEG-PS → dvdauthor → real IFOs → hardware-playable disc.
    • Skeleton mode (fallback): only fires when dvdauthor isn't installed, or you pass --skeleton-only. Same as v0.0.21's behavior — software-player-only.
    • The chosen mode is announced in the output up front so you know what kind of disc you're getting.

Notes

  • dvdauthor is GPL — same licensing posture as ffmpeg. We don't bundle it; users install via choco install dvdauthor, scoop install dvdauthor, or the Sourceforge binary.

[0.0.21] — 2026-05-07

Added — DVD-Video authoring (experimental)

  • Futureburn.Core/Authoring/DvdIfoBuilder.cs writes minimal-but-recognizable VIDEO_TS.IFO and VTS_##_0.IFO skeletons (2048 bytes each: "DVDVIDEO-VMG" / "DVDVIDEO-VTS" signatures, spec version 1.0, volume / title-set count, provider id; the rest of the navigation tables are zero).
  • dvdv-author <input-video> <output-folder> CLI command. Runs ffmpeg -target ntsc-dvd (or pal-dvd with --pal) to transcode to MPEG-2 + AC-3 in DVD-PS, places the result as VIDEO_TS/VTS_01_1.VOB capped at the per-VOB 1 GB DVD-Video limit, writes IFO/BUP pairs for both VMG and VTS_01_0, creates the spec-required empty AUDIO_TS/ folder.

Validated

  • Same Wallace & Gromit short used for the VCD test (~24 min, 1080p H.264) → 695 MB MPEG-2/AC-3 DVD payload in 34 sec via ffmpeg. validate-folder recognizes the result as well-formed DvdVideo (after a related fix below).

Fixed

  • DiscFolderValidator was misclassifying pure DVD-Video discs as DvdAudioVideoHybrid whenever the spec-required empty AUDIO_TS\ folder was present. Now distinguishes "AUDIO_TS exists with files" (real DVD-Audio content) from "AUDIO_TS exists empty" (DVD-Video spec compliance). The DvdVideo branch's findings now affirm "AUDIO_TS\ folder present (empty is normal for pure DVD-Video)" so users don't worry it should have content.

Tests

  • 6 new DvdIfoBuilderTests, 1 new DiscFolderValidatorTests for the empty-AUDIO_TS case. Total 108 tests.

Honestly experimental

The IFO files we write are SKELETONS — signature + version + a couple of fields, otherwise zero. A real DVD-Video IFO has nested tables (TT_SRPT, VTS_PTT_SRPT, VTS_PGCI, VTS_C_ADT, VTS_VOBU_ADMAP) that tell standalone DVD players how to navigate the disc. Building the VOBU address map alone requires scanning the VOB for NAV packets. That level of authoring is its own multi-session subsystem (or just call dvdauthor externally — the open-source GPL DVD-Video authoring tool that does this properly).

What our skeletons get you: a folder structure that plays in VLC, MPC-HC, and most software DVD readers (they accept the VOBs directly). What they don't get you: standalone DVD player playback. For that, author with DVDStyler/DVDFlick/dvdauthor and burn-folder the result.

[0.0.20] — 2026-05-06

Added — Burn Audio CD GUI polish (part 1)

  • Drag-reorder in the track list. Custom WPF DragDrop with our own "FuturreburnTrack" data format (so it doesn't conflict with the Window-level Drop that accepts files / folders / playlists). DragOver shows Move; Drop computes the target row and reorders the ObservableCollection.
  • Rename: F2 on a selected row, double-click, or the new "Rename" toolbar button — opens a small reusable TextInputDialog seeded with the current title. Made TrackItem.Title mutable to support live updates.
  • Audio preview: ▶ Play / ■ Stop toolbar buttons, NAudio MediaFoundationReader + WaveOutEvent. Auto-resets on PlaybackStopped. Disposes on window close.

Added — VCD authoring (part 2, experimental)

  • Futureburn.Core/Authoring/VcdInfoBuilder.cs and VcdEntriesBuilder.cs write the binary 2048-byte INFO.VCD and ENTRIES.VCD files per the VCD 2.0 White Book layout. ToBcd + LbaToMsfBcd helpers handle the CD-time conversions.
  • vcd-author <input-video> <output-folder> CLI command. Locates ffmpeg, runs -target ntsc-vcd (or pal-vcd with --pal) to transcode the input to MPEG-1 video + MP2 audio in MPEG-PS, places the result at MPEGAV/AVSEQ01.DAT, and writes the VCD/INFO.VCD + VCD/ENTRIES.VCD companions. Result can be burn-folder'd.

Validated

  • Synthetic 5-second 320×240 test video → ffmpeg → 846.54 KB AVSEQ01.DAT (MPEG-1 + MP2 muxed). INFO.VCD + ENTRIES.VCD both 2048 bytes. validate-folder recognizes the result as a well-formed VideoCd structure.

Tests

  • 12 new VcdBuilderTests (signature/length checks, profile/version, album-label padding + truncation, BE16 volume fields, PAL flag, BCD encoder, LBA→MSF). Total 101 tests.

Honestly deferred

  • CD-Text writing was on the same request batch but is a separate ~300+ line subsystem (binary subchannel R-W generation + SCSI WRITE 12 in raw mode). Holding for its own dedicated turn.
  • Strict-spec VCD multi-track CD writing (file system on track 1, video on tracks 2+) — what older standalone VCD players require. Our SPTI data path writes single-track. The validator surfaces this caveat as a finding when it identifies a VCD folder.

[0.0.19] — 2026-05-06

Added

  • ffmpeg / ffprobe runtime integration. Futureburn.Core/Ffmpeg/{FfmpegRunner,FfprobeRunner}.cs:
    • FfmpegRunner shells out to ffmpeg.exe with arbitrary args, streams stderr line-by-line via callback. Foundation for transcoding pipelines (DVD-Video / VCD / DVD-Audio authoring will all sit on top of this).
    • FfprobeRunner runs ffprobe -print_format json -show_format -show_streams and parses the JSON into typed FormatInfo + StreamInfo records. Handles audio + video streams, embedded tags, optional fields.
    • probe <file> CLI command now augments the basic NAudio readout with container/codec/bitrate/tags from ffprobe when it's installed. Silently skipped when ffmpeg isn't there.
  • FfmpegLocator extended for winget installs. Now finds ffmpeg under %LOCALAPPDATA%\Microsoft\WinGet\Packages\Gyan.FFmpeg*\ffmpeg-*\bin\ffmpeg.exe (the path Gyan.FFmpeg uses) and the Microsoft\WindowsApps\ shim location. Validated against a fresh winget install Gyan.FFmpeg install.
  • Burn Audio CD GUI tile — major UX upgrade:
    • Drag-and-drop any combination of audio files, folders, or .m3u/.m3u8 playlists onto the window. Files added directly. Folders scanned for supported audio. Playlists parsed with our existing PlaylistParser.
    • Add folder... button (uses .NET 8's OpenFolderDialog).
    • Load M3U... button + corresponding Save M3U8... button. The Save button writes an extended M3U8 with #EXTINF durations + titles you can hand back to futureburn burn.
    • Fits-on-disc indicator: shows whether the current track total fits a 74-min CD-R, needs an 80-min CD-R, or exceeds standard capacity (with overage in minutes).
    • Estimated burn time at the currently-selected speed, recomputed live when you change the Speed dropdown. Adds ~30 sec for finalization overhead.

Tests

  • 3 new FfprobeParseTests covering AAC/M4A audio streams, MKV with H.264 video + AC-3 audio, and missing-optional-fields handling. Total 83 tests.

[0.0.18] — 2026-05-06

Added — prep work for video-disc authoring (DVD-Video / VCD / DVD-Audio)

None of the actual authoring (transcoding + IFO/BUP/VOB / INFO.VCD generation) lands in this commit — those are still long-arc projects. What does land are foundational pieces that all three authoring paths will use:

  • Futureburn.Core/Tools/FfmpegLocator.cs + ffmpeg CLI command. Locates ffmpeg on PATH, ProgramFiles, ProgramFilesX86, %LOCALAPPDATA%\Programs, C:\ffmpeg, Chocolatey, Scoop. Reports the version line. Documents which package managers can install it. We don't bundle ffmpeg (LGPL/GPL licensing concerns for our MIT distribution).
  • Futureburn.Core/Fs/DiscFolderValidator.cs + validate-folder CLI command. Recognizes the well-known disc-folder structures (VIDEO_TS, AUDIO_TS, VCD, SVCD, BDMV) AND validates the structural details — VIDEO_TS.IFO + .BUP pairing, AOB presence, AVSEQ*.DAT presence, etc. Reports findings + issues. Catches "almost a DVD-Video disc but missing VIDEO_TS.BUP" before a disc gets wasted.
  • cd-info now uses the same validator for its disc-type label, so CLI + GUI agree on what a disc is. VCD and SVCD are now explicitly recognized (was just "Data CD/DVD" before).

Validated

  • ffmpeg detection: correctly reports "not found" + install instructions on the user's machine (no ffmpeg installed yet).
  • DVD-Video validation: synthetic folder with VIDEO_TS.IFO + VTS_01_1.VOB but no .BUP correctly flagged.
  • VCD validation: synthetic folder with INFO.VCD + ENTRIES.VCD + AVSEQ01.DAT recognized as well-formed VideoCd, with the Mode-2-sectors caveat surfaced as a note.

Tests

  • 12 new DiscFolderValidatorTests covering each disc type + a few malformed cases. Total 80 tests.

Notes — VCD scope

User asked specifically about VCD. Same answer as DVD-Video and DVD-Audio: needs authoring (MPEG-1 video + MPEG-1 Layer II audio + MPEG-PS muxing + binary INFO.VCD/ENTRIES.VCD/etc.). One additional VCD-specific quirk: spec-compliant VCDs use CD-ROM XA Mode 2 Form 2 sectors for video tracks (2324 user bytes), while our SPTI data path writes Mode 1 (2048 bytes). In practice most modern players accept Mode-1-burned VCDs; older standalone VCD players may not. The validator surfaces this as a note.

[0.0.17] — 2026-05-06

Added

  • BIN/CUE data-mode burning. New Futureburn.Core/Image/{CueSheet,CueSheetParser,BinCueImageStream}.cs:
    • CueSheetParser is a minimal text-mode .cue parser. Single-FILE sheets only. Supports MODE1/2048, MODE1/2352, and AUDIO track types; silently ignores PERFORMER / TITLE / REM etc.
    • BinCueImageStream exposes a .bin's user-data portion as a 2048-byte-per-sector stream — for MODE1/2352 it strips the 12-byte sync + 4-byte header and 288-byte ECC per sector and emits just the 2048-byte payload, so downstream code is identical to ISO burning.
    • SptiDataBurner.Plan() now detects .cue extensions and resolves to the referenced .bin. Audio BIN/CUE is rejected with a clear message (on the roadmap).
    • burn-iso CLI command accepts .cue files transparently — no separate command needed.
  • MusicBrainz disc lookup. New Futureburn.Core/Net/MusicBrainz.cs computes the canonical MB disc ID from a TOC (SHA-1 over the standard hex-string format, with the URL-safe base64 substitutions + → ., / → _, = → -) and queries the public MB API at /ws/2/discid/{id}. Parses the JSON response into typed releases + tracks, handles multi-artist joinphrase fields. CLI: cd-lookup <drive>.
  • 17 new unit tests across CueSheetParserTests (8) and MusicBrainzTests (9) — total 68 tests.

Validated

  • Live MusicBrainz lookup on the audio CD currently in F:\ correctly identified it as OutKast — Aquemini (16 tracks, 1998), with full per-track titles. Algorithm matches the documented MB spec exactly.

Notes — explicitly deferred

This commit was driven by a request that included DVD-Video and DVD-Audio authoring. Those are full subsystems on their own:

  • DVD-Video from MKV = MPEG-2 video transcoding + AC-3 / LPCM audio transcoding + IFO/BUP/VOB authoring + UDF burn. Realistically requires ffmpeg integration. Months, not weeks.
  • DVD-Audio from album = LPCM AOB authoring + ATS_##_#.IFO authoring. Smaller than DVD-Video but still substantial; obscure tooling.
  • NRG / MDS / CDI / CCD image formats — each is a proprietary container with its own header format. Doable but lower priority than BIN/CUE which we just added.

For DVD-Video and DVD-Audio burning today: author the VIDEO_TS / AUDIO_TS folder structure with an external tool, then burn-folder it — the IMAPI UDF generator handles the file system and the disc plays itself in standalone players.

[0.0.16] — 2026-05-06

Added

  • Folder → ISO image builder. New Futureburn.Core/Fs/FsImageBuilder.cs wraps Windows' IMAPI2FS.MsftFileSystemImage COM via dynamic dispatch (same pattern as our IMAPI v2 work — no NuGet wrappers). Builds ISO 9660 + Joliet + UDF in any combination, configurable volume label, sequential-byte output to either a Stream or a file path.
  • CLI: mkiso <folder> <output.iso> builds the image to disk. Flags: --label NAME, --fs all|iso|joliet|udf.
  • CLI: burn-folder <folder> <drive> does mkiso + burn-iso in one step (writes to a temp ISO, burns it, cleans up). Flags: --label, --fs, --speed, --dry-run, --yes, --keep-iso.
  • GUI: BurnImageWindow gains a Choose folder... button. Builds the ISO in the background (Task.Run + Dispatcher progress updates), displays the source folder + temp ISO path together, cleans up the temp file when the window closes.

Validated

  • Built a 348.63 MB / 178,496-sector ISO from the 5-track whale-album folder. Mounted it via Windows (Mount-DiskImage); all 6 files (5 WAVs + playlist.m3u8) readable with correct sizes. ISO 9660 magic "CD001" present at byte 0x8001.

Notes

  • Initial implementation had wrong FsiFileSystems enum values (guessed 0x02/0x04/0x08; spec says 0x01/0x02/0x04). IMAPI2FS rejected the bogus combo with "value specified for parameter 'newVal' is not valid." Fixed and noted with a // must match IMAPI2FS's FsiFileSystems comment so we don't drift again.

[0.0.15] — 2026-05-06

Added

  • ISO image burning to blank CD-R or DVD-R via raw SCSI (no IMAPI involved). New Futureburn.Core/Spti/SptiDataBurner.cs plus CLI command burn-iso <iso> <drive> with --dry-run, --speed Nx, --yes flags. Detects disc type from the loaded profile and picks CD-data or DVD-data MODE SELECT settings appropriately. WRITE 12 in 32-sector (64 KB) chunks with the same retry-on-Win32-121 logic the audio burner uses.
  • SptiDevice.ConfigureForDataCd() / ConfigureForDataDvd() — Mode Page 0x05 setup for data writes (Mode 1, 2048 bytes per sector, BUFE on, TAO for CD / SAO for DVD).
  • Burn Blu-ray / DVD GUI tile is real. BurnImageWindow.xaml lets you choose an ISO, pick a drive + speed, and burn. Same background-thread + Dispatcher pattern as BurnAudioCdWindow. Shows which standard disc capacities the chosen image fits on (CD-R / DVD-R / DVD-R DL / BD-R).
  • README's "What's coming" list reorganized to clarify the realistic next steps: folder → ISO builder, then MKV → DVD-Video transcoding (the latter being a separate large subsystem). Blu-ray burning waits for hardware.

Notes

  • ISO burning assumes the image is pre-authored. We don't build the file system from a folder yet — that's a separate (smaller) future task using either IMAPI's MsftFileSystemImage or our own UDF/ISO 9660 writer. Building DVD-Video discs from raw video files is a much bigger task involving MPEG-2 encoding and IFO/BUP/VOB authoring; that's the long-arc goal for the Burn Blu-ray / DVD tile.

[0.0.10] — 2026-05-06

Added

  • CD Info GUI tile now reads real disc info via SPTI. When you select a drive with a disc loaded, the details pane shows: disc finalization status, last session state, session count, disc type, layout (audio CD / data / mixed), and a full track listing with per-track type and duration. Same data the CLI's cd-info command surfaces, just clickable.
  • Failures degrade gracefully — if SCSI pass-through is unavailable for any reason, you still see the IMAPI-based info above it.

[0.0.9] — 2026-05-06

Added

  • SptiDevice.ReadDiscInformation() — SCSI MMC READ DISC INFORMATION (opcode 0x51). Returns Disc Status (Empty/Incomplete/Finalized/Other), State of Last Session (Empty/Incomplete/Reserved/Complete), session count, disc type, and erasable flag. This is the authoritative answer to "is this disc finalized?" — finalized + complete = will play in any standalone CD player.
  • cd-info now reports the disc-info fields above before the TOC, with a friendly "will play in standalone players" / "NOT fully finalized" annotation.

Fixed

  • Initial bit parsing of READ DISC INFORMATION byte 2 was wrong — had Disc Status in bits 7-6, but per MMC-6 it's in bits 1-0 (and State of Last Session is in bits 3-2). Caught when a known-finalized 19-track audio CD reported "Empty" with "Reserved" session state. Fixed to match the spec.

Validated

  • The user's previously-burned puck disc (CDBurnerXP from the same playlist) reports Disc Status: Finalized, Last Session: Complete — definitive proof the disc is structurally fine. Any playback failure (VLC's longstanding Windows CD-DA bugs being the prime suspect) is a player-side issue.

[0.0.8] — 2026-05-06

Added

  • SptiDevice.ReadToc() + cd-info <drive> CLI command. SCSI READ TOC/PMA/ATIP via SPTI. Returns first/last track numbers, lead-out LBA, plus per-track type (audio vs data, with pre-emphasis flag), start LBA, length, and duration. Works on any CD with a readable TOC — audio CDs, mixed-mode, finalized CD-Rs.

Validated

  • Read the puck disc (a finalized 19-track audio CD that CDBurnerXP burned from the user's same playlist earlier). Result: 19 audio tracks, lead-out at LBA 281,457, total 01:02:32. Matches our Plan() output for the same playlist track-for-track. End-to-end proof that our pipeline computes the right disc layout.

[0.0.7] — 2026-05-06

Added

  • IMAPI v1 burn engine. Futureburn.Core/Imapi/AudioCdBurnerV1.cs and ImapiV1Interop.cs. Typed [ComImport] declarations for IDiscMaster, IDiscRecorder, IEnumDiscRecorders, IRedbookDiscMaster. Used as a fallback for drives where IMAPI v2's TAO path returns a SCSI mode-page error on blank CD-Rs (LG GE20LU10 firmware FE06 is the known case). Selected via futureburn burn ... --engine v1.
  • CLI: imapi-v1-info — non-destructive diagnostic that opens v1, enumerates recorders, and reports Redbook capabilities. Validated on the LG drive: v1 sees the drive correctly while v2 chokes.
  • SPTI scaffold. Futureburn.Core/Spti/{SptiNative,MmcOpcodes,SptiDevice,SptiBurnEngine}.cs. P/Invoke for IOCTL_SCSI_PASS_THROUGH_DIRECT, MMC opcode constants, drive-opener that talks raw SCSI. SptiBurnEngine is a stub for now — full audio CD burn via raw SCSI is the work that comes if v1 also fails on someone's hardware.
  • CLI: spti-info <drive> — runs a SCSI INQUIRY via SPTI. Validated end-to-end on the LG drive: returns vendor/product/firmware identical to IMAPI's view, proving the SPTI pipeline works.

Fixed

  • BurnPlan time displays were using mm\\:ss format which capped at 59:59 — burned playlists over an hour showed mangled minutes ("14:00" for a 74-min disc). Now uses hh\\:mm\\:ss.
  • Wrong field referenced when computing v1 plan total time (was reading disc capacity instead of track sum).

Investigation notes (in case future-us forgets)

  • IMAPI v1 interfaces are vtable-only IUnknown. PowerShell can't talk to them at all. Typed [ComImport] is the only way in.
  • The LG GE20LU10 FE06 returns "mode page not present" from IDiscFormat2TrackAtOnce::PrepareMedia for blank CD-R, even with AcquireExclusiveAccess(force=true) and DisableMcn. Bare PowerShell IMAPI hits the same error — it's not our code.
  • ImgBurn talks to the same drive successfully because it uses SPTI directly (not IMAPI). That's why we have the SPTI scaffold ready.
  • IMAPI 2 IIDs do NOT all share the 7F64 second segment that IDiscMaster2 uses. Look up actual GUIDs from HKLM:\SOFTWARE\Classes\Interface\ rather than guessing.

[0.0.6] — 2026-05-06

Added

  • Futureburn.Core/Imapi/AudioCdBurner.cs — two-phase burn pipeline. Plan() validates the request and returns a BurnPlan; ExecuteBurn() actually writes. Uses MsftDiscFormat2TrackAtOnce via dynamic COM. No typed [ComImport] interfaces required — every TAO property we touch (NumberOfExistingTracks, TotalSectorsOnMedia, FreeSectorsOnMedia, SupportedWriteSpeeds) lives on IDiscFormat2TrackAtOnce directly.
  • Futureburn.Core/Imapi/ManagedIStream.cs — adapts a .NET Stream to a COM IStream so we can pass it to AddAudioTrack. Marked [ComVisible(true)] because the assembly default is false.
  • Futureburn.Core/Audio/CdPaddedAudioStream.cs — wraps a CD-format WAV file as raw PCM bytes padded to 2352-byte CD sectors (IMAPI's hard requirement).
  • CLI: burn <playlist> <drive> with --dry-run, --speed Nx, --force, --yes / -y, --keep-temp flags.
  • Smart pre-check: if MsftDiscFormat2Data can't read the loaded CD-R/CD-RW's capacity, we abort with a friendly "this disc isn't fresh" message instead of letting PrepareMedia fail later with a cryptic SCSI mode page error.
  • Tracks already in CD format (44.1k / 16-bit / stereo WAV) are passed through directly — no pointless re-decode of huge WAV files.
  • IMAPI track minimum-length enforcement (4 seconds = 300 sectors) to refuse tracks too short for CD-DA.

Notes (a.k.a. things we learned)

  • IDiscFormat2TrackAtOnce.PrepareMedia() must be called before NumberOfExistingTracks, sector counts, and SupportedWriteSpeeds are readable. PrepareMedia reserves the drive but writes nothing — releasing the COM object without ReleaseMedia aborts the session cleanly (no AddAudioTrack was issued, so nothing was committed to the disc).
  • For our test CD-R (already had data), both MsftDiscFormat2Data and MsftDiscFormat2TrackAtOnce refused to read it — exactly the expected symptom of a write-once disc that's already been used. The pre-check now catches this politely.

Verified

  • Builds clean. CLI prints the right usage text for burn.
  • Dry-run with the test playlist successfully reaches Plan() and surfaces the "disc isn't fresh" pre-check error when given a non-blank CD-R.

Pending

  • Real-hardware test with a fresh blank CD-R. Will update the changelog and README once we've completed an actual burn end-to-end.

[0.0.5] — 2026-05-06

Added

  • NAudio (2.3.0) added to Futureburn.Core. First — and so far only — third-party audio dependency. Justified because writing MP3/AAC/FLAC decoders from scratch is a separate career.
  • Futureburn.Core/Audio/CdFormat.cs — Red Book audio constants (44.1 kHz, 16-bit, stereo, 2352-byte sectors, 75 sectors/sec) plus duration/sector math helpers.
  • Futureburn.Core/Audio/AudioDecoder.csProbe() returns format/duration without decoding; DecodeToCdWav() decodes any supported file and writes a CD-format WAV. Inputs that are already CD-format skip the resampler entirely. WAV uses NAudio's lightweight WaveFileReader; MP3 / M4A / AAC / WMA / FLAC go through Windows Media Foundation via MediaFoundationReader.
  • Futureburn.Core/Audio/Playlist.cs — M3U / M3U8 parser. Handles both simple (paths only) and extended (#EXTM3U + #EXTINF:<seconds>,<title>) flavors. Relative paths resolved against the playlist's directory.
  • CLI: probe <file>, decode <in> <out.wav>, playlist <file.m3u>. The probe command tells you whether resampling will be needed.

Verified

  • Decoded C:\Windows\Media\Alarm01.wav (22050 Hz / stereo / 16-bit) → CD-format WAV (44100 Hz / stereo / 16-bit). Round-tripped probe confirms IsCdFormat: yes — no resampling needed.
  • Extended M3U with a missing-file entry parses correctly, marks the missing track with ?, and reports the total duration.

Burns

  • Still nothing! But we can now produce the exact bytes a CD wants. v0.0.6 carries those bytes to a disc.

[0.0.4] — 2026-05-06

Added

  • The four-tile shell. MainWindow is now a 2×2 grid of big tile buttons (Burn Audio CD / Burn Video DVD / CD Info / Settings) with a menu bar (File → Exit, Help → About) and a status bar. Each tile has a quippy subtitle.
  • CdInfoWindow — the CD Info tile opens a real sub-program: a drive list on the left, a live details pane on the right (capabilities, loaded media, capacity, write speeds), plus a Refresh button. Same data the CLI's drives and disc commands show, just interactive.
  • PlaceholderWindow — parameterized "this ships in v0.X" dialog reused by the other three tiles.
  • About dialog with the GitHub URL, because every passion project deserves an About box.

Notes

  • Code-behind, not MVVM. We'll graduate to MVVM if/when bindings get hairy enough to earn the ceremony.
  • No third-party packages. WPF defaults all the way down.

Burns

  • Still nothing. But you can now click on Burn Audio CD and read a polite refusal in window form.

[0.0.3] — 2026-05-06

Added

  • Futureburn.Core/Imapi/Mmc.cs — lookup tables for MMC profile codes (CD-R, DVD+R DL, BD-RE, HD DVD-RAM, ...) and feature pages, plus the IMAPI media physical type enum. Unknown codes are still surfaced as raw hex with an "Unknown" label so weird drives (Xbox 360, exotic Blu-ray formats) stay visible.
  • Futureburn.Core/Imapi/OpticalDrive.cs — extracted into its own file, now carries SupportedProfiles, CurrentProfiles, SupportedFeaturePages, CurrentFeaturePages, CanLoadMedia, plus WritableProfiles / ReadOnlyProfiles / PrimaryMount conveniences.
  • Futureburn.Core/Imapi/LoadedDisc.cs — record describing what's in the drive: media type, sectors total/free, next writable address, current + supported write speeds, blank flag. Has a HasFormatDetails flag for when MsftDiscFormat2Data can't read the disc (audio CDs, finalized media, ROM).
  • Futureburn.Core/Imapi/DiscInspector.cs — uses MsftDiscFormat2Data to read media info. Fails gracefully on non-data discs.
  • DriveEnumerator.Find(identifier) — look up a drive by mount point ("F", "F:", "F:\") or by unique id.
  • CLI: drives -v / drives --verbose dumps every supported profile and feature page (raw codes shown for unknown ones).
  • CLI: disc <drive> inspects the loaded media in a drive.

Notes (a.k.a. things we learned the hard way)

  • The IDispatch on MsftDiscFormat2Data doesn't expose the inherited IDiscFormat2 base members (CurrentMediaType, MediaPhysicallyBlank, etc.) when we go through C# dynamic. To stay hand-rolled (no [ComImport] interface declarations), we derive media type from the drive's CurrentProfile and infer "blank" from FreeSectors == TotalSectors. If we ever need authoritative state, the next step is to declare a typed IDiscFormat2 and cast.

Burns

  • Still nothing. But we now know exactly which of your drives can write CD-R, DVD-R DL, or whatever exotic format you've got plugged in.

[0.0.2] — 2026-05-06

Added

  • Futureburn.Core/Imapi/DriveEnumerator.cs — hand-rolled IMAPI2 access via Type.GetTypeFromProgID + dynamic. No COM interface declarations, no NuGet wrappers. Returns a list of OpticalDrive records (vendor, product, firmware revision, mount points, unique id).
  • futureburn drives CLI command. Lists every optical drive Windows can see.
  • futureburn help / --help / -h for usage.

Changed

  • All three projects now target net8.0-windows (was net8.0 for Core/Cli, already net8.0-windows for Gui). We're Win11-only, so this kills CA1416 warnings on Windows-specific APIs without scattering [SupportedOSPlatform] everywhere.
  • Hoisted TargetFramework, Nullable, ImplicitUsings into Directory.Build.props. The csprojs are now mercifully short.
  • Deleted the Class1.cs placeholder that came with dotnet new classlib.

Burns

  • Still nothing. But we know who's capable of burning now, which is progress.

[0.0.1] — 2026-05-06

Added

  • Empty .NET 8 solution with three projects: Futureburn.Core (class library), Futureburn.Cli (console app), Futureburn.Gui (WPF app).
  • Both Cli and Gui reference Core.
  • Centralized version + metadata in Directory.Build.props so bumping a version means editing one line.
  • Repo, README, .gitignore, and this changelog.

Burns

  • Nothing yet. We are pre-burn. Like pre-Cambrian, but with less life.