import os import shutil import argparse import xml.etree.ElementTree as ET from urllib.parse import urlparse, unquote def localname(tag: str) -> str: return tag.split('}', 1)[-1].lower() def extract_filename(u: str) -> str: s = (u or "").strip() if not s: return "" p = urlparse(s) path = p.path if p.scheme else s path = path.replace("\\", "/") name = path.split("/")[-1] return unquote(name) def replace_urls_in_vmix(xml_path: str, prefix_url: str) -> int: if not os.path.isfile(xml_path): raise FileNotFoundError(f"Файл не найден: {xml_path}") backup_path = xml_path + ".bak" shutil.copy2(xml_path, backup_path) tree = ET.parse(xml_path) root = tree.getroot() replaced = 0 for node in root.iter(): if localname(node.tag).startswith("datasource") and node.get("friendlyName") == "JSON": for sub in node.iter(): if localname(sub.tag) == "url": old = (sub.text or "").strip() # ✅ проверка: если уже новый URL — пропускаем if old.startswith(prefix_url): print(f"Пропускаем — уже новый URL: {old}") continue tail = extract_filename(old) if not tail: continue new_full = prefix_url + tail if old != new_full: print(f"{old} -> {new_full}") sub.text = new_full replaced += 1 # сохраняем без XML декларации tree.write(xml_path, encoding="utf-8", xml_declaration=False) return replaced def main(): parser = argparse.ArgumentParser( description="Заменяет в datasource[friendlyName=JSON] на PREFIX + имя файла." ) parser.add_argument("--file", "-f", required=True, help="Путь к .vmix файлу") parser.add_argument("--url", "-u", required=False, help="Префикс нового URL (например, https://gfx.tvstart.ru/app/static/gfx_)") parser.add_argument("--pause", action="store_true", help="Ожидать Enter в конце (удобно при запуске двойным кликом)") args = parser.parse_args() prefix = args.url or input("Введите префикс нового URL (например, https://gfx.tvstart.ru/app/static/gfx_): ").strip() if not prefix: print("Префикс пустой — ничего не сделано.") return try: count = replace_urls_in_vmix(args.file, prefix) print(f"Готово. Заменено тегов : {count}") print(f"Резервная копия: {args.file}.bak") except Exception as e: print("Ошибка:", e) if args.pause: input("Нажмите Enter для выхода...") if __name__ == "__main__": main()