Flask-based web app that automatically archives Zoom cloud recordings on a configurable schedule. Supports multiple Zoom accounts via Server-to-Server OAuth, organizes downloads by date, and provides a web dashboard for managing accounts, viewing logs, and browsing archived recordings.
- Python 3.10+
- Zoom Account with admin or owner access
- Zoom Server-to-Server OAuth App — see ZOOM_SETUP.md for step-by-step instructions
- Sufficient disk space for storing audio recordings (M4A format)
Your Zoom S2S OAuth app needs the following scopes:
| Scope | Purpose |
|---|---|
cloud_recording:read:list_user_recordings |
List recordings for a user |
cloud_recording:read:list_recording_files |
Access recording file download URLs |
user:read:user |
Connection testing |
-
Clone the repository
git clone https://github.com/payown/Zoom-Capture.git cd Zoom-Capture -
Create a virtual environment (recommended)
python -m venv venv source venv/bin/activate # Linux/macOS venv\Scripts\activate # Windows
-
Install dependencies
pip install -r requirements.txt
This installs:
- Flask — web framework
- APScheduler — background job scheduling
- requests — HTTP client for the Zoom API
- mutagen — M4A file validation
- filelock — thread-safe config file access
-
Create your Zoom S2S OAuth app
Follow the instructions in ZOOM_SETUP.md to create an app and obtain your Account ID, Client ID, and Client Secret.
Start the application:
python app.pyThe web dashboard will be available at http://localhost:5000.
- Open the dashboard and go to Settings.
- Set the Archive Path — the directory where recordings will be saved.
- Set the Log Path — the directory for daily log files.
- Set the Run Time — the daily time (24-hour format) when the scheduler automatically downloads new recordings.
- Go to Accounts and click Add Account to enter your Zoom S2S OAuth credentials.
- Use Test Connection to verify your credentials work.
- Dashboard — overview of scheduler status, account count, and archive stats
- Accounts — add, edit, enable/disable, test, and delete Zoom accounts
- Settings — configure archive path, log path, and daily run time
- Logs — view and download daily log files, filter by errors/warnings
- Manual Run — trigger downloads on demand for specific dates or all available recordings
Service configuration files are included for running Zoom Capture as a background service:
- Linux (systemd):
services/zoom-archival.service - macOS (launchd):
services/zoom-archival.plist
├── app.py # Flask application and API routes
├── config_manager.py # Thread-safe config with file locking
├── scheduler.py # APScheduler-based download job
├── zoom_api.py # Zoom S2S OAuth client
├── file_manager.py # File download, validation, and organization
├── requirements.txt # Python dependencies
├── config.json # Local config (git-ignored, contains credentials)
├── templates/ # Jinja2 HTML templates
├── static/ # CSS and JavaScript
├── services/ # systemd and launchd service files
└── ZOOM_SETUP.md # Zoom OAuth app setup guide