- Python3 - Script to automatically join Zoom meetings and control FFmpeg
- FFmpeg - Triggered by python script to start/stop screen recording
- Docker - Headless VNC Container based on Ubuntu 20.04 with Xfce window manager and TigerVNC
Join with ID and Passcode | Join with URL |
---|---|
The entire mechanism runs in a Docker container. So all you need to do is install Docker and use the image from Registry.
- Docker - https://docs.docker.com/get-docker/
Docker images are build and pushed automatically to Docker Hub and GitHub Container Registry.
So you can choose and use one of them:
ghcr.io/kastldratza/zoomrec:master
kastldratza/zoomrec:latest
For my examples in this README I used kastldratza/zoomrec:latest
- Container saves recordings at /home/zoomrec/recordings
- The current directory is used to mount recordings-Folder, but can be changed if needed
- Please check use of paths on different operating systems!
- Please check permissions for used directory!
- Container stops when Python script is terminated
- Zoomrec uses a CSV file with entries of Zoom meetings to record them
- The csv can be passed as seen below (mount as volume or add to docker image)
- To "say" something after joining a meeting:
- paplay (pulseaudio-utils) is used to play a sound to a specified microphone output, which is mapped to a microphone input at startup.
- paplay is triggered and plays a random file from /home/zoomrec/audio
- Nothing will be played if directory:
- does not contain .wav files
- is not mounted properly
CSV must be formatted as in example/meetings.csv
- Delimiter must be a semicolon ";"
- Only meetings with flag "record = true" are joined and recorded
- "description" is used for filename when recording
- "duration" in minutes (+5 minutes to the end)
weekday | time | duration | id | password | description | record |
---|---|---|---|---|---|---|
monday | 09:55 | 60 | 111111111111 | 741699 | Important_Meeting | true |
monday | 14:00 | 90 | 222222222222 | 321523 | Unimportant_Meeting | false |
tuesday | 17:00 | 90 | https://zoom.us/j/123456789?pwd=abc | Meeting_with_URL | true |
You can connect to zoomrec via vnc and see what is happening.
Hostname | Port | Password |
---|---|---|
localhost | 5901 | zoomrec |
To have access to the recordings, a volume is mounted, so you need to create a folder that container users can access.
[ IMPORTANT ]
mkdir -p recordings/screenshots
chown -R 1000:1000 recordings
mkdir -p audio
chown -R 1000:1000 audio
docker run -d --restart unless-stopped \
-e TZ=Europe/Berlin \
-v $(pwd)/recordings:/home/zoomrec/recordings \
-v $(pwd)/example/audio:/home/zoomrec/audio \
-v $(pwd)/example/meetings.csv:/home/zoomrec/meetings.csv:ro \
-p 5901:5901 \
kastldratza/zoomrec:latest
- screenshot on error
- record joining
- do not exit container on error
docker run -d --restart unless-stopped \
-e DEBUG=True \
-v $(pwd)/recordings:/home/zoomrec/recordings \
-v $(pwd)/example/audio:/home/zoomrec/audio \
-v $(pwd)/example/meetings.csv:/home/zoomrec/meetings.csv:ro \
-p 5901:5901 \
kastldratza/zoomrec:latest
docker run -d --restart unless-stopped \
-v %cd%\recordings:/home/zoomrec/recordings \
-v %cd%\example\audio:/home/zoomrec/audio \
-v %cd%\example\meetings.csv:/home/zoomrec/meetings.csv:ro \
-p 5901:5901 \
kastldratza/zoomrec:latest
docker run -d --restart unless-stopped \
-v ${PWD}/recordings:/home/zoomrec/recordings \
-v ${PWD}/example/audio:/home/zoomrec/audio \
-v ${PWD}/example/meetings.csv:/home/zoomrec/meetings.csv:ro \
-p 5901:5901 \
kastldratza/zoomrec:latest
docker run -d --restart unless-stopped \
-v $(pwd)/recordings:/home/zoomrec/recordings \
-v $(pwd)/example/audio:/home/zoomrec/audio \
-v $(pwd)/example/meetings.csv:/home/zoomrec/meetings.csv:ro \
-p 5901:5901 \
kastldratza/zoomrec:latest
# Switch to example directory
cd example
# Build new image by customized Dockerfile
docker build -t kastldratza/zoomrec-custom:latest .
# Run image without mounting meetings.csv and audio directory
# Linux
docker run -d --restart unless-stopped -v $(pwd)/recordings:/home/zoomrec/recordings -p 5901:5901 kastldratza/zoomrec-custom:latest
# Windows / PowerShell
docker run -d --restart unless-stopped -v ${PWD}/recordings:/home/zoomrec/recordings -p 5901:5901 kastldratza/zoomrec-custom:latest
# Windows / cmd
docker run -d --restart unless-stopped -v %cd%\recordings:/home/zoomrec/recordings -p 5901:5901 kastldratza/zoomrec-custom:latest
- Show when the next meeting starts
- Join a Meeting from csv with id and password
- Wrong error: Invalid meeting ID / Leave
- Join with Computer Audio
- Please wait for the host to start this meeting.
- Please wait, the meeting host will let you in soon.
- Enter Full Screen
- Switch to Speaker View
- Continuously check: This meeting is being recorded / Continue
- Continuously check: Hide Video Panel
- Continuously check: This meeting has been ended by host
- Quit ffmpeg gracefully on abort
- Host is sharing poll results
- This meeting is for authorized attendees only / Leave meeting
- Play sound after joining a meeting
- Join a Meeting from csv with url
- Refactoring
- Create terraform stack to deploy in AWS
- Join a Meeting from calendar
- Sign In to existing Zoom account
- Join Breakout Room
- Support to record Google Meet, MS Teams, Cisco WebEx calls too
- Ability to monitor recordings sessions in various containers
Create unittests for different use cases:
- Join meeting
- Start / Stop ffmpeg and check if file was created
- ...
Feel free. However, if you want to support me and my work, I have some crypto addresses here.
name | address |
---|---|
Bitcoin (BTC) | |
Ethereum (ETH) | |
Dogecoin (DOGE) | |
Cardano (ADA) |
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.