import os import sys import glob from lxml import etree def parse_xml(file_path): """Parse XML content from a file and return an ElementTree object.""" try: with open(file_path, "r", encoding="utf-8") as file: return etree.parse(file) except etree.XMLSyntaxError: print(f"Error parsing XML in {file_path}") return None def update_target_file(source_tree, target_tree): """Update XML properties in the target file only if they exist in the source file.""" source_root = source_tree.getroot() target_root = target_tree.getroot() source_elements = {elem.tag: elem for elem in source_root} for target_elem in target_root: if target_elem.tag in source_elements: target_elem.text = source_elements[target_elem.tag].text def process_files(source_dir, target_dir): """Process all .nfo files in source_dir and update matching files in target_dir.""" source_files = glob.glob(os.path.join(source_dir, "*.nfo")) target_files = glob.glob(os.path.join(target_dir, "*.nfo")) for src_file in source_files: src_filename_base = os.path.splitext(os.path.basename(src_file))[0] # Remove .nfo extension matching_targets = [tgt for tgt in target_files if src_filename_base in os.path.splitext(os.path.basename(tgt))[0]] if not matching_targets: print(f"No matching target file found for: {src_filename_base}") continue source_tree = parse_xml(src_file) if source_tree is None: continue for tgt_file in matching_targets: print(f"Updating file: {tgt_file}") target_tree = parse_xml(tgt_file) if target_tree is None: continue update_target_file(source_tree, target_tree) # Save the updated target file with open(tgt_file, "wb") as f: target_tree.write(f, encoding="utf-8", xml_declaration=True) print(f"Updated: {tgt_file}") if __name__ == "__main__": if len(sys.argv) != 3: print("Usage: python script.py ") sys.exit(1) source_directory = sys.argv[1] target_directory = sys.argv[2] process_files(source_directory, target_directory)