#################################
# Clean No-Intro ROMs
# Author: SigKill
# Website: http://sigkillit.com
# Last Updated: 07/01/2025
################################# IMPORTANT: Make sure no Antivirus or Backups are scanning the source or destination folders for maximum performance!
#################################
#################################
#################################



CHANGE LOG
#################################

## [v6.4] - 07/01/2025
-Updated 3_CheckXML.ps1 to Detect non-game ROMs, Identify ROM files not listed in gamelist.xml, and Identify media files not listed in gamelist.xml. 
-Extended $script:ValidateData in 3_CheckXML.ps1 to include EmulationStation metadata and Batocera extended metadata fields.
-Enhanced $script:RomDistroConfigs with GameListRoot, MediaRoot, and MediaFolders for 3_CheckXML.ps1.
-Added 6_RemovedOrphanedFiles.ps1 to compliment the Orphaned ROM and Orphaned Media detection in 3_CheckXML.ps1.
-Corrected 'odyssey2' name to 'o2em' for Batocera in $script:RomNoIntroHashTable and the filter name.
-Fixed a bug in the MasterhashTable.ps1 "comments".  Apparently if you comment out a HashTable key/value pair it's still parsed and not treated as a comment and had weird effects breaking code in Convert-MasterHashTable.ps1 when modifying the comments. I removed the key/value pairs in the comments.
-Split MasterHashTable.ps1 into a second script Convert-MasterHashTable.ps1 so the original only has the hash tables and the latter converts it to other formats, and updated the code to better handle bugs. This is in preparation for future releases to start dot sourcing the MasterHashtable.ps1 so I can make further improvements such as having a single filter per game system instead of a version for each distro.
-Improved Show-RetroDistroValidation to dynamically list valid enum values.
-Updated Write-Out to Version 1.7
-Updated filters for amiga1200, atarist, c64, fds, gb, gbc, msx1, msx2, o2em, pcengine, pico, satellaview, scv, and vsmile

## [v6.3] - 06/15/2025
-Added _functions folder containing ps1 files for helper and log functions. These are now dot-sourced into each script, enabling centralized updates.
-Created MasterHashTable.ps1 in _functions, which defines detailed No-Intro and Custom hash tables. It can output these in multiple formats for copy/paste or future dot-sourcing.
-Introduced 5_ConfirmFiltersExist.ps1 to validate the existence of required filters per distro.
-Added RetroBat to the list of supported distros.
-Fixed a typo in 4_UpdateVersion.ps1 related to $filterDirectory validation.
-Corrected an incorrect filter file name (odyssey2.ps1) for Batocera.

## [v6.2] - 06/04/2025
-Added support for multiple Retro OS distributions, including major ones like Batocera, Recalbox, Lakka, and RetroPie. RetroPie was included despite appearing to slow or stop updates.
-To add support for a new Retro OS, update the RetroGameDistros enum, adjust any references to $script:RomDistro, extend $script:RomDistroConfigs, and extend either $script:RomNoIntroHashTable or $script:RomNoCustomHashTable with appropriate directory and filter configurations.
-Added support for multiple ROM source directories by making it an array instead of string. For example, the Commodore 64 system now references all three No-Intro source folders directly within the No-Intro hash table, eliminating the need for manual merging and inlcluding it in the Custom hash table.
-Updated all filters.
-Fixed an issue in Get-NoIntroDefaultFilters and Get-CustomDefaultFilters that caused errors when creating new filters. Also added additional fallback pattern matches for edge cases.
-Fixed a fringe case bug identifying primary ROM when $romsSortOrder has no matches and there are multiple matches for a unique ROM name. The script now selects the first match based on the default sort order.
-Refactored and reorganized the codebase with #region blocks, improved modularity, and optimized performance. Also upgraded Write-Out to v1.6.
-Updated the minimum required version to PowerShell 5.1.

## [v6.1] - 05/02/2025
-Updated filters to remove additional non-games and duplicates based on scraping tests.

## [v6.0] - 06/07/2023
-Rewrote all code to add features, updates, general code improvements, and optimizations for All Scripts which in some cases such as 3_CheckXML.ps1 are 10x faster!
-Added readme.txt and moved the change logs to there instead of the individual scripts.
-Updated Write-Out to v1.5 to allow support for multiple log files.
-Added ability to have Custom ROMs in Addition to No-Intro ROMs and Renamed functions to generalize the names.
-Added ability to detect Multicart ROMs for gaming systems that used multiple disks for a single game. I would consider this an experimental feature at the moment and will probably be improved in a future release.  So far in my testing, I'm getting the same results as v5.5 so it looks to be working fine but helps cleanup the filters needed.
-Replaced split() with -split to determine Primary ROM name. Split() is char array and -split is string array which allows using regex for advanced matching.
-Fixed issue with unzipping ROMs by Adding -LiteralPath
-On Filters, Renamed $romSplitchar with $romSplitstr to reflect switching to -split
-On Filters, Added $romSortAscending to allow sorting ROMS Ascending or Descending to determine Primary ROM name
-On Filters, added $romsMultiCart to detect Multicart Games
-Repaced Sort-Object with Natural Sort when determining primary ROM for ascending/descending order.
-Added variables to optionally skip sections of the script for faster results or test runs
-Added additional time tracking to results

## [v6.0b] - 06/07/2023
-Different code in '1_Clean-NoIntroRoms.ps1' Clean-Roms() Function on "STEP 3/7): Remove Exceptions" versus the code in the v6.0 release that I might want to later implement. This code seems to run faster on larger data sets or when it matches a large number of files to remove as exceptions. However, it seems to suffer when doing exact ROM matches, which is why I opted to pull it.

## [v5.6] - 11/5/2022
-Added 4_UpdateVersion.ps1 Script to programatically update version #'s on scripts and filters
-Added "Description" to Filters to help identify the ROM set they're intended to be used on. 
-Updated Clean-NoInroRoms Default Filters to Include a Description.

## [v5.5] - 10/3/2022
-Added $romSplitchar variable to Filters to customize how unique ROM names are determined
-Everything to the left of $romSplitchar is determined to be the unique ROM name.  
-If $romSplitchar is left blank, all ROMs will be skipped. Recommended to keep default '(' for No-Intro ROMs
-Fixed logs in 1_Clean-NoIntroRoms_Exceptions.log so they stay in order

## [v5.4] - 10/3/2022
-Fixed bug in Get-NoIntroRomsExceptions When ROM Name Does Not Contain '('
-Fixed bug setting non-duplicate primary ROM due to name missing $romSplitchar resulting in 0 matches
-Updated Filters by adding ROM extensions as last resort when matching, otherwise primary ROM is never set
-Added $script:ScriptVersion to Set Filter Version in Get-NoIntroDefaultFilters Function

## [v5.3] - 12/11/2020
-Re-Added Function Get-NoIntroDefaultFilters which was accidently removed from version 5.2
-Renamed "config" to "filter" where filters are stored
-Added Changelog in Comments

## [v5.2] - 10/8/2020
-Added variables for Write-Out Colors and Updated to Write-Out v1.3
-Updated Filters
-On CheckXML.ps1, Missing attributes set to $true were not being detected, only worked if they had a blank value

## [v5.1] - 9/28/2020
-Fixed minor bugs and updated filters

## [v5.0] - 9/10/2020
-Rewrote the code to be modular by importing filters for each game system instead of using separate scripts
-Added variables to define where to store game system filters and logs
-Replaced $MyInvocation.MyCommand.Name with $PSCommandPath which requires Powershell 3 or greater
-Replaced Log-Write with Write-Out function which requires Powershell 4 or greater
-Added Atari Jaguar because it can run on PI4 with proper customization
-Fixed bug with romsDoNotDelete
-Fixed bug where exceptions were not removed from uniqueRom causing it to still evaluate them for duplicates



SCRIPT USAGE
#################################

1_Clean-NoIntroRoms.ps1
*********************************
Description: 
	I did not want my Emulation Distros to be cluttered with unnecessary ROMs. I only wanted the original games, I did not want duplicates, revisions, and I preferred games in English. For example, the NES has about 716 officially licensed games and the No-Intro 2018 ROM set has about 2,748 games in it. I wanted to reduce that number closer to the officially licensed games count to save space and reduce the amount of ROMs I would have to scroll through each time. I decided to create several powershell scripts based on the No-Intro 2018 ROM set to accomplish my goal, which is explained in further detail below.

[Select Retro OS Distribution to Process]
$script:RomDistro: 
	Select the Retro OS Distribition to process, which is restricticted to the values in the RetroGameDistros Enumeration currently including (Batocera, Recalbox, Lakka, and Retropie).  You can have multiple values in an array format if you want to run against multiple distros.
	Default is All Distros.

[ROM Sets Directories and Processing]
$script:RomNoIntroDirectory: 
	Source No-Intro 2018 Game System ROM Directory. Each game system should have a folder in here that matches in $script:RomNoIntroHashTable.
	Default is "C:\Games\Complete ROM Sets\No-Intro 2018\".

$script:RomCustomDirectory: 
	Source Custom Game System ROM Directory. Each game system should have a folder in here that matches in $script:RomCustomHashTable. 
	Default is "C:\Games\Complete ROM Sets\Custom\".

$script:RomCleanDirectory: 
	Destination Directory to Copy Cleaned Source ROMs. Each game system will have a directory in here that matches the one on retropie as  defined in $script:RomNoIntroHashTable and $script:RomCustomHashTable. 
	Default is "C:\Games\Distros\".

$script:RomCleanDirectoryPurge: 
	Purge the $script:RomCleanDirectory Directory Before Copying ROMs. It is recommended to enable this to ensure you ONLY have the cleaned ROMs in your destination directory. When running the script multiple times while changing filters, your cleaned ROM results will differ. For example: On your initial run you end up with 100 cleaned ROMs, then you modify a filter for a second run that has 95 cleaned ROMs, you would still have at least 100 ROMs in the Destination Cleaned ROM directory even if you enabled	$script:RomOverwrite. 
	Default is $true.

$script:RomCleanDirectoryOverwrite: 
	Overwrite existing ROMs in each game system directory in $script:RomCleanDirectory if the game system directory exists. When $false, it will not copy any ROMs into the game system directory if it exists. When $true, it will copy and overwrite ROMs into the game system directory if it exists, but will not remove any additional ROMs or files that exist. The intent is to replace a ROMs you find issues with when testing without having to clear the entire directory such as replacing a corrupt ROM with a known good ROM of the same name.  It is recommended to use $script:RomCleanDirectoryPurge instead. 
	Default is $false.

$script:RomFilterDirectory: 
	Directory that stores the "filters" for each game system. The filters are .ps1 files named using the RetroPie directory name defined in $script:RomNoIntroHashTable and $script:RomCustomHashTable. I have customized the filters for each system and included them by default. You can modify them to your liking or if they do not exist, the script will generate a generic filter for each system. 
	Default is a "filters" folder in the same directory as the script.

$script:RomDedupMultiSourceReversed:
	For Game Systems that have multiple source folders such as Commodore 64, it will deduplicate ROMS keeping the first ROM based on the Priority the folders are specified in $script:RomNoIntroHashTable or $script:RomCustomHashTable.  the default preference is to keep the file based on the source folder older in the event of a duplicate file.  For example, if there are two source folders (Source1 and Source2), then there is a duplicate file (zork1.zip) in both folders, it will copy that file from Source1 and will not copy/overwrite the duplicate from the Source2 folder.  If you wish to change this behavior, setting this to $false will reverse the order so the last folder specified will take the highest priority.
	Default is $false.

$script:RomNoIntroHashTable: 
	HashTable containing No-Intro ROM directory names on the retropie and your source directory listed by each Retro OS Distribution. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for Nintendo NES, you can comment out the other systems by adding a # at the begginning of that line ex: # "nes" = @("Nintendo - Nintendo Entertainment System [headered]"), but make sure you do it under the Distribution that matches $script:RomDistro (e.g. [RetroGameDistros]::Batocera). 
	Default is all enabled unless noted othewise.
	
$script:RomCustomHashTable: 
	HashTable containing Custom ROM directory names on the retropie and your source directory listed by each Retro OS Distribution. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for NeoGeo, you can comment out the other systems by adding a # at the begginning of that line ex: # "neogeo" = "neo-geo-mvs-romset", but make sure you do it under the Distribution that matches $script:RomDistro (e.g. [RetroGameDistros]::Batocera). 
	Default is all enabled unless noted othewise.

[Enable/Disable Parts of the Script to Run]
$script:RunNoIntroRomsExceptions: 
	Enable/Disable running the Get-RomsExceptions Function used to build a list of potential exceptions to create filters used to remove unwanted ROMs for each system defined in the $script:RomNoIntroHashTable. 
	Default is $true.
	
$script:RunNoIntroRomsClean: 
	Enable/Disable running the Clean-Roms Function used to clean No-Intro ROMs defined in the $script:RomNoIntroHashTable. 
	Default is $true.

$script:RunNoIntroRomsUpload:
	Enable/Disable running the Upload-Roms Function used to upload cleaned No-Intro ROMs to the Distros.
	Default is $false.
	
$script:RunCustomRomsExceptions: 
	Enable/Disable running the Get-RomsExceptions Function used to build a list of potential exceptions to create filters used to remove unwanted ROMs for each system defined in the $script:RomCustomHashTable. 
	Default is $false.

$script:RunCustomRomsClean: 
	Enable/Disable running the Clean-Roms Function used to clean Custom ROMs defined in the $script:RomCustomHashTable. 
	Default is $false.
	
$script:RunCustomRomsUpload:
	Enable/Disable running the Upload-Roms Function used to upload cleaned Custom ROMs to the Distros.
	Default is $false.

[Retropie Upload ROM Variables]
$script:RomDistroDirectoryPurge
	Purge the destion ROM directory for each game system prior to copying the cleaned Rom Source to your distro. It is recommended to enable this to ensure you ONLY have the cleaned ROMs. 
	Default is $true.

$script:RomDistroOverwrite: 
	Overwrite existing ROMs in each game system directory in $script:RomRetropieDirectory if the game system directory exists. When $false, it will not copy any ROMs into the game system directory if it exists. When $true, it will copy and overwrite ROMs into the game system directory if it exists, but will not remove any additional ROMs or files that exist. It is recommended to use $script:RomRetropieDirectoryPurge instead. 
	Default is $false.

$script:RomDistroConfigs: 
	UNC SMB path for each distros roms directory, default username/password, root directory for gamelist.xml, root directory for media files and the media folder names, and custom error message. You shouldn't have to change these variable unless your comptuter is unable to resolve the distro name on your network in which case you can replace it with the ip ex: "\\192.168.5.25\roms\" for Retropie.
	Default is "\\retropie\roms\"

[System Variables - Do Not Change These]
$script:ScriptName: Defaults to name of the .ps1 script. Do not change this.
$script:ScriptVersion: Script version.  Do not change this.
enum RetroGameDistros: Enumeration of available RetroOS's available in the script.  Do not change unless you plan to expand all of the code where used.
$script:LogFile: Main log file where all output is stored. Do not change this.
$script:LogOverwrite: Overwrite Log Files each time the script runs. Do not change this.
$script:LogVerbose: Log detailed info for determining primary ROM for debugging. Do Not change this.
$script:LogRemoveExceptions: Log removal of ROM Exceptions. Default is true, and setting to false is for advanced use only to speed up results on large ROM sets. Do not change this.



2_CompareFolderResults
*********************************
Description: 
	This is intended to be used as the supplemental script (2_CompareFolderResults.ps1) to be used in conjunction with the 1_Clean-NoIntroRoms.ps1 and 3_CheckXML.ps1 scripts. This script allows you to compare the files/roms in 2 directories to show the differences in files of each folder by using the compare-object cmdlet. It is intended to compare the different results in 1_Clean-NoIntroRoms.ps1 when you change the filters for a system.

[Select Retro OS Distribution to Process]
$script:RomDistro: 
	Select the Retro OS Distribitin to process, which is restricticted to the values in the RetroGameDistros Enumeration currently including (Batocera, Recalbox, Lakka, and Retropie). You can only select 1 value since it's only comparing 2 folders.
	Default is Batocera.
	
[ROM Sets Directories and Processing]
$script:RomCleanDirectory1: 
	Directory with Cleaned ROMs. Each game system will have a directory in here that matches the one on retropie as defined in $script:RomNoIntroHashTable and $script:RomCustomHashTable. 
	Default is "C:\Games\Batocera\roms\".

$script:RomCleanDirectory2: 
	Alternate Directory with Cleaned ROMs, which you want to compare to $script:RomCleanDirectory. If you want to test modifying filters on 1_Clean-NoIntroRoms.ps1, you can use this directory to compare your results. 
	Default is "C:\Games\Batocera\roms2\".
	
$script:RomNoIntroHashTable: 
	HashTable containing No-Intro ROM directory names on the retropie and your source directory listed by each Retro OS Distribution. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for Nintendo NES, you can comment out the other systems by adding a # at the begginning of that line ex: # "nes" = @("Nintendo - Nintendo Entertainment System [headered]"), but make sure you do it under the Distribution that matches $script:RomDistro (e.g. [RetroGameDistros]::Batocera). 
	Default is all enabled unless noted othewise.
	
$script:RomCustomHashTable: 
	HashTable containing Custom ROM directory names on the retropie and your source directory listed by each Retro OS Distribution. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for NeoGeo, you can comment out the other systems by adding a # at the begginning of that line ex: # "neogeo" = "neo-geo-mvs-romset", but make sure you do it under the Distribution that matches $script:RomDistro (e.g. [RetroGameDistros]::Batocera). 
	Default is all enabled unless noted othewise.

[Enable/Disable Parts of the Script to Run]
$script:RunNoIntroRomsCompare: 
	Enable/Disable comparing folders for No-Intro ROMs defined in $script:RomNoIntroHashTable. 
	Default is $true.

$script:RunCustomRomsCompare: 
	Enable/Disable comparing folders for Cusom ROMs defined in $script:RomNoIntroHashTable. 
	Default is $false.

[System Variables - Do Not Change These]
$script:ScriptName: Defaults to name of the .ps1 script. Do not change this.
$script:ScriptVersion: Script version.  Do not change this.
enum RetroGameDistros: Enumeration of available RetroOS's available in the script.  Do not change unless you plan to expand all of the code where used.
$script:LogFile: Main log file where all output is stored. Do not change this.
$script:LogOverwrite: Overwrite Log Files each time the script runs. Do not change this.



3_CheckXML.ps1
*********************************
Description: 
	This is intended to be used as the supplemental script (3_CheckXML.ps1) to be used in conjunction with the 1_Clean-NoIntroRoms.ps1 and 2_CompareFolderResults.ps1 scripts. This script allows you check missing scraped data in RetroPie by examining the gamelist.xml file for each game system on you RetroPie. This can save you HOURS of time manually checking for missing ROM scraped data. In addition, it helps identify potential duplicate ROMs based on the scraped Name.  NOTE: Duplicate detection was re-written in 6.0, so it is about 10x faster! You can Check No-Intro in about 1min vs. 10min on older versions of the script.

[Select Retro OS Distribution to Process]
$script:RomDistro: 
	Select the Retro OS Distribition to process, which is restricticted to the values in the RetroGameDistros Enumeration currently including (Batocera, Recalbox, Lakka, and Retropie).  You can have multiple values in an array format if you want to run against multiple distros.
	Default is Batocera.

[ROM Sets Directories and Processing]
$script:RomSplitstr: 
	Manually set $romSplitst, otherwise it will import it from the games filter file. This is used to determine the ROM's unique name. 
	Default is "" so it will import from the games Filter.

$script:RomFilterDirectory: 
	Directory that stores the "filters" for each game system. The filters are .ps1 files named using the RetroPie directory name defined in $script:RomNoIntroHashTable and $script:RomCustomHashTable. I have customized the filters for each system and included them by default. You can modify them to your liking or if they do not exist, the script will generate a generic filter for each system. 
	Default is a "filters" folder in the same directory as the script.				  

$script:FindRomDuplicates: 
	Optionally skip duplicate ROM detection and only do $script:ValidateData checks. Duplicate detection was greately improved in version 6.0 to be about 10x faster, so it's not really necessary to disable this. Uses the same method as 1_Clean-NoIntroRoms.ps1 to identify potential duplicates based on their base name and supports multicart roms.
	Default setting is $true. 

$script:IgnoreMulticartDuplicates: 
	If enabled, any potential duplicate ROM that matches the regex in $MultiCartExceptions would be excluded as a duplicate. 
	Default is $true.

$script:MultiCartExceptions: 
	Manually set $MultiCartExceptions, otherwise it will import from the games filter file if left blank.  This is used to determine Multirom games when identifying duplicate ROMs.
	Default is @().

$script:NonGames:
	Optionally used to Find Non-Games in the gamelist.xml. You will need to customize this based on the scraper used as they all work differently, and it is an array so you can supply multiple valus for different systems/scrapers. Default value is the one used by Batocera's scraper.
	Default is @("ZZZ(notgame)")

$script:FindGameDuplicates:
	Optionally find duplicate games in gamelist.xml after scraping. Checks for duplicate name elements in gamelist.xml after scraping.  For example, for Commodore 64 some ROMs have different ROM names for the same game that would be missed by ROM Duplicates due to the ROM basenames being different such as 'Wonder Boy (USA, Europe).zip' vs 'Wonderboy (USA, Europe).zip'.
	Default is $true.

$script:FindNonGame:
	Optionally find Non-Games in gamelist.xml after scraping. These would show up like 'ZZZ\(notgame)' in the XML file for things such a calculator program, but this can vary based on the scraper used. You will need to customize this using the $script:NonGames variable.
	Default is $true.
	
$script:FindRomsNotInXml:
	Optionally find ROMs not in the gamelist.xml after scraping. These are orphaned ROM files in the directory.
	Default is $true.
	
$script:FindMediaNotInXml:
	Optionally find Media files not in gamelist.xml after scraping. These are orphaned media files such as videos
	Default is $true.

$script:ValidateVerbose: 
	Override all settings in ValidateChild and Validate all properties in it. Please note, many game systems do not use all of the properties, so this will add a lot more results and increase the time to run the script.
	Default is $false.

$script:ValidateData: 
	Allows you to individually set the properties to check if the data has been scraped. Please note, many game systems do not use all of the properties, or you may have chosen to not scrape certain data such as videos to save disk space. I have only enabled the most common properties by default. If $script:ValidateVerbose is enabled, all properties set here will be ignored and it will check all properties. 
	Default is "name, image, desc" set to $true and the rest set to $false.

$script:RomNoIntroHashTable: 
	HashTable containing No-Intro ROM directory names on the retropie and your source directory. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for Nintendo NES, you can comment out the other systems by adding a # at the begginning of that line ex: # "nes" = "Nintendo - Nintendo Entertainment System [headered]". 
	Default is all enabled.
	
$script:RomCustomHashTable: 
	HashTable containing Custom ROM directory names on the retropie and your source directory. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for NeoGeo, you can comment out the other systems by adding a # at the begginning of that line ex: # "neogeo" = "neo-geo-mvs-romset". 
	Default is all enabled.

[Enable/Disable Parts of the Script to Run]
$script:RunNoIntroRomsXml: 
	Enable/Disable checking XML for No-Intro ROMs defined in $script:RomNoIntroHashTable. 
	Default is $true.
	
$script:RunCustomRomsXml: 
	Enable/Disable checking XML for Custom ROMs defined in $script:RomCustomHashTable. 
	Default is $false.
	
[Distro Configs]
$script:RomDistroConfigs: 
	UNC SMB path for each distros roms directory, default username/password, root directory for gamelist.xml, and custom error message. You shouldn't have to change these variable unless your comptuter is unable to resolve the distro name on your network in which case you can replace it with the ip ex: "\\192.168.5.25\roms\" for Retropie.
	Default is "\\retropie\roms\"

[System Variables - Do Not Change These]
$script:ScriptName: Defaults to name of the .ps1 script. Do not change this.
$script:ScriptVersion: Script version.  Do not change this.
enum RetroGameDistros: Enumeration of available RetroOS's available in the script.  Do not change unless you plan to expand all of the code where used.
$script:LogFile: Main log file where all output is stored. Do not change this.
$script:LogOverwrite: Overwrite Log Files each time the script runs. Do not change this.



4_UpdateVersion.ps1
*********************************
Description: 
	This is intended to be used as the supplemental script to be used in conjunction with the other scripts and game system filters. Whenever an update is made to any script or filter that requires a version update, this script will update the version number in each file. In addition, it will append the version to the 'CHANGE LOG' section in readme.txt, which you can add the changes made.

[Select Retro OS Distribution to Process]
$script:RomDistro: 
	Select the Retro OS Distribition to process, which is restricticted to the values in the RetroGameDistros Enumeration currently including (Batocera, Recalbox, Lakka, and Retropie).  You can have multiple values in an array format if you want to run against multiple distros.
	Default is Batocera.

[ROM Filters Directories and Processing]	
$script:RomFilterDirectory: 
	Directory that stores the "filters" for each game system. The filters are .ps1 files named using the RetroPie directory name defined in $script:RomNoIntroHashTable. I have customized the filters for each system and included them by default. You can modify them to your liking or if they do not exist, the script will generate a generic filter for each system. 
	Default is a "filters" folder in the same directory as the script.

$FileVersion: 
	Manually Set Script Version here or Read it From First Script File.
	Default is "", which means it will read the value from the first Script File.
	
[Enable/Disable Parts of the Script to Run]
$script:DryRun
	Displays the changes it will make on the Script Files, Readme.txt, and Filter files without actually writing data.
	Default is $true as a safeguard to prevent accidental overwriting

[System Variables - Do Not Change These]
$script:ScriptName: Defaults to name of the .ps1 script. Do not change this.
$script:ScriptVersion: Script version.  Do not change this.
enum RetroGameDistros: Enumeration of available RetroOS's available in the script.  Do not change unless you plan to expand all of the code where used.
$script:LogFile: Main log file where all output is stored. Do not change this.
$script:LogOverwrite: Overwrite Log Files each time the script runs. Do not change this.



5_ConfirmFiltersExist.ps1
*********************************
Description: 
	This script audits your filters to ensure there is a filter file for each distro.

[Select Retro OS Distribution to Process]
$script:RomDistro: 
	Select the Retro OS Distribition to process, which is restricticted to the values in the RetroGameDistros Enumeration currently including (Batocera, Recalbox, Lakka, and Retropie).  You can have multiple values in an array format if you want to run against multiple distros.
	Default is Batocera.

[ROM Filters Directories and Processing]	
$script:RomFilterDirectory: 
	Directory that stores the "filters" for each game system. The filters are .ps1 files named using the RetroPie directory name defined in $script:RomNoIntroHashTable. I have customized the filters for each system and included them by default. You can modify them to your liking or if they do not exist, the script will generate a generic filter for each system. 
	Default is a "filters" folder in the same directory as the script.

$script:RomNoIntroHashTable: 
	HashTable containing No-Intro ROM directory names on the retropie and your source directory. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for Nintendo NES, you can comment out the other systems by adding a # at the begginning of that line ex: # "nes" = "Nintendo - Nintendo Entertainment System [headered]". 
	Default is all enabled.
	
$script:RomCustomHashTable: 
	HashTable containing Custom ROM directory names on the retropie and your source directory. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for NeoGeo, you can comment out the other systems by adding a # at the begginning of that line ex: # "neogeo" = "neo-geo-mvs-romset". 
	Default is all enabled.

[Distro Configs]
$script:RomDistroConfigs: 
	UNC SMB path for each distros roms directory, default username/password, root directory for gamelist.xml, and custom error message. You shouldn't have to change these variable unless your comptuter is unable to resolve the distro name on your network in which case you can replace it with the ip ex: "\\192.168.5.25\roms\" for Retropie.
	Default is "\\retropie\roms\"

[System Variables - Do Not Change These]
$script:ScriptName: Defaults to name of the .ps1 script. Do not change this.
$script:ScriptVersion: Script version.  Do not change this.
enum RetroGameDistros: Enumeration of available RetroOS's available in the script.  Do not change unless you plan to expand all of the code where used.
$script:LogFile: Main log file where all output is stored. Do not change this.
$script:LogOverwrite: Overwrite Log Files each time the script runs. Do not change this.



6_RemoveOrphanedFiles.ps1
*********************************
Description: 
	This script removes orphaned ROM and Media files from Distros that do not exist in gamelist.xml. It is meant to compliment the orphaned ROM and Media detection in 3_CheckXML.ps1.

[Select Retro OS Distribution to Process]
$script:RomDistro: 
	Select the Retro OS Distribition to process, which is restricticted to the values in the RetroGameDistros Enumeration currently including (Batocera, Recalbox, Lakka, and Retropie).  You can have multiple values in an array format if you want to run against multiple distros.
	Default is Batocera.

[ROM Directories and Processing]	
$script:RomNoIntroHashTable: 
	HashTable containing No-Intro ROM directory names on the retropie and your source directory. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for Nintendo NES, you can comment out the other systems by adding a # at the begginning of that line ex: # "nes" = "Nintendo - Nintendo Entertainment System [headered]". 
	Default is all enabled.
	
$script:RomCustomHashTable: 
	HashTable containing Custom ROM directory names on the retropie and your source directory. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for NeoGeo, you can comment out the other systems by adding a # at the begginning of that line ex: # "neogeo" = "neo-geo-mvs-romset". 
	Default is all enabled.

[Distro Configs]
$script:RomDistroConfigs: 
	UNC SMB path for each distros roms directory, default username/password, root directory for gamelist.xml, and custom error message. You shouldn't have to change these variable unless your comptuter is unable to resolve the distro name on your network in which case you can replace it with the ip ex: "\\192.168.5.25\roms\" for Retropie.
	Default is "\\retropie\roms\"

$script:DeleteOrphanedRoms: Enable/Disable deleting orphaned ROMs.

$script:DeleteOrphanedMedia: Enable/Disable deleting orphaned Media files.

[System Variables - Do Not Change These]
$script:ScriptName: Defaults to name of the .ps1 script. Do not change this.
$script:ScriptVersion: Script version.  Do not change this.
enum RetroGameDistros: Enumeration of available RetroOS's available in the script.  Do not change unless you plan to expand all of the code where used.
$script:LogFile: Main log file where all output is stored. Do not change this.
$script:LogOverwrite: Overwrite Log Files each time the script runs. Do not change this.



FILTERS USAGE
#################################

Description: 
	I have customized and included these since v5.0 and they are located in ".\filters\<gamesystem>.ps1". If you want customize which ROMs are cleaned or kept for each system, this is what you want to change.

$romSplitstr: 
	Customize the string used to split a ROM name to determine the unique ROM names by using everything to the left of this string. This string is a regex to allow advanced matching, but you need to escape special characters using a backslash '\' or using [regex]::escape(), which will automatically escape any special characters. 
	Default for the No-Intro ROMs this is a left parenthesis set as "\(" or [regex]::escape("("), and varies for the Custom ROMs. For example, when comparing "Darkwing Duck (USA).zip" and  "Darkwing Duck (Europe).zip" for NES, the unique ROM name would be "Darkwing Duck ". The script would then use $romSortOrder to determine which of the two files to keep, which would be the USA version if you use my default filters.

$romSortAscending: 
	Determines if the ROMs are sorted in ascending/descending alphabetical order. The sort order determines the order the ROMs are matched in $romsSortOder and if there are no matches the first file is chosen as primary. 
	Default is $true which sorts ROMs ascending.

$romUnzip: 
	Unzip ROMs for emulators that don’t support .zip files. Setting this to $true will unzip the files and $false will NOT unzip them after cleaning then in Script 1.

$romsDoNotDelete: 
	Any exact ROM name (including extension) in this list will NOT be deleted. ROMs listed here will not be deleted even in they match a value in $romsExceptions or they are NOT the Primary ROM via $romSortOrder. Ex: "Castlevania (USA) (Rev A).zip" would always keep this specific ROM.
	Default is @().

$romsExceptions: 
	Any ROMs containing these strings or exact ROM name will be removed unless the exact ROM name is in $romsDoNotDelete.
	Default is @().

$romsSortOrder: 
	Preferred sorting order to pick 1 Primary ROM to keep when evaluating duplicates. Uses regular expressions to define the preferred sorting order based on language, and if there are no matches it will determine the primary ROM by either ascending/descending alphabetical order defined in $romSortAscending. ROMs in $romsExceptions will not be deleted even if it is not determined to be the Primary ROM.
	Default is @().

$romsMultiCart
	I would consider this an experimental feature as of v6.0 and will probably be improved in a future release. Some gaming systems used multiple disks for a single game, and this allows you to keep these multicarts as an exception. Once the primary ROM is determined for a game, it will check if it has a multicart exception by checking if the primary ROM name matches a regex in $romsMultiCart. If a match is found, it considers a multicart the exact name of the ROM and replaces the matching text with the regex $romsMultiCart. For example, in the $romsMultiCart hash table, if you had the value "\(Disk\s?[1-4].*\)" and your primary ROM was "Dungeon Master (Disk 1).zip", it would consider any ROM matching the name "Dungeon Master (Disk #).zip" a Multicart exception to keep where # is 1 to 4.
	Default is @().
	


EXPECTED RESULTS & TROUBLESHOOTING
#################################

1_Clean-NoIntroRoms.ps1 should take about 8 minutes to complete All No-Intro ROMs and 9 minutes for All Custom ROMs, which is skewed by ZXSpectrum.  If the script seems to be running slow, ake sure you don't have any Antivirus or Backup software running on the source, destination, or script directories.
Here are my No-Intro 2018 & Custom Results for comparison:

  ======================================================================
  **********************************************************************
  >> SECTION: CLEAN NO-INTRO ROMS BATOCERA [1/1]
  **********************************************************************
  ======================================================================
    Step 8/8 Clean No-Intro ROMs Results: (ADVISION) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 5
    ROMs UNIQUE: 5
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 1
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 1
    ROMs Total Cleaned: 4
    ROMs Total Cleaned Size: 0.01MB
    Start Time: 06/12/2025 18:15:35
    End Time: 06/12/2025 18:15:36
    Elapsed Time: 0.81

    Step 8/8 Clean No-Intro ROMs Results: (AMIGA1200) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 2820
    ROMs UNIQUE: 2197
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 290
    ROMs Dups Deleted: 473
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 763
    ROMs Total Cleaned: 2057
    ROMs Total Cleaned Size: 2177.32MB
    Start Time: 06/12/2025 18:15:36
    End Time: 06/12/2025 18:16:22
    Elapsed Time: 46.74

    Step 8/8 Clean No-Intro ROMs Results: (ARCADIA) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 48
    ROMs UNIQUE: 48
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 0
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 0
    ROMs Total Cleaned: 48
    ROMs Total Cleaned Size: 0.18MB
    Start Time: 06/12/2025 18:16:22
    End Time: 06/12/2025 18:16:23
    Elapsed Time: 0.52

    Step 8/8 Clean No-Intro ROMs Results: (ATARI2600) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 582
    ROMs UNIQUE: 567
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 89
    ROMs Dups Deleted: 15
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 104
    ROMs Total Cleaned: 478
    ROMs Total Cleaned Size: 1.98MB
    Start Time: 06/12/2025 18:16:23
    End Time: 06/12/2025 18:16:25
    Elapsed Time: 2.32

    Step 8/8 Clean No-Intro ROMs Results: (ATARI5200) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 107
    ROMs UNIQUE: 104
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 34
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 34
    ROMs Total Cleaned: 73
    ROMs Total Cleaned Size: 0.72MB
    Start Time: 06/12/2025 18:16:25
    End Time: 06/12/2025 18:16:26
    Elapsed Time: 0.73

    Step 8/8 Clean No-Intro ROMs Results: (ATARI7800) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 116
    ROMs UNIQUE: 67
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 10
    ROMs Dups Deleted: 47
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 57
    ROMs Total Cleaned: 59
    ROMs Total Cleaned Size: 1.81MB
    Start Time: 06/12/2025 18:16:26
    End Time: 06/12/2025 18:16:27
    Elapsed Time: 0.65

    Step 8/8 Clean No-Intro ROMs Results: (ATARIST) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 306
    ROMs UNIQUE: 302
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 6
    ROMs Dups Deleted: 4
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 10
    ROMs Total Cleaned: 296
    ROMs Total Cleaned Size: 99.67MB
    Start Time: 06/12/2025 18:16:27
    End Time: 06/12/2025 18:16:39
    Elapsed Time: 12.32

    Step 8/8 Clean No-Intro ROMs Results: (C20) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 292
    ROMs UNIQUE: 217
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 57
    ROMs Dups Deleted: 64
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 121
    ROMs Total Cleaned: 171
    ROMs Total Cleaned Size: 0.98MB
    Start Time: 06/12/2025 18:16:39
    End Time: 06/12/2025 18:16:40
    Elapsed Time: 1.16

    Step 8/8 Clean No-Intro ROMs Results: (C64) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 3676
    ROMs UNIQUE: 2843
    ROMs Msrc Dedup Deleted: 153
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 334
    ROMs Dups Deleted: 632
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 1119
    ROMs Total Cleaned: 2557
    ROMs Total Cleaned Size: 225.64MB
    Start Time: 06/12/2025 18:16:40
    End Time: 06/12/2025 18:16:55
    Elapsed Time: 14.62

    Step 8/8 Clean No-Intro ROMs Results: (CHANNELF) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 37
    ROMs UNIQUE: 33
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 6
    ROMs Dups Deleted: 2
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 8
    ROMs Total Cleaned: 29
    ROMs Total Cleaned Size: 0.06MB
    Start Time: 06/12/2025 18:16:55
    End Time: 06/12/2025 18:16:55
    Elapsed Time: 0.51

    Step 8/8 Clean No-Intro ROMs Results: (COLECOVISION) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 174
    ROMs UNIQUE: 160
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 22
    ROMs Dups Deleted: 10
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 32
    ROMs Total Cleaned: 142
    ROMs Total Cleaned Size: 1.56MB
    Start Time: 06/12/2025 18:16:55
    End Time: 06/12/2025 18:16:56
    Elapsed Time: 0.96

    Step 8/8 Clean No-Intro ROMs Results: (CPLUS4) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 18
    ROMs UNIQUE: 14
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 13
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 13
    ROMs Total Cleaned: 5
    ROMs Total Cleaned Size: 0.05MB
    Start Time: 06/12/2025 18:16:56
    End Time: 06/12/2025 18:16:57
    Elapsed Time: 0.54

    Step 8/8 Clean No-Intro ROMs Results: (CRVISION) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 21
    ROMs UNIQUE: 18
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 3
    ROMs Dups Deleted: 3
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 6
    ROMs Total Cleaned: 15
    ROMs Total Cleaned Size: 0.07MB
    Start Time: 06/12/2025 18:16:57
    End Time: 06/12/2025 18:16:57
    Elapsed Time: 0.44

    Step 8/8 Clean No-Intro ROMs Results: (FDS) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 319
    ROMs UNIQUE: 273
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 3
    ROMs Multicarts Kept: 3
    ROMs Exceptions Deleted: 70
    ROMs Dups Deleted: 21
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 91
    ROMs Total Cleaned: 228
    ROMs Total Cleaned Size: 9.99MB
    Start Time: 06/12/2025 18:16:57
    End Time: 06/12/2025 18:16:59
    Elapsed Time: 2.02

    Step 8/8 Clean No-Intro ROMs Results: (GAMECOM) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 24
    ROMs UNIQUE: 23
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 4
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 4
    ROMs Total Cleaned: 20
    ROMs Total Cleaned Size: 8.3MB
    Start Time: 06/12/2025 18:16:59
    End Time: 06/12/2025 18:17:00
    Elapsed Time: 0.46

    Step 8/8 Clean No-Intro ROMs Results: (GAMEGEAR) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 501
    ROMs UNIQUE: 415
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 205
    ROMs Dups Deleted: 26
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 231
    ROMs Total Cleaned: 270
    ROMs Total Cleaned Size: 45.45MB
    Start Time: 06/12/2025 18:17:00
    End Time: 06/12/2025 18:17:02
    Elapsed Time: 2.02

    Step 8/8 Clean No-Intro ROMs Results: (GB) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 1616
    ROMs UNIQUE: 1320
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 1
    ROMs Multicarts Kept: 7
    ROMs Exceptions Deleted: 897
    ROMs Dups Deleted: 112
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 1009
    ROMs Total Cleaned: 607
    ROMs Total Cleaned Size: 61.72MB
    Start Time: 06/12/2025 18:17:02
    End Time: 06/12/2025 18:17:06
    Elapsed Time: 4.1

    Step 8/8 Clean No-Intro ROMs Results: (GBA) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 3095
    ROMs UNIQUE: 2142
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 1337
    ROMs Dups Deleted: 602
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 1939
    ROMs Total Cleaned: 1156
    ROMs Total Cleaned Size: 4464.71MB
    Start Time: 06/12/2025 18:17:06
    End Time: 06/12/2025 18:19:01
    Elapsed Time: 115.33

    Step 8/8 Clean No-Intro ROMs Results: (GBC) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 1430
    ROMs UNIQUE: 1144
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 1
    ROMs Multicarts Kept: 3
    ROMs Exceptions Deleted: 657
    ROMs Dups Deleted: 194
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 851
    ROMs Total Cleaned: 579
    ROMs Total Cleaned Size: 240.46MB
    Start Time: 06/12/2025 18:19:01
    End Time: 06/12/2025 18:19:07
    Elapsed Time: 6.23

    Step 8/8 Clean No-Intro ROMs Results: (GMASTER) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 13
    ROMs UNIQUE: 13
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 1
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 1
    ROMs Total Cleaned: 12
    ROMs Total Cleaned Size: 0.1MB
    Start Time: 06/12/2025 18:19:07
    End Time: 06/12/2025 18:19:08
    Elapsed Time: 0.42

    Step 8/8 Clean No-Intro ROMs Results: (GP32) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 35
    ROMs UNIQUE: 23
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 7
    ROMs Dups Deleted: 6
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 13
    ROMs Total Cleaned: 22
    ROMs Total Cleaned Size: 159.15MB
    Start Time: 06/12/2025 18:19:08
    End Time: 06/12/2025 18:19:09
    Elapsed Time: 1.54

    Step 8/8 Clean No-Intro ROMs Results: (JAGUAR) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 64
    ROMs UNIQUE: 61
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 6
    ROMs Dups Deleted: 2
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 8
    ROMs Total Cleaned: 56
    ROMs Total Cleaned Size: 105.35MB
    Start Time: 06/12/2025 18:19:09
    End Time: 06/12/2025 18:19:10
    Elapsed Time: 1.06

    Step 8/8 Clean No-Intro ROMs Results: (LYNX) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 87
    ROMs UNIQUE: 85
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 10
    ROMs Dups Deleted: 1
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 11
    ROMs Total Cleaned: 76
    ROMs Total Cleaned Size: 10.09MB
    Start Time: 06/12/2025 18:19:10
    End Time: 06/12/2025 18:19:11
    Elapsed Time: 1

    Step 8/8 Clean No-Intro ROMs Results: (MASTERSYSTEM) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 573
    ROMs UNIQUE: 446
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 268
    ROMs Dups Deleted: 24
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 292
    ROMs Total Cleaned: 281
    ROMs Total Cleaned Size: 35.76MB
    Start Time: 06/12/2025 18:19:11
    End Time: 06/12/2025 18:19:14
    Elapsed Time: 2.14

    Step 8/8 Clean No-Intro ROMs Results: (MEGADRIVE) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 1813
    ROMs UNIQUE: 1307
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 750
    ROMs Dups Deleted: 224
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 974
    ROMs Total Cleaned: 839
    ROMs Total Cleaned Size: 567.71MB
    Start Time: 06/12/2025 18:19:14
    End Time: 06/12/2025 18:19:21
    Elapsed Time: 7.86

    Step 8/8 Clean No-Intro ROMs Results: (MSX1) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 937
    ROMs UNIQUE: 612
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 78
    ROMs Dups Deleted: 311
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 389
    ROMs Total Cleaned: 548
    ROMs Total Cleaned Size: 11.65MB
    Start Time: 06/12/2025 18:19:21
    End Time: 06/12/2025 18:19:28
    Elapsed Time: 6.71

    Step 8/8 Clean No-Intro ROMs Results: (MSX2) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 196
    ROMs UNIQUE: 154
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 8
    ROMs Dups Deleted: 39
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 47
    ROMs Total Cleaned: 149
    ROMs Total Cleaned Size: 17.61MB
    Start Time: 06/12/2025 18:19:28
    End Time: 06/12/2025 18:19:30
    Elapsed Time: 1.38

    Step 8/8 Clean No-Intro ROMs Results: (N64) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 950
    ROMs UNIQUE: 498
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 352
    ROMs Dups Deleted: 277
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 629
    ROMs Total Cleaned: 321
    ROMs Total Cleaned Size: 3737.25MB
    Start Time: 06/12/2025 18:19:30
    End Time: 06/12/2025 18:22:24
    Elapsed Time: 174.49

    Step 8/8 Clean No-Intro ROMs Results: (N64DD) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 13
    ROMs UNIQUE: 13
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 2
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 2
    ROMs Total Cleaned: 11
    ROMs Total Cleaned Size: 218.27MB
    Start Time: 06/12/2025 18:22:24
    End Time: 06/12/2025 18:22:33
    Elapsed Time: 9.42

    Step 8/8 Clean No-Intro ROMs Results: (NES) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 2748
    ROMs UNIQUE: 2001
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 1593
    ROMs Dups Deleted: 342
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 1935
    ROMs Total Cleaned: 813
    ROMs Total Cleaned Size: 80.21MB
    Start Time: 06/12/2025 18:22:33
    End Time: 06/12/2025 18:22:42
    Elapsed Time: 8.03

    Step 8/8 Clean No-Intro ROMs Results: (NGP) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 11
    ROMs UNIQUE: 11
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 5
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 5
    ROMs Total Cleaned: 6
    ROMs Total Cleaned Size: 2.61MB
    Start Time: 06/12/2025 18:22:42
    End Time: 06/12/2025 18:22:42
    Elapsed Time: 0.42

    Step 8/8 Clean No-Intro ROMs Results: (NGPC) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 120
    ROMs UNIQUE: 88
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 70
    ROMs Dups Deleted: 9
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 79
    ROMs Total Cleaned: 41
    ROMs Total Cleaned Size: 22.27MB
    Start Time: 06/12/2025 18:22:42
    End Time: 06/12/2025 18:22:43
    Elapsed Time: 0.84

    Step 8/8 Clean No-Intro ROMs Results: (O2EM) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 133
    ROMs UNIQUE: 120
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 3
    ROMs Dups Deleted: 13
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 16
    ROMs Total Cleaned: 117
    ROMs Total Cleaned Size: 0.32MB
    Start Time: 06/12/2025 18:22:43
    End Time: 06/12/2025 18:22:44
    Elapsed Time: 0.79

    Step 8/8 Clean No-Intro ROMs Results: (PCENGINE) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 420
    ROMs UNIQUE: 354
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 20
    ROMs Dups Deleted: 61
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 81
    ROMs Total Cleaned: 339
    ROMs Total Cleaned Size: 73.75MB
    Start Time: 06/12/2025 18:22:44
    End Time: 06/12/2025 18:22:45
    Elapsed Time: 1.86

    Step 8/8 Clean No-Intro ROMs Results: (PICO) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 343
    ROMs UNIQUE: 321
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 43
    ROMs Dups Deleted: 22
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 65
    ROMs Total Cleaned: 278
    ROMs Total Cleaned Size: 199.71MB
    Start Time: 06/12/2025 18:22:45
    End Time: 06/12/2025 18:22:48
    Elapsed Time: 2.27

    Step 8/8 Clean No-Intro ROMs Results: (POKEMINI) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 44
    ROMs UNIQUE: 24
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 7
    ROMs Dups Deleted: 17
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 24
    ROMs Total Cleaned: 20
    ROMs Total Cleaned Size: 2.8MB
    Start Time: 06/12/2025 18:22:48
    End Time: 06/12/2025 18:22:48
    Elapsed Time: 0.47

    Step 8/8 Clean No-Intro ROMs Results: (PV1000) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 5
    ROMs UNIQUE: 5
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 0
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 0
    ROMs Total Cleaned: 5
    ROMs Total Cleaned Size: 0.03MB
    Start Time: 06/12/2025 18:22:48
    End Time: 06/12/2025 18:22:49
    Elapsed Time: 0.38

    Step 8/8 Clean No-Intro ROMs Results: (SATELLAVIEW) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 244
    ROMs UNIQUE: 219
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 47
    ROMs Dups Deleted: 21
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 68
    ROMs Total Cleaned: 176
    ROMs Total Cleaned Size: 77.46MB
    Start Time: 06/12/2025 18:22:49
    End Time: 06/12/2025 18:22:50
    Elapsed Time: 1.2

    Step 8/8 Clean No-Intro ROMs Results: (SCV) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 25
    ROMs UNIQUE: 23
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 0
    ROMs Dups Deleted: 2
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 2
    ROMs Total Cleaned: 23
    ROMs Total Cleaned Size: 0.41MB
    Start Time: 06/12/2025 18:22:50
    End Time: 06/12/2025 18:22:51
    Elapsed Time: 1.02

    Step 8/8 Clean No-Intro ROMs Results: (SEGA32X) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 63
    ROMs UNIQUE: 51
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 21
    ROMs Dups Deleted: 9
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 30
    ROMs Total Cleaned: 33
    ROMs Total Cleaned Size: 57.51MB
    Start Time: 06/12/2025 18:22:51
    End Time: 06/12/2025 18:22:55
    Elapsed Time: 4.57

    Step 8/8 Clean No-Intro ROMs Results: (SG1000) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 208
    ROMs UNIQUE: 101
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 85
    ROMs Dups Deleted: 41
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 126
    ROMs Total Cleaned: 82
    ROMs Total Cleaned Size: 1.12MB
    Start Time: 06/12/2025 18:22:55
    End Time: 06/12/2025 18:22:57
    Elapsed Time: 1.37

    Step 8/8 Clean No-Intro ROMs Results: (SNES) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 3486
    ROMs UNIQUE: 2269
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 2188
    ROMs Dups Deleted: 474
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 2662
    ROMs Total Cleaned: 824
    ROMs Total Cleaned Size: 668.87MB
    Start Time: 06/12/2025 18:22:57
    End Time: 06/12/2025 18:23:09
    Elapsed Time: 12.45

    Step 8/8 Clean No-Intro ROMs Results: (SUFAMI) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 13
    ROMs UNIQUE: 13
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 0
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 0
    ROMs Total Cleaned: 13
    ROMs Total Cleaned Size: 4.4MB
    Start Time: 06/12/2025 18:23:09
    End Time: 06/12/2025 18:23:15
    Elapsed Time: 5.52

    Step 8/8 Clean No-Intro ROMs Results: (SUPERGRAFX) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 5
    ROMs UNIQUE: 5
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 0
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 0
    ROMs Total Cleaned: 5
    ROMs Total Cleaned Size: 2.4MB
    Start Time: 06/12/2025 18:23:15
    End Time: 06/12/2025 18:23:16
    Elapsed Time: 0.98

    Step 8/8 Clean No-Intro ROMs Results: (SUPERVISION) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 63
    ROMs UNIQUE: 63
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 0
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 0
    ROMs Total Cleaned: 63
    ROMs Total Cleaned Size: 1.27MB
    Start Time: 06/12/2025 18:23:16
    End Time: 06/12/2025 18:23:16
    Elapsed Time: 0.59

    Step 8/8 Clean No-Intro ROMs Results: (SUPRACAN) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 9
    ROMs UNIQUE: 9
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 0
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 0
    ROMs Total Cleaned: 9
    ROMs Total Cleaned Size: 8.92MB
    Start Time: 06/12/2025 18:23:16
    End Time: 06/12/2025 18:23:17
    Elapsed Time: 0.46

    Step 8/8 Clean No-Intro ROMs Results: (VECTREX) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 45
    ROMs UNIQUE: 41
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 13
    ROMs Dups Deleted: 2
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 15
    ROMs Total Cleaned: 30
    ROMs Total Cleaned Size: 0.13MB
    Start Time: 06/12/2025 18:23:17
    End Time: 06/12/2025 18:23:17
    Elapsed Time: 0.51

    Step 8/8 Clean No-Intro ROMs Results: (VIDEOPACPLUS) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 34
    ROMs UNIQUE: 33
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 7
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 7
    ROMs Total Cleaned: 27
    ROMs Total Cleaned Size: 0.14MB
    Start Time: 06/12/2025 18:23:17
    End Time: 06/12/2025 18:23:18
    Elapsed Time: 0.47

    Step 8/8 Clean No-Intro ROMs Results: (VIRTUALBOY) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 31
    ROMs UNIQUE: 29
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 6
    ROMs Dups Deleted: 2
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 8
    ROMs Total Cleaned: 23
    ROMs Total Cleaned Size: 8.04MB
    Start Time: 06/12/2025 18:23:18
    End Time: 06/12/2025 18:23:18
    Elapsed Time: 0.48

    Step 8/8 Clean No-Intro ROMs Results: (VSMILE) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 112
    ROMs UNIQUE: 102
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 19
    ROMs Dups Deleted: 10
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 29
    ROMs Total Cleaned: 83
    ROMs Total Cleaned Size: 305.42MB
    Start Time: 06/12/2025 18:23:18
    End Time: 06/12/2025 18:23:21
    Elapsed Time: 2.24

    Step 8/8 Clean No-Intro ROMs Results: (WSWAN) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 116
    ROMs UNIQUE: 111
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 1
    ROMs Dups Deleted: 5
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 6
    ROMs Total Cleaned: 110
    ROMs Total Cleaned Size: 92.61MB
    Start Time: 06/12/2025 18:23:21
    End Time: 06/12/2025 18:23:22
    Elapsed Time: 1.46

    Step 8/8 Clean No-Intro ROMs Results: (WSWANC) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 95
    ROMs UNIQUE: 92
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 2
    ROMs Dups Deleted: 3
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 5
    ROMs Total Cleaned: 90
    ROMs Total Cleaned Size: 143.92MB
    Start Time: 06/12/2025 18:23:22
    End Time: 06/12/2025 18:23:23
    Elapsed Time: 1.41

  ======================================================================
  **********************************************************************
  >> SECTION: RESULTS BATOCERA [1/1]
  **********************************************************************
  ======================================================================
  Exceptions ROMs (No-Intro) Elapsed Time: 10.43 seconds
  Cleanup    ROMs (No-Intro) Elapsed Time: 468.69 seconds
  Exceptions ROMs (Custom)   Elapsed Time: 0.01 seconds
  Cleanup    ROMs (Custom)   Elapsed Time: 0.02 seconds
  Upload     ROMs (No-Intro) Elapsed Time: 0.01 seconds
  Upload     ROMs (Custom)   Elapsed Time: 0 seconds
  Distro Elapsed Time: 479.2 seconds



  ======================================================================
  **********************************************************************
  >> SECTION: CLEAN CUSTOM ROMS BATOCERA [1/1]
  **********************************************************************
  ======================================================================
 
    Step 8/8 Clean No-Intro ROMs Results: (AMSTRADCPC) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 2416
    ROMs UNIQUE: 2140
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 168
    ROMs Multicarts Kept: 191
    ROMs Exceptions Deleted: 90
    ROMs Dups Deleted: 52
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 142
    ROMs Total Cleaned: 2274
    ROMs Total Cleaned Size: 80.74MB
    Start Time: 06/12/2025 18:46:54
    End Time: 06/12/2025 18:47:14
    Elapsed Time: 20.08

    Step 8/8 Clean No-Intro ROMs Results: (APPLE2) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 1006
    ROMs UNIQUE: 458
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 141
    ROMs Multicarts Kept: 219
    ROMs Exceptions Deleted: 220
    ROMs Dups Deleted: 122
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 342
    ROMs Total Cleaned: 664
    ROMs Total Cleaned Size: 37.88MB
    Start Time: 06/12/2025 18:47:14
    End Time: 06/12/2025 18:47:40
    Elapsed Time: 25.88

    Step 8/8 Clean No-Intro ROMs Results: (ATARI800) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 8333
    ROMs UNIQUE: 3114
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 221
    ROMs Multicarts Kept: 270
    ROMs Exceptions Deleted: 3880
    ROMs Dups Deleted: 1250
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 5130
    ROMs Total Cleaned: 3203
    ROMs Total Cleaned Size: 67.78MB
    Start Time: 06/12/2025 18:47:40
    End Time: 06/12/2025 18:48:34
    Elapsed Time: 53.85

    Step 8/8 Clean No-Intro ROMs Results: (COCO) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 109
    ROMs UNIQUE: 97
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 38
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 38
    ROMs Total Cleaned: 71
    ROMs Total Cleaned Size: 0.85MB
    Start Time: 06/12/2025 18:48:34
    End Time: 06/12/2025 18:48:35
    Elapsed Time: 1.11

    Step 8/8 Clean No-Intro ROMs Results: (INTELLIVISION) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 189
    ROMs UNIQUE: 161
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 38
    ROMs Dups Deleted: 16
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 54
    ROMs Total Cleaned: 135
    ROMs Total Cleaned Size: 1.1MB
    Start Time: 06/12/2025 18:48:35
    End Time: 06/12/2025 18:48:37
    Elapsed Time: 1.69

    Step 8/8 Clean No-Intro ROMs Results: (NEOGEO) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 149
    ROMs UNIQUE: 149
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 0
    ROMs Multicarts Kept: 0
    ROMs Exceptions Deleted: 2
    ROMs Dups Deleted: 0
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 2
    ROMs Total Cleaned: 147
    ROMs Total Cleaned Size: 2631.84MB
    Start Time: 06/12/2025 18:48:37
    End Time: 06/12/2025 18:49:24
    Elapsed Time: 47.26

    Step 8/8 Clean No-Intro ROMs Results: (ZXSPECTRUM) BATOCERA [1/1]
    ================================================================================
    ROMs TOTAL: 61615
    ROMs UNIQUE: 13780
    ROMs Msrc Dedup Deleted: 0
    ROMs Multicart Games: 548
    ROMs Multicarts Kept: 586
    ROMs Exceptions Deleted: 39702
    ROMs Dups Deleted: 13219
    ROMs Non-Dup Deleted: 0
    ROMs Total Deleted: 52921
    ROMs Total Cleaned: 8694
    ROMs Total Cleaned Size: 301.47MB
    Start Time: 06/12/2025 18:49:24
    End Time: 06/12/2025 18:53:29
    Elapsed Time: 244.29

  ======================================================================
  **********************************************************************
  >> SECTION: RESULTS BATOCERA [1/1]
  **********************************************************************
  ======================================================================
  Exceptions ROMs (No-Intro) Elapsed Time: 0.05 seconds
  Cleanup    ROMs (No-Intro) Elapsed Time: 0.06 seconds
  Exceptions ROMs (Custom)   Elapsed Time: 145.17 seconds
  Cleanup    ROMs (Custom)   Elapsed Time: 394.25 seconds
  Upload     ROMs (No-Intro) Elapsed Time: 0 seconds
  Upload     ROMs (Custom)   Elapsed Time: 0.02 seconds
  Distro Elapsed Time: 539.58 seconds
