@@ -791,22 +791,83 @@ async def fetch_hasheous_rom(hasheous_rom: HasheousRom) -> HasheousRom:
791791 fetch_libretro_rom (),
792792 )
793793
794- metadata_handlers = {
795- MetadataSource .IGDB : igdb_handler_rom ,
796- MetadataSource .MOBY : moby_handler_rom ,
797- MetadataSource .SS : ss_handler_rom ,
798- MetadataSource .RA : ra_handler_rom ,
799- MetadataSource .LAUNCHBOX : launchbox_handler_rom ,
800- MetadataSource .HASHEOUS : hasheous_handler_rom ,
801- MetadataSource .FLASHPOINT : flashpoint_handler_rom ,
802- MetadataSource .HLTB : hltb_handler_rom ,
803- MetadataSource .GAMELIST : gamelist_handler_rom ,
804- MetadataSource .LIBRETRO : libretro_handler_rom ,
794+ metadata_handlers : dict [MetadataSource , dict ] = {
795+ MetadataSource .IGDB : {
796+ "handler" : igdb_handler_rom ,
797+ "id_field" : "igdb_id" ,
798+ "metadata_field" : "igdb_metadata" ,
799+ },
800+ MetadataSource .MOBY : {
801+ "handler" : moby_handler_rom ,
802+ "id_field" : "moby_id" ,
803+ "metadata_field" : "moby_metadata" ,
804+ },
805+ MetadataSource .SS : {
806+ "handler" : ss_handler_rom ,
807+ "id_field" : "ss_id" ,
808+ "metadata_field" : "ss_metadata" ,
809+ },
810+ MetadataSource .RA : {
811+ "handler" : ra_handler_rom ,
812+ "id_field" : "ra_id" ,
813+ "metadata_field" : "ra_metadata" ,
814+ },
815+ MetadataSource .LAUNCHBOX : {
816+ "handler" : launchbox_handler_rom ,
817+ "id_field" : "launchbox_id" ,
818+ "metadata_field" : "launchbox_metadata" ,
819+ },
820+ MetadataSource .HASHEOUS : {
821+ "handler" : hasheous_handler_rom ,
822+ "id_field" : "hasheous_id" ,
823+ "metadata_field" : "hasheous_metadata" ,
824+ },
825+ MetadataSource .FLASHPOINT : {
826+ "handler" : flashpoint_handler_rom ,
827+ "id_field" : "flashpoint_id" ,
828+ "metadata_field" : "flashpoint_metadata" ,
829+ },
830+ MetadataSource .HLTB : {
831+ "handler" : hltb_handler_rom ,
832+ "id_field" : "hltb_id" ,
833+ "metadata_field" : "hltb_metadata" ,
834+ },
835+ MetadataSource .GAMELIST : {
836+ "handler" : gamelist_handler_rom ,
837+ "id_field" : "gamelist_id" ,
838+ "metadata_field" : "gamelist_metadata" ,
839+ },
840+ MetadataSource .LIBRETRO : {
841+ "handler" : libretro_handler_rom ,
842+ "id_field" : "libretro_id" ,
843+ "metadata_field" : None ,
844+ },
845+ MetadataSource .SGDB : {
846+ "handler" : {},
847+ "id_field" : "sgdb_id" ,
848+ "metadata_field" : None ,
849+ },
850+ MetadataSource .TGDB : {
851+ "handler" : {},
852+ "id_field" : "tgdb_id" ,
853+ "metadata_field" : None ,
854+ },
805855 }
806856
857+ # For COMPLETE rescans, explicitly clear metadata IDs and metadata for unselected sources
858+ # This ensures that when a source is no longer selected, its data is removed from the ROM
859+ if not newly_added and scan_type == ScanType .COMPLETE :
860+ for source , fields in metadata_handlers .items ():
861+ if source not in metadata_sources :
862+ rom_attrs [fields ["id_field" ]] = None
863+ if fields ["metadata_field" ]:
864+ rom_attrs [fields ["metadata_field" ]] = {}
865+
807866 # Determine which metadata sources are available
808867 available_sources = [
809- name for name , handler in metadata_handlers .items () if handler .get (f"{ name } _id" )
868+ name
869+ for name , fields in metadata_handlers .items ()
870+ if fields ["handler" ].get (fields ["id_field" ])
810871 ]
811872
812873 # Apply metadata priority order
@@ -815,7 +876,7 @@ async def fetch_hasheous_rom(hasheous_rom: HasheousRom) -> HasheousRom:
815876 )
816877 # Reverse priority order to apply highest priority last
817878 for source_name in reversed (priority_ordered ):
818- handler_data = metadata_handlers [source_name ]
879+ handler_data = metadata_handlers [source_name ][ "handler" ]
819880 # Only update fields that have valid values
820881 for key , field_value in handler_data .items ():
821882 if field_value :
@@ -827,7 +888,7 @@ async def fetch_hasheous_rom(hasheous_rom: HasheousRom) -> HasheousRom:
827888 )
828889 # Reverse priority order to apply highest priority last
829890 for source_name in reversed (priority_ordered_artwork ):
830- handler_data = metadata_handlers [source_name ]
891+ handler_data = metadata_handlers [source_name ][ "handler" ]
831892 for field in ["url_cover" , "url_screenshots" , "url_manual" ]:
832893 # Only update fields that have valid values
833894 field_value = handler_data .get (field )
@@ -931,7 +992,9 @@ async def fetch_sgdb_details(playmatch_rom: PlaymatchRomMatch) -> SGDBRom:
931992 )
932993 if sgdb_cover and not manual_cover_preserved :
933994 cover_sources = [
934- name for name , h in metadata_handlers .items () if h .get ("url_cover" )
995+ name
996+ for name , fields in metadata_handlers .items ()
997+ if fields ["handler" ].get ("url_cover" )
935998 ]
936999 ranked = get_priority_ordered_metadata_sources (
9371000 cover_sources + [MetadataSource .SGDB ], "artwork"
0 commit comments