diff --git a/scripts/sfz_sample_checks.py b/scripts/sfz_sample_checks.py new file mode 100755 index 00000000..359b6266 --- /dev/null +++ b/scripts/sfz_sample_checks.py @@ -0,0 +1,72 @@ +#!/usr/bin/python3 +import re +import os +import argparse + +rex = r"sample=([a-zA-Z0-9-_#.&\/\s\\\(\),\*]+?)\s*(?=[a-zA-Z0-9_]*=|//.*|$|<[a-z]+>)" + + +parser = argparse.ArgumentParser(description="Simple script to update the sample names in an existing SFZ files") +parser.add_argument('file', type=str, help="SFZ input file") +parser.add_argument('--output', type=str, help="Output file name; if not specified, _corrected will be appended to the input") +parser.add_argument('--test', action='store_true', help="Test run") +args = parser.parse_args() + +assert os.path.exists(args.file), "File does not exists" + +root_directory = os.path.dirname(args.file) + '/' + +def case_insensitive_check(filename): + elements = filename.split('/') + path = '' + for e in elements: + if path != '': + path += '/' + found = False + + if os.path.exists(root_directory + path + e): + path += e + continue + + for dir_entry in os.listdir(root_directory + path): + if dir_entry.lower() == e.lower(): + path += dir_entry + found = True + + if found == False: + return None + + return path + +with open(args.file, 'r') as file: + content = file.read() + +output_content = content +replacements = 0 +for match in re.findall(rex, content): + if not os.path.exists(root_directory + match): + possible = case_insensitive_check(match) + if possible is not None: + print("{} -> {}".format(match, possible)) + replacements += 1 + output_content = re.sub(match, possible, output_content) + else: + print("{} -> ????".format(match)) + +if args.test: + exit(0) + +if replacements == 0: + print("All samples seem to exist, not writing a file...") + exit(0) + +if args.output is None: + output_file, ext = os.path.splitext(args.file) + output_file += '_corrected' + output_file += ext +else: + output_file = args.output + +print("Writing corrected file to", output_file) +with open(output_file, 'w') as file: + file.write(output_content) \ No newline at end of file