71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
import itertools
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from hippolyzer.lib.base import llsd
|
|
|
|
|
|
def iter_viewer_data_dirs():
|
|
if sys.platform.startswith("linux"):
|
|
paths = (x for x in Path.home().iterdir() if x.name.startswith("."))
|
|
elif sys.platform == "darwin":
|
|
paths = (Path.home() / "Library" / "Application Support").iterdir()
|
|
elif sys.platform in ("win32", "msys", "cygwin"):
|
|
app_data = Path.home() / "AppData"
|
|
# On Windows the cache directory is in Local, the settings are in Roaming. I think.
|
|
paths = itertools.chain((app_data / "Local").iterdir(), (app_data / "Roaming").iterdir())
|
|
else:
|
|
raise Exception("Unknown OS, can't locate viewer config dirs!")
|
|
|
|
for path in paths:
|
|
if not path.is_dir():
|
|
continue
|
|
if not has_settings_file(path) and not has_cache_file(path):
|
|
continue
|
|
yield path
|
|
|
|
|
|
def has_cache_file(path: Path):
|
|
try:
|
|
return (path / "avatar_name_cache.xml").exists()
|
|
except PermissionError:
|
|
return False
|
|
|
|
|
|
def has_settings_file(path: Path):
|
|
try:
|
|
return (path / "user_settings" / "settings.xml").exists()
|
|
except PermissionError:
|
|
return False
|
|
|
|
|
|
def iter_viewer_config_dirs():
|
|
for viewer_dir in iter_viewer_data_dirs():
|
|
if has_settings_file(viewer_dir):
|
|
yield viewer_dir
|
|
|
|
|
|
def iter_viewer_cache_dirs():
|
|
for viewer_dir in iter_viewer_data_dirs():
|
|
# Is this a settings dir
|
|
if has_settings_file(viewer_dir):
|
|
# Users can choose custom locations for the cache directory, we need to parse
|
|
# their settings to see if they've done so.
|
|
with open(viewer_dir / "user_settings" / "settings.xml", "rb") as fh:
|
|
config: dict = llsd.parse_xml(fh.read())
|
|
# TODO: is this the case on all platforms?
|
|
cache_location = None
|
|
cache_elem = config.get("CacheLocation")
|
|
if cache_elem:
|
|
cache_location = cache_elem.get("Value")
|
|
if cache_location:
|
|
cache_location = Path(cache_location)
|
|
if has_cache_file(cache_location):
|
|
yield cache_location
|
|
# Cache may be in the base dir on Windows
|
|
if has_cache_file(viewer_dir):
|
|
yield viewer_dir
|
|
# but it might also be in a subfolder
|
|
if has_cache_file(viewer_dir / "cache"):
|
|
yield viewer_dir / "cache"
|