{"id":50758597,"url":"https://github.com/pratham2402/autoextract","last_synced_at":"2026-06-11T08:00:19.067Z","repository":{"id":363966965,"uuid":"859977123","full_name":"pratham2402/AutoExtract","owner":"pratham2402","description":"Daemon that watches folders and automatically extracts archives. Supports ZIP, RAR, 7z, Tar, ISO. Event-driven, recursive, webhook notifications.","archived":false,"fork":false,"pushed_at":"2026-06-11T06:11:11.000Z","size":129,"stargazers_count":1,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-06-11T06:22:23.338Z","etag":null,"topics":["7z","archive-extraction","automation","daemon","docker","extraction","python","rar","tar","watchdog","zip"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pratham2402.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-09-19T15:47:30.000Z","updated_at":"2026-06-11T06:11:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pratham2402/AutoExtract","commit_stats":null,"previous_names":["pratham2402/autoextract"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/pratham2402/AutoExtract","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pratham2402%2FAutoExtract","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pratham2402%2FAutoExtract/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pratham2402%2FAutoExtract/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pratham2402%2FAutoExtract/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pratham2402","download_url":"https://codeload.github.com/pratham2402/AutoExtract/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pratham2402%2FAutoExtract/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34188272,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["7z","archive-extraction","automation","daemon","docker","extraction","python","rar","tar","watchdog","zip"],"created_at":"2026-06-11T08:00:15.142Z","updated_at":"2026-06-11T08:00:19.013Z","avatar_url":"https://github.com/pratham2402.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Made with Python](https://forthebadge.com/api/badges/generate?primaryLabel=MADE+WITH\u0026secondaryLabel=PYTHON\u0026primaryBGColor=%23306998\u0026secondaryBGColor=%23ffd43b\u0026primaryIcon=python\u0026primaryIconColor=%23ffffff)](https://python.org)\n[![Open Source](https://forthebadge.com/api/badges/generate?primaryLabel=OPEN\u0026secondaryLabel=SOURCE\u0026primaryBGColor=%232ea44f\u0026secondaryBGColor=%231b4332)](https://github.com/pratham2402/AutoExtract)\n[![MIT License](https://forthebadge.com/api/badges/generate?primaryLabel=MIT\u0026secondaryLabel=LICENSE\u0026primaryBGColor=%237c3aed\u0026secondaryBGColor=%234c1d95)](https://github.com/pratham2402/AutoExtract/blob/master/LICENSE)\n[![Docker Ready](https://forthebadge.com/api/badges/generate?primaryLabel=DOCKER\u0026secondaryLabel=READY\u0026primaryBGColor=%230db7ed\u0026secondaryBGColor=%231e3a5f\u0026primaryIcon=docker\u0026primaryIconColor=%23ffffff)](https://docker.com)\n[![Version 2.1.0](https://forthebadge.com/api/badges/generate?primaryLabel=VERSION\u0026secondaryLabel=2.1.0\u0026primaryBGColor=%23e01e5a\u0026secondaryBGColor=%23ffd034)](https://github.com/pratham2402/AutoExtract/releases)\n\n# AutoExtract\n\nAutomated multi-format archive extraction daemon. Watches folders for compressed archives and extracts them automatically with no manual unzipping required.\n\n![](https://github.com/pratham2402/AutoExtract/blob/master/ReadMe%20Banner%20Design.png)\n\n## ✨ Features\n\n- **Multi-format support** - ZIP, RAR, 7z, Tar, Tar.gz, Tar.bz2, ISO, CAB, and more\n- **Event-driven** - Uses inotify (via watchdog) for instant extraction; falls back to polling\n- **Recursive extraction** - Finds and extracts archives nested within archives\n- **Password support** - Password-protected archives via config or password file\n- **Webhook notifications** - Get notified on extraction success/failure via HTTP webhooks\n- **Configurable** - YAML config file with environment variable overrides\n- **Trash after extract** - Move archives to system Trash after successful extraction (safer than permanent delete)\n- **Subfolder extraction** - Each archive extracted into its own folder\n- **Daemon-ready** - Systemd service file and Docker support included\n- **Graceful shutdown** - Signal handling for clean termination\n\n## 🚀 Quick Start\n\n### 📥 Install\n\n```bash\ngit clone https://github.com/pratham2402/AutoExtract.git\ncd AutoExtract\n\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -e .\n```\n\nLinux users also need the system `unrar` and `7z` binaries:\n```bash\nsudo apt-get update \u0026\u0026 sudo apt-get install -y unrar p7zip-full\n```\n\n### 🛠️ Configure\n\nEdit `config.yaml` or set environment variables:\n\n```yaml\nwatch:\n  paths:\n    - ~/Downloads\n  patterns:\n    - \"*.zip\"\n    - \"*.rar\"\n    - \"*.7z\"\n    - \"*.tar\"\n    - \"*.tar.gz\"\n    - \"*.tgz\"\n    - \"*.tar.bz2\"\n    - \"*.tbz2\"\n  debounce_seconds: 5.0\n\nextraction:\n  extract_to_subfolder: true\n  delete_after: false\n  trash_after: false\n  recursive: true\n  max_recursion_depth: 5\n```\n\n### 🪄 Setup Wizard\n\nThe fastest way to get started — interactive prompts, no YAML editing:\n\n```bash\nautoextract setup\n```\n\n### ▶️ Run\n\n```bash\nautoextract\n```\n\nOr with a custom config:\n\n```bash\nautoextract --config /path/to/config.yaml\n```\n\n## 📦 Standalone Binary\n\nDownload a single executable for your platform — no Python or pip required. These are built automatically on every tagged release.\n\nSystem dependencies still required: `unrar` for RAR support and `7z` for 7z/ISO support.\n\n```bash\n# Download the binary for your platform from:\n#   https://github.com/pratham2402/AutoExtract/releases/latest\nchmod +x autoextract-linux-x86_64\nsudo mv autoextract-linux-x86_64 /usr/local/bin/autoextract\n\n# Run\nautoextract --config /path/to/config.yaml\n```\n\n### Build from source\n\n```bash\npip install -e \".[full]\" pyinstaller\nbash scripts/build-binary.sh\n# Binary at: dist/autoextract\n```\n\n## ⚙️ Configuration Reference\n\n### Watch section\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| `paths` | list | `[~/Downloads]` | Directories to monitor |\n| `recursive` | bool | `false` | Watch subdirectories recursively |\n| `patterns` | list | `*.zip, *.rar, *.7z, *.tar, *.tar.gz, *.tgz, *.tar.bz2, *.tbz2` | File patterns to match |\n| `polling_interval` | int | `10` | Seconds between polls (when watchdog unavailable) |\n| `debounce_seconds` | float | `5.0` | Wait for file to stop changing before extracting |\n\n### Extraction section\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| `output_dir` | str | `null` | Extraction target directory (null = same as source) |\n| `extract_to_subfolder` | bool | `true` | Create subfolder named after archive |\n| `delete_after` | bool | `false` | Permanently delete archive after successful extraction |\n| `trash_after` | bool | `false` | Move archive to system Trash after successful extraction (safer than delete) |\n| `keep_on_failure` | bool | `true` | Keep archive if extraction fails (only relevant with delete_after/trash_after) |\n| `password` | str | `null` | Global password for encrypted archives |\n| `password_file` | str | `null` | Path to file with passwords to try (one per line) |\n| `recursive` | bool | `true` | Extract archives found within extracted content |\n| `max_recursion_depth` | int | `5` | Maximum nesting depth for recursive extraction |\n| `max_extracted_size` | int | `53687091200` | Max total uncompressed bytes before aborting (default 50 GB) |\n| `max_file_count` | int | `10000` | Max files in a single archive before aborting |\n| `min_free_space` | int | `1073741824` | Minimum free disk space required before extraction (default 1 GB) |\n\n### Webhooks section\n\n```yaml\nwebhooks:\n  - url: \"https://example.com/hook\"\n    events: [\"extraction_success\", \"extraction_failure\"]\n    timeout: 30\n    retries: 3\n```\n\nEvents: `extraction_start`, `extraction_success`, `extraction_failure`\n\n### Logging section\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| `level` | str | `INFO` | Log level (DEBUG, INFO, WARNING, ERROR) |\n| `file` | str | `null` | Log file path (null = stdout) |\n| `format` | str | `%(asctime)s - %(name)s - %(levelname)s - %(message)s` | Log format string |\n\n## 🔧 Environment Variables\n\nAll settings can be overridden with `AUTOEXTRACT_` prefixed env vars:\n\n```bash\nexport AUTOEXTRACT_CONFIG=/path/to/config.yaml\nexport AUTOEXTRACT_WATCH_PATHS=\"/watch/dir1,/watch/dir2\"\nexport AUTOEXTRACT_EXTRACTION_OUTPUT_DIR=/output\nexport AUTOEXTRACT_EXTRACTION_DELETE_AFTER=true\nexport AUTOEXTRACT_EXTRACTION_PASSWORD=secret\nexport AUTOEXTRACT_LOG_LEVEL=DEBUG\nexport AUTOEXTRACT_WEBHOOK_URL=https://hooks.example.com/notify\n```\n\n## 🖥️ Systemd Service\n\n```bash\nsudo cp autoextract.service /etc/systemd/system/\nsudo mkdir -p /etc/autoextract\nsudo cp config.yaml /etc/autoextract/\nsudo systemctl daemon-reload\nsudo systemctl enable --now autoextract\n```\n\n## 🐳 Docker\n\n```bash\ndocker compose up -d\n```\n\nOr manually:\n\n```bash\ndocker build -t autoextract .\ndocker run -d \\\n  -v ~/Downloads:/watch \\\n  -v ./extracted:/output \\\n  -v ./config.yaml:/etc/autoextract/config.yaml:ro \\\n  autoextract\n```\n\n## 📦 Supported Formats\n\n| Format | Extension | Backend |\n|--------|-----------|---------|\n| ZIP | `.zip` | stdlib `zipfile` |\n| RAR | `.rar`, `.cbr` | `rarfile` + `unrar` |\n| 7-Zip | `.7z` | `py7zr` |\n| ISO | `.iso` | `py7zr` |\n| CAB | `.cab` | `py7zr` |\n| Tar | `.tar` | stdlib `tarfile` |\n| Tar.gz | `.tar.gz`, `.tgz` | stdlib `tarfile` |\n| Tar.bz2 | `.tar.bz2`, `.tbz2` | stdlib `tarfile` |\n| Tar.xz | `.tar.xz`, `.txz` | stdlib `tarfile` |\n| Tar.zst | `.tar.zst`, `.tzst` | stdlib `tarfile` |\n\n## 📁 Project Structure\n\n```\nAutoExtract/\n├── autoextract/\n│   ├── __init__.py       # Package version\n│   ├── __main__.py       # Entry point\n│   ├── config.py         # YAML + env var configuration\n│   ├── extractors.py     # Multi-format extraction engine\n│   ├── monitor.py        # Watchdog + polling folder monitor\n│   ├── security.py       # Zip-bomb protection, disk space check\n│   ├── webhooks.py       # HTTP notification callbacks\n│   └── cli_setup.py      # Interactive terminal setup wizard\n├── scripts/\n│   └── build-binary.sh   # PyInstaller standalone binary build\n├── .github/workflows/\n│   └── build.yml         # Multi-platform CI build + release\n├── config.yaml           # Default configuration\n├── setup.py              # Package installer\n├── Dockerfile\n├── docker-compose.yml\n├── autoextract.service   # systemd unit file\n├── requirements.txt\n├── LICENSE\n└── README.md\n```\n\n## 👥 Contributors\n\n[![Contributors](https://contrib.rocks/image?repo=pratham2402/AutoExtract)](https://github.com/pratham2402/AutoExtract/graphs/contributors)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpratham2402%2Fautoextract","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpratham2402%2Fautoextract","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpratham2402%2Fautoextract/lists"}