Releases: purelogiccode/FindRomCover
Releases · purelogiccode/FindRomCover
Release list
release_3.1.0
FindRomCover 3.1.0 — What's New
Fixes & Improvements
- Automatic scan after selecting a folder — Browsing to your ROM or Image folder now scans automatically as soon as both folders are set. No more wondering why the list stays empty after using "Browse..." (#1)
- Clear scan feedback — The status bar now reports how many ROM files matched the supported extensions and how many are missing covers. If nothing matches, you get an explicit message instead of a silently empty list. (#1)
- Refresh after editing supported extensions — Changing the extension list (Settings > Edit Supported Extensions...) now re-scans immediately instead of showing stale results.
- Repository migrated — The project now lives at purelogiccode/FindRomCover. The built-in update checker follows the new releases page.
Under the Hood
- Hardened settings loading: a corrupt
settings.datis quarantined assettings.dat.corruptand defaults are restored instead of failing. - Added a managed PBKDF2 fallback so settings decryption no longer crashes on systems where the OS cryptographic implementation fails.
- Friendlier Google Custom Search API error messages (invalid API key, quota exceeded, bad requests) instead of raw JSON dumps.
- More robust link opening with an
explorer.exefallback for systems without a default browser association. - Version bumped to 3.1.0.
Download
release_3.1.0_win-x64.zip— Windows x64release_3.1.0_win-arm64.zip— Windows ARM64
Both builds are framework-dependent and require the .NET 10.0 Desktop Runtime. Extract and run FindRomCover.exe.
release_3.0.1
WebView2 Graceful Fallback
When the WebView2 Runtime is not installed, FindRomCover now handles it gracefully instead of logging repeated errors. Web search features (Google/Bing tabs) will be unavailable, but all other functionality remains intact.
Image Conversion Improvements
- Corrupt or misformatted images are now detected immediately (via
MagickException) and skipped without unnecessary retries. - Retry logic remains in place for transient I/O failures (file locks, network drives, etc.).
Less Log Noise
- Benign events like "file disappeared after wait" and "conversion skipped" are now logged at Debug level instead of Warning.
- The bug report sink now only sends Error-level events (was Warning), reducing unnecessary reports.
Dependency Updates
- Magick.NET
14.14.0→14.15.0 - MessagePack
3.1.7→3.1.8 - Microsoft.Web.WebView2
1.0.4022.49→1.0.4078.44 - Serilog
4.3.1→4.4.0
release_3.0.0
New Features
Tabbed Search Interface
- Replaced the single search engine dropdown with a 4-tab interface: Local Files, Google Web, Bing Web, and Google API
- Each tab works independently — switch between them without losing results
- Status bar now shows the active tab name
Local File Similarity Search
- New Local Files tab that scans your image folder for similar filenames using configurable algorithms
- Three similarity algorithms available: Jaro-Winkler Distance, Levenshtein Distance, and Jaccard Similarity
- Adjustable similarity threshold (10%–90%) from the menu
- Trigram indexing (
NgramIndex) for fast candidate filtering in large directories - Click a local match to instantly assign it as the cover image
System Tray Integration
- Minimize the application to the system tray instead of keeping it in the taskbar
- Tray icon with context menu (Restore / Exit)
- Balloon notification when minimized
Keyboard Shortcuts
- F5: Refresh the missing covers list
- Escape: Exit the application
Image Folder Watcher
- New
ImageFolderWatcherservice monitors the image folder in real-time - Automatically detects when a cover image is saved (via browser download or drag-and-drop)
- Auto-removes matched ROMs from the missing list
- Auto-converts non-PNG images (JPG, BMP, GIF, TIFF, WebP, AVIF, HEIC, HEIF, JXL, JP2) to PNG
- Pre-registration of expected files to prevent race conditions
Delete ROM from Missing List
- New right-click context menu option: Delete corresponding ROM or ISO
- Permanently deletes the ROM file from disk after confirmation
Improvements
Settings & Security
- Settings are now AES-encrypted using a machine-specific PBKDF2-derived key (
settings.dat) - Legacy
settings.xmlis automatically migrated on first launch - API keys are masked in log output
Logging
- Migrated from custom
AppLoggerto Serilog structured logging - Rolling log files with 7-day retention (
app.log) - Real-time log viewer in the Debug Window via
ObservableCollection<LogEntry> - Error reports still sent to the bug report API
Dependency Injection
- Application now uses Microsoft.Extensions.DependencyInjection
SettingsManagerregistered as a singleton
Startup & Shutdown
- Orphaned temp files are cleaned up on startup
- Graceful shutdown with proper disposal of
HttpClient,AudioService,ErrorLogger, andServiceProvider - Global exception handlers for
AppDomain,TaskScheduler, andDispatcher
Google API
- Better error messages for 429 (rate limit), 403 (forbidden), and 400 (bad request) responses
UI Polish
- Extracted reusable styles in
App.xaml(loading overlay, empty state, status bar, etc.) - Added
ProgressRingindicators for missing images check and local search - Improved empty state messages with actionable hints
- New image resources:
brokenimage.png,copy.png,usethis.png,folder.png
Image Processing
- Extended format support: HEIC, HEIF, ICO, SVG, JXL, JP2, AVIF
- Magick.NET resource limits configured (512 MB memory, 4 threads)
- Retry logic for concurrent file access issues
Other
MameManagerrefactored to a static class returningMameDataobjectsSupportedExtensionschanged fromHashSet<string>toList<string>withINotifyPropertyChanged- Filename sanitization to prevent path traversal attacks
FindCorrespondingRomFilewith case-insensitive fallback search
Breaking Changes
- PlaySound service removed — replaced by
IAudioServicewithNullAudioServicefallback - settings.xml no longer used — migrated to encrypted
settings.dat - MameManager is no longer a serializable DTO — use
MameDatainstead
Dependencies Updated
| Package | Old Version | New Version |
|---|---|---|
| MahApps.Metro | 2.4.11 | 3.0.0-rc0529 |
| ControlzEx | — | 7.0.4 |
| Serilog | — | 4.3.1 |
| Serilog.Sinks.File | — | 7.0.0 |
| Serilog.Sinks.Observable | — | 3.0.0 |
| Microsoft.Extensions.DependencyInjection | — | 10.0.9 |
| Microsoft.NET.Test.Sdk | — | 18.7.0 |
Bug Fixes
- Fixed thread safety issues in
ImageFolderWatcherdeduplication logic - Fixed rename handling when source equals target in
ImageFolderWatcher - Fixed PendingRenameTarget reset on auto-remove
- Fixed download failure user notification (now shows a warning dialog)
- Fixed file disappearance logging for PNG conversion
- Fixed blank WebView navigation on startup
- Fixed error handling and logging in event handlers across multiple files
- Fixed cancellation on dispose to prevent resource leaks
Full Changelog: release_2.9.0...release_3.0.0
release_2.9.0
Bug Fixes
- Fixed similarity calculation for empty strings (both Levenshtein and Jaro-Winkler now return 100% instead of NaN or 0)
- Handle
InvalidWmpVersionExceptionin audio service to prevent crashes on systems with incompatible Windows Media Player versions - Removed redundant error logging when right-click context menu is created without a selected image path
- Fixed error handling during application shutdown to catch and ignore disposal exceptions gracefully
Update Check Refactoring
- Added
UpdateCheckOrchestratorservice as a proper orchestration layer for update checking, separating concerns between API calls and notification display - Added
UpdateNotificationInforecord for cleaner update notification flow - Enhanced error logging in
GitHubReleaseService(network errors, timeouts, and JSON parse errors are now properly logged)
UI Improvements
- File extensions in the Settings window are now automatically sorted alphabetically when added
- Added tooltips to progress indicators, loading overlays, empty state messages, and the missing covers label for better accessibility
- Added visual border styling to the extensions list in Settings
Enhanced Error Handling & Logging
BugReportModel.FromExceptionnow safely handles null exceptions- Improved robustness of the image save workflow with retry logic for directory write permission tests
- Added a fatal error dialog when the application fails during startup, preventing silent crashes
- Updated internal log method naming for consistency
Dependency Updates
- coverlet.collector: 10.0.0 → 10.0.1
- FluentAssertions: 8.9.0 → 8.10.0
- Magick.NET-Q16-AnyCPU: 14.13.0 → 14.13.1
- MessagePack: 3.1.4 → 3.1.6
- Microsoft.Extensions.DependencyInjection: 10.0.7 → 10.0.8
- Microsoft.Extensions.DependencyInjection.Abstractions: 10.0.7 → 10.0.8
Test Coverage
- Added comprehensive unit tests for
ButtonFactory,UpdateCheckOrchestrator,GitHubReleaseResponse,UpdateCheckResult,SettingsWindow, andNullAudioService - Expanded test coverage for edge cases in
SettingsManager,MameDataService,ImageProcessor,ImageLoader,NgramIndex,SimilarityCalculator, andErrorLogger
Full Changelog: release_2.8.0...release_2.9.0
release_2.8.0
Performance
- N-gram indexing for large image folders (50+ files). The similarity engine now builds a trigram index to pre-filter candidate images, dramatically reducing the number of comparisons needed for large collections.
- Early bailout in Levenshtein distance calculation. If the minimum edit distance already exceeds the similarity threshold, computation stops early.
- Jaccard n-grams pre-computed once per query instead of recomputed per candidate.
- ArrayPool in Jaro-Winkler distance replaces array allocations, reducing GC pressure.
- Progressive image loading. Results appear in the UI as soon as each image is loaded, rather than waiting for all images to finish.
Features
- GitHub update checking. On startup, the app checks GitHub for a new release and offers to open the download page if one is available.
- Usage tracking (anonymized, best-effort) helps the developer understand adoption.
- Cross-instance settings synchronization. A static file lock prevents corruption when multiple instances save settings simultaneously.
UI / UX
- Tooltips added throughout the menu, buttons, and controls for better discoverability.
- Delete key handling moved to
PreviewKeyDownto prevent repeats on key hold. - Improved empty states with styled text blocks and clearer "no results" messaging.
- Loading overlay background moved to XAML style for cleaner markup.
- Missing covers label uses shared constant for consistency.
Error Handling & Logging
- Every bare
catch { }block now logs the exception or at minimum explains the failure. - Async naming convention applied to all async event handlers (e.g.,
ClickAsync,SelectionChangedAsync). - Error logging switched from
lock-based toSemaphoreSlim-based for internal log writes (avoiding potential deadlocks with the main log semaphore). - Theme fallback now logs the fallback failure instead of silently ignoring it.
Environment.Exitcalled on shutdown to ensure all background threads terminate.
Removed
MameManagerclass. Replaced byMameDataService.ImageData.ClearCachedContextMenumethod.UseWindowsFormsSDK reference (no longer needed).AppConstants.AccentPrefix, unused app constants, andTabIndexattributes (redundant when usingIsDefault/IsCancel).
Dependencies
ControlzExupdated from 7.0.3 to 7.0.4Magick.NET-Q16-AnyCPUupdated from 14.12.0 to 14.13.0Microsoft.Extensions.DependencyInjectionandAbstractionsupdated from 10.0.5 to 10.0.7
Testing
- New unit test project with 214 tests covering services, models, managers, and constants.
- Tests use xUnit + FluentAssertions + coverlet for coverage collection.
InternalsVisibleToattribute exposes internal methods for testing.
Full Changelog: release_2.7.0...release_2.8.0
release_2.7.0
Code Quality & Documentation
- XML Documentation: Added comprehensive XML documentation to services and models for improved code clarity and IntelliSense support.
- MameDataService: Deprecated the legacy
MameManagerclass in favor of the newerMameDataService, improving maintainability and consistency across the codebase.
UI Improvements
- Accessibility: Enhanced UI accessibility with proper
AutomationPropertiesfor better screen reader support. - Resource Consolidation: Refactored UI resources into
App.xamlfor centralized styling and easier maintenance.
Error Handling
- Audio Service: Improved error handling by silently catching codec and media infrastructure errors (COMException and InvalidOperationException) that occur due to missing codecs or incompatible Windows Media Foundation components rather than application bugs.
- Logging: Enhanced error logging mechanisms for better diagnostics and debugging.
release_2.6.0
✨ Key UI Improvements
- Loading Overlays: Full-screen progress indicators with descriptive text replace inline spinners
- Cached Context Menus: Right-click menus now reuse instances for smoother repeated interactions
🛠 Technical Refinements
- Threading Overhaul: Better async patterns, cancellation support, and resource disposal across all services
- Image Processing: Robust retry logic for file locks (OneDrive/antivirus), atomic writes, orphaned temp cleanup
- Data Binding: Fixed image dimension bindings, added
MissingImageItemmodel for cleaner ListBox binding - Error Resilience: Granular locking in ErrorLogger, UI thread safety in AudioService, graceful mame.dat handling
📈 Performance & Reliability
- Swapped Parallel.ForEach → Task.WhenAll for better cancellation
- Lazy initialization for heavy resources (broken images, MAME data)
- Source-generated regex, C#14 static lambdas, pattern matching throughout
Result: Smoother UX during searches, fewer binding errors, bulletproof file operations 🚀
release_2.5.1
Update dependencies, and enhance image loading resilience
- Update Magick.NET library to version 14.10.2.
- Refactor
ImageLoaderto improve error resilience and handling for corrupted or empty images. - Optimize image processing logic for better memory and exception management.
- Adjust
SimilarityCalculatorto provide clearer error reporting for failed image loads.
release_2.5.0
- Image Processing: Replaced GDI+ with Magick.NET in
ImageLoader.csandImageProcessor.csfor robust loading/saving, auto-orientation, error correction, and reduced memory usage. Added configurable retries/delays viaSettingsManager. - Cancellation & Async Handling: Overhauled
LstMissingImages_SelectionChangedinMainWindow.xaml.cswith proper semaphore usage, early cancellation,Task.Yield()for UI responsiveness, andHashSetfor efficient ROM deduplication. Improved missing files scan with exception resilience. - Error Management: Enhanced logging with detailed contexts. Added lazy
NullAudioServicefallback inApp.xaml.csand silent WMP handling inAudioService.cs. - Settings Enhancements:
SettingsManager.csnow includes new properties (MaxImagesToLoad,ImageLoaderMaxRetries/Delay,ApiTimeoutSeconds), value clamping, thread-safe saving (lock), and XML persistence. - MAME Loading: Lazy caching in
MameManager.cs; throwsFileNotFoundExceptionfor better handling. - Similarity Search: Capped parallelism (
MaxDegreeOfParallelism=8), uses settings for image limits inSimilarityCalculator.cs. - UI/UX: Consolidated folder validation; cleaned XAML design-time data; improved
Dispose()with cancellation wait. - Cleanup: Removed redundant code (e.g.,
_currentFindTask, legacy fallbacks).
release_2.4.2
Improve the error logging