{"id":25735713,"url":"https://github.com/alertua/updatechecker","last_synced_at":"2026-02-27T18:25:58.987Z","repository":{"id":110764570,"uuid":"180869249","full_name":"ALERTua/updatechecker","owner":"ALERTua","description":null,"archived":false,"fork":false,"pushed_at":"2026-02-21T18:22:17.000Z","size":1534,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-21T22:23:04.316Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ALERTua.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-04-11T20:05:04.000Z","updated_at":"2026-02-21T18:21:53.000Z","dependencies_parsed_at":"2025-02-26T05:31:52.319Z","dependency_job_id":"e4b8b917-069c-49b3-86b6-0ecd969a987b","html_url":"https://github.com/ALERTua/updatechecker","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/ALERTua/updatechecker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALERTua%2Fupdatechecker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALERTua%2Fupdatechecker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALERTua%2Fupdatechecker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALERTua%2Fupdatechecker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ALERTua","download_url":"https://codeload.github.com/ALERTua/updatechecker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALERTua%2Fupdatechecker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29907601,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T17:28:36.873Z","status":"ssl_error","status_checked_at":"2026-02-27T17:28:20.970Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-26T05:31:45.429Z","updated_at":"2026-02-27T18:25:58.981Z","avatar_url":"https://github.com/ALERTua.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner-direct-single.svg)](https://stand-with-ukraine.pp.ua)\n[![Made in Ukraine](https://img.shields.io/badge/made_in-Ukraine-ffd700.svg?labelColor=0057b7)](https://stand-with-ukraine.pp.ua)\n[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://stand-with-ukraine.pp.ua)\n[![Russian Warship Go Fuck Yourself](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/RussianWarship.svg)](https://stand-with-ukraine.pp.ua)\n\n\u003cimg src=\"media/icon.png\" height=\"320\"\u003e\n\n# Update Checker\n\nA Python utility for automatically checking and downloading updates for files and GitHub releases. It supports MD5 verification, automatic process management, archive handling, and parallel chunked downloads.\n\n## Features\n\n- **Download and update files from URLs and GitHub releases**\n- **Parallel chunked downloads** - Auto-detects large files (≥10MB) and downloads in parallel chunks for faster transfers\n- **MD5 checksum verification** - Verify file integrity after download\n- **HTTP HEAD optimization** - Skip downloads when file hasn't changed (ETag, Last-Modified, Content-Length checks)\n- **Automatic backup of existing files**\n- **Process management** - Kill and relaunch capabilities for locked files\n- **Archive extraction support** - Automatic unzip with optional flatten mode\n- **Concurrent processing** - Thread pooling for multiple entries\n- **GitHub API support** - Authenticated requests with token to avoid rate limits\n- **Typer-based CLI** - Clean command-line interface with auto-completion\n\n## How it works\n\n\u003cdetails\u003e\n\u003csummary\u003eClick to expand flowchart\u003c/summary\u003e\n\n```mermaid\nflowchart TD\n    A[Read Configuration] --\u003e B[For Each Entry]\n    B --\u003e C{File Exists?}\n    C --\u003e|No| D[Download File]\n    C --\u003e|Yes| E{HEAD Check}\n    E --\u003e|Unchanged| F[Skip Download]\n    E --\u003e|Changed| D\n    E --\u003e|Failed| G{MD5 Match?}\n    G --\u003e|Match| F\n    G --\u003e|No Match| D\n    D --\u003e H[Verify MD5]\n    H --\u003e I[Backup Existing]\n    I --\u003e J[Update File]\n    J --\u003e K{Archive?}\n    K --\u003e|Yes| L{Flatten?}\n    K --\u003e|No| M{Process Locked?}\n    L --\u003e|Yes| L1[Flatten Extraction]\n    L --\u003e|No| L2[Normal Extraction]\n    L1 --\u003e M\n    L2 --\u003e M\n    M --\u003e|Yes| N[Kill Process]\n    N --\u003e O{Relaunch?}\n    M --\u003e|No| P{Launch Config?}\n    O --\u003e|Yes| Q[Relaunch Application]\n    O --\u003e|No| P\n    P --\u003e|Yes| R[Launch Application]\n    P --\u003e|No| B\n    Q --\u003e B\n    R --\u003e B\n    F --\u003e B\n```\n\n\u003c/details\u003e\n\n## CLI Usage\n\n```bash\n# Basic usage - check all entries\nuv run updatechecker\n\n# Use specific config file\nuv run updatechecker --config /path/to/config.yaml\n\n# Process specific entries only\nuv run updatechecker --entries entry1,entry2,entry3\n\n# Force re-download (skip HEAD/MD5 checks)\nuv run updatechecker --force\n\n# Disable parallel processing\nuv run updatechecker --no-async\n\n# Set number of threads for parallel processing\nuv run updatechecker --threads 4\n\n# Provide GitHub token for API requests\nuv run updatechecker --gh-token ghp_your_token\n\n# Enable verbose output\nuv run updatechecker --verbose\n```\n\n### CLI Options\n\n| Option | Short | Description |\n|--------|-------|-------------|\n| `--config` | `-c` | Path to config file (default: `~/updatechecker.yaml`) |\n| `--async/--no-async` | | Enable/disable parallel processing (default: enabled) |\n| `--threads` | `-t` | Number of threads for parallel processing (default: CPU count - 1) |\n| `--entries` | `-e` | Comma-separated list of entry names to check (default: all) |\n| `--force` | | Force re-download, skip HEAD/MD5 checks |\n| `--verbose` | `-v` | Enable verbose output (DEBUG log level) |\n| `--gh-token` | | GitHub token for API requests (overrides config and `GITHUB_TOKEN` env var) |\n\n## Configuration\n\nCreate `updatechecker.yaml` in `%USERPROFILE%` or in the cloned repository folder. See [updatechecker.example.yaml](updatechecker.example.yaml) for a complete example with detailed comments.\n\n### Quick Example\n\n```yaml\n# Optional: GitHub token for authenticated API requests\ngithub_token: 'ghp_abc123'\n\nvariables:\n  games_dir: 'D:\\Games'\n  tools_dir: '{{games_dir}}\\Tools'\n\nentries:\n  my_tool:\n    url: \"https://github.com/user/repo\"\n    git_asset: 'tool.*\\.zip'      # Regex pattern for GitHub release asset\n    target: '{{tools_dir}}\\tool.zip'\n    unzip_target: '{{tools_dir}}\\tool'\n    chunked_download: true         # Enable parallel download for large files\n    flatten: true                  # Skip redundant versioned folder in zip\n```\n\n### Entry Options\n\n| Option | Type | Description |\n|--------|------|-------------|\n| `url` | string | URL to download from or GitHub repo URL |\n| `git_asset` | string | Regex pattern to match GitHub release asset |\n| `md5` | string | URL containing MD5 hash for verification |\n| `target` | string | Full path to save downloaded file |\n| `unzip_target` | string | Directory to extract archive to |\n| `archive_password` | string | Password for encrypted archives |\n| `kill_if_locked` | string | Process path/name to kill if file is locked |\n| `relaunch` | bool | Relaunch the killed process (default: false) |\n| `launch` | string | Path to launch after download |\n| `arguments` | string | Arguments for launch command |\n| `flatten` | bool | Skip redundant parent folder in zip (default: false) |\n| `chunked_download` | bool | Enable parallel chunked download (default: auto-detect) |\n| `use_content_length_check` | bool | Use file size check when metadata missing (default: true) |\n\n## Getting Started\n\n### Installation\n\n1. Clone this repository:\n   ```bash\n   git clone https://github.com/ALERTua/updatechecker.git\n   ```\n2. Install [uv](https://docs.astral.sh/uv/getting-started/installation/)\n3. Create config from example:\n   ```bash\n   cp updatechecker.example.yaml ~/updatechecker.yaml\n   ```\n4. Edit config and run:\n   ```bash\n   uv run updatechecker\n   ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falertua%2Fupdatechecker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falertua%2Fupdatechecker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falertua%2Fupdatechecker/lists"}