Replace legacy branding with Kaizoku

This commit is contained in:
Codex
2026-08-09 13:42:51 +02:00
parent 95c9eca99f
commit fa7a922d13
15 changed files with 223 additions and 459 deletions
+27 -58
View File
@@ -38,16 +38,13 @@ def configured_cli_command(env_name, executable_name):
KAIZOKU_DOWNLOADER = configured_cli_command("KAIZOKU_DOWNLOADER_BIN", "provider_downloader.py")
ANI_CLI = configured_cli_command("ANI_CLI_BIN", "ani-cli")
ANIPY_CLI = configured_cli_command("ANIPY_CLI_BIN", "anipy-cli")
ANIMDL = configured_cli_command("ANIMDL_BIN", "animdl")
APP_NAME = "Kaizoku"
VERSION_FILE = PROJECT_ROOT / "VERSION"
CHANGELOG_FILE = PROJECT_ROOT / "CHANGELOG.md"
ALLANIME_BASE = "allanime.day"
ALLANIME_API = f"https://api.{ALLANIME_BASE}"
ALLANIME_REFERER = "https://allmanga.to"
ALLMANGA_SITE_BASE = "https://allmanga.to"
METADATA_API_HOST = "allanime.day"
METADATA_API = f"https://api.{METADATA_API_HOST}"
METADATA_REFERER = "https://allmanga.to"
METADATA_SITE_BASE = "https://allmanga.to"
ANIMESCHEDULE_API = "https://animeschedule.net/api/v3"
ANIMESCHEDULE_IMAGE_BASE = "https://img.animeschedule.net/production/assets/public/img/"
ANIDB_TITLES_URL = "https://anidb.net/api/anime-titles.xml.gz"
@@ -125,16 +122,24 @@ def env_flag(name, default=False):
return str(raw).strip().lower() in {"1", "true", "yes", "on"}
def env_value(name, default="", aliases=()):
for key in (name, *aliases):
raw = os.environ.get(key)
if raw is not None and str(raw).strip():
return str(raw).strip()
return default
def debug_enabled():
return DEBUG_MODE or env_flag("ANI_CLI_WEB_DEBUG")
return DEBUG_MODE or env_flag("KAIZOKU_DEBUG")
def remote_access_allowed():
return env_flag("ANI_CLI_WEB_ALLOW_REMOTE")
return env_flag("KAIZOKU_ALLOW_REMOTE")
def remote_access_username(config=None):
configured = str(os.environ.get("ANI_CLI_WEB_AUTH_USERNAME") or "").strip()
configured = env_value("KAIZOKU_AUTH_USERNAME")
if configured:
return configured
if isinstance(config, dict):
@@ -143,7 +148,7 @@ def remote_access_username(config=None):
def remote_access_password(config=None):
configured = str(os.environ.get("ANI_CLI_WEB_AUTH_PASSWORD") or "").strip()
configured = env_value("KAIZOKU_AUTH_PASSWORD")
if configured:
return configured
if isinstance(config, dict):
@@ -270,11 +275,11 @@ def clear_remote_access_sessions(config=None):
def background_workers_enabled():
return not env_flag("ANI_CLI_WEB_DISABLE_WORKER")
return not env_flag("KAIZOKU_DISABLE_WORKER")
def job_stdout_enabled():
return env_flag("ANI_CLI_WEB_JOB_STDOUT")
return env_flag("KAIZOKU_JOB_STDOUT")
def client_address_is_local(host):
@@ -302,8 +307,9 @@ def debug_log(event, **fields):
def default_download_dir():
if os.environ.get("ANI_CLI_DOWNLOAD_DIR"):
return os.environ["ANI_CLI_DOWNLOAD_DIR"]
configured = env_value("KAIZOKU_DOWNLOAD_DIR")
if configured:
return configured
home_downloads = Path.home() / "Downloads" / "Anime"
if os.access(home_downloads.parent if home_downloads.parent.exists() else Path.home(), os.W_OK):
return str(home_downloads)
@@ -312,9 +318,8 @@ def default_download_dir():
DEFAULT_CONFIG = {
"download_dir": default_download_dir(),
"mode": os.environ.get("ANI_CLI_MODE", "sub"),
"quality": os.environ.get("ANI_CLI_QUALITY", "best"),
"anipy_cli_fallback_enabled": False,
"mode": env_value("KAIZOKU_MODE", "sub"),
"quality": env_value("KAIZOKU_QUALITY", "best"),
"download_methods": ["kaizoku"],
"provider": "anikoto",
"watchlist_auto_refresh_enabled": False,
@@ -328,8 +333,8 @@ DEFAULT_CONFIG = {
"jellyfin_movie_dir": "",
"discord_webhook_url": "",
"discord_webhook_events": [],
"auth_username": str(os.environ.get("ANI_CLI_WEB_AUTH_USERNAME") or "").strip(),
"auth_password": str(os.environ.get("ANI_CLI_WEB_AUTH_PASSWORD") or "").strip(),
"auth_username": env_value("KAIZOKU_AUTH_USERNAME"),
"auth_password": env_value("KAIZOKU_AUTH_PASSWORD"),
}
PRIVATE_CONFIG_KEYS = {"auth_username", "auth_password"}
@@ -339,7 +344,7 @@ def now_iso():
def project_app_root():
configured = str(os.environ.get("ANI_CLI_WEB_STATE_ROOT") or "").strip()
configured = env_value("KAIZOKU_STATE_ROOT")
if configured:
return Path(configured).expanduser()
return PROJECT_ROOT / ".kaizoku"
@@ -473,7 +478,6 @@ def normalize_config(data):
if quality.endswith("p") and quality[:-1].isdigit():
quality = quality[:-1]
download_dir = str(config.get("download_dir") or DEFAULT_CONFIG["download_dir"])
anipy_cli_fallback_enabled = config.get("anipy_cli_fallback_enabled")
download_methods = config.get("download_methods")
auto_refresh_enabled = config.get("watchlist_auto_refresh_enabled")
auto_refresh_minutes = config.get("watchlist_auto_refresh_minutes")
@@ -491,10 +495,6 @@ def normalize_config(data):
auth_username = str(config.get("auth_username") or "").strip()
auth_password = str(config.get("auth_password") or "").strip()
if isinstance(anipy_cli_fallback_enabled, str):
anipy_cli_fallback_enabled = anipy_cli_fallback_enabled.strip().lower() in {"1", "true", "yes", "on"}
else:
anipy_cli_fallback_enabled = bool(anipy_cli_fallback_enabled)
if isinstance(download_methods, str):
method_values = [part.strip().lower() for part in re.split(r"[\s,]+", download_methods) if part.strip()]
elif isinstance(download_methods, list):
@@ -541,7 +541,6 @@ def normalize_config(data):
config["quality"] = quality if quality in QUALITY_CHOICES else "best"
config["download_dir"] = str(Path(download_dir).expanduser())
config["download_methods"] = ["kaizoku"]
config["anipy_cli_fallback_enabled"] = False
provider = str(config.get("provider") or DEFAULT_CONFIG.get("provider") or "anikoto").strip().lower()
config["provider"] = provider if provider in PROVIDER_CHOICES else "anikoto"
config["watchlist_auto_refresh_enabled"] = auto_refresh_enabled
@@ -577,7 +576,7 @@ def sanitize_public_config(config):
def _env_remote_path_roots():
raw = str(os.environ.get("ANI_CLI_WEB_REMOTE_PATH_ROOTS") or "").strip()
raw = env_value("KAIZOKU_REMOTE_PATH_ROOTS")
if not raw:
return []
roots = []
@@ -1122,26 +1121,6 @@ def extract_episode_from_filename(path):
return match.group(1) if match else None
def episode_values_from_spec(value):
spec = str(value or "").strip()
if not spec:
return []
values = []
for part in re.split(r"\s+", spec):
if not part:
continue
if "-" in part:
start_text, end_text = [piece.strip() for piece in part.split("-", 1)]
if start_text.isdigit() and end_text.isdigit():
start = int(start_text, 10)
end = int(end_text, 10)
if start <= end:
values.extend(str(number) for number in range(start, end + 1))
continue
values.append(part)
return values
def unique_destination(path):
if not path.exists():
return path
@@ -1170,15 +1149,11 @@ def finalize_library_files(job):
moved = []
fallback_episode = 1
requested_episode_values = episode_values_from_spec(job.get("episodes"))
backend = str(job.get("download_backend") or "").strip().lower()
for source in files:
if media_type == "movie":
final_name = f"{library_name}{source.suffix}"
else:
ep = None
if backend in {"anipy-cli", "animdl"} and requested_episode_values:
ep = requested_episode_values.pop(0)
if ep is None:
ep = extract_episode_from_filename(source)
if ep is None:
@@ -1255,12 +1230,6 @@ def normalize_result_index(value):
return index
def anipy_search_spec(job):
query = re.sub(r"\s+", " ", str(job.get("query") or "").replace(":", " ")).strip()
mode = "dub" if str(job.get("mode") or "").strip().lower() == "dub" else "sub"
return f"{query}:{job['episodes']}:{mode}"
def command_for_job(job, backend="kaizoku", download_path=None):
show_id = str(job.get("show_id") or job.get("query") or "").strip()
provider = str(job.get("provider") or "").strip().lower()