diff --git a/ansible/artwork/2020.fossasia.org/blank.png b/ansible/artwork/2020.fossasia.org/blank.png new file mode 100644 index 0000000..3e4503c Binary files /dev/null and b/ansible/artwork/2020.fossasia.org/blank.png differ diff --git a/ansible/artwork/2020.fossasia.org/side-by-side-43-reverse.png b/ansible/artwork/2020.fossasia.org/side-by-side-43-reverse.png new file mode 100644 index 0000000..31a8613 Binary files /dev/null and b/ansible/artwork/2020.fossasia.org/side-by-side-43-reverse.png differ diff --git a/ansible/artwork/2020.fossasia.org/side-by-side-43.png b/ansible/artwork/2020.fossasia.org/side-by-side-43.png new file mode 100644 index 0000000..a620feb Binary files /dev/null and b/ansible/artwork/2020.fossasia.org/side-by-side-43.png differ diff --git a/ansible/artwork/2020.fossasia.org/side-by-side-reverse.png b/ansible/artwork/2020.fossasia.org/side-by-side-reverse.png new file mode 100644 index 0000000..1d0a97e Binary files /dev/null and b/ansible/artwork/2020.fossasia.org/side-by-side-reverse.png differ diff --git a/ansible/artwork/2020.fossasia.org/side-by-side.png b/ansible/artwork/2020.fossasia.org/side-by-side.png new file mode 100644 index 0000000..43516c0 Binary files /dev/null and b/ansible/artwork/2020.fossasia.org/side-by-side.png differ diff --git a/ansible/event b/ansible/event new file mode 100644 index 0000000..4f1aa34 --- /dev/null +++ b/ansible/event @@ -0,0 +1,6 @@ +[recorders:children] +testgroup + +[testgroup] +#user@10.10.2.5 room_id=test +ambrose@10.10.0.90 room_id=test diff --git a/ansible/group_vars/all b/ansible/group_vars/all new file mode 100644 index 0000000..d21b84c --- /dev/null +++ b/ansible/group_vars/all @@ -0,0 +1,9 @@ +--- + +event: + id: 2020.fossasia.org + title: FOSSASIA Summit 2020 + +# Meta + +ansible_python_interpreter: auto diff --git a/ansible/group_vars/recorders b/ansible/group_vars/recorders new file mode 100644 index 0000000..7b13ac4 --- /dev/null +++ b/ansible/group_vars/recorders @@ -0,0 +1,4 @@ +--- + +room_id: unknown + diff --git a/ansible/play b/ansible/play new file mode 100755 index 0000000..58b45ff --- /dev/null +++ b/ansible/play @@ -0,0 +1,3 @@ +#!/bin/sh + +ansible-playbook -Kbf 1 -i "$1" "$2" diff --git a/ansible/recorders.yml b/ansible/recorders.yml new file mode 100644 index 0000000..ba66367 --- /dev/null +++ b/ansible/recorders.yml @@ -0,0 +1,5 @@ +--- +- hosts: recorders + roles: + - role: recorder + - role: monitoring-client diff --git a/ansible/roles/monitoring-client/tasks/main.yml b/ansible/roles/monitoring-client/tasks/main.yml new file mode 100644 index 0000000..cd21505 --- /dev/null +++ b/ansible/roles/monitoring-client/tasks/main.yml @@ -0,0 +1,2 @@ +--- + diff --git a/ansible/roles/recorder/files/gdm.conf b/ansible/roles/recorder/files/gdm.conf new file mode 100644 index 0000000..4ff3506 --- /dev/null +++ b/ansible/roles/recorder/files/gdm.conf @@ -0,0 +1,31 @@ +# MANAGED BY ANSIBLE + +# GDM configuration storage +# +# See /usr/share/gdm/gdm.schemas for a list of available options. + +[daemon] +# Uncomment the line below to force the login screen to use Xorg +#WaylandEnable=false + +# Enabling automatic login +AutomaticLoginEnable = true +AutomaticLogin = mixer + +# Enabling timed login +# TimedLoginEnable = true +# TimedLogin = user1 +# TimedLoginDelay = 10 + +[security] + +[xdmcp] + +[chooser] + +[debug] +# Uncomment the line below to turn on debugging +# More verbose logs +# Additionally lets the X server dump core if it crashes +#Enable=true + diff --git a/ansible/roles/recorder/tasks/artwork.yml b/ansible/roles/recorder/tasks/artwork.yml new file mode 100644 index 0000000..c33d729 --- /dev/null +++ b/ansible/roles/recorder/tasks/artwork.yml @@ -0,0 +1,23 @@ +--- + +- name: create artwork directory + file: + dest: /opt/artwork + state: directory + owner: root + group: root + mode: u=rwx,g=rx,o=rx + +- name: copy backgrounds + copy: + src: ../../../artwork/{{ event.id }}/{{ item }}.png + dest: /opt/artwork/ + owner: root + group: root + mode: u=rw,g=r,o=r + with_items: + - side-by-side + - side-by-side-reverse + - side-by-side-43 + - side-by-side-43-reverse + - blank diff --git a/ansible/roles/recorder/tasks/hostname.yml b/ansible/roles/recorder/tasks/hostname.yml new file mode 100644 index 0000000..b2db0a7 --- /dev/null +++ b/ansible/roles/recorder/tasks/hostname.yml @@ -0,0 +1,10 @@ +--- + +- name: generate hosts file + template: + src: etc-hosts.j2 + dest: /etc/hosts + +- name: set hostname to room_id + hostname: + name: "room-{{ room_id }}" diff --git a/ansible/roles/recorder/tasks/main.yml b/ansible/roles/recorder/tasks/main.yml new file mode 100644 index 0000000..0634b60 --- /dev/null +++ b/ansible/roles/recorder/tasks/main.yml @@ -0,0 +1,5 @@ +--- +- include: user.yml +- include: hostname.yml +- include: packages.yml +- include: artwork.yml diff --git a/ansible/roles/recorder/tasks/obs.yml b/ansible/roles/recorder/tasks/obs.yml new file mode 100644 index 0000000..7ae59a5 --- /dev/null +++ b/ansible/roles/recorder/tasks/obs.yml @@ -0,0 +1,34 @@ +--- + +- name: create obs directory + file: + dest: "{{ mixer_user.home }}/.config/obs-studio/{{ item }}" + state: directory + recurse: yes + owner: root + group: root + mode: u=rwx,g=rx,o=rx + with_items: + - basic/profiles/1080p + - basic/profiles/720p + - basic/scenes + +- name: generate base obs configuration files + template: + src: "obs-studio/{{ item }}.j2" + dest: "{{ mixer_user.home }}/.config/obs-studio/{{ item }}" + owner: mixer + group: mixer + mode: u=rw,g=r,o=r + with_items: + - global.ini + - basic/profiles/1080p/basic.ini + - basic/profiles/720p/basic.ini + +- name: generate event obs configuration files + template: + src: "obs-studio/basic/scenes/event_id.json.j2" + dest: "{{ mixer_user.home }}/.config/obs-studio/basic/scenes/{{ event.id }}.json" + owner: mixer + group: mixer + mode: u=rw,g=r,o=r diff --git a/ansible/roles/recorder/tasks/packages.yml b/ansible/roles/recorder/tasks/packages.yml new file mode 100644 index 0000000..fddef1e --- /dev/null +++ b/ansible/roles/recorder/tasks/packages.yml @@ -0,0 +1,13 @@ +--- + +- name: install general packages + apt: + state: latest + name: + - git + +- name: install packages required to be a recorder + apt: + state: latest + name: + - obs-studio diff --git a/ansible/roles/recorder/tasks/user.yml b/ansible/roles/recorder/tasks/user.yml new file mode 100644 index 0000000..83bd15d --- /dev/null +++ b/ansible/roles/recorder/tasks/user.yml @@ -0,0 +1,52 @@ +--- + +- name: create mixer group + group: + name: mixer + +- name: create mixer user with password mixer + user: + name: mixer + group: mixer + comment: Mixer + shell: /bin/bash + password: $6$8tFX.bXNC4348gTR$8e33nlbdydXVvFZ0VmaN9Y7H5HjMduu1Z4Ofjh13PhRFGLJ6ojubsHh1SuLZSHWzWMeUxIPEyVX6VH.UaCZe8/ + register: mixer_user + +- name: enable gdm autologin to mixer user + copy: + src: gdm.conf + dest: /etc/gdm3/daemon.conf + owner: root + group: root + mode: u=rw,g=r,o=r + +- name: check sleep settings + command: + cmd: /usr/bin/gsettings get org.gnome.desktop.session idle-delay + become: yes + become_user: mixer + register: idle_delay_setting + changed_when: false + +- name: prevent mixer from sleeping + command: + cmd: "{{ item }}" + environment: + # Required only when setting gsettings + DBUS_SESSION_BUS_ADDRESS: "unix:path=/run/user/{{ mixer_user.uid }}/bus" + with_items: + - /usr/bin/gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'nothing' + - /usr/bin/gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-type 'nothing' + - /usr/bin/gsettings set org.gnome.settings-daemon.plugins.power idle-dim false + - /usr/bin/gsettings set org.gnome.settings-daemon.plugins.power power-button-action 'nothing' + - /usr/bin/gsettings set org.gnome.desktop.lockdown disable-lock-screen true + - /usr/bin/gsettings set org.gnome.desktop.lockdown disable-log-out true + - /usr/bin/gsettings set org.gnome.desktop.lockdown disable-printing true + - /usr/bin/gsettings set org.gnome.desktop.lockdown disable-print-setup true + - /usr/bin/gsettings set org.gnome.desktop.lockdown disable-save-to-disk true + - /usr/bin/gsettings set org.gnome.desktop.interface gtk-theme 'Adwaita-dark' + - /usr/bin/gsettings set org.gnome.desktop.session idle-delay 0 + become: yes + become_user: mixer + when: "'uint32 0' not in idle_delay_setting.stdout" diff --git a/ansible/roles/recorder/templates/etc-hosts.j2 b/ansible/roles/recorder/templates/etc-hosts.j2 new file mode 100644 index 0000000..bc1a83d --- /dev/null +++ b/ansible/roles/recorder/templates/etc-hosts.j2 @@ -0,0 +1,4 @@ +127.0.0.1 localhost room-{{ room_id }} +::1 localhost ip6-localhost ip6-loopbac room-{{ room_id }} +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters diff --git a/ansible/roles/recorder/templates/obs-studio/basic/profiles/1080p/basic.ini.j2 b/ansible/roles/recorder/templates/obs-studio/basic/profiles/1080p/basic.ini.j2 new file mode 100644 index 0000000..c09d996 --- /dev/null +++ b/ansible/roles/recorder/templates/obs-studio/basic/profiles/1080p/basic.ini.j2 @@ -0,0 +1,33 @@ +[General] +Name=1080p + +[Video] +BaseCX=1920 +BaseCY=1080 +OutputCX=1920 +OutputCY=1080 + +[Output] +Mode=Simple + +[Audio] +SampleRate=48000 + +[Hotkeys] +OBSBasic.StartRecording={\n "bindings": [\n {\n "control": true,\n "key": "OBS_KEY_RETURN"\n }\n ]\n} +OBSBasic.StopRecording={\n "bindings": [\n {\n "control": true,\n "key": "OBS_KEY_BACKSPACE"\n }\n ]\n} +OBSBasic.Transition={\n "bindings": [\n {\n "key": "OBS_KEY_RETURN"\n }\n ]\n} + +[SimpleOutput] +RecFormat=mkv +RecQuality=Small +RecEncoder=x264_lowcpu + +[AdvOut] +TrackIndex=1 +RecType=Standard +RecTracks=1 +FFOutputToFile=true +FFVEncoderId=0 +FFAEncoderId=0 +FFAudioTrack=1 diff --git a/ansible/roles/recorder/templates/obs-studio/basic/profiles/720p/basic.ini.j2 b/ansible/roles/recorder/templates/obs-studio/basic/profiles/720p/basic.ini.j2 new file mode 100644 index 0000000..9205fe2 --- /dev/null +++ b/ansible/roles/recorder/templates/obs-studio/basic/profiles/720p/basic.ini.j2 @@ -0,0 +1,33 @@ +[General] +Name=720p + +[Video] +BaseCX=1920 +BaseCY=1080 +OutputCX=1280 +OutputCY=720 + +[Output] +Mode=Simple + +[Audio] +SampleRate=48000 + +[Hotkeys] +OBSBasic.StartRecording={\n "bindings": [\n {\n "control": true,\n "key": "OBS_KEY_RETURN"\n }\n ]\n} +OBSBasic.StopRecording={\n "bindings": [\n {\n "control": true,\n "key": "OBS_KEY_BACKSPACE"\n }\n ]\n} +OBSBasic.Transition={\n "bindings": [\n {\n "key": "OBS_KEY_RETURN"\n }\n ]\n} + +[SimpleOutput] +RecFormat=mkv +RecQuality=Small +RecEncoder=x264_lowcpu + +[AdvOut] +TrackIndex=1 +RecType=Standard +RecTracks=1 +FFOutputToFile=true +FFVEncoderId=0 +FFAEncoderId=0 +FFAudioTrack=1 diff --git a/ansible/roles/recorder/templates/obs-studio/basic/scenes/event_id.json.j2 b/ansible/roles/recorder/templates/obs-studio/basic/scenes/event_id.json.j2 new file mode 100644 index 0000000..37d4dab --- /dev/null +++ b/ansible/roles/recorder/templates/obs-studio/basic/scenes/event_id.json.j2 @@ -0,0 +1,1115 @@ +{ + "AuxAudioDevice1": { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "libobs.mute": [], + "libobs.push-to-mute": [], + "libobs.push-to-talk": [], + "libobs.unmute": [] + }, + "id": "pulse_input_capture", + "mixers": 255, + "monitoring_type": 0, + "muted": false, + "name": "Microphone", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "device_id": "alsa_input.usb-Creative_Labs_VF0470_Live__Cam_Notebook-01.analog-mono" + }, + "sync": 0, + "volume": 1.0 + }, + "AuxAudioDevice2": { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "libobs.mute": [], + "libobs.push-to-mute": [], + "libobs.push-to-talk": [], + "libobs.unmute": [] + }, + "id": "pulse_input_capture", + "mixers": 255, + "monitoring_type": 0, + "muted": false, + "name": "Slides Audio", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "device_id": "alsa_input.usb-VXIS_Inc_ACASIS-02.iec958-stereo" + }, + "sync": 0, + "volume": 1.0 + }, + "AuxAudioDevice3": { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "libobs.mute": [], + "libobs.push-to-mute": [], + "libobs.push-to-talk": [], + "libobs.unmute": [] + }, + "id": "pulse_input_capture", + "mixers": 255, + "monitoring_type": 0, + "muted": true, + "name": "Emergency Audio", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "device_id": "alsa_input.pci-0000_00_1b.0.analog-stereo" + }, + "sync": 0, + "volume": 1.0 + }, + "current_program_scene": "Slides Primary 16:9", + "current_scene": "Slides Primary 16:9", + "current_transition": "Fade", + "modules": { + "output-timer": { + "autoStartRecordTimer": false, + "autoStartStreamTimer": false, + "recordTimerHours": 0, + "recordTimerMinutes": 0, + "recordTimerSeconds": 30, + "streamTimerHours": 0, + "streamTimerMinutes": 0, + "streamTimerSeconds": 30 + } + }, + "name": "{{ event.id }}", + "preview_locked": true, + "quick_transitions": [ + { + "duration": 300, + "hotkeys": [], + "id": 1, + "name": "Cut" + }, + { + "duration": 300, + "hotkeys": [], + "id": 2, + "name": "Fade" + } + ], + "scaling_enabled": false, + "scaling_level": 0, + "scaling_off_x": 0.0, + "scaling_off_y": 0.0, + "scene_order": [ + { + "name": "Camera Only" + }, + { + "name": "Slides Primary 16:9" + }, + { + "name": "Camera Primary 16:9" + }, + { + "name": "Slides Only 16:9" + }, + { + "name": "Slides Primary 4:3" + }, + { + "name": "Camera Primary 4:3" + }, + { + "name": "Slides Only 4:3" + }, + { + "name": "Blank" + } + ], + "sources": [ + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "image_source", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Background (blank)", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "file": "/opt/artwork/{{ event.id }}/blank.png", + "unload": true + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "OBSBasic.SelectScene": [ + { + "key": "OBS_KEY_F9" + } + ] + }, + "id": "scene", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Blank", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "id_counter": 1, + "items": [ + { + "align": 5, + "bounds": { + "x": 0.0, + "y": 0.0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 1, + "locked": true, + "name": "Background (blank)", + "pos": { + "x": 0.0, + "y": 0.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + } + ] + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "OBSBasic.SelectScene": [ + { + "key": "OBS_KEY_F7" + } + ] + }, + "id": "scene", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Slides Only 4:3", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "id_counter": 1, + "items": [ + { + "align": 5, + "bounds": { + "x": 1440.0, + "y": 1080.0 + }, + "bounds_align": 0, + "bounds_type": 1, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 1, + "locked": true, + "name": "Slides", + "pos": { + "x": 240.0, + "y": 0.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + } + ] + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "OBSBasic.SelectScene": [ + { + "key": "OBS_KEY_F3" + } + ] + }, + "id": "scene", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Slides Only 16:9", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "id_counter": 1, + "items": [ + { + "align": 5, + "bounds": { + "x": 1920.0, + "y": 1080.0 + }, + "bounds_align": 0, + "bounds_type": 1, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 1, + "locked": true, + "name": "Slides", + "pos": { + "x": 0.0, + "y": 0.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + } + ] + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "OBSBasic.SelectScene": [ + { + "key": "OBS_KEY_F10" + }, + { + "key": "OBS_KEY_F4" + }, + { + "key": "OBS_KEY_F8" + } + ] + }, + "id": "scene", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Camera Only", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "id_counter": 1, + "items": [ + { + "align": 5, + "bounds": { + "x": 1920.0, + "y": 1080.0 + }, + "bounds_align": 0, + "bounds_type": 3, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 1, + "locked": true, + "name": "Camera", + "pos": { + "x": 0.0, + "y": 0.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + } + ] + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "filters": [ + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "color_key_filter", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Color Key", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "key_color_type": "green", + "similarity": 1, + "smoothness": 1 + }, + "sync": 0, + "volume": 1.0 + } + ], + "flags": 0, + "hotkeys": {}, + "id": "image_source", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Background (side-by-side-43-reverse)", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "file": "/opt/artwork/{{ event.id }}/side-by-side-43-reverse.png", + "unload": true + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "OBSBasic.SelectScene": [ + { + "key": "OBS_KEY_F6" + } + ] + }, + "id": "scene", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Camera Primary 4:3", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "id_counter": 3, + "items": [ + { + "align": 5, + "bounds": { + "x": 1120.0, + "y": 1000.0 + }, + "bounds_align": 0, + "bounds_type": 3, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 3, + "locked": true, + "name": "Camera", + "pos": { + "x": 40.0, + "y": 40.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + }, + { + "align": 5, + "bounds": { + "x": 680.0, + "y": 510.0 + }, + "bounds_align": 0, + "bounds_type": 1, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 2, + "locked": true, + "name": "Slides", + "pos": { + "x": 1200.0, + "y": 530.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + }, + { + "align": 5, + "bounds": { + "x": 0.0, + "y": 0.0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 1, + "locked": true, + "name": "Background (side-by-side-43-reverse)", + "pos": { + "x": 0.0, + "y": 0.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + } + ] + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "filters": [ + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "color_key_filter", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Color Key", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "key_color_type": "green", + "similarity": 1, + "smoothness": 1 + }, + "sync": 0, + "volume": 1.0 + } + ], + "flags": 0, + "hotkeys": {}, + "id": "image_source", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Background (side-by-side-43)", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "file": "/opt/artwork/{{ event.id }}/side-by-side-43.png", + "unload": true + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "OBSBasic.SelectScene": [ + { + "key": "OBS_KEY_F5" + } + ] + }, + "id": "scene", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Slides Primary 4:3", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "id_counter": 3, + "items": [ + { + "align": 5, + "bounds": { + "x": 480.0, + "y": 420.0 + }, + "bounds_align": 0, + "bounds_type": 3, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 1, + "locked": true, + "name": "Camera", + "pos": { + "x": 1400.0, + "y": 620.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + }, + { + "align": 5, + "bounds": { + "x": 1320.0, + "y": 990.0 + }, + "bounds_align": 0, + "bounds_type": 1, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 2, + "locked": true, + "name": "Slides", + "pos": { + "x": 40.0, + "y": 40.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.5, + "y": 1.5 + }, + "scale_filter": "disable", + "visible": true + }, + { + "align": 5, + "bounds": { + "x": 0.0, + "y": 0.0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 3, + "locked": true, + "name": "Background (side-by-side-43)", + "pos": { + "x": 0.0, + "y": 0.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + } + ] + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "OBSBasic.SelectScene": [ + { + "key": "OBS_KEY_F1" + } + ] + }, + "id": "scene", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Slides Primary 16:9", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "id_counter": 7, + "items": [ + { + "align": 5, + "bounds": { + "x": 300.0, + "y": 420.0 + }, + "bounds_align": 0, + "bounds_type": 3, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 4, + "locked": true, + "name": "Camera", + "pos": { + "x": 1580.0, + "y": 620.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + }, + { + "align": 5, + "bounds": { + "x": 1501.0, + "y": 844.0 + }, + "bounds_align": 0, + "bounds_type": 1, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 2, + "locked": true, + "name": "Slides", + "pos": { + "x": 40.0, + "y": 40.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + }, + { + "align": 5, + "bounds": { + "x": 0.0, + "y": 0.0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 3, + "locked": true, + "name": "Background (side-by-side)", + "pos": { + "x": 0.0, + "y": 0.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + } + ] + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "v4l2_input", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Slides", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "buffering": true, + "device_id": "/dev/v4l/by-id/usb-VXIS_Inc_ACASIS-video-index0", + "framerate": 65566, + "input": 0, + "pixelformat": 842093913, + "resolution": 83886800 + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "filters": [ + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "color_key_filter", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Color Key", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "key_color_type": "green", + "similarity": 1, + "smoothness": 1 + }, + "sync": 0, + "volume": 1.0 + } + ], + "flags": 0, + "hotkeys": {}, + "id": "image_source", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Background (side-by-side)", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "file": "/opt/artwork/{{ event.id }}/side-by-side.png", + "unload": false + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "v4l2_input", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Camera", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "buffering": true, + "device_id": "/dev/v4l/by-id/usb-Creative_Labs_VF0470_Live__Cam_Notebook-video-index0", + "framerate": 65566, + "input": 0, + "pixelformat": 842093913, + "resolution": 41943520 + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "OBSBasic.SelectScene": [ + { + "key": "OBS_KEY_F2" + } + ] + }, + "id": "scene", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Camera Primary 16:9", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "id_counter": 3, + "items": [ + { + "align": 5, + "bounds": { + "x": 1120.0, + "y": 1000.0 + }, + "bounds_align": 0, + "bounds_type": 3, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 2, + "locked": true, + "name": "Camera", + "pos": { + "x": 40.0, + "y": 40.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + }, + { + "align": 5, + "bounds": { + "x": 680.0, + "y": 383.0 + }, + "bounds_align": 0, + "bounds_type": 1, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 3, + "locked": true, + "name": "Slides", + "pos": { + "x": 1200.0, + "y": 657.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + }, + { + "align": 5, + "bounds": { + "x": 0.0, + "y": 0.0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "id": 1, + "locked": true, + "name": "Background (side-by-side-reverse)", + "pos": { + "x": 0.0, + "y": 0.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "scale_filter": "disable", + "visible": true + } + ] + }, + "sync": 0, + "volume": 1.0 + }, + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "filters": [ + { + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "color_key_filter", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Color Key", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "key_color_type": "green", + "similarity": 1, + "smoothness": 1 + }, + "sync": 0, + "volume": 1.0 + } + ], + "flags": 0, + "hotkeys": {}, + "id": "image_source", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Background (side-by-side-reverse)", + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "file": "/opt/artwork/{{ event.id }}/side-by-side-reverse.png", + "unload": false + }, + "sync": 0, + "volume": 1.0 + } + ], + "transition_duration": 300, + "transitions": [] +} diff --git a/ansible/roles/recorder/templates/obs-studio/global.ini b/ansible/roles/recorder/templates/obs-studio/global.ini new file mode 100644 index 0000000..5d0192e --- /dev/null +++ b/ansible/roles/recorder/templates/obs-studio/global.ini @@ -0,0 +1,27 @@ +[General] +Pre19Defaults=false +Pre21Defaults=false +FirstRun=true +LastVersion=352321538 + +[PropertiesWindow] +cx=720 +cy=580 + +[BasicWindow] +geometry=AdnQywACAAAAAABDAAAAGwAAA/8AAAL/AAAAWAAAAEYAAAOuAAACwgAAAAACAAAABAA= +DockState=AAAA/wAAAAD9AAAAAQAAAAMAAAO9AAAA+/wBAAAABfsAAAAUAHMAYwBlAG4AZQBzAEQAbwBjAGsBAAAAAAAAANsAAACoAP////sAAAAWAHMAbwB1AHIAYwBlAHMARABvAGMAawEAAADhAAAA3AAAAKgA////+wAAABIAbQBpAHgAZQByAEQAbwBjAGsBAAABwwAAASoAAADkAP////sAAAAeAHQAcgBhAG4AcwBpAHQAaQBvAG4AcwBEAG8AYwBrAAAAAlgAAAC/AAAAggD////7AAAAGABjAG8AbgB0AHIAbwBsAHMARABvAGMAawEAAALzAAAAygAAAJsA////AAADvQAAAZkAAAAEAAAABAAAAAgAAAAI/AAAAAA= +PreviewEnabled=true +AlwaysOnTop=false +SceneDuplicationMode=true +SwapScenesMode=true +EditPropertiesMode=false +PreviewProgramMode=false +DocksLocked=true +ShowListboxToolbars=false + +[Basic] +SceneCollection={{ event.id }} +SceneCollectionFile={{ event.id }} +Profile={{ record_profile }} +ProfileDir={{ record_profile }}