Skip to content

dynamic_download_repository

appimage_updater.repositories.dynamic_download_repository

Dynamic download repository implementation for applications with JavaScript-generated download links.

This handles applications that generate download links dynamically through JavaScript or API calls.

logger = logging.getLogger(__name__) module-attribute

DynamicDownloadRepository(timeout=30, user_agent=None, **kwargs)

Repository client for dynamic download URLs that require parsing.

Source code in src/appimage_updater/repositories/dynamic_download_repository.py
def __init__(self, timeout: int = 30, user_agent: str | None = None, **kwargs: Any):
    super().__init__(timeout, user_agent, **kwargs)

repository_type property

Get the repository type identifier.

detect_repository_type(url)

Detect if URL requires dynamic parsing.

Source code in src/appimage_updater/repositories/dynamic_download_repository.py
def detect_repository_type(self, url: str) -> bool:
    """Detect if URL requires dynamic parsing."""
    # Patterns that indicate dynamic download pages
    dynamic_patterns = [
        r".*/download/?$",  # Generic download pages that might be dynamic
    ]

    return any(re.match(pattern, url, re.IGNORECASE) for pattern in dynamic_patterns)

generate_pattern_from_releases(url) async

Generate file pattern from releases.

Source code in src/appimage_updater/repositories/dynamic_download_repository.py
async def generate_pattern_from_releases(self, url: str) -> str | None:
    """Generate file pattern from releases."""
    try:
        releases = await self.get_releases(url, limit=5)
        if not releases:
            return None

        # Extract AppImage asset names
        asset_names = self._extract_appimage_asset_names(releases)
        if not asset_names:
            return None

        # Generate pattern based on first asset name
        return self._generate_regex_pattern(asset_names[0])

    except Exception as e:
        logger.error(f"Failed to generate pattern for {url}: {e}")
        return None

get_latest_release(url) async

Get the latest release for dynamic download URL.

Source code in src/appimage_updater/repositories/dynamic_download_repository.py
async def get_latest_release(self, url: str) -> Release:
    """Get the latest release for dynamic download URL."""
    releases = await self.get_releases(url, limit=1)
    if not releases:
        raise RepositoryError(f"No releases found for {url}")
    return releases[0]

get_latest_release_including_prerelease(repo_url) async

Get the latest release including prereleases (same as latest for dynamic downloads).

Source code in src/appimage_updater/repositories/dynamic_download_repository.py
async def get_latest_release_including_prerelease(self, repo_url: str) -> Release:
    """Get the latest release including prereleases (same as latest for dynamic downloads)."""
    return await self.get_latest_release(repo_url)

get_releases(url, limit=10) async

Get releases for dynamic download URL.

Source code in src/appimage_updater/repositories/dynamic_download_repository.py
async def get_releases(self, url: str, limit: int = 10) -> list[Release]:
    """Get releases for dynamic download URL."""
    try:
        return await self._handle_generic_dynamic(url)

    except Exception as e:
        logger.error(f"Failed to get releases for {url}: {e}")
        raise RepositoryError(f"Failed to fetch release information: {e}") from e

normalize_repo_url(url)

Normalize dynamic download URL.

Source code in src/appimage_updater/repositories/dynamic_download_repository.py
def normalize_repo_url(self, url: str) -> tuple[str, bool]:
    """Normalize dynamic download URL."""
    # For dynamic downloads, we typically don't modify the URL
    return url, False

parse_repo_url(url)

Parse dynamic download URL to extract meaningful components.

Source code in src/appimage_updater/repositories/dynamic_download_repository.py
def parse_repo_url(self, url: str) -> tuple[str, str]:
    """Parse dynamic download URL to extract meaningful components."""
    try:
        parsed = urlparse(url)
        domain = parsed.netloc.replace("www.", "")

        # Extract app name from domain or path
        path_parts = [p for p in parsed.path.split("/") if p]
        repo_name = path_parts[0] if path_parts else "app"
        return domain, repo_name
    except Exception as e:
        raise RepositoryError(f"Invalid URL format: {url}") from e

should_enable_prerelease(url) async

Check if prerelease should be enabled (always False for dynamic downloads).

Source code in src/appimage_updater/repositories/dynamic_download_repository.py
async def should_enable_prerelease(self, url: str) -> bool:
    """Check if prerelease should be enabled (always False for dynamic downloads)."""
    return False