kastldratza / zoomrec

Record Zoom meetings automatically in headless docker container with Python and FFmpeg
MIT License
265 stars 68 forks source link
automation csv docker ffmpeg headless meetings python-script python3 recording screencapture screencast ubuntu vnc xfce zoom zoom-meetings zoom-recorder zoomrecorder

zoomrec

A all-in-one solution to automatically join and record Zoom meetings.

GitHub Workflow Status GitHub Workflow Status GitHub Workflow Status GitHub Workflow Status
Docker Pulls Docker Image Size (tag) Github Stars



Join with ID and Passcode Join with URL

Installation

The entire mechanism runs in a Docker container. So all you need to do is install Docker and use the image from Registry.

Requirements

Docker Registry

Docker images are build and pushed automatically to Docker Hub and GitHub Container Registry.

So you can choose and use one of them:

For my examples in this README I used kastldratza/zoomrec:latest


Usage

CSV structure

CSV must be formatted as in example/meetings.csv

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

VNC

You can connect to zoomrec via vnc and see what is happening.

Connect (default)

Hostname Port Password
localhost 5901 zoomrec

Telegram

Zoomrec can notify you via Telegram about starting and ending a recording or if joining a meeting failed. All you need is a bot token and a chat id of a Telegram channel.

At first create a new telegram bot to get the bot token. After that create a new channel and add the bot with sufficient permissions to write messages in that channel. Finally get the chat id of your channel and look below how to pass your Telegram details to Zoomrec.

Preparation

To have access to the recordings, a volume is mounted, so you need to create a folder that container users can access.

[ IMPORTANT ]

Create folders and set permissions (on Host)

mkdir -p recordings/screenshots
chown -R 1000:1000 recordings

mkdir -p audio
chown -R 1000:1000 audio

Flags

Set timezone (default: Europe/Berlin)

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 \
  --security-opt seccomp:unconfined \
kastldratza/zoomrec:latest

Set debugging flag (default: False)

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 \
  --security-opt seccomp:unconfined \
kastldratza/zoomrec:latest

Set Telegram details

docker run -d --restart unless-stopped \
  -e TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN" \
  -e TELEGRAM_CHAT_ID="-100_YOUR_CHAT_ID" \
  -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 \
  --security-opt seccomp:unconfined \
kastldratza/zoomrec:latest

Set Zoom display name

docker run -d --restart unless-stopped \
  -e DISPLAY_NAME="zoomrec" \
  -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 \
  --security-opt seccomp:unconfined \
kastldratza/zoomrec:latest

Windows / cmd

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 \
  --security-opt seccomp:unconfined \
kastldratza/zoomrec:latest

Windows / PowerShell

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 `
  --security-opt seccomp:unconfined `
kastldratza/zoomrec:latest

Linux / macOS

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 \
  --security-opt seccomp:unconfined \
kastldratza/zoomrec:latest

Customization example

Add meetings.csv to image

# 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 --security-opt seccomp:unconfined kastldratza/zoomrec-custom:latest

# Windows / PowerShell
docker run -d --restart unless-stopped -v ${PWD}/recordings:/home/zoomrec/recordings -p 5901:5901 --security-opt seccomp:unconfined kastldratza/zoomrec-custom:latest

# Windows / cmd
docker run -d --restart unless-stopped -v %cd%\recordings:/home/zoomrec/recordings -p 5901:5901 --security-opt seccomp:unconfined kastldratza/zoomrec-custom:latest

Supported actions


Roadmap


Testing

Create unittests for different use cases:


Support

Feel free. However, if you want to support me and my work, I have some crypto addresses here.

name address
Bitcoin (BTC)
show


bc1qz2n26d4gq8qjdge9ueeluqut5p0rmv5wjmvnus

Ethereum (ETH)
show


0x984dBf7fb4ab489E33ca004552259484041AeF88

Dogecoin (DOGE)
show


DHBCESbBPqER83h5E2j6cw6H1QZW8qHtYd

Cardano (ADA)
show


addr1q90phcf0qzkx9da8vghtaa04a68gwpat37gvss963r9xfsj7r0sj7q9vv2m6wc3whm6ltm5wsur6hrusepqt4zx2vnpqz307az


Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.