Refresh dependencies and compatibility guards

This commit is contained in:
Victor Kuznetsov
2026-07-31 17:24:05 -07:00
parent be7553b55f
commit 9c71dc9c79
7 changed files with 883 additions and 837 deletions
+1 -1
View File
@@ -1,3 +1,3 @@
# HuggingFace token (optional; only needed for gated/private models)
# Get yours at: https://huggingface.co/settings/tokens
HF_TOKEN=
# HF_TOKEN=
+6 -2
View File
@@ -133,7 +133,10 @@ trustmark = [
# eraser backend needs none of this.
lama = [
"remove-ai-watermarks[visible]",
"onnxruntime>=1.16.0",
# ONNX Runtime 1.24 dropped CPython 3.10 wheels; keep the project's
# supported 3.10 line on the last compatible release series.
"onnxruntime>=1.16.0,<1.24; python_version < '3.11'",
"onnxruntime>=1.16.0; python_version >= '3.11'",
"huggingface-hub>=0.20.0",
]
# Lightweight inpaint backend -- MI-GAN via onnxruntime (andraniksargsyan/migan,
@@ -143,7 +146,8 @@ lama = [
# LaMa, the quality-first `auto` choice, is too large. Same runtime as `lama`.
migan = [
"remove-ai-watermarks[visible]",
"onnxruntime>=1.16.0",
"onnxruntime>=1.16.0,<1.24; python_version < '3.11'",
"onnxruntime>=1.16.0; python_version >= '3.11'",
"huggingface-hub>=0.20.0",
]
# Optional pre-diffusion super-resolution for small inputs (Real-ESRGAN). Loaded via
@@ -156,7 +156,6 @@ class TextMarkLocation:
y: int
w: int
h: int
is_fallback: bool = True # geometry anchor (no template match) -> always True for now
@property
def bbox(self) -> tuple[int, int, int, int]:
@@ -512,7 +511,7 @@ class TextMarkEngine:
y = min(margin_b, max(0, h - wm_h)) if c.corner == "tl" else max(0, h - margin_b - wm_h)
wm_w = min(wm_w, w - x)
wm_h = min(wm_h, h - y)
return TextMarkLocation(x=x, y=y, w=wm_w, h=wm_h, is_fallback=True)
return TextMarkLocation(x=x, y=y, w=wm_w, h=wm_h)
# ── Mask ────────────────────────────────────────────────────────────
+3 -2
View File
@@ -22,6 +22,7 @@ import click
from remove_ai_watermarks import __version__, image_io, watermark_registry
from remove_ai_watermarks._internal.constants import SUPPORTED_FORMATS
from remove_ai_watermarks._internal.utils import is_supported_format
from remove_ai_watermarks._internal.watermark_profiles import (
resolve_seed,
resolve_steps,
@@ -143,7 +144,7 @@ def _validate_image(path: Path) -> Path:
if not path.exists():
console.print(f"Error: File not found: {path}")
raise SystemExit(1)
if path.suffix.lower() not in SUPPORTED_FORMATS:
if not is_supported_format(path):
console.print(f"Warning: {path.suffix} may not be supported (expected: {', '.join(SUPPORTED_FORMATS)})")
return path
@@ -2092,7 +2093,7 @@ def cmd_batch(
output_dir = directory.parent / (directory.name + "_clean")
output_dir.mkdir(parents=True, exist_ok=True)
images = sorted(p for p in directory.iterdir() if p.suffix.lower() in SUPPORTED_FORMATS)
images = sorted(p for p in directory.iterdir() if is_supported_format(p))
if not images:
console.print(f"No supported images found in {directory}")
+3 -2
View File
@@ -13,7 +13,6 @@ from __future__ import annotations
import logging
import math
from dataclasses import dataclass
from importlib.util import find_spec
from typing import TYPE_CHECKING, Any
import cv2
@@ -75,7 +74,9 @@ class VideoVaeRuntime:
def is_available() -> bool:
"""Return whether the optional VAE runtime can be imported."""
return find_spec("torch") is not None and find_spec("diffusers") is not None
from remove_ai_watermarks.optional_deps import module_available
return module_available("torch", "diffusers")
def _fit_size(width: int, height: int, long_side: int) -> tuple[int, int]:
+4 -4
View File
@@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, cast
import pytest
from remove_ai_watermarks import video_encoding, video_invisible
from remove_ai_watermarks import optional_deps, video_encoding, video_invisible
from remove_ai_watermarks.video_synthid import DEFAULT_VIDEO_SYNTHID_NOISE_STD
if TYPE_CHECKING:
@@ -68,9 +68,9 @@ def test_encoder_redirects_large_stderr_while_frames_are_streaming(
def test_availability_requires_both_optional_packages(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setattr(
video_invisible,
"find_spec",
lambda name: object() if name == "torch" else None,
optional_deps,
"module_available",
lambda *names: set(names) <= {"torch"},
)
assert video_invisible.is_available() is False
Generated
+865 -824
View File
File diff suppressed because it is too large Load Diff