2022-06-12 19:50:43 +02:00
|
|
|
import os
|
|
|
|
import json
|
|
|
|
import logging
|
|
|
|
import platform
|
2025-01-31 22:35:37 +01:00
|
|
|
import argparse
|
2022-06-12 19:50:43 +02:00
|
|
|
from typing import Optional
|
|
|
|
|
|
|
|
import requests
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
|
|
from . import __version__
|
|
|
|
|
2025-01-31 22:35:37 +01:00
|
|
|
OVERRIDABLE_SETTINGS = (
|
|
|
|
"api_key",
|
|
|
|
"user_agent",
|
|
|
|
"download_to",
|
|
|
|
"mirror_web",
|
|
|
|
"urls_only",
|
|
|
|
"parallel",
|
|
|
|
"filter_files_glob",
|
|
|
|
"filter_files_regex",
|
|
|
|
"verbose",
|
|
|
|
)
|
|
|
|
|
2022-06-12 19:50:43 +02:00
|
|
|
|
|
|
|
class Settings(BaseModel):
|
|
|
|
"""Available settings for itch-dl. Make sure all of them
|
|
|
|
have default values, as the config file may not exist."""
|
2024-03-17 01:17:19 +01:00
|
|
|
|
2022-06-12 19:50:43 +02:00
|
|
|
api_key: Optional[str] = None
|
|
|
|
user_agent: str = f"python-requests/{requests.__version__} itch-dl/{__version__}"
|
|
|
|
|
2025-01-31 22:35:37 +01:00
|
|
|
download_to: Optional[str] = None
|
|
|
|
mirror_web: bool = False
|
|
|
|
urls_only: bool = False
|
|
|
|
parallel: int = 1
|
|
|
|
|
2025-01-27 12:13:47 +01:00
|
|
|
filter_files_glob: Optional[str] = None
|
|
|
|
filter_files_regex: Optional[str] = None
|
|
|
|
|
2025-01-31 22:35:37 +01:00
|
|
|
verbose: bool = False
|
|
|
|
|
2022-06-12 19:50:43 +02:00
|
|
|
|
|
|
|
def create_and_get_config_path() -> str:
|
|
|
|
"""Returns the configuration directory in the appropriate
|
|
|
|
location for the current OS. The directory may not exist."""
|
|
|
|
system = platform.system()
|
|
|
|
if system == "Linux":
|
2024-03-17 01:17:19 +01:00
|
|
|
base_path = os.environ.get("XDG_CONFIG_HOME") or os.path.expanduser("~/.config/")
|
2022-06-12 19:50:43 +02:00
|
|
|
elif system == "Darwin":
|
2024-03-17 01:17:19 +01:00
|
|
|
base_path = os.path.expanduser("~/Library/Application Support/")
|
2022-06-12 19:50:43 +02:00
|
|
|
elif system == "Windows":
|
2024-03-17 01:17:19 +01:00
|
|
|
base_path = os.environ.get("APPDATA") or os.path.expanduser("~/AppData/Roaming/")
|
2022-06-12 19:50:43 +02:00
|
|
|
else:
|
|
|
|
raise NotImplementedError(f"Unknown platform: {system}")
|
|
|
|
|
|
|
|
return os.path.join(base_path, "itch-dl")
|
|
|
|
|
|
|
|
|
2025-01-31 22:35:37 +01:00
|
|
|
def load_config(args: argparse.Namespace, profile: Optional[str] = None) -> Settings:
|
2022-06-12 19:50:43 +02:00
|
|
|
"""Loads the configuration from the file system if it exists,
|
|
|
|
the returns a Settings object."""
|
|
|
|
config_path = create_and_get_config_path()
|
|
|
|
config_file_path = os.path.join(config_path, "config.json")
|
|
|
|
profile_file_path = os.path.join(config_path, "profiles", profile or "")
|
|
|
|
|
|
|
|
if os.path.isfile(config_file_path):
|
2025-01-31 23:40:40 +01:00
|
|
|
logging.debug("Found config file: %s", config_file_path)
|
2022-06-12 19:50:43 +02:00
|
|
|
with open(config_file_path) as f:
|
|
|
|
config_data = json.load(f)
|
|
|
|
else:
|
|
|
|
config_data = {}
|
|
|
|
|
|
|
|
if os.path.isfile(profile_file_path):
|
2025-01-31 23:40:40 +01:00
|
|
|
logging.debug("Found profile: %s", profile_file_path)
|
2022-06-12 19:50:43 +02:00
|
|
|
with open(config_file_path) as f:
|
|
|
|
profile_data = json.load(f)
|
|
|
|
|
|
|
|
config_data.update(profile_data)
|
|
|
|
|
2025-01-31 22:35:37 +01:00
|
|
|
# All settings from the base file:
|
|
|
|
settings = Settings(**config_data)
|
|
|
|
|
|
|
|
# Apply overrides from CLI args:
|
|
|
|
for key in OVERRIDABLE_SETTINGS:
|
|
|
|
value = getattr(args, key)
|
|
|
|
if value:
|
|
|
|
setattr(settings, key, value)
|
|
|
|
|
|
|
|
return settings
|