Files
Jackify/jackify/backend/utils/clf3_postinstall.py
T

50 lines
1.8 KiB
Python

"""
Post-install fixups applied after a CLF3 install completes.
"""
import logging
import re
from pathlib import Path
logger = logging.getLogger(__name__)
_SDCARD_RE = re.compile(r'^/run/media/')
def _linux_to_wine_path(path_str: str) -> str:
"""Convert an absolute Linux path to a Wine-format path (Z: or D: for SD card)."""
if _SDCARD_RE.match(path_str):
from jackify.backend.handlers.wine_utils import WineUtils
stripped = WineUtils._strip_sdcard_path(path_str).lstrip('/')
return "D:\\" + stripped.replace('/', '\\')
return "Z:\\" + path_str.lstrip('/').replace('/', '\\')
def inject_mo2_download_dir(install_dir: str, downloads_dir: str) -> None:
"""Ensure ModOrganizer.ini contains download_directory pointing at downloads_dir.
Some modlists ship a bundled ModOrganizer.ini that omits download_directory.
MO2 then defaults to its own internal path, causing it to report all downloads
as missing on first launch. This injects the correct path if absent.
"""
ini_path = Path(install_dir) / "ModOrganizer.ini"
if not ini_path.exists():
return
content = ini_path.read_text(encoding="utf-8", errors="replace")
if "download_directory=" in content.lower():
return
wine_path = _linux_to_wine_path(str(downloads_dir))
entry = f"download_directory={wine_path}"
lines = content.splitlines(keepends=True)
for i, line in enumerate(lines):
if line.strip().lower() == "[general]":
lines.insert(i + 1, entry + "\n")
ini_path.write_text("".join(lines), encoding="utf-8")
logger.info(f"Injected download_directory into {ini_path}: {wine_path}")
return
logger.debug(f"ModOrganizer.ini has no [General] section, skipping injection: {ini_path}")