Giter VIP home page Giter VIP logo

zoomrec's Introduction

zoomrec

Changes in this fork

  • FFmpeg enoding paramters moved to environment var: FFMPEG_ENCODE="-acodec pcm_s16le -vcodec libx264rgb -preset ultrafast -crf 0"
  • docker logs --tail 50 --follow --timestamps $(sudo docker ps | grep rkilchmn/zoomrec:latest | awk '{print $1}') or docker logs --tail 50 --follow --timestamps rkilchmn/zoomrec
  • Usefull commands

  • build container for CPU A/V encoding: docker build -t rkilchmn/zoomrec zoomrec/
  • build container for AMD GPU accelerated A/V encoding: docker build --build-arg GPU_BUILD=AMD -t rkilchmn/zoomrec zoomrec/
  • build container for INTEL GPU accelerated A/V encoding: docker build --build-arg GPU_BUILD=INTEL -t rkilchmn/zoomrec zoomrec/
  • build container for NVIDIA GPU accelerated A/V encoding: docker build --build-arg GPU_BUILD=NVIDIA -t rkilchmn/zoomrec zoomrec/
  • stop container: docker stop $(sudo docker ps | grep rkilchmn/zoomrec:latest | awk '{print $1}')
  • start root shell: docker container exec -u 0 -it zoomrec /bin/bash
  • remove container: docker rmi -f rkilchmn/zoomrec:latest
  • cleanup docker dir with unused garbage: docker system prune -a
  • remove stopped containers: docker rm $(docker ps -a -q -f status=exited)
  • remove dangling/unrefernced images: docker rmi $(docker images --filter "dangling=true" -q)
  • docker run -d --restart unless-stopped \ -e TZ=Australia/Sydney \ -e DISPLAY_NAME="Monica" \ -e FFMPEG_ENCODE="-acodec aac -b:a 128k -vaapi_device /dev/dri/renderD128 -vf 'hwupload,scale_vaapi=format=nv12' -c:v h264_vaapi -qp 24" \ -e LIBVA_DRIVER_NAME=i965 \ -v /home/roger/zoomrec/recordings:/home/zoomrec/recordings \ -v /home/roger/zoomrec/audio:/home/zoomrec/audio \ -v /home/roger/zoomrec/meetings.csv:/home/zoomrec/meetings.csv \ -p 5901:5901 \ --security-opt seccomp:unconfined \ --group-add="44" \ --group-add="110" \ --device /dev/dri/renderD128:/dev/dri/renderD128 \ --device /dev/dri/card0:/dev/dri/card0 \ rkilchmn/zoomrec:latest
  • (h)top like tool for supporting all GPU vendors: https://github.com/Syllo/nvtop
  • 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


    • 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
    • Telegram - Get notified about your recordings

    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:

    • ghcr.io/kastldratza/zoomrec:master
    • kastldratza/zoomrec:latest

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


    Usage

    • 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 structure

    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

    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)

    • 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 \
      --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

    • 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

    Roadmap

    • 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

    Testing

    Create unittests for different use cases:

    • Join meeting
    • Start / Stop ffmpeg and check if file was created
    • ...

    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.

    zoomrec's People

    Contributors

    bakkerrs avatar g-fuchter avatar kastldratza avatar rkilchmn avatar snyk-bot avatar toaster1032 avatar v1nc avatar

    Stargazers

     avatar

    Recommend Projects

    • React photo React

      A declarative, efficient, and flexible JavaScript library for building user interfaces.

    • Vue.js photo Vue.js

      ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

    • Typescript photo Typescript

      TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

    • TensorFlow photo TensorFlow

      An Open Source Machine Learning Framework for Everyone

    • Django photo Django

      The Web framework for perfectionists with deadlines.

    • D3 photo D3

      Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

    Recommend Topics

    • javascript

      JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

    • web

      Some thing interesting about web. New door for the world.

    • server

      A server is a program made to process requests and deliver data to clients.

    • Machine learning

      Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

    • Game

      Some thing interesting about game, make everyone happy.

    Recommend Org

    • Facebook photo Facebook

      We are working to build community through open source technology. NB: members must have two-factor auth.

    • Microsoft photo Microsoft

      Open source projects and samples from Microsoft.

    • Google photo Google

      Google โค๏ธ Open Source for everyone.

    • D3 photo D3

      Data-Driven Documents codes.