@@ -63,7 +63,11 @@ def dataLooksValid(
6363 parent = filetree .parent ()
6464 if parent is not None and self .dataLooksValid (parent ) is self .FIXABLE :
6565 return self .FIXABLE
66- if (status := super ().dataLooksValid (filetree )) is not self .INVALID :
66+ if (status := super ().dataLooksValid (filetree )) is self .INVALID :
67+ # Archive with REDmod folders, not in mods/
68+ if all (self ._valid_redmod (e ) for e in filetree ):
69+ return self .CheckReturn .FIXABLE
70+ else :
6771 match self ._check_bin_folder (filetree ):
6872 case self .INVALID :
6973 return self .INVALID
@@ -76,6 +80,11 @@ def dataLooksValid(
7680 status = self .FIXABLE
7781 return status
7882
83+ def _valid_redmod (self , filetree : mobase .IFileTree | mobase .FileTreeEntry ) -> bool :
84+ return isinstance (filetree , mobase .IFileTree ) and bool (
85+ filetree and filetree .find ("info.json" )
86+ )
87+
7988 def _check_bin_folder (
8089 self , filetree : mobase .IFileTree
8190 ) -> mobase .ModDataChecker .CheckReturn :
@@ -117,6 +126,12 @@ def fix(self, filetree: mobase.IFileTree) -> mobase.IFileTree:
117126 filetree .move (file , target )
118127 clear_empty_folder (parent )
119128 self ._fix_cet_framework (filetree )
129+ # REDmod
130+ for entry in list (filetree ):
131+ if not self ._regex_patterns .valid .match (
132+ entry .name ().casefold ()
133+ ) and self ._valid_redmod (entry ):
134+ filetree .move (entry , "mods/" )
120135 return filetree
121136
122137 def _fix_cet_framework (self , filetree : mobase .IFileTree ):
0 commit comments