-
-
Notifications
You must be signed in to change notification settings - Fork 14
commit 58baca7
abduznik edited this page May 23, 2026
·
1 revision
Commit: 58baca7e2e21aa4708c121036ec7873f8edc65a1
Author: abduznik
Date: 2026-04-29
Why: Fixes a bug or regression in the existing codebase.
lib/core/romm/rom_scanner_service.dart | 20 +++++++++++++++--
lib/core/storage/directory_service.dart | 40 ++++++++++++++++++++-------------
2 files changed, 43 insertions(+), 17 deletions(-)
lib/core/romm/rom_scanner_service.dartlib/core/storage/directory_service.dart
diff --git a/lib/core/romm/rom_scanner_service.dart b/lib/core/romm/rom_scanner_service.dart
index e0925d7..c9a0679 100644
--- a/lib/core/romm/rom_scanner_service.dart
+++ b/lib/core/romm/rom_scanner_service.dart
@@ -89,8 +89,24 @@ class RomScannerService {
final fileName = p.basename(entityPath);
- // Skip hidden files, system files, etc.
- if (fileName.startsWith('.') || fileName.toLowerCase() == 'roms' || fileName.toLowerCase() == 'gamelist.xml') continue;
+ // Skip hidden files, system files, known non-rom files, and files with invalid extensions
+ if (fileName.startsWith('.') ||
+ fileName.toLowerCase() == 'roms' ||
+ fileName.toLowerCase() == 'gamelist.xml' ||
+ fileName.toLowerCase().endsWith('.sav') ||
+ fileName.toLowerCase().endsWith('.srm') ||
+ fileName.toLowerCase().endsWith('.txt') ||
+ fileName.toLowerCase().endsWith('.pdf') ||
+ fileName.toLowerCase().endsWith('.jpg') ||
+ fileName.toLowerCase().endsWith('.png')) {
+ continue;
+ }
+
+ // Strict extension validation
+ if (await File(entityPath).exists() && !DirectoryService.isRomFile(platformSlug, entityPath)) {
+ debugPrint('[Scanner] Skipping non-ROM file by extension: $fileName');
+ continue;
+ }
debugPrint('[Scanner] Discovery: $fileName');
diff --git a/lib/core/storage/directory_service.dart b/lib/core/storage/directory_service.dart
index 844303f..36d4588 100644
--- a/lib/core/storage/directory_service.dart
+++ b/lib/core/storage/directory_service.dart
@@ -74,18 +74,18 @@ class DirectoryService {
static const String _emudeckRootPathKey = 'emudeckRootPath';
// Known extensions per platform slug
- static const Map<String, List<String>> _platformExtensions = {
+ static const Map<String, List<String>> platformExtensions = {
'switch': ['.nsp', '.xci', '.nsz', '.xcz'],
'nintendo-switch': ['.nsp', '.xci', '.nsz', '.xcz'],
'ns': ['.nsp', '.xci', '.nsz', '.xcz'],
- 'gba': ['.gba', '.zip'],
- 'gbc': ['.gbc', '.gb', '.zip'],
- 'gb': ['.gb', '.gbc', '.zip'],
- 'nds': ['.nds', '.zip'],
- 'n64': ['.z64', '.n64', '.v64', '.zip'],
- 'snes': ['.sfc', '.smc', '.zip'],
- 'nes': ['.nes', '.zip'],
- 'psx': ['.bin', '.cue', '.iso', '.img', '.chd'],
+ 'gba': ['.gba', '.zip', '.7z'],
+ 'gbc': ['.gbc', '.gb', '.zip', '.7z'],
+ 'gb': ['.gb', '.gbc', '.zip', '.7z'],
+ 'nds': ['.nds', '.zip', '.7z'],
+ 'n64': ['.z64', '.n64', '.v64', '.zip', '.7z'],
+ 'snes': ['.sfc', '.smc', '.zip', '.7z'],
+ 'nes': ['.nes', '.zip', '.7z'],
+ 'psx': ['.bin', '.cue', '.iso', '.img', '.chd', '.pbp'],
'ps2': ['.iso', '.bin', '.chd'],
'ps3': ['.pkg', '.iso', '.bin', '.edat'],
'psp': ['.iso', '.cso', '.pbp'],
@@ -93,10 +93,20 @@ class DirectoryService {
'gamecube': ['.iso', '.gcm', '.rvz', '.wbfs'],
'wii': ['.iso', '.wbfs', '.rvz'],
'dreamcast': ['.chd', '.gdi', '.cdi', '.iso'],
- 'megadrive': ['.md', '.bin', '.gen', '.zip'],
- 'genesis': ['.md', '.bin', '.gen', '.zip'],
+ 'megadrive': ['.md', '.bin', '.gen', '.zip', '.7z'],
+ 'genesis': ['.md', '.bin', '.gen', '.zip', '.7z'],
+ '3ds': ['.3ds', '.cia', '.app'],
+ 'wiiu': ['.wua', '.rpx', '.wud', '.wux'],
};
+ static bool isRomFile(String platformSlug, String path) {
+ final ext = p.extension(path).toLowerCase();
+ if (ext.isEmpty) return false; // Folders are handled separately or skip
+ final allowed = platformExtensions[platformSlug.toLowerCase()] ?? [];
+ if (allowed.isEmpty) return true; // If no list, allow all (risky but fallback)
+ return allowed.contains(ext);
+ }
+
final SharedPreferences _prefs;
late String romsRootPath;
late String emulatorsRootPath;
@@ -389,7 +399,7 @@ class DirectoryService {
/// Checks if a platform's emulator natively supports ZIP or 7Z archives.
bool platformSupportsArchive(String? platformSlug) {
if (platformSlug == null) return false;
- final extensions = _platformExtensions[platformSlug.toLowerCase()] ?? [];
+ final extensions = platformExtensions[platformSlug.toLowerCase()] ?? [];
return extensions.any((ext) => ext.toLowerCase() == '.zip' || ext.toLowerCase() == '.7z');
}
@@ -481,7 +491,7 @@ class DirectoryService {
}
// Try with extensions
- final extensions = _platformExtensions[platformLower] ?? [];
+ final extensions = platformExtensions[game.platformSlug?.toLowerCase()] ?? [];
for (final ext in extensions) {
final nameWithExt = lowerName.endsWith(ext.toLowerCase()) ? lowerName : '$lowerName${ext.toLowerCase()}';
if (index.files.containsKey(nameWithExt)) return index.files[nameWithExt];
@@ -548,7 +558,7 @@ class DirectoryService {
}
// 4. Try common extensions for this platform (Case-insensitive)
- final extensions = _platformExtensions[platformLower] ?? [];
+ final extensions = platformExtensions[platformLower] ?? [];
for (final dirPath in searchDirs) {
final pDir = Directory(dirPath);
if (!await pDir.exists()) continue;
@@ -600,7 +610,7 @@ class DirectoryService {
// But we still try to find a "main" file inside first for better emulator compatibility
}
- final extensions = _platformExtensions[game.platformSlug?.toLowerCase()] ?? [];
+ final extensions = platformExtensions[game.platformSlug?.toLowerCase()] ?? [];
File? largestFile;
int largestSize = 0;