Skip to content

Releases: purelogiccode/FindRomCover

release_3.1.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 02 Sep 16:56

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.dat is quarantined as settings.dat.corrupt and 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.exe fallback for systems without a default browser association.
  • Version bumped to 3.1.0.

Download

  • release_3.1.0_win-x64.zip — Windows x64
  • release_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

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 12 Jul 18:27

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.014.15.0
  • MessagePack 3.1.73.1.8
  • Microsoft.Web.WebView2 1.0.4022.491.0.4078.44
  • Serilog 4.3.14.4.0

release_3.0.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 06 Jul 00:40

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 ImageFolderWatcher service 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.xml is automatically migrated on first launch
  • API keys are masked in log output

Logging

  • Migrated from custom AppLogger to 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
  • SettingsManager registered as a singleton

Startup & Shutdown

  • Orphaned temp files are cleaned up on startup
  • Graceful shutdown with proper disposal of HttpClient, AudioService, ErrorLogger, and ServiceProvider
  • Global exception handlers for AppDomain, TaskScheduler, and Dispatcher

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 ProgressRing indicators 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

  • MameManager refactored to a static class returning MameData objects
  • SupportedExtensions changed from HashSet<string> to List<string> with INotifyPropertyChanged
  • Filename sanitization to prevent path traversal attacks
  • FindCorrespondingRomFile with case-insensitive fallback search

Breaking Changes

  • PlaySound service removed — replaced by IAudioService with NullAudioService fallback
  • settings.xml no longer used — migrated to encrypted settings.dat
  • MameManager is no longer a serializable DTO — use MameData instead

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 ImageFolderWatcher deduplication 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

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 25 May 04:20

Bug Fixes

  • Fixed similarity calculation for empty strings (both Levenshtein and Jaro-Winkler now return 100% instead of NaN or 0)
  • Handle InvalidWmpVersionException in 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 UpdateCheckOrchestrator service as a proper orchestration layer for update checking, separating concerns between API calls and notification display
  • Added UpdateNotificationInfo record 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.FromException now 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, and NullAudioService
  • Expanded test coverage for edge cases in SettingsManager, MameDataService, ImageProcessor, ImageLoader, NgramIndex, SimilarityCalculator, and ErrorLogger

Full Changelog: release_2.8.0...release_2.9.0

release_2.8.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 12 May 03:28

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 PreviewKeyDown to 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 to SemaphoreSlim-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.Exit called on shutdown to ensure all background threads terminate.

Removed

  • MameManager class. Replaced by MameDataService.
  • ImageData.ClearCachedContextMenu method.
  • UseWindowsForms SDK reference (no longer needed).
  • AppConstants.AccentPrefix, unused app constants, and TabIndex attributes (redundant when using IsDefault/IsCancel).

Dependencies

  • ControlzEx updated from 7.0.3 to 7.0.4
  • Magick.NET-Q16-AnyCPU updated from 14.12.0 to 14.13.0
  • Microsoft.Extensions.DependencyInjection and Abstractions updated 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.
  • InternalsVisibleTo attribute exposes internal methods for testing.

Full Changelog: release_2.7.0...release_2.8.0

release_2.7.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 14 Apr 03:30

Code Quality & Documentation

  • XML Documentation: Added comprehensive XML documentation to services and models for improved code clarity and IntelliSense support.
  • MameDataService: Deprecated the legacy MameManager class in favor of the newer MameDataService, improving maintainability and consistency across the codebase.

UI Improvements

  • Accessibility: Enhanced UI accessibility with proper AutomationProperties for better screen reader support.
  • Resource Consolidation: Refactored UI resources into App.xaml for 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

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 22 Feb 00:01

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 MissingImageItem model 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

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 21 Jan 19:59

Update dependencies, and enhance image loading resilience

  • Update Magick.NET library to version 14.10.2.
  • Refactor ImageLoader to improve error resilience and handling for corrupted or empty images.
  • Optimize image processing logic for better memory and exception management.
  • Adjust SimilarityCalculator to provide clearer error reporting for failed image loads.

release_2.5.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 08 Jan 13:54
  • Image Processing: Replaced GDI+ with Magick.NET in ImageLoader.cs and ImageProcessor.cs for robust loading/saving, auto-orientation, error correction, and reduced memory usage. Added configurable retries/delays via SettingsManager.
  • Cancellation & Async Handling: Overhauled LstMissingImages_SelectionChanged in MainWindow.xaml.cs with proper semaphore usage, early cancellation, Task.Yield() for UI responsiveness, and HashSet for efficient ROM deduplication. Improved missing files scan with exception resilience.
  • Error Management: Enhanced logging with detailed contexts. Added lazy NullAudioService fallback in App.xaml.cs and silent WMP handling in AudioService.cs.
  • Settings Enhancements: SettingsManager.cs now includes new properties (MaxImagesToLoad, ImageLoaderMaxRetries/Delay, ApiTimeoutSeconds), value clamping, thread-safe saving (lock), and XML persistence.
  • MAME Loading: Lazy caching in MameManager.cs; throws FileNotFoundException for better handling.
  • Similarity Search: Capped parallelism (MaxDegreeOfParallelism=8), uses settings for image limits in SimilarityCalculator.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

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 03 Jan 22:50

Improve the error logging