From f53dea0ae9dc45b7f2cfcb83bfabcf0114f2d449 Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 12 May 2024 18:00:25 +0200 Subject: [PATCH] update docs --- docs/reference/configuration.md | 106 ++++++++++++++++++++++++++++++++ docs/reference/openapi.json | 2 +- docs/setup/admincenter.md | 45 +------------- mkdocs.yml | 1 + 4 files changed, 109 insertions(+), 45 deletions(-) create mode 100644 docs/reference/configuration.md diff --git a/docs/reference/configuration.md b/docs/reference/configuration.md new file mode 100644 index 0000000..943f5c3 --- /dev/null +++ b/docs/reference/configuration.md @@ -0,0 +1,106 @@ + +# Configuration + +The configuration is divided in several categories. All configuration items have a description, following information give a higher level overview. + +## Common + +Some very basic settings. + +## Actions and Trigger + +The photobooth app offers four different modes to capture currently: + +- Single images, +- Collages, +- Animations and +- Videos. + +Each action can be triggered by one or more of the following triggers: + +- touch buttons on the main screen of the webapp (frontpage), +- GPIO pins on a Raspberry Pi, +- keyboard input or +- via another custom app that calls the [Rest-API](./api.md). + +### Actions + +Create one or more actions for every mode. Example: Create two actions in the category single image with different themed frames that overlay the captured image. + +#### Single Images + +Just one still captured by the camera. You can apply a frame and add texts to the final image as well as a color-filter similar like Instagram. + +#### Collages + +One or more images captured by the camera, stitched together in one final image. It's also possible to use predefined images that are embedded in every collage instead a capture. You can apply a frame and add texts to the final image as well as a color-filter similar like Instagram. + +#### Animations (GIF) + +One or more images captured by the camera, sequenced in a GIF animation. The result is not a video! It's also possible to use predefined images that are embedded in every animation instead a capture. You can apply a frame and add texts to the final image as well as a color-filter similar like Instagram. + +#### Videos + +Captures a live video. Audio is not supported currently. + +### Trigger + +#### Touch buttons on the screen + +To display a trigger button on the main screen of the app, define in the trigger section of an action a title and/or an icon. +The icon can be any material design icon. + +#### GPIO + +To trigger an action via GPIO define the pin and choose when to trigger the action (on press, on release or after hold). + +!!! info + Enable the GPIO service in admin dashboard -> configuration -> hardwareinput/output! + +!!! warning + Each pin can be used only one time! Check the log for errors if it does not work as expected. + + [See the GPIO section how to wire the buttons](../setup/gpio.md). + +#### Keyboard + +To trigger an action via keypress define the keycode. If you're unsure what keycode to use, open the browser console and press the key to check for the keycode. The keycodes are captured by the browser. + +!!! info + Enable the keyboard processing in admin dashboard -> configuration -> hardwareinput/output! + +## Printer + +TODO + +## Sharing + +TODO + +## Filetransfer + +TODO + +## Mediaprocessing + +TODO + +## UI Settings + +TODO + +## Backends + +TODO + +## Hardware Input / Output + +TODO + +## Misc + +TODO + +## Questions remain? + +Reach out in a [discussion](https://github.com/photobooth-app/photobooth-app/discussions). diff --git a/docs/reference/openapi.json b/docs/reference/openapi.json index ac6f2c2..7cdb13e 100644 --- a/docs/reference/openapi.json +++ b/docs/reference/openapi.json @@ -1 +1 @@ -{"openapi": "3.1.0", "info": {"title": "Photobooth App API", "description": "\nPhotobooth App \ud83d\ude80\n\nThe photobooth app is written in Python and coming along with a modern Vue frontend.\n\nFollowing api is provided by the app.\n\n## API may change any time.\n\n", "version": "2.0.0"}, "paths": {"/api/aquisition/stream.mjpg": {"get": {"tags": ["aquisition"], "summary": "Video Stream", "description": "endpoint to stream live video to clients", "operationId": "video_stream_api_aquisition_stream_mjpg_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/aquisition/still": {"get": {"tags": ["aquisition"], "summary": "Api Still Get", "description": "Aquire image and serve to download\n\nRaises:\n HTTPException: Image could not be aquired from backend\n\nReturns:\n Response: Returns jpeg image to download", "operationId": "api_still_get_api_aquisition_still_get", "responses": {"200": {"description": "Successful Response", "content": {"image/jpeg": {}}}}}}, "/api/aquisition/mode/{mode}": {"get": {"tags": ["aquisition"], "summary": "Api Cmd Aquisition Capturemode Get", "description": "set backends to preview or capture mode (usually automatically switched as needed by processingservice)", "operationId": "api_cmd_aquisition_capturemode_get_api_aquisition_mode__mode__get", "parameters": [{"name": "mode", "in": "path", "required": true, "schema": {"type": "string", "title": "Mode"}}], "responses": {"202": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/config/ui": {"get": {"tags": ["config"], "summary": "Index", "description": "get part of the config dedicated for UI only. UI requests this on startup", "operationId": "index_api_config_ui_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/debug/log/latest": {"get": {"tags": ["logs"], "summary": "Get Log Latest", "description": "provide latest logfile to download\nTODO Handle exception if file not exists\n\nReturns:\n _type_: _description_", "operationId": "get_log_latest_api_debug_log_latest_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/mediacollection/getitems": {"get": {"tags": ["mediacollection"], "summary": "Api Getitems", "operationId": "api_getitems_api_mediacollection_getitems_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/mediacollection/delete": {"get": {"tags": ["mediacollection"], "summary": "Api Gallery Delete", "operationId": "api_gallery_delete_api_mediacollection_delete_get", "parameters": [{"name": "image_id", "in": "query", "required": true, "schema": {"type": "string", "title": "Image Id"}}], "responses": {"204": {"description": "Successful Response"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/mediacollection/delete_all": {"get": {"tags": ["mediacollection"], "summary": "Api Gallery Delete All", "description": "Warning: deletes all files permanently without any further confirmation\n\nRaises:\n HTTPException: _description_", "operationId": "api_gallery_delete_all_api_mediacollection_delete_all_get", "responses": {"204": {"description": "Successful Response"}}}}, "/api/mediaprocessing/preview/{mediaitem_id}/{filter}": {"get": {"tags": ["mediaprocessing"], "summary": "Api Get Preview Image Filtered", "operationId": "api_get_preview_image_filtered_api_mediaprocessing_preview__mediaitem_id___filter__get", "parameters": [{"name": "mediaitem_id", "in": "path", "required": true, "schema": {"title": "Mediaitem Id"}}, {"name": "filter", "in": "path", "required": true, "schema": {"title": "Filter"}}], "responses": {"200": {"description": "Successful Response"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/mediaprocessing/applyfilter/{mediaitem_id}/{filter}": {"get": {"tags": ["mediaprocessing"], "summary": "Api Get Applyfilter", "operationId": "api_get_applyfilter_api_mediaprocessing_applyfilter__mediaitem_id___filter__get", "parameters": [{"name": "mediaitem_id", "in": "path", "required": true, "schema": {"title": "Mediaitem Id"}}, {"name": "filter", "in": "path", "required": true, "schema": {"type": "string", "title": "Filter"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/print/latest": {"get": {"tags": ["print"], "summary": "Api Print Latest", "operationId": "api_print_latest_api_print_latest_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/print/item/{id}": {"get": {"tags": ["print"], "summary": "Api Print Item Id", "operationId": "api_print_item_id_api_print_item__id__get", "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "string", "title": "Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/processing/chose/1pic": {"get": {"tags": ["processing"], "summary": "Api Chose 1Pic Get", "operationId": "api_chose_1pic_get_api_processing_chose_1pic_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/processing/chose/collage": {"get": {"tags": ["processing"], "summary": "Api Chose Collage Get", "operationId": "api_chose_collage_get_api_processing_chose_collage_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/processing/chose/animation": {"get": {"tags": ["processing"], "summary": "Api Chose Animation Get", "operationId": "api_chose_animation_get_api_processing_chose_animation_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/processing/chose/video": {"get": {"tags": ["processing"], "summary": "Api Chose Video Get", "operationId": "api_chose_video_get_api_processing_chose_video_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/processing/cmd/confirm": {"get": {"tags": ["processing"], "summary": "Api Cmd Confirm Get", "operationId": "api_cmd_confirm_get_api_processing_cmd_confirm_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/processing/cmd/reject": {"get": {"tags": ["processing"], "summary": "Api Cmd Reject Get", "operationId": "api_cmd_reject_get_api_processing_cmd_reject_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/processing/cmd/stop": {"get": {"tags": ["processing"], "summary": "Api Cmd Stop Get", "operationId": "api_cmd_stop_get_api_processing_cmd_stop_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/processing/cmd/abort": {"get": {"tags": ["processing"], "summary": "Api Cmd Abort Get", "operationId": "api_cmd_abort_get_api_processing_cmd_abort_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/sse": {"get": {"tags": ["home"], "summary": "Subscribe", "description": "Eventstream to feed clients with server generated events and data", "operationId": "subscribe_api_sse_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/system/{action}/{param}": {"get": {"tags": ["system"], "summary": "Api Cmd", "operationId": "api_cmd_api_system__action___param__get", "parameters": [{"name": "action", "in": "path", "required": true, "schema": {"title": "Action"}}, {"name": "param", "in": "path", "required": true, "schema": {"title": "Param"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/config/schema": {"get": {"tags": ["admin", "config"], "summary": "Api Get Config Schema", "description": "Get schema to build the client UI\n:param str schema_type: default or dereferenced.", "operationId": "api_get_config_schema_api_admin_config_schema_get", "parameters": [{"name": "schema_type", "in": "query", "required": false, "schema": {"type": "string", "default": "default", "title": "Schema Type"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/config/reset": {"get": {"tags": ["admin", "config"], "summary": "Api Reset Config", "description": "Reset config, deleting config.json file", "operationId": "api_reset_config_api_admin_config_reset_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/admin/config/currentActive": {"get": {"tags": ["admin", "config"], "summary": "Api Get Config Current Active", "description": "returns currently cached and active settings", "operationId": "api_get_config_current_active_api_admin_config_currentActive_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/admin/config/current": {"get": {"tags": ["admin", "config"], "summary": "Api Get Config Current", "description": "read settings from drive and return", "operationId": "api_get_config_current_api_admin_config_current_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}, "post": {"tags": ["admin", "config"], "summary": "Api Post Config Current", "operationId": "api_post_config_current_api_admin_config_current_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppConfig"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/files/list/{dir}": {"get": {"tags": ["admin", "files"], "summary": "Get List", "operationId": "get_list_api_admin_files_list__dir__get", "parameters": [{"name": "dir", "in": "path", "required": true, "schema": {"type": "string", "title": "Dir"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/files/file/{file}": {"get": {"tags": ["admin", "files"], "summary": "Get File", "operationId": "get_file_api_admin_files_file__file__get", "parameters": [{"name": "file", "in": "path", "required": true, "schema": {"type": "string", "title": "File"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/files/file/upload": {"post": {"tags": ["admin", "files"], "summary": "Create Upload File", "operationId": "create_upload_file_api_admin_files_file_upload_post", "requestBody": {"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/Body_create_upload_file_api_admin_files_file_upload_post"}}}, "required": true}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/files/folder/new": {"post": {"tags": ["admin", "files"], "summary": "Post Folder New", "description": "need to provide full path starting from CWD.", "operationId": "post_folder_new_api_admin_files_folder_new_post", "requestBody": {"content": {"application/json": {"schema": {"type": "string", "title": "New Folder Name"}}}, "required": true}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/files/delete": {"post": {"tags": ["admin", "files"], "summary": "Post Delete", "operationId": "post_delete_api_admin_files_delete_post", "requestBody": {"content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/PathListItem"}, "type": "array", "title": "Selected Paths"}}}}, "responses": {"204": {"description": "Successful Response"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/files/zip": {"post": {"tags": ["admin", "files"], "summary": "Post Zip", "operationId": "post_zip_api_admin_files_zip_post", "requestBody": {"content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/PathListItem"}, "type": "array", "title": "Selected Paths"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/": {"get": {"tags": ["static"], "summary": "Index", "description": "return homepage of booth", "operationId": "index__get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/private.css": {"get": {"tags": ["static"], "summary": "Ui Private Css", "description": "if private.css exists return the file content, otherwise send empty response to avoid 404", "operationId": "ui_private_css_private_css_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}}, "components": {"schemas": {"AnimationMergeDefinition": {"properties": {"duration": {"type": "integer", "minimum": 0.0, "title": "Duration", "default": 2000}, "predefined_image": {"type": "string", "title": "Predefined Image", "default": ""}, "filter": {"allOf": [{"$ref": "#/components/schemas/EnumPilgramFilter"}], "default": "original"}}, "type": "object", "title": "AnimationMergeDefinition"}, "AppConfig": {"properties": {"common": {"allOf": [{"$ref": "#/components/schemas/GroupCommon"}], "default": {"countdown_capture_first": 2.0, "countdown_capture_second_following": 1.0, "countdown_camera_capture_offset": 0.2, "collage_automatic_capture_continue": true, "collage_approve_autoconfirm_timeout": 15.0, "gallery_show_individual_images": false, "logging_level": "DEBUG", "webserver_bind_ip": "0.0.0.0", "webserver_port": 8000}}, "sharing": {"allOf": [{"$ref": "#/components/schemas/GroupSharing"}], "default": {"shareservice_enabled": false, "shareservice_url": "https://photobooth-app.org/extras/shareservice-landing/", "shareservice_apikey": "changedefault!", "shareservice_share_original": false, "share_custom_qr_url": "http://localhost/media/processed/full/{filename}"}}, "filetransfer": {"allOf": [{"$ref": "#/components/schemas/GroupFileTransfer"}], "default": {"enabled": false, "target_folder_name": "photobooth"}}, "mediaprocessing": {"allOf": [{"$ref": "#/components/schemas/GroupMediaprocessing"}], "default": {"HIRES_STILL_QUALITY": 90, "LIVEPREVIEW_QUALITY": 80, "THUMBNAIL_STILL_QUALITY": 60, "PREVIEW_STILL_QUALITY": 75, "FULL_STILL_WIDTH": 1500, "PREVIEW_STILL_WIDTH": 1200, "THUMBNAIL_STILL_WIDTH": 400, "removechromakey_enable": false, "removechromakey_keycolor": 110, "removechromakey_tolerance": 10}}, "mediaprocessing_pipeline_singleimage": {"allOf": [{"$ref": "#/components/schemas/GroupMediaprocessingPipelineSingleImage"}], "default": {"filter": "original", "fill_background_enable": false, "fill_background_color": "#00f", "img_background_enable": false, "img_background_file": "backgrounds/pink-7761356_1920.jpg", "img_frame_enable": true, "img_frame_file": "frames/pixabay-holidays-1798208_1920.png", "texts_enable": true, "texts": [{"color": "#ccc", "font": "fonts/Roboto-Bold.ttf", "font_size": 40, "pos_x": 100, "pos_y": 1300, "rotate": 0, "text": "Made with the python photobooth-app"}]}}, "mediaprocessing_pipeline_collage": {"allOf": [{"$ref": "#/components/schemas/GroupMediaprocessingPipelineCollage"}], "default": {"capture_fill_background_enable": false, "capture_fill_background_color": "#00f", "capture_img_background_enable": false, "capture_img_background_file": "backgrounds/pink-7761356_1920.jpg", "canvas_width": 1920, "canvas_height": 1280, "canvas_merge_definition": [{"filter": "earlybird", "height": 725, "pos_x": 160, "pos_y": 220, "predefined_image": "", "rotate": 0, "width": 510}, {"filter": "original", "height": 725, "pos_x": 705, "pos_y": 66, "predefined_image": "predefined_images/photobooth-collage-predefined-image.png", "rotate": 0, "width": 510}, {"filter": "reyes", "height": 725, "pos_x": 1245, "pos_y": 220, "predefined_image": "", "rotate": 0, "width": 510}], "canvas_fill_background_enable": false, "canvas_fill_background_color": "#008000", "canvas_img_background_enable": false, "canvas_img_background_file": "backgrounds/pink-7761356_1920.jpg", "canvas_img_front_enable": true, "canvas_img_front_file": "frames/pixabay-poster-2871536_1920.png", "canvas_texts_enable": true, "canvas_texts": [{"color": "#333", "font": "fonts/Roboto-Bold.ttf", "font_size": 40, "pos_x": 200, "pos_y": 1100, "rotate": 1, "text": "Have a nice day :)"}]}}, "mediaprocessing_pipeline_animation": {"allOf": [{"$ref": "#/components/schemas/GroupMediaprocessingPipelineAnimation"}], "default": {"canvas_width": 1500, "canvas_height": 900, "sequence_merge_definition": [{"duration": 2000, "filter": "crema", "predefined_image": ""}, {"duration": 2000, "filter": "inkwell", "predefined_image": ""}, {"duration": 4000, "filter": "original", "predefined_image": "predefined_images/photobooth-gif-animation-predefined-image.png"}]}}, "mediaprocessing_pipeline_printing": {"allOf": [{"$ref": "#/components/schemas/GroupMediaprocessingPipelinePrint"}], "default": {}}, "uisettings": {"allOf": [{"$ref": "#/components/schemas/GroupUiSettings"}], "default": {"PRIMARY_COLOR": "#196cb0", "SECONDARY_COLOR": "#b8124f", "show_takepic_on_frontpage": true, "show_takecollage_on_frontpage": true, "show_takeanimation_on_frontpage": true, "show_takevideo_on_frontpage": true, "show_gallery_on_frontpage": true, "show_admin_on_frontpage": true, "show_automatic_slideshow_timeout": 300, "livestream_mirror_effect": true, "FRONTPAGE_TEXT": "
Hey!
Let's take some pictures!
\ud83d\udcf7\ud83d\udc95
", "TAKEPIC_MSG_TIME": 0.5, "TAKEPIC_MSG_TEXT": "\ud83d\ude03", "AUTOCLOSE_NEW_ITEM_ARRIVED": 30, "GALLERY_EMPTY_MSG": "
Empty, Zero, Nada! \ud83e\udd37\u200d\u2642\ufe0f
Let's take some pictures!
\ud83d\udcf7\ud83d\udc95
", "gallery_show_qrcode": true, "gallery_show_filter": true, "gallery_filter_userselectable": ["original", "_1977", "aden", "ashby", "amaro", "brannan", "brooklyn", "charmes", "clarendon", "crema", "dogpatch", "earlybird", "gingham", "ginza", "hefe", "helena", "hudson", "inkwell", "juno", "kelvin", "lark", "lofi", "ludwig", "maven", "mayfair", "moon", "nashville", "perpetua", "poprocket", "reyes", "rise", "sierra", "skyline", "slumber", "stinson", "sutro", "toaster", "valencia", "walden", "willow", "xpro2"], "gallery_show_download": true, "gallery_show_delete": true, "gallery_show_print": true}}, "backends": {"allOf": [{"$ref": "#/components/schemas/GroupBackends"}], "default": {"MAIN_BACKEND": "VirtualCamera", "LIVE_BACKEND": "Disabled", "LIVEPREVIEW_ENABLED": true, "LIVEPREVIEW_FRAMERATE": 15, "retry_capture": 3, "gphoto2_capture_target": "", "gphoto2_disable_viewfinder_before_capture": true, "gphoto2_iso_liveview": "", "gphoto2_iso_capture": "", "gphoto2_shutter_speed_liveview": "", "gphoto2_shutter_speed_capture": "", "cv2_CAM_RESOLUTION_WIDTH": 10000, "cv2_CAM_RESOLUTION_HEIGHT": 10000, "cv2_device_index": 0, "cv2_CAMERA_TRANSFORM_HFLIP": false, "cv2_CAMERA_TRANSFORM_VFLIP": false, "v4l_CAM_RESOLUTION_WIDTH": 10000, "v4l_CAM_RESOLUTION_HEIGHT": 10000, "v4l_device_index": 0, "digicamcontrol_base_url": "http://127.0.0.1:5513", "picamera2_CAPTURE_CAM_RESOLUTION_WIDTH": 1280, "picamera2_CAPTURE_CAM_RESOLUTION_HEIGHT": 720, "picamera2_PREVIEW_CAM_RESOLUTION_WIDTH": 1280, "picamera2_PREVIEW_CAM_RESOLUTION_HEIGHT": 720, "picamera2_LIVEVIEW_RESOLUTION_WIDTH": 1280, "picamera2_LIVEVIEW_RESOLUTION_HEIGHT": 720, "picamera2_CAMERA_TRANSFORM_HFLIP": false, "picamera2_CAMERA_TRANSFORM_VFLIP": false, "picamera2_AE_EXPOSURE_MODE": 1, "picamera2_videostream_quality": "MEDIUM"}}, "hardwareinputoutput": {"allOf": [{"$ref": "#/components/schemas/GroupHardwareInputOutput"}], "default": {"keyboard_input_enabled": false, "keyboard_input_keycode_takepic": "i", "keyboard_input_keycode_takecollage": "c", "keyboard_input_keycode_takeanimation": "g", "keyboard_input_keycode_takevideo": "v", "keyboard_input_keycode_print_recent_item": "p", "wled_enabled": false, "wled_serial_port": "", "gpio_enabled": false, "gpio_pin_shutdown": 17, "gpio_pin_reboot": 18, "gpio_pin_take1pic": 27, "gpio_pin_collage": 22, "gpio_pin_animation": 24, "gpio_pin_video": 26, "gpio_pin_print_recent_item": 23, "printing_enabled": false, "printing_command": "mspaint /p {filename}", "printing_blocked_time": 20}}, "misc": {"allOf": [{"$ref": "#/components/schemas/GroupMisc"}], "default": {"video_duration": 5, "video_bitrate": 3000, "video_framerate": 25}}}, "type": "object", "title": "AppConfig", "description": "AppConfig class glueing all together\n\nIn the case where a value is specified for the same Settings field in multiple ways, the selected value is determined as follows\n(in descending order of priority):\n\n1 Arguments passed to the Settings class initialiser.\n2 Environment variables, e.g. my_prefix_special_function as described above.\n3 Variables loaded from a dotenv (.env) file.\n4 Variables loaded from the secrets directory.\n5 The default field values for the Settings model."}, "BackendsLive": {"type": "string", "enum": ["Disabled", "VirtualCamera", "WebcamCv2"], "title": "BackendsLive", "description": "Secondary backend used for live streaming only. Useful to stream from webcam if DSLR camera has no livestream capability."}, "BackendsMain": {"type": "string", "enum": ["VirtualCamera", "WebcamCv2", "Digicamcontrol"], "title": "BackendsMain", "description": "Main backend to use for high quality still captures. Also used for livepreview if backend is capable of."}, "Body_create_upload_file_api_admin_files_file_upload_post": {"properties": {"upload_target_folder": {"type": "string", "title": "Upload Target Folder"}, "uploaded_files": {"items": {"type": "string", "format": "binary"}, "type": "array", "title": "Uploaded Files"}}, "type": "object", "required": ["upload_target_folder", "uploaded_files"], "title": "Body_create_upload_file_api_admin_files_file_upload_post"}, "CollageMergeDefinition": {"properties": {"pos_x": {"type": "integer", "minimum": 0.0, "title": "Pos X", "default": 50}, "pos_y": {"type": "integer", "minimum": 0.0, "title": "Pos Y", "default": 50}, "width": {"type": "integer", "minimum": 0.0, "title": "Width", "default": 600}, "height": {"type": "integer", "minimum": 0.0, "title": "Height", "default": 600}, "rotate": {"type": "integer", "title": "Rotate", "default": 0}, "predefined_image": {"type": "string", "title": "Predefined Image", "default": ""}, "filter": {"allOf": [{"$ref": "#/components/schemas/EnumPilgramFilter"}], "default": "original"}}, "type": "object", "title": "CollageMergeDefinition"}, "EnumPilgramFilter": {"type": "string", "enum": ["original", "_1977", "aden", "ashby", "amaro", "brannan", "brooklyn", "charmes", "clarendon", "crema", "dogpatch", "earlybird", "gingham", "ginza", "hefe", "helena", "hudson", "inkwell", "juno", "kelvin", "lark", "lofi", "ludwig", "maven", "mayfair", "moon", "nashville", "perpetua", "poprocket", "reyes", "rise", "sierra", "skyline", "slumber", "stinson", "sutro", "toaster", "valencia", "walden", "willow", "xpro2"], "title": "EnumPilgramFilter", "description": "enum to choose image filter from, pilgram filter"}, "GroupBackends": {"properties": {"MAIN_BACKEND": {"allOf": [{"$ref": "#/components/schemas/BackendsMain"}], "title": "Main Backend", "description": "Main backend to use for high quality still captures. Also used for livepreview if backend is capable of.", "default": "VirtualCamera"}, "LIVE_BACKEND": {"allOf": [{"$ref": "#/components/schemas/BackendsLive"}], "title": "Live Backend", "description": "Secondary backend used for live streaming only. Useful to stream from webcam if DSLR camera has no livestream capability.", "default": "Disabled"}, "LIVEPREVIEW_ENABLED": {"type": "boolean", "title": "Livepreview Enabled", "description": "Enable livestream (if possible)", "default": true}, "LIVEPREVIEW_FRAMERATE": {"type": "integer", "maximum": 30.0, "minimum": 5.0, "title": "Livepreview Framerate", "description": "Reduce the framerate to save cpu/gpu on device displaying the live preview", "default": 15, "ui_component": "QSlider"}, "retry_capture": {"type": "integer", "maximum": 5.0, "minimum": 1.0, "title": "Retry Capture", "description": "Number of attempts to gather a picture from backend.", "default": 3}, "gphoto2_capture_target": {"type": "string", "title": "Gphoto2 Capture Target", "description": "Set capture target (examples: 'Internal RAM', 'Memory card'). To keep images, capture to a disk target. Empty means default of camera (mostly RAM).", "default": ""}, "gphoto2_disable_viewfinder_before_capture": {"type": "boolean", "title": "Gphoto2 Disable Viewfinder Before Capture", "description": "Disable viewfinder before capture might speed up following capture autofocus. Might not work with every camera.", "default": true}, "gphoto2_iso_liveview": {"type": "string", "title": "Gphoto2 Iso Liveview", "description": "Sets the ISO for when the photobooth is in live preview modus. Very useful, when Camera does not support Exposure Simulation, and an external Flash is used. Only works when the camera is in manual. (Example Values: Auto, 100, 200, ...)", "default": ""}, "gphoto2_iso_capture": {"type": "string", "title": "Gphoto2 Iso Capture", "description": "Sets the ISO for when the photobooth captures a photo. Very useful, when Camera does not support Exposure Simulation, and an external Flash is used. Only works when the camera is in manual. (Example Values: Auto, 100, 200, ...)", "default": ""}, "gphoto2_shutter_speed_liveview": {"type": "string", "title": "Gphoto2 Shutter Speed Liveview", "description": "Sets the shutter speed for the camera during the photobooth's live preview mode. Very useful, when Camera does not support Exposure Simulation, and an external Flash is used. This setting is effective only when the camera is in manual mode. (Example Values: 1, 1/5, 1/20, 1/30, 1/60, 1/1000, 1/4000, ...) Choose a very high default shutter speed in combination with Auto iso to emulate auto exposure. ", "default": ""}, "gphoto2_shutter_speed_capture": {"type": "string", "title": "Gphoto2 Shutter Speed Capture", "description": "Configures the shutter speed for the camera at the time of capturing a photo in the photobooth. Very useful, when Camera does not support Exposure Simulation, and an external Flash is used. Operational only in manual mode. (Example Values: 1/60, 1/320, 1/1000, 1/2000, 1/4000, ...)", "default": ""}, "cv2_CAM_RESOLUTION_WIDTH": {"type": "integer", "title": "Cv2 Cam Resolution Width", "description": "still photo camera resolution width to opencv2 backend", "default": 10000}, "cv2_CAM_RESOLUTION_HEIGHT": {"type": "integer", "title": "Cv2 Cam Resolution Height", "description": "still photo camera resolution height to opencv2 backend", "default": 10000}, "cv2_device_index": {"type": "integer", "title": "Cv2 Device Index", "description": "Device index of webcam opened in cv2 backend", "default": 0}, "cv2_CAMERA_TRANSFORM_HFLIP": {"type": "boolean", "title": "Cv2 Camera Transform Hflip", "description": "Apply horizontal flip to image source to opencv2 backend", "default": false}, "cv2_CAMERA_TRANSFORM_VFLIP": {"type": "boolean", "title": "Cv2 Camera Transform Vflip", "description": "Apply vertical flip to image source to opencv2 backend", "default": false}, "v4l_CAM_RESOLUTION_WIDTH": {"type": "integer", "title": "V4L Cam Resolution Width", "description": "still photo camera resolution width on supported backends", "default": 10000}, "v4l_CAM_RESOLUTION_HEIGHT": {"type": "integer", "title": "V4L Cam Resolution Height", "description": "still photo camera resolution height on supported backends", "default": 10000}, "v4l_device_index": {"type": "integer", "title": "V4L Device Index", "description": "Device index of webcam opened in v4l backend", "default": 0}, "digicamcontrol_base_url": {"type": "string", "title": "Digicamcontrol Base Url", "description": "Base URL used to connect to the host running the digicamcontrol software. Usually photobooth-app and digicamcontrol are on the same computer and no adjustmend needed.", "default": "http://127.0.0.1:5513"}, "picamera2_CAPTURE_CAM_RESOLUTION_WIDTH": {"type": "integer", "title": "Picamera2 Capture Cam Resolution Width", "description": "camera resolution width to capture high resolution photo", "default": 1280}, "picamera2_CAPTURE_CAM_RESOLUTION_HEIGHT": {"type": "integer", "title": "Picamera2 Capture Cam Resolution Height", "description": "camera resolution height to capture high resolution photo", "default": 720}, "picamera2_PREVIEW_CAM_RESOLUTION_WIDTH": {"type": "integer", "maximum": 3500.0, "minimum": 500.0, "title": "Picamera2 Preview Cam Resolution Width", "description": "camera resolution width to capture live video", "default": 1280}, "picamera2_PREVIEW_CAM_RESOLUTION_HEIGHT": {"type": "integer", "maximum": 2500.0, "minimum": 500.0, "title": "Picamera2 Preview Cam Resolution Height", "description": "camera resolution height to capture live video", "default": 720}, "picamera2_LIVEVIEW_RESOLUTION_WIDTH": {"type": "integer", "maximum": 3500.0, "minimum": 500.0, "title": "Picamera2 Liveview Resolution Width", "description": "actual resolution width for liveview stream", "default": 1280}, "picamera2_LIVEVIEW_RESOLUTION_HEIGHT": {"type": "integer", "maximum": 2500.0, "minimum": 500.0, "title": "Picamera2 Liveview Resolution Height", "description": "actual resolution height for liveview stream", "default": 720}, "picamera2_CAMERA_TRANSFORM_HFLIP": {"type": "boolean", "title": "Picamera2 Camera Transform Hflip", "description": "Apply horizontal flip to image source to picamera2 backend", "default": false}, "picamera2_CAMERA_TRANSFORM_VFLIP": {"type": "boolean", "title": "Picamera2 Camera Transform Vflip", "description": "Apply vertical flip to image source to picamera2 backend", "default": false}, "picamera2_AE_EXPOSURE_MODE": {"type": "integer", "maximum": 4.0, "minimum": 0.0, "title": "Picamera2 Ae Exposure Mode", "description": "Usually 0=normal exposure, 1=short, 2=long, 3=custom. Not all necessarily supported by camera!", "default": 1}, "picamera2_videostream_quality": {"type": "string", "enum": ["VERY_LOW", "LOW", "MEDIUM", "HIGH", "VERY_HIGH"], "title": "Picamera2 Videostream Quality", "description": "Lower quality results in less data to be transferred and may reduce load on devices.", "default": "MEDIUM"}}, "type": "object", "title": "Camera Backend Config", "description": "Choose backends for still images/high quality images captured on main backend.\nIf the livepreview is enabled, the video is captured from live backend (if configured)\nor main backend."}, "GroupCommon": {"properties": {"countdown_capture_first": {"type": "number", "multipleOf": 0.1, "maximum": 20.0, "minimum": 0.0, "title": "Countdown Capture First", "description": "Countdown in seconds, started when user start a capture process", "default": 2.0}, "countdown_capture_second_following": {"type": "number", "multipleOf": 0.1, "maximum": 20.0, "minimum": 0.0, "title": "Countdown Capture Second Following", "description": "Countdown in seconds, used for second and following captures for collages", "default": 1.0}, "countdown_camera_capture_offset": {"type": "number", "multipleOf": 0.05, "maximum": 20.0, "minimum": 0.0, "title": "Countdown Camera Capture Offset", "description": "Trigger camera capture by offset earlier (in seconds). 0 trigger exactly when countdown is 0. Use to compensate for delay in camera processing for better UX.", "default": 0.2}, "collage_automatic_capture_continue": {"type": "boolean", "title": "Collage Automatic Capture Continue", "description": "Automatically continue with second and following images to capture for collage. No user interaction in between.", "default": true}, "collage_approve_autoconfirm_timeout": {"type": "number", "title": "Collage Approve Autoconfirm Timeout", "description": "If user is required to approve collage captures, after this timeout, the job continues and user confirmation is assumed.", "default": 15.0}, "gallery_show_individual_images": {"type": "boolean", "title": "Gallery Show Individual Images", "description": "Show individual images of collages/animations in the gallery. Hidden images are still stored in the data folder. (Note: changing this setting will not change visibility of already captured images).", "default": false}, "logging_level": {"type": "string", "enum": ["DEBUG", "INFO", "WARNING", "ERROR"], "title": "Logging Level", "description": "Log verbosity. File is writte to disc, and latest log is displayed also in UI.", "default": "DEBUG"}, "webserver_bind_ip": {"type": "string", "title": "Webserver Bind Ip", "description": "IP/Hostname to bind the webserver to. 0.0.0.0 means bind to all IP adresses of host.", "default": "0.0.0.0"}, "webserver_port": {"type": "integer", "title": "Webserver Port", "description": "Port to serve the photobooth website. Ensure the port is available. Ports below 1024 need root!", "default": 8000}}, "type": "object", "title": "Common Config", "description": "Common config for photobooth."}, "GroupFileTransfer": {"properties": {"enabled": {"type": "boolean", "title": "Enabled", "description": "Enable the automatic file transfer to USB service. Files are copied when the USB drive is inserted.", "default": false}, "target_folder_name": {"type": "string", "title": "Target Folder Name", "description": "Name of the top-level folder on the USB drive where files will be copied to.", "default": "photobooth"}}, "type": "object", "title": "USB File Transfer Service Config", "description": "Configuration for USB File Transfer Service."}, "GroupHardwareInputOutput": {"properties": {"keyboard_input_enabled": {"type": "boolean", "title": "Keyboard Input Enabled", "description": "Enable keyboard input globally", "default": false}, "keyboard_input_keycode_takepic": {"type": "string", "title": "Keyboard Input Keycode Takepic", "description": "Keycode triggers capture of one image", "default": "i"}, "keyboard_input_keycode_takecollage": {"type": "string", "title": "Keyboard Input Keycode Takecollage", "description": "Keycode triggers capture of collage", "default": "c"}, "keyboard_input_keycode_takeanimation": {"type": "string", "title": "Keyboard Input Keycode Takeanimation", "description": "Keycode triggers capture of animation (GIF)", "default": "g"}, "keyboard_input_keycode_takevideo": {"type": "string", "title": "Keyboard Input Keycode Takevideo", "description": "Keycode triggers start and stop of video (MP4)", "default": "v"}, "keyboard_input_keycode_print_recent_item": {"type": "string", "title": "Keyboard Input Keycode Print Recent Item", "description": "Keycode triggers printing most recent image captured", "default": "p"}, "wled_enabled": {"type": "boolean", "title": "Wled Enabled", "description": "Enable WLED integration for user feedback during countdown and capture by LEDs.", "default": false}, "wled_serial_port": {"type": "string", "title": "Wled Serial Port", "description": "Serial port the WLED device is connected to.", "default": ""}, "gpio_enabled": {"type": "boolean", "title": "Gpio Enabled", "description": "Enable Raspberry Pi GPIOzero integration.", "default": false}, "gpio_pin_shutdown": {"type": "integer", "title": "Gpio Pin Shutdown", "description": "GPIO pin to shutdown after holding it for 2 seconds.", "default": 17}, "gpio_pin_reboot": {"type": "integer", "title": "Gpio Pin Reboot", "description": "GPIO pin to reboot after holding it for 2 seconds.", "default": 18}, "gpio_pin_take1pic": {"type": "integer", "title": "Gpio Pin Take1Pic", "description": "GPIO pin to take one picture.", "default": 27}, "gpio_pin_collage": {"type": "integer", "title": "Gpio Pin Collage", "description": "GPIO pin to take a collage.", "default": 22}, "gpio_pin_animation": {"type": "integer", "title": "Gpio Pin Animation", "description": "GPIO pin to take an animation (GIF).", "default": 24}, "gpio_pin_video": {"type": "integer", "title": "Gpio Pin Video", "description": "GPIO pin to start recording / stop recording a video (MP4).", "default": 26}, "gpio_pin_print_recent_item": {"type": "integer", "title": "Gpio Pin Print Recent Item", "description": "GPIO pin to print last captured item.", "default": 23}, "printing_enabled": {"type": "boolean", "title": "Printing Enabled", "description": "Enable printing in general.", "default": false}, "printing_command": {"type": "string", "title": "Printing Command", "description": "Command issued to print. Use {filename} as placeholder for the JPEG image to be printed.", "default": "mspaint /p {filename}"}, "printing_blocked_time": {"type": "integer", "title": "Printing Blocked Time", "description": "Block queue print until time is passed. Time in seconds.", "default": 20}}, "type": "object", "title": "Hardware Input/Output Config", "description": "Configure hardware GPIO, keyboard and more. Find integration information in the documentation."}, "GroupMediaprocessing": {"properties": {"HIRES_STILL_QUALITY": {"type": "integer", "maximum": 100.0, "minimum": 10.0, "title": "Hires Still Quality", "description": "Still JPEG full resolution quality, applied to download images and images with filter", "default": 90, "ui_component": "QSlider"}, "LIVEPREVIEW_QUALITY": {"type": "integer", "maximum": 100.0, "minimum": 10.0, "title": "Livepreview Quality", "description": "Livepreview stream JPEG image quality on supported backends", "default": 80, "ui_component": "QSlider"}, "THUMBNAIL_STILL_QUALITY": {"type": "integer", "maximum": 100.0, "minimum": 10.0, "title": "Thumbnail Still Quality", "description": "Still JPEG thumbnail quality, thumbs used in gallery list", "default": 60, "ui_component": "QSlider"}, "PREVIEW_STILL_QUALITY": {"type": "integer", "maximum": 100.0, "minimum": 10.0, "title": "Preview Still Quality", "description": "Still JPEG preview quality, preview still shown in gallery detail", "default": 75, "ui_component": "QSlider"}, "FULL_STILL_WIDTH": {"type": "integer", "maximum": 5000.0, "minimum": 800.0, "title": "Full Still Width", "description": "Width of resized full image with filters applied. For performance choose as low as possible but still gives decent print quality. Example: 1500/6inch=250dpi", "default": 1500}, "PREVIEW_STILL_WIDTH": {"type": "integer", "maximum": 2500.0, "minimum": 200.0, "title": "Preview Still Width", "description": "Width of resized preview image, height is automatically calculated to keep aspect ratio", "default": 1200}, "THUMBNAIL_STILL_WIDTH": {"type": "integer", "maximum": 1000.0, "minimum": 100.0, "title": "Thumbnail Still Width", "description": "Width of resized thumbnail image, height is automatically calculated to keep aspect ratio", "default": 400}, "removechromakey_enable": {"type": "boolean", "title": "Removechromakey Enable", "description": "Apply chromakey greenscreen removal from captured images", "default": false}, "removechromakey_keycolor": {"type": "integer", "maximum": 360.0, "minimum": 0.0, "title": "Removechromakey Keycolor", "description": "Color (H) in HSV colorspace to remove on 360\u00b0 scale.", "default": 110}, "removechromakey_tolerance": {"type": "integer", "maximum": 50.0, "minimum": 1.0, "title": "Removechromakey Tolerance", "description": "Tolerance for color (H) on chromakey color removal.", "default": 10}}, "type": "object", "title": "Process media after capture", "description": "Configure stages how to process images after capture."}, "GroupMediaprocessingPipelineAnimation": {"properties": {"canvas_width": {"type": "integer", "title": "Canvas Width", "description": "Width (X) in pixel of animation image (GIF). The higher the better the quality but also longer time to process. All processes keep aspect ratio.", "default": 1500}, "canvas_height": {"type": "integer", "title": "Canvas Height", "description": "Height (Y) in pixel of animation image (GIF). The higher the better the quality but also longer time to process. All processes keep aspect ratio.", "default": 900}, "sequence_merge_definition": {"items": {"$ref": "#/components/schemas/AnimationMergeDefinition"}, "type": "array", "title": "Sequence Merge Definition", "description": "Sequence images in an animated GIF. Predefined image files are used instead a camera capture. File needs to be located in DATA_DIR/*", "default": [{"duration": 2000, "predefined_image": "", "filter": "crema"}, {"duration": 2000, "predefined_image": "", "filter": "inkwell"}, {"duration": 4000, "predefined_image": "predefined_images/photobooth-gif-animation-predefined-image.png", "filter": "original"}]}}, "type": "object", "title": "Process Animation (GIF) after capture", "description": "Configure stages how to process collage after capture."}, "GroupMediaprocessingPipelineCollage": {"properties": {"capture_fill_background_enable": {"type": "boolean", "title": "Capture Fill Background Enable", "description": "Apply solid color background to captured image (useful only if image is extended or background removed)", "default": false}, "capture_fill_background_color": {"type": "string", "format": "color", "title": "Capture Fill Background Color", "description": "Solid color used to fill background.", "default": "#00f"}, "capture_img_background_enable": {"type": "boolean", "title": "Capture Img Background Enable", "description": "Add image from file to background (useful only if image is extended or background removed)", "default": false}, "capture_img_background_file": {"type": "string", "title": "Capture Img Background File", "description": "Image file to use as background filling transparent area. File needs to be located in DATA_DIR/*", "default": "backgrounds/pink-7761356_1920.jpg"}, "canvas_width": {"type": "integer", "title": "Canvas Width", "description": "Width (X) in pixel of collage image. The higher the better the quality but also longer time to process. All processes keep aspect ratio.", "default": 1920}, "canvas_height": {"type": "integer", "title": "Canvas Height", "description": "Height (Y) in pixel of collage image. The higher the better the quality but also longer time to process. All processes keep aspect ratio.", "default": 1280}, "canvas_merge_definition": {"items": {"$ref": "#/components/schemas/CollageMergeDefinition"}, "type": "array", "title": "Canvas Merge Definition", "description": "How to arrange single images in the collage. Pos_x/Pos_y measure in pixel starting 0/0 at top-left in image. Width/Height in pixels. Aspect ratio is kept always. Predefined image files are used instead a camera capture. File needs to be located in DATA_DIR/*", "default": [{"pos_x": 160, "pos_y": 220, "width": 510, "height": 725, "rotate": 0, "predefined_image": "", "filter": "earlybird"}, {"pos_x": 705, "pos_y": 66, "width": 510, "height": 725, "rotate": 0, "predefined_image": "predefined_images/photobooth-collage-predefined-image.png", "filter": "original"}, {"pos_x": 1245, "pos_y": 220, "width": 510, "height": 725, "rotate": 0, "predefined_image": "", "filter": "reyes"}]}, "canvas_fill_background_enable": {"type": "boolean", "title": "Canvas Fill Background Enable", "description": "Apply solid color background to collage", "default": false}, "canvas_fill_background_color": {"type": "string", "format": "color", "title": "Canvas Fill Background Color", "description": "Solid color used to fill background.", "default": "#008000"}, "canvas_img_background_enable": {"type": "boolean", "title": "Canvas Img Background Enable", "description": "Add image from file to background.", "default": false}, "canvas_img_background_file": {"type": "string", "title": "Canvas Img Background File", "description": "Image file to use as background filling transparent area. File needs to be located in userdata/*", "default": "backgrounds/pink-7761356_1920.jpg"}, "canvas_img_front_enable": {"type": "boolean", "title": "Canvas Img Front Enable", "description": "Overlay image on canvas image.", "default": true}, "canvas_img_front_file": {"type": "string", "title": "Canvas Img Front File", "description": "Image file to paste on top over photos and backgrounds. Photos are visible only through transparant parts. Image needs to be transparent (PNG). File needs to be located in DATA_DIR/*", "default": "frames/pixabay-poster-2871536_1920.png"}, "canvas_texts_enable": {"type": "boolean", "title": "Canvas Texts Enable", "description": "General enable apply texts below.", "default": true}, "canvas_texts": {"items": {"$ref": "#/components/schemas/TextsConfig"}, "type": "array", "title": "Canvas Texts", "description": "Text to overlay on final collage. Pos_x/Pos_y measure in pixel starting 0/0 at top-left in image. Font to use in text stages. File needs to be located in DATA_DIR/*", "default": [{"text": "Have a nice day :)", "pos_x": 200, "pos_y": 1100, "rotate": 1, "font_size": 40, "font": "fonts/Roboto-Bold.ttf", "color": "#333"}]}}, "type": "object", "title": "Process collage after capture", "description": "Configure stages how to process collage after capture."}, "GroupMediaprocessingPipelinePrint": {"properties": {}, "type": "object", "title": "Process mediaitem before printing on paper", "description": "Configure stages how to process mediaitem before printing on paper."}, "GroupMediaprocessingPipelineSingleImage": {"properties": {"filter": {"allOf": [{"$ref": "#/components/schemas/EnumPilgramFilter"}], "title": "Pic1 Filter", "description": "Instagram-like filter to apply per default. 'original' applies no filter.", "default": "original"}, "fill_background_enable": {"type": "boolean", "title": "Fill Background Enable", "description": "Apply solid color background to captured image (useful only if image is extended or background removed)", "default": false}, "fill_background_color": {"type": "string", "format": "color", "title": "Fill Background Color", "description": "Solid color used to fill background.", "default": "#00f"}, "img_background_enable": {"type": "boolean", "title": "Img Background Enable", "description": "Add image from file to background (useful only if image is extended or background removed)", "default": false}, "img_background_file": {"type": "string", "title": "Img Background File", "description": "Image file to use as background filling transparent area. File needs to be located in DATA_DIR/*", "default": "backgrounds/pink-7761356_1920.jpg"}, "img_frame_enable": {"type": "boolean", "title": "Img Frame Enable", "description": "Mount captured image to frame.", "default": true}, "img_frame_file": {"type": "string", "title": "Img Frame File", "description": "Image file to which the captured image is mounted to. Frame determines the output image size! Photos are visible through transparant parts. Image needs to be transparent (PNG). File needs to be located in userdata/*", "default": "frames/pixabay-holidays-1798208_1920.png"}, "texts_enable": {"type": "boolean", "title": "Texts Enable", "description": "General enable apply texts below.", "default": true}, "texts": {"items": {"$ref": "#/components/schemas/TextsConfig"}, "type": "array", "title": "Texts", "description": "Text to overlay on images after capture. Pos_x/Pos_y measure in pixel starting 0/0 at top-left in image. Font to use in text stages. File needs to be located in DATA_DIR/*", "default": [{"text": "Made with the python photobooth-app", "pos_x": 100, "pos_y": 1300, "rotate": 0, "font_size": 40, "font": "fonts/Roboto-Bold.ttf", "color": "#ccc"}]}}, "type": "object", "title": "Postprocess single captures", "description": "Configure stages how to process images after capture."}, "GroupMisc": {"properties": {"video_duration": {"type": "integer", "maximum": 30.0, "minimum": 1.0, "title": "Video Duration", "description": "Duration of a video in seconds. The user can stop recording earlier but cannot take longer videos.", "default": 5}, "video_bitrate": {"type": "integer", "maximum": 10000.0, "minimum": 1000.0, "title": "Video Bitrate", "description": "Video quality bitrate in k.", "default": 3000}, "video_framerate": {"type": "integer", "maximum": 30.0, "minimum": 1.0, "title": "Video Framerate", "description": "Video framerate (frames per second).", "default": 25}}, "type": "object", "title": "Miscellaneous Config", "description": "Quite advanced or experimental, usually not necessary to touch. Can change any time."}, "GroupSharing": {"properties": {"shareservice_enabled": {"type": "boolean", "title": "Shareservice Enabled", "description": "Enable share service. To enable URL needs to be configured and dl.php script setup properly.", "default": false}, "shareservice_url": {"type": "string", "title": "Shareservice Url", "description": "URL of php script that is used to serve files and share via QR code. The default is a landingpage with further instructions how to setup.", "default": "https://photobooth-app.org/extras/shareservice-landing/"}, "shareservice_apikey": {"type": "string", "title": "Shareservice Apikey", "description": "Key to secure the download php script. Set the key in dl.php script to same value. Only if correct key is provided the shareservice works properly.", "default": "changedefault!"}, "shareservice_share_original": {"type": "boolean", "title": "Shareservice Share Original", "description": "Upload original image as received from camera. If unchecked, the full processed version is uploaded with filter and texts applied.", "default": false}, "share_custom_qr_url": {"type": "string", "title": "Share Custom Qr Url", "description": "URL displayed as QR code to image for download. Need you to sync the files on your own or allow the user to access via hotspot. {filename} is replaced by actual filename in QR code.", "default": "http://localhost/media/processed/full/{filename}"}}, "type": "object", "title": "\ud83e\udef6 Share Config", "description": "Settings about shareing media"}, "GroupUiSettings": {"properties": {"PRIMARY_COLOR": {"type": "string", "format": "color", "title": "Primary Color", "description": "Primary color (e.g. buttons, title bar).", "default": "#196cb0"}, "SECONDARY_COLOR": {"type": "string", "format": "color", "title": "Secondary Color", "description": "Secondary color (admin interface, accents).", "default": "#b8124f"}, "show_takepic_on_frontpage": {"type": "boolean", "title": "Show Takepic On Frontpage", "description": "Show button to capture single picture on frontpage.", "default": true}, "show_takecollage_on_frontpage": {"type": "boolean", "title": "Show Takecollage On Frontpage", "description": "Show button to capture collage on frontpage.", "default": true}, "show_takeanimation_on_frontpage": {"type": "boolean", "title": "Show Takeanimation On Frontpage", "description": "Show button to capture animated GIF on frontpage.", "default": true}, "show_takevideo_on_frontpage": {"type": "boolean", "title": "Show Takevideo On Frontpage", "description": "Show button to capture video on frontpage.", "default": true}, "show_gallery_on_frontpage": {"type": "boolean", "title": "Show Gallery On Frontpage", "description": "Show button to gallery on frontpage.", "default": true}, "show_admin_on_frontpage": {"type": "boolean", "title": "Show Admin On Frontpage", "description": "Show button to admin center, usually only during setup.", "default": true}, "show_automatic_slideshow_timeout": {"type": "integer", "minimum": 0.0, "title": "Show Automatic Slideshow Timeout", "description": "Timeout (seconds) after which a random order slideshow of all images is started. Set to 0 to disable.", "default": 300}, "livestream_mirror_effect": {"type": "boolean", "title": "Livestream Mirror Effect", "description": "Flip livestream horizontally to create a mirror effect feeling more natural to users.", "default": true}, "FRONTPAGE_TEXT": {"type": "string", "title": "Frontpage Text", "description": "Text/HTML displayed on frontpage.", "default": "
Hey!
Let's take some pictures!
\ud83d\udcf7\ud83d\udc95
"}, "TAKEPIC_MSG_TIME": {"type": "number", "title": "Takepic Msg Time", "description": "Offset in seconds, the smile-icon shall be shown.", "default": 0.5}, "TAKEPIC_MSG_TEXT": {"type": "string", "title": "Takepic Msg Text", "description": "Message to display at the end of the capture countdown.", "default": "\ud83d\ude03"}, "AUTOCLOSE_NEW_ITEM_ARRIVED": {"type": "integer", "title": "Autoclose New Item Arrived", "description": "Timeout in seconds a new item popup closes automatically.", "default": 30}, "GALLERY_EMPTY_MSG": {"type": "string", "title": "Gallery Empty Msg", "description": "Message displayed if gallery is empty.", "default": "
Empty, Zero, Nada! \ud83e\udd37\u200d\u2642\ufe0f
Let's take some pictures!
\ud83d\udcf7\ud83d\udc95
"}, "gallery_show_qrcode": {"type": "boolean", "title": "Gallery Show Qrcode", "description": "Show QR code in gallery. If shareservice is enabled the URL is automatically generated, if not go to share config and provide URL.", "default": true}, "gallery_show_filter": {"type": "boolean", "title": "Gallery Show Filter", "description": "Show instagramlike filter (pilgram2).", "default": true}, "gallery_filter_userselectable": {"items": {"$ref": "#/components/schemas/EnumPilgramFilter"}, "type": "array", "title": "Pic1 Filter Userselectable", "description": "Filter the user may choose from in the gallery. 'original' applies no filter.", "default": ["original", "_1977", "aden", "ashby", "amaro", "brannan", "brooklyn", "charmes", "clarendon", "crema", "dogpatch", "earlybird", "gingham", "ginza", "hefe", "helena", "hudson", "inkwell", "juno", "kelvin", "lark", "lofi", "ludwig", "maven", "mayfair", "moon", "nashville", "perpetua", "poprocket", "reyes", "rise", "sierra", "skyline", "slumber", "stinson", "sutro", "toaster", "valencia", "walden", "willow", "xpro2"]}, "gallery_show_download": {"type": "boolean", "title": "Gallery Show Download", "description": "Show download button in gallery.", "default": true}, "gallery_show_delete": {"type": "boolean", "title": "Gallery Show Delete", "description": "Show delete button for items in gallery.", "default": true}, "gallery_show_print": {"type": "boolean", "title": "Gallery Show Print", "description": "Show print button for items in gallery.", "default": true}}, "type": "object", "title": "Personalize the User Interface", "description": "Personalize the booth's UI."}, "HTTPValidationError": {"properties": {"detail": {"items": {"$ref": "#/components/schemas/ValidationError"}, "type": "array", "title": "Detail"}}, "type": "object", "title": "HTTPValidationError"}, "PathListItem": {"properties": {"name": {"type": "string", "title": "Name"}, "filepath": {"type": "string", "title": "Filepath"}, "is_dir": {"type": "boolean", "title": "Is Dir"}, "size": {"type": "integer", "title": "Size"}}, "type": "object", "required": ["name", "filepath", "is_dir", "size"], "title": "PathListItem"}, "TextsConfig": {"properties": {"text": {"type": "string", "title": "Text", "default": ""}, "pos_x": {"type": "integer", "minimum": 0.0, "title": "Pos X", "default": 50}, "pos_y": {"type": "integer", "minimum": 0.0, "title": "Pos Y", "default": 50}, "rotate": {"type": "integer", "title": "Rotate", "default": 0}, "font_size": {"type": "integer", "exclusiveMinimum": 0.0, "title": "Font Size", "default": 40}, "font": {"type": "string", "title": "Font", "default": "fonts/Roboto-Bold.ttf"}, "color": {"type": "string", "format": "color", "title": "Color", "default": "#f00"}}, "type": "object", "title": "TextsConfig"}, "ValidationError": {"properties": {"loc": {"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, "type": "array", "title": "Location"}, "msg": {"type": "string", "title": "Message"}, "type": {"type": "string", "title": "Error Type"}}, "type": "object", "required": ["loc", "msg", "type"], "title": "ValidationError"}}}} \ No newline at end of file +{"openapi": "3.1.0", "info": {"title": "Photobooth-App API", "description": "API may change any time.", "version": "2.0.6"}, "paths": {"/api/actions/image/{index}": {"get": {"tags": ["actions"], "summary": "Api Chose 1Pic Get", "operationId": "api_chose_1pic_get_api_actions_image__index__get", "parameters": [{"name": "index", "in": "path", "required": true, "schema": {"type": "integer", "title": "Index"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/actions/collage/{index}": {"get": {"tags": ["actions"], "summary": "Api Chose Collage Get", "operationId": "api_chose_collage_get_api_actions_collage__index__get", "parameters": [{"name": "index", "in": "path", "required": true, "schema": {"type": "integer", "title": "Index"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/actions/animation/{index}": {"get": {"tags": ["actions"], "summary": "Api Chose Animation Get", "operationId": "api_chose_animation_get_api_actions_animation__index__get", "parameters": [{"name": "index", "in": "path", "required": true, "schema": {"type": "integer", "title": "Index"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/actions/video/{index}": {"get": {"tags": ["actions"], "summary": "Api Chose Video Get", "operationId": "api_chose_video_get_api_actions_video__index__get", "parameters": [{"name": "index", "in": "path", "required": true, "schema": {"type": "integer", "title": "Index"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/actions/confirm": {"get": {"tags": ["actions"], "summary": "Api Cmd Confirm Get", "operationId": "api_cmd_confirm_get_api_actions_confirm_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/actions/reject": {"get": {"tags": ["actions"], "summary": "Api Cmd Reject Get", "operationId": "api_cmd_reject_get_api_actions_reject_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/actions/stop": {"get": {"tags": ["actions"], "summary": "Api Cmd Stop Get", "operationId": "api_cmd_stop_get_api_actions_stop_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/actions/abort": {"get": {"tags": ["actions"], "summary": "Api Cmd Abort Get", "operationId": "api_cmd_abort_get_api_actions_abort_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/aquisition/stream.mjpg": {"get": {"tags": ["aquisition"], "summary": "Video Stream", "description": "endpoint to stream live video to clients", "operationId": "video_stream_api_aquisition_stream_mjpg_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/aquisition/still": {"get": {"tags": ["aquisition"], "summary": "Api Still Get", "description": "Aquire image and serve to download\n\nRaises:\n HTTPException: Image could not be aquired from backend\n\nReturns:\n Response: Returns jpeg image to download", "operationId": "api_still_get_api_aquisition_still_get", "responses": {"200": {"description": "Successful Response", "content": {"image/jpeg": {}}}}}}, "/api/aquisition/mode/{mode}": {"get": {"tags": ["aquisition"], "summary": "Api Cmd Aquisition Capturemode Get", "description": "set backends to preview or capture mode (usually automatically switched as needed by processingservice)", "operationId": "api_cmd_aquisition_capturemode_get_api_aquisition_mode__mode__get", "parameters": [{"name": "mode", "in": "path", "required": true, "schema": {"type": "string", "title": "Mode"}}], "responses": {"202": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/config/ui": {"get": {"tags": ["config"], "summary": "Index", "description": "get part of the config dedicated for UI only. UI requests this on startup", "operationId": "index_api_config_ui_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/debug/log/latest": {"get": {"tags": ["logs"], "summary": "Get Log Latest", "description": "provide latest logfile to download\nTODO Handle exception if file not exists\n\nReturns:\n _type_: _description_", "operationId": "get_log_latest_api_debug_log_latest_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/mediacollection/getitems": {"get": {"tags": ["mediacollection"], "summary": "Api Getitems", "operationId": "api_getitems_api_mediacollection_getitems_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/mediacollection/delete": {"post": {"tags": ["mediacollection"], "summary": "Api Gallery Delete", "operationId": "api_gallery_delete_api_mediacollection_delete_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Body_api_gallery_delete_api_mediacollection_delete_post"}}}, "required": true}, "responses": {"204": {"description": "Successful Response"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/mediacollection/delete_all": {"get": {"tags": ["mediacollection"], "summary": "Api Gallery Delete All", "description": "Warning: deletes all files permanently without any further confirmation\n\nRaises:\n HTTPException: _description_", "operationId": "api_gallery_delete_all_api_mediacollection_delete_all_get", "responses": {"204": {"description": "Successful Response"}}}}, "/api/mediaprocessing/preview/{mediaitem_id}/{filter}": {"get": {"tags": ["mediaprocessing"], "summary": "Api Get Preview Image Filtered", "operationId": "api_get_preview_image_filtered_api_mediaprocessing_preview__mediaitem_id___filter__get", "parameters": [{"name": "mediaitem_id", "in": "path", "required": true, "schema": {"title": "Mediaitem Id"}}, {"name": "filter", "in": "path", "required": true, "schema": {"title": "Filter"}}], "responses": {"200": {"description": "Successful Response"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/mediaprocessing/applyfilter/{mediaitem_id}/{filter}": {"get": {"tags": ["mediaprocessing"], "summary": "Api Get Applyfilter", "operationId": "api_get_applyfilter_api_mediaprocessing_applyfilter__mediaitem_id___filter__get", "parameters": [{"name": "mediaitem_id", "in": "path", "required": true, "schema": {"title": "Mediaitem Id"}}, {"name": "filter", "in": "path", "required": true, "schema": {"type": "string", "title": "Filter"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/printer/print/latest/{index}": {"get": {"tags": ["printer"], "summary": "Api Print Latest", "operationId": "api_print_latest_api_printer_print_latest__index__get", "parameters": [{"name": "index", "in": "path", "required": true, "schema": {"type": "integer", "title": "Index"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/printer/print/{index}": {"get": {"tags": ["printer"], "summary": "Api Print Latest", "operationId": "api_print_latest_api_printer_print__index__get", "parameters": [{"name": "index", "in": "path", "required": true, "schema": {"type": "integer", "title": "Index"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/printer/print/{id}/{index}": {"get": {"tags": ["printer"], "summary": "Api Print Item Id", "operationId": "api_print_item_id_api_printer_print__id___index__get", "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "string", "title": "Id"}}, {"name": "index", "in": "path", "required": true, "schema": {"type": "integer", "title": "Index"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/sse": {"get": {"tags": ["home"], "summary": "Subscribe", "description": "Eventstream to feed clients with server generated events and data", "operationId": "subscribe_api_sse_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/system/{action}/{param}": {"get": {"tags": ["system"], "summary": "Api Cmd", "operationId": "api_cmd_api_system__action___param__get", "parameters": [{"name": "action", "in": "path", "required": true, "schema": {"title": "Action"}}, {"name": "param", "in": "path", "required": true, "schema": {"title": "Param"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/config/schema": {"get": {"tags": ["admin", "config"], "summary": "Api Get Config Schema", "description": "Get schema to build the client UI\n:param str schema_type: default or dereferenced.", "operationId": "api_get_config_schema_api_admin_config_schema_get", "parameters": [{"name": "schema_type", "in": "query", "required": false, "schema": {"type": "string", "default": "default", "title": "Schema Type"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/config/reset": {"get": {"tags": ["admin", "config"], "summary": "Api Reset Config", "description": "Reset config, deleting config.json file", "operationId": "api_reset_config_api_admin_config_reset_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/admin/config/currentActive": {"get": {"tags": ["admin", "config"], "summary": "Api Get Config Current Active", "description": "returns currently cached and active settings", "operationId": "api_get_config_current_active_api_admin_config_currentActive_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/admin/config/current": {"get": {"tags": ["admin", "config"], "summary": "Api Get Config Current", "description": "read settings from drive and return", "operationId": "api_get_config_current_api_admin_config_current_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}, "post": {"tags": ["admin", "config"], "summary": "Api Post Config Current", "operationId": "api_post_config_current_api_admin_config_current_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppConfig"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/files/list/{dir}": {"get": {"tags": ["admin", "files"], "summary": "Get List", "operationId": "get_list_api_admin_files_list__dir__get", "parameters": [{"name": "dir", "in": "path", "required": true, "schema": {"type": "string", "title": "Dir"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/files/file/{file}": {"get": {"tags": ["admin", "files"], "summary": "Get File", "operationId": "get_file_api_admin_files_file__file__get", "parameters": [{"name": "file", "in": "path", "required": true, "schema": {"type": "string", "title": "File"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/files/file/upload": {"post": {"tags": ["admin", "files"], "summary": "Create Upload File", "operationId": "create_upload_file_api_admin_files_file_upload_post", "requestBody": {"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/Body_create_upload_file_api_admin_files_file_upload_post"}}}, "required": true}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/files/folder/new": {"post": {"tags": ["admin", "files"], "summary": "Post Folder New", "description": "need to provide full path starting from CWD.", "operationId": "post_folder_new_api_admin_files_folder_new_post", "requestBody": {"content": {"application/json": {"schema": {"type": "string", "title": "New Folder Name"}}}, "required": true}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/files/delete": {"post": {"tags": ["admin", "files"], "summary": "Post Delete", "operationId": "post_delete_api_admin_files_delete_post", "requestBody": {"content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/PathListItem"}, "type": "array", "title": "Selected Paths"}}}}, "responses": {"204": {"description": "Successful Response"}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/admin/files/zip": {"post": {"tags": ["admin", "files"], "summary": "Post Zip", "operationId": "post_zip_api_admin_files_zip_post", "requestBody": {"content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/PathListItem"}, "type": "array", "title": "Selected Paths"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/": {"get": {"tags": ["static"], "summary": "Index", "description": "return homepage of booth", "operationId": "index__get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/private.css": {"get": {"tags": ["static"], "summary": "Ui Private Css", "description": "if private.css exists return the file content, otherwise send empty response to avoid 404", "operationId": "ui_private_css_private_css_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}}, "components": {"schemas": {"AnimationConfigurationSet": {"properties": {"name": {"type": "string", "title": "Name", "description": "Name to identify, only used for display in admin center.", "default": "default animation settings"}, "actions": {"$ref": "#/components/schemas/AnimationProcessing"}, "trigger": {"$ref": "#/components/schemas/Trigger"}}, "type": "object", "required": ["actions", "trigger"], "title": "Postprocess single captures", "description": "Configure stages how to process images after capture."}, "AnimationMergeDefinition": {"properties": {"duration": {"type": "integer", "minimum": 0.0, "title": "Duration", "default": 2000}, "predefined_image": {"type": "string", "title": "Predefined Image", "default": ""}, "filter": {"allOf": [{"$ref": "#/components/schemas/PilgramFilter"}], "default": "original"}}, "type": "object", "title": "AnimationMergeDefinition"}, "AnimationProcessing": {"properties": {"ask_approval_each_capture": {"type": "boolean", "title": "Ask Approval Each Capture", "description": "Stop after every capture to ask user if he would like to continue or redo the capture. If disabled captures are granted as approved always.", "default": false}, "approve_autoconfirm_timeout": {"type": "number", "title": "Approve Autoconfirm Timeout", "description": "If user is required to approve animation captures, after this timeout, the job continues and user confirmation is assumed.", "default": 15.0}, "canvas_width": {"type": "integer", "title": "Canvas Width", "description": "Width (X) in pixel of animation image (GIF). The higher the better the quality but also longer time to process. All processes keep aspect ratio.", "default": 1500}, "canvas_height": {"type": "integer", "title": "Canvas Height", "description": "Height (Y) in pixel of animation image (GIF). The higher the better the quality but also longer time to process. All processes keep aspect ratio.", "default": 900}, "merge_definition": {"items": {"$ref": "#/components/schemas/AnimationMergeDefinition"}, "type": "array", "title": "Merge Definition", "description": "Sequence images in an animated GIF. Predefined image files are used instead a camera capture. File needs to be located in DATA_DIR/*", "default": []}, "gallery_hide_individual_images": {"type": "boolean", "title": "Gallery Hide Individual Images", "description": "Hide individual images of animations in the gallery. Hidden images are still stored in the data folder. (Note: changing this setting will not change visibility of already captured images).", "default": false}}, "type": "object", "title": "Process Animation (GIF) after capture", "description": "Configure stages how to process collage after capture."}, "AppConfig": {"properties": {"common": {"allOf": [{"$ref": "#/components/schemas/GroupCommon"}], "default": {"countdown_capture_first": 2.0, "countdown_capture_second_following": 1.0, "countdown_camera_capture_offset": 0.2, "logging_level": "DEBUG", "webserver_bind_ip": "0.0.0.0", "webserver_port": 8000}}, "actions": {"allOf": [{"$ref": "#/components/schemas/GroupActions"}], "default": {"image": [{"actions": {"fill_background_color": "#00f", "fill_background_enable": false, "filter": "original", "img_background_enable": true, "img_background_file": "backgrounds/pink-7761356_1920.jpg", "img_frame_enable": true, "img_frame_file": "frames/pixabay-holidays-1798208_1920.png", "texts": [{"color": "#ccc", "font": "fonts/Roboto-Bold.ttf", "font_size": 40, "pos_x": 100, "pos_y": 1300, "rotate": 0, "text": "Made with the photobooth-app"}], "texts_enable": true}, "name": "default single image settings", "trigger": {"frontpage_trigger": {"icon": "o_photo_camera", "title": "Image"}, "gpio_trigger": {"pin": "27", "trigger_on": "pressed"}, "keyboard_trigger": {"keycode": "i"}}}], "collage": [{"actions": {"approve_autoconfirm_timeout": 15.0, "ask_approval_each_capture": true, "canvas_fill_background_color": "#008000", "canvas_fill_background_enable": false, "canvas_height": 1280, "canvas_img_background_enable": false, "canvas_img_background_file": "", "canvas_img_front_enable": true, "canvas_img_front_file": "frames/pixabay-poster-2871536_1920.png", "canvas_texts": [{"color": "#333", "font": "fonts/Roboto-Bold.ttf", "font_size": 40, "pos_x": 200, "pos_y": 1100, "rotate": 1, "text": "Have a nice day :)"}], "canvas_texts_enable": true, "canvas_width": 1920, "capture_fill_background_color": "#00f", "capture_fill_background_enable": false, "capture_img_background_enable": false, "capture_img_background_file": "", "gallery_hide_individual_images": false, "merge_definition": [{"filter": "earlybird", "height": 725, "pos_x": 160, "pos_y": 220, "predefined_image": "", "rotate": 0, "width": 510}, {"filter": "original", "height": 725, "pos_x": 705, "pos_y": 66, "predefined_image": "predefined_images/photobooth-collage-predefined-image.png", "rotate": 0, "width": 510}, {"filter": "reyes", "height": 725, "pos_x": 1245, "pos_y": 220, "predefined_image": "", "rotate": 0, "width": 510}]}, "name": "default collage settings", "trigger": {"frontpage_trigger": {"icon": "o_auto_awesome_mosaic", "title": "Collage"}, "gpio_trigger": {"pin": "22", "trigger_on": "pressed"}, "keyboard_trigger": {"keycode": "c"}}}], "animation": [{"actions": {"approve_autoconfirm_timeout": 15.0, "ask_approval_each_capture": false, "canvas_height": 900, "canvas_width": 1500, "gallery_hide_individual_images": true, "merge_definition": [{"duration": 2000, "filter": "crema", "predefined_image": ""}, {"duration": 2000, "filter": "inkwell", "predefined_image": ""}, {"duration": 4000, "filter": "original", "predefined_image": "predefined_images/photobooth-gif-animation-predefined-image.png"}]}, "name": "default animation settings", "trigger": {"frontpage_trigger": {"icon": "o_gif_box", "title": "Animation"}, "gpio_trigger": {"pin": "24", "trigger_on": "pressed"}, "keyboard_trigger": {"keycode": "g"}}}], "video": [{"actions": {"boomerang": true, "video_duration": 5, "video_framerate": 15}, "name": "default boomerang video", "trigger": {"frontpage_trigger": {"icon": "o_movie", "title": "Video"}, "gpio_trigger": {"pin": "26", "trigger_on": "pressed"}, "keyboard_trigger": {"keycode": "v"}}}]}}, "printer": {"allOf": [{"$ref": "#/components/schemas/GroupPrinter"}], "default": {"print": [{"actions": {"printing_blocked_time": 10, "printing_command": "mspaint /p {filename}"}, "name": "default print settings", "trigger": {"frontpage_trigger": {"icon": "", "title": ""}, "gpio_trigger": {"pin": "23", "trigger_on": "pressed"}, "keyboard_trigger": {"keycode": "p"}}}]}}, "sharing": {"allOf": [{"$ref": "#/components/schemas/GroupSharing"}], "default": {"shareservice_enabled": false, "shareservice_url": "https://photobooth-app.org/extras/shareservice-landing/", "shareservice_apikey": "changedefault!", "shareservice_share_original": false, "share_custom_qr_url": "http://localhost/media/processed/full/{filename}"}}, "filetransfer": {"allOf": [{"$ref": "#/components/schemas/GroupFileTransfer"}], "default": {"enabled": false, "target_folder_name": "photobooth"}}, "mediaprocessing": {"allOf": [{"$ref": "#/components/schemas/GroupMediaprocessing"}], "default": {"HIRES_STILL_QUALITY": 90, "LIVEPREVIEW_QUALITY": 80, "THUMBNAIL_STILL_QUALITY": 60, "PREVIEW_STILL_QUALITY": 75, "FULL_STILL_WIDTH": 1500, "PREVIEW_STILL_WIDTH": 1200, "THUMBNAIL_STILL_WIDTH": 400, "removechromakey_enable": false, "removechromakey_keycolor": 110, "removechromakey_tolerance": 10}}, "uisettings": {"allOf": [{"$ref": "#/components/schemas/GroupUiSettings"}], "default": {"PRIMARY_COLOR": "#196cb0", "SECONDARY_COLOR": "#b8124f", "show_takepic_on_frontpage": true, "show_takecollage_on_frontpage": true, "show_takeanimation_on_frontpage": true, "show_takevideo_on_frontpage": true, "show_gallery_on_frontpage": true, "show_admin_on_frontpage": true, "show_automatic_slideshow_timeout": 300, "livestream_mirror_effect": true, "FRONTPAGE_TEXT": "
Hey!
Let's take some pictures!
\ud83d\udcf7\ud83d\udc95
", "TAKEPIC_MSG_TIME": 0.5, "TAKEPIC_MSG_TEXT": "\ud83d\ude03", "AUTOCLOSE_NEW_ITEM_ARRIVED": 30, "GALLERY_EMPTY_MSG": "
Empty, Zero, Nada! \ud83e\udd37\u200d\u2642\ufe0f
Let's take some pictures!
\ud83d\udcf7\ud83d\udc95
", "gallery_show_qrcode": true, "gallery_show_filter": true, "gallery_filter_userselectable": ["original", "_1977", "aden", "ashby", "amaro", "brannan", "brooklyn", "charmes", "clarendon", "crema", "dogpatch", "earlybird", "gingham", "ginza", "hefe", "helena", "hudson", "inkwell", "juno", "kelvin", "lark", "lofi", "ludwig", "maven", "mayfair", "moon", "nashville", "perpetua", "poprocket", "reyes", "rise", "sierra", "skyline", "slumber", "stinson", "sutro", "toaster", "valencia", "walden", "willow", "xpro2"], "gallery_show_download": true, "gallery_show_delete": true, "gallery_show_print": true}}, "backends": {"allOf": [{"$ref": "#/components/schemas/GroupBackends"}], "default": {"enable_livestream": true, "livestream_framerate": 15, "retry_capture": 3, "group_main": {"active_backend": "VirtualCamera", "digicamcontrol": {"base_url": "http://127.0.0.1:5513"}, "virtualcamera": {}, "webcamcv2": {"CAMERA_TRANSFORM_HFLIP": false, "CAMERA_TRANSFORM_VFLIP": false, "CAM_RESOLUTION_HEIGHT": 10000, "CAM_RESOLUTION_WIDTH": 10000, "device_index": 0}}, "group_live": {"active_backend": "Disabled", "virtualcamera": {}, "webcamcv2": {"CAMERA_TRANSFORM_HFLIP": false, "CAMERA_TRANSFORM_VFLIP": false, "CAM_RESOLUTION_HEIGHT": 10000, "CAM_RESOLUTION_WIDTH": 10000, "device_index": 0}}}}, "hardwareinputoutput": {"allOf": [{"$ref": "#/components/schemas/GroupHardwareInputOutput"}], "default": {"keyboard_input_enabled": false, "wled_enabled": false, "wled_serial_port": "", "gpio_enabled": false, "gpio_pin_shutdown": 17, "gpio_pin_reboot": 18, "printing_enabled": false}}, "misc": {"allOf": [{"$ref": "#/components/schemas/GroupMisc"}], "default": {"video_bitrate": 3000, "video_compatibility_mode": false}}}, "type": "object", "title": "AppConfig", "description": "AppConfig class glueing all together\n\nIn the case where a value is specified for the same Settings field in multiple ways, the selected value is determined as follows\n(in descending order of priority):\n\n1 Arguments passed to the Settings class initialiser.\n2 Environment variables, e.g. my_prefix_special_function as described above.\n3 Variables loaded from a dotenv (.env) file.\n4 Variables loaded from the secrets directory.\n5 The default field values for the Settings model."}, "Body_api_gallery_delete_api_mediacollection_delete_post": {"properties": {"image_id": {"type": "string", "title": "Image Id"}}, "type": "object", "required": ["image_id"], "title": "Body_api_gallery_delete_api_mediacollection_delete_post"}, "Body_create_upload_file_api_admin_files_file_upload_post": {"properties": {"upload_target_folder": {"type": "string", "title": "Upload Target Folder"}, "uploaded_files": {"items": {"type": "string", "format": "binary"}, "type": "array", "title": "Uploaded Files"}}, "type": "object", "required": ["upload_target_folder", "uploaded_files"], "title": "Body_create_upload_file_api_admin_files_file_upload_post"}, "CollageConfigurationSet": {"properties": {"name": {"type": "string", "title": "Name", "description": "Name to identify, only used for display in admin center.", "default": "default collage settings"}, "actions": {"$ref": "#/components/schemas/CollageProcessing"}, "trigger": {"$ref": "#/components/schemas/Trigger"}}, "type": "object", "required": ["actions", "trigger"], "title": "Postprocess single captures", "description": "Configure stages how to process images after capture."}, "CollageMergeDefinition": {"properties": {"pos_x": {"type": "integer", "minimum": 0.0, "title": "Pos X", "default": 50}, "pos_y": {"type": "integer", "minimum": 0.0, "title": "Pos Y", "default": 50}, "width": {"type": "integer", "minimum": 0.0, "title": "Width", "default": 600}, "height": {"type": "integer", "minimum": 0.0, "title": "Height", "default": 600}, "rotate": {"type": "integer", "title": "Rotate", "default": 0}, "predefined_image": {"type": "string", "title": "Predefined Image", "default": ""}, "filter": {"allOf": [{"$ref": "#/components/schemas/PilgramFilter"}], "default": "original"}}, "type": "object", "title": "CollageMergeDefinition"}, "CollageProcessing": {"properties": {"ask_approval_each_capture": {"type": "boolean", "title": "Ask Approval Each Capture", "description": "Stop after every capture to ask user if he would like to continue or redo the capture. If disabled captures are granted as approved always.", "default": false}, "approve_autoconfirm_timeout": {"type": "number", "title": "Approve Autoconfirm Timeout", "description": "If user is required to approve collage captures, after this timeout, the job continues and user confirmation is assumed.", "default": 15.0}, "capture_fill_background_enable": {"type": "boolean", "title": "Capture Fill Background Enable", "description": "Apply solid color background to captured image (useful only if image is extended or background removed)", "default": false}, "capture_fill_background_color": {"type": "string", "format": "color", "title": "Capture Fill Background Color", "description": "Solid color used to fill background.", "default": "#00f"}, "capture_img_background_enable": {"type": "boolean", "title": "Capture Img Background Enable", "description": "Add image from file to background (useful only if image is extended or background removed)", "default": false}, "capture_img_background_file": {"type": "string", "title": "Capture Img Background File", "description": "Image file to use as background filling transparent area. File needs to be located in DATA_DIR/*", "default": ""}, "canvas_width": {"type": "integer", "title": "Canvas Width", "description": "Width (X) in pixel of collage image. The higher the better the quality but also longer time to process. All processes keep aspect ratio.", "default": 1920}, "canvas_height": {"type": "integer", "title": "Canvas Height", "description": "Height (Y) in pixel of collage image. The higher the better the quality but also longer time to process. All processes keep aspect ratio.", "default": 1280}, "merge_definition": {"items": {"$ref": "#/components/schemas/CollageMergeDefinition"}, "type": "array", "title": "Merge Definition", "description": "How to arrange single images in the collage. Pos_x/Pos_y measure in pixel starting 0/0 at top-left in image. Width/Height in pixels. Aspect ratio is kept always. Predefined image files are used instead a camera capture. File needs to be located in DATA_DIR/*"}, "gallery_hide_individual_images": {"type": "boolean", "title": "Gallery Hide Individual Images", "description": "Hide individual images of collages in the gallery. Hidden images are still stored in the data folder. (Note: changing this setting will not change visibility of already captured images).", "default": false}, "canvas_fill_background_enable": {"type": "boolean", "title": "Canvas Fill Background Enable", "description": "Apply solid color background to collage", "default": false}, "canvas_fill_background_color": {"type": "string", "format": "color", "title": "Canvas Fill Background Color", "description": "Solid color used to fill background.", "default": "#008000"}, "canvas_img_background_enable": {"type": "boolean", "title": "Canvas Img Background Enable", "description": "Add image from file to background.", "default": false}, "canvas_img_background_file": {"type": "string", "title": "Canvas Img Background File", "description": "Image file to use as background filling transparent area. File needs to be located in userdata/*", "default": ""}, "canvas_img_front_enable": {"type": "boolean", "title": "Canvas Img Front Enable", "description": "Overlay image on canvas image.", "default": false}, "canvas_img_front_file": {"type": "string", "title": "Canvas Img Front File", "description": "Image file to paste on top over photos and backgrounds. Photos are visible only through transparant parts. Image needs to be transparent (PNG). File needs to be located in DATA_DIR/*", "default": ""}, "canvas_texts_enable": {"type": "boolean", "title": "Canvas Texts Enable", "description": "General enable apply texts below.", "default": false}, "canvas_texts": {"items": {"$ref": "#/components/schemas/TextsConfig"}, "type": "array", "title": "Canvas Texts", "description": "Text to overlay on final collage. Pos_x/Pos_y measure in pixel starting 0/0 at top-left in image. Font to use in text stages. File needs to be located in DATA_DIR/*", "default": []}}, "type": "object", "required": ["merge_definition"], "title": "Process collage after capture", "description": "Configure stages how to process collage after capture."}, "FrontpageTrigger": {"properties": {"title": {"type": "string", "title": "Title", "description": "Label used for the trigger button.", "default": ""}, "icon": {"type": "string", "title": "Icon", "description": "Icon used for the trigger button (any icon from material icons, see documentation).", "default": ""}}, "type": "object", "title": "Frontpage triggers configuration", "description": "Frontpage triggers configuration."}, "GpioTrigger": {"properties": {"pin": {"type": "string", "title": "Pin", "description": "GPIO the button is connected to.", "default": ""}, "trigger_on": {"type": "string", "enum": ["pressed", "released", "longpress"], "title": "Trigger On", "description": "Trigger action when button pressed (contact closed), released (contact open after closed) or longpress (hold for 0.6 seconds).", "default": "pressed"}}, "type": "object", "title": "GPIO triggers configuration", "description": "Configure trigger the user can interact with. Sources are GPIO and keyboard."}, "GroupActions": {"properties": {"image": {"items": {"$ref": "#/components/schemas/SingleImageConfigurationSet"}, "type": "array", "title": "Image", "description": "Capture single images.", "default": [{"name": "default single image settings", "actions": {"fill_background_color": "#00f", "fill_background_enable": false, "filter": "original", "img_background_enable": true, "img_background_file": "backgrounds/pink-7761356_1920.jpg", "img_frame_enable": true, "img_frame_file": "frames/pixabay-holidays-1798208_1920.png", "texts": [{"color": "#ccc", "font": "fonts/Roboto-Bold.ttf", "font_size": 40, "pos_x": 100, "pos_y": 1300, "rotate": 0, "text": "Made with the photobooth-app"}], "texts_enable": true}, "trigger": {"frontpage_trigger": {"icon": "o_photo_camera", "title": "Image"}, "gpio_trigger": {"pin": "27", "trigger_on": "pressed"}, "keyboard_trigger": {"keycode": "i"}}}]}, "collage": {"items": {"$ref": "#/components/schemas/CollageConfigurationSet"}, "type": "array", "title": "Collage", "description": "Capture collages consist of one or more still images.", "default": [{"name": "default collage settings", "actions": {"approve_autoconfirm_timeout": 15.0, "ask_approval_each_capture": true, "canvas_fill_background_color": "#008000", "canvas_fill_background_enable": false, "canvas_height": 1280, "canvas_img_background_enable": false, "canvas_img_background_file": "", "canvas_img_front_enable": true, "canvas_img_front_file": "frames/pixabay-poster-2871536_1920.png", "canvas_texts": [{"color": "#333", "font": "fonts/Roboto-Bold.ttf", "font_size": 40, "pos_x": 200, "pos_y": 1100, "rotate": 1, "text": "Have a nice day :)"}], "canvas_texts_enable": true, "canvas_width": 1920, "capture_fill_background_color": "#00f", "capture_fill_background_enable": false, "capture_img_background_enable": false, "capture_img_background_file": "", "gallery_hide_individual_images": false, "merge_definition": [{"filter": "earlybird", "height": 725, "pos_x": 160, "pos_y": 220, "predefined_image": "", "rotate": 0, "width": 510}, {"filter": "original", "height": 725, "pos_x": 705, "pos_y": 66, "predefined_image": "predefined_images/photobooth-collage-predefined-image.png", "rotate": 0, "width": 510}, {"filter": "reyes", "height": 725, "pos_x": 1245, "pos_y": 220, "predefined_image": "", "rotate": 0, "width": 510}]}, "trigger": {"frontpage_trigger": {"icon": "o_auto_awesome_mosaic", "title": "Collage"}, "gpio_trigger": {"pin": "22", "trigger_on": "pressed"}, "keyboard_trigger": {"keycode": "c"}}}]}, "animation": {"items": {"$ref": "#/components/schemas/AnimationConfigurationSet"}, "type": "array", "title": "Animation", "description": "Capture GIF animation sequence consist of one or more still images. It's not a video but a low number of still images.", "default": [{"name": "default animation settings", "actions": {"approve_autoconfirm_timeout": 15.0, "ask_approval_each_capture": false, "canvas_height": 900, "canvas_width": 1500, "gallery_hide_individual_images": true, "merge_definition": [{"duration": 2000, "filter": "crema", "predefined_image": ""}, {"duration": 2000, "filter": "inkwell", "predefined_image": ""}, {"duration": 4000, "filter": "original", "predefined_image": "predefined_images/photobooth-gif-animation-predefined-image.png"}]}, "trigger": {"frontpage_trigger": {"icon": "o_gif_box", "title": "Animation"}, "gpio_trigger": {"pin": "24", "trigger_on": "pressed"}, "keyboard_trigger": {"keycode": "g"}}}]}, "video": {"items": {"$ref": "#/components/schemas/VideoConfigurationSet"}, "type": "array", "title": "Video", "description": "Capture videos from live streaming backend.", "default": [{"name": "default boomerang video", "actions": {"boomerang": true, "video_duration": 5, "video_framerate": 15}, "trigger": {"frontpage_trigger": {"icon": "o_movie", "title": "Video"}, "gpio_trigger": {"pin": "26", "trigger_on": "pressed"}, "keyboard_trigger": {"keycode": "v"}}}]}}, "type": "object", "title": "Actions configuration", "description": "Configure actions like capture photo, video, collage and animations."}, "GroupBackendDigicamcontrol": {"properties": {"base_url": {"type": "string", "title": "Base Url", "description": "Base URL used to connect to the host running the digicamcontrol software. Usually photobooth-app and digicamcontrol are on the same computer and no adjustmend needed.", "default": "http://127.0.0.1:5513"}}, "type": "object", "title": "Digicamcontrol"}, "GroupBackendOpenCv2": {"properties": {"device_index": {"type": "integer", "title": "Device Index", "description": "Device index of webcam. Usually 0 or 1, check docs how to determine.", "default": 0}, "CAM_RESOLUTION_WIDTH": {"type": "integer", "title": "Cam Resolution Width", "description": "Resolution width requested from camera.", "default": 10000}, "CAM_RESOLUTION_HEIGHT": {"type": "integer", "title": "Cam Resolution Height", "description": "Resolution height requested from camera.", "default": 10000}, "CAMERA_TRANSFORM_HFLIP": {"type": "boolean", "title": "Camera Transform Hflip", "description": "Apply horizontal flip to image source to opencv2 backend", "default": false}, "CAMERA_TRANSFORM_VFLIP": {"type": "boolean", "title": "Camera Transform Vflip", "description": "Apply vertical flip to image source to opencv2 backend", "default": false}}, "type": "object", "title": "OpenCv2"}, "GroupBackendVirtualcamera": {"properties": {}, "type": "object", "title": "VirtualCamera"}, "GroupBackends": {"properties": {"enable_livestream": {"type": "boolean", "title": "Enable Livestream", "description": "Enable livestream (if possible)", "default": true}, "livestream_framerate": {"type": "integer", "maximum": 30.0, "minimum": 5.0, "title": "Livestream Framerate", "description": "Reduce the framerate to save cpu/gpu on device displaying the live preview", "default": 15, "ui_component": "QSlider"}, "retry_capture": {"type": "integer", "maximum": 5.0, "minimum": 1.0, "title": "Retry Capture", "description": "Number of attempts to gather a picture from backend.", "default": 3}, "group_main": {"allOf": [{"$ref": "#/components/schemas/GroupMainBackend"}], "default": {"active_backend": "VirtualCamera", "virtualcamera": {}, "webcamcv2": {"CAMERA_TRANSFORM_HFLIP": false, "CAMERA_TRANSFORM_VFLIP": false, "CAM_RESOLUTION_HEIGHT": 10000, "CAM_RESOLUTION_WIDTH": 10000, "device_index": 0}, "digicamcontrol": {"base_url": "http://127.0.0.1:5513"}}}, "group_live": {"allOf": [{"$ref": "#/components/schemas/GroupLiveBackend"}], "default": {"active_backend": "Disabled", "virtualcamera": {}, "webcamcv2": {"CAMERA_TRANSFORM_HFLIP": false, "CAMERA_TRANSFORM_VFLIP": false, "CAM_RESOLUTION_HEIGHT": 10000, "CAM_RESOLUTION_WIDTH": 10000, "device_index": 0}}}}, "type": "object", "title": "Camera Backend Config", "description": "Choose backends for still images/high quality images captured on main backend.\nIf the livepreview is enabled, the video is captured from live backend (if configured)\nor main backend."}, "GroupCommon": {"properties": {"countdown_capture_first": {"type": "number", "multipleOf": 0.1, "maximum": 20.0, "minimum": 0.0, "title": "Countdown Capture First", "description": "Countdown in seconds, started when user start a capture process", "default": 2.0}, "countdown_capture_second_following": {"type": "number", "multipleOf": 0.1, "maximum": 20.0, "minimum": 0.0, "title": "Countdown Capture Second Following", "description": "Countdown in seconds, used for second and following captures for collages", "default": 1.0}, "countdown_camera_capture_offset": {"type": "number", "multipleOf": 0.05, "maximum": 20.0, "minimum": 0.0, "title": "Countdown Camera Capture Offset", "description": "Trigger camera capture by offset earlier (in seconds). 0 trigger exactly when countdown is 0. Use to compensate for delay in camera processing for better UX.", "default": 0.2}, "logging_level": {"type": "string", "enum": ["DEBUG", "INFO", "WARNING", "ERROR"], "title": "Logging Level", "description": "Log verbosity. File is writte to disc, and latest log is displayed also in UI.", "default": "DEBUG"}, "webserver_bind_ip": {"type": "string", "title": "Webserver Bind Ip", "description": "IP/Hostname to bind the webserver to. 0.0.0.0 means bind to all IP adresses of host.", "default": "0.0.0.0"}, "webserver_port": {"type": "integer", "title": "Webserver Port", "description": "Port to serve the photobooth website. Ensure the port is available. Ports below 1024 need root!", "default": 8000}}, "type": "object", "title": "Common Config", "description": "Common config for photobooth."}, "GroupFileTransfer": {"properties": {"enabled": {"type": "boolean", "title": "Enabled", "description": "Enable the automatic file transfer to USB service. Files are copied when the USB drive is inserted.", "default": false}, "target_folder_name": {"type": "string", "title": "Target Folder Name", "description": "Name of the top-level folder on the USB drive where files will be copied to.", "default": "photobooth"}}, "type": "object", "title": "USB File Transfer Service Config", "description": "Configuration for USB File Transfer Service."}, "GroupHardwareInputOutput": {"properties": {"keyboard_input_enabled": {"type": "boolean", "title": "Keyboard Input Enabled", "description": "Enable keyboard input globally. Keyup is catched in browsers connected to the app.", "default": false}, "wled_enabled": {"type": "boolean", "title": "Wled Enabled", "description": "Enable WLED integration for user feedback during countdown and capture by LEDs.", "default": false}, "wled_serial_port": {"type": "string", "title": "Wled Serial Port", "description": "Serial port the WLED device is connected to.", "default": ""}, "gpio_enabled": {"type": "boolean", "title": "Gpio Enabled", "description": "Enable Raspberry Pi GPIOzero integration.", "default": false}, "gpio_pin_shutdown": {"type": "integer", "title": "Gpio Pin Shutdown", "description": "GPIO pin to shutdown after holding it for 2 seconds.", "default": 17}, "gpio_pin_reboot": {"type": "integer", "title": "Gpio Pin Reboot", "description": "GPIO pin to reboot after holding it for 2 seconds.", "default": 18}, "printing_enabled": {"type": "boolean", "title": "Printing Enabled", "description": "Enable printing in general.", "default": false}}, "type": "object", "title": "Hardware Input/Output Config", "description": "Configure hardware GPIO, keyboard and more. Find integration information in the documentation."}, "GroupLiveBackend": {"properties": {"active_backend": {"type": "string", "enum": ["Disabled", "VirtualCamera", "WebcamCv2"], "title": "Active Backend for Live-View and Video", "description": "Secondary backend used for live streaming and video only. Useful to stream from webcam if DSLR camera has no livestream capability.", "default": "Disabled"}, "virtualcamera": {"allOf": [{"$ref": "#/components/schemas/GroupBackendVirtualcamera"}], "default": {}}, "webcamcv2": {"allOf": [{"$ref": "#/components/schemas/GroupBackendOpenCv2"}], "default": {"device_index": 0, "CAM_RESOLUTION_WIDTH": 10000, "CAM_RESOLUTION_HEIGHT": 10000, "CAMERA_TRANSFORM_HFLIP": false, "CAMERA_TRANSFORM_VFLIP": false}}}, "type": "object", "title": "Live Backend Configuration"}, "GroupMainBackend": {"properties": {"active_backend": {"type": "string", "enum": ["VirtualCamera", "WebcamCv2", "Digicamcontrol"], "title": "Active Backend for stills", "description": "Main backend to use for high quality still captures. Also used for livepreview if backend is capable of.", "default": "VirtualCamera"}, "virtualcamera": {"allOf": [{"$ref": "#/components/schemas/GroupBackendVirtualcamera"}], "default": {}}, "webcamcv2": {"allOf": [{"$ref": "#/components/schemas/GroupBackendOpenCv2"}], "default": {"device_index": 0, "CAM_RESOLUTION_WIDTH": 10000, "CAM_RESOLUTION_HEIGHT": 10000, "CAMERA_TRANSFORM_HFLIP": false, "CAMERA_TRANSFORM_VFLIP": false}}, "digicamcontrol": {"allOf": [{"$ref": "#/components/schemas/GroupBackendDigicamcontrol"}], "default": {"base_url": "http://127.0.0.1:5513"}}}, "type": "object", "title": "Main Backend Configuration", "description": "Choose backends for still images/high quality images captured on main backend.\nIf the livepreview is enabled, the video is captured from live backend (if configured)\nor main backend."}, "GroupMediaprocessing": {"properties": {"HIRES_STILL_QUALITY": {"type": "integer", "maximum": 100.0, "minimum": 10.0, "title": "Hires Still Quality", "description": "Still JPEG full resolution quality, applied to download images and images with filter", "default": 90, "ui_component": "QSlider"}, "LIVEPREVIEW_QUALITY": {"type": "integer", "maximum": 100.0, "minimum": 10.0, "title": "Livepreview Quality", "description": "Livepreview stream JPEG image quality on supported backends", "default": 80, "ui_component": "QSlider"}, "THUMBNAIL_STILL_QUALITY": {"type": "integer", "maximum": 100.0, "minimum": 10.0, "title": "Thumbnail Still Quality", "description": "Still JPEG thumbnail quality, thumbs used in gallery list", "default": 60, "ui_component": "QSlider"}, "PREVIEW_STILL_QUALITY": {"type": "integer", "maximum": 100.0, "minimum": 10.0, "title": "Preview Still Quality", "description": "Still JPEG preview quality, preview still shown in gallery detail", "default": 75, "ui_component": "QSlider"}, "FULL_STILL_WIDTH": {"type": "integer", "maximum": 5000.0, "minimum": 800.0, "title": "Full Still Width", "description": "Width of resized full image with filters applied. For performance choose as low as possible but still gives decent print quality. Example: 1500/6inch=250dpi", "default": 1500}, "PREVIEW_STILL_WIDTH": {"type": "integer", "maximum": 2500.0, "minimum": 200.0, "title": "Preview Still Width", "description": "Width of resized preview image, height is automatically calculated to keep aspect ratio", "default": 1200}, "THUMBNAIL_STILL_WIDTH": {"type": "integer", "maximum": 1000.0, "minimum": 100.0, "title": "Thumbnail Still Width", "description": "Width of resized thumbnail image, height is automatically calculated to keep aspect ratio", "default": 400}, "removechromakey_enable": {"type": "boolean", "title": "Removechromakey Enable", "description": "Apply chromakey greenscreen removal from captured images", "default": false}, "removechromakey_keycolor": {"type": "integer", "maximum": 360.0, "minimum": 0.0, "title": "Removechromakey Keycolor", "description": "Color (H) in HSV colorspace to remove on 360\u00b0 scale.", "default": 110}, "removechromakey_tolerance": {"type": "integer", "maximum": 50.0, "minimum": 1.0, "title": "Removechromakey Tolerance", "description": "Tolerance for color (H) on chromakey color removal.", "default": 10}}, "type": "object", "title": "Process media after capture", "description": "Configure stages how to process images after capture."}, "GroupMisc": {"properties": {"video_bitrate": {"type": "integer", "maximum": 10000.0, "minimum": 1000.0, "title": "Video Bitrate", "description": "Video quality bitrate in k.", "default": 3000}, "video_compatibility_mode": {"type": "boolean", "title": "Video Compatibility Mode", "description": "Enable for improved video compatibility on iOS devices. Might reduce resulting quality slightly.", "default": false}}, "type": "object", "title": "Miscellaneous Config", "description": "Quite advanced or experimental, usually not necessary to touch. Can change any time."}, "GroupPrinter": {"properties": {"print": {"items": {"$ref": "#/components/schemas/PrintingConfigurationSet"}, "type": "array", "title": "Print", "description": "Process media items before printing.", "default": [{"name": "default print settings", "actions": {"printing_blocked_time": 10, "printing_command": "mspaint /p {filename}"}, "trigger": {"frontpage_trigger": {"icon": "", "title": ""}, "gpio_trigger": {"pin": "23", "trigger_on": "pressed"}, "keyboard_trigger": {"keycode": "p"}}}]}}, "type": "object", "title": "Printer configuration", "description": "Configure actions like capture photo, video, collage and animations."}, "GroupSharing": {"properties": {"shareservice_enabled": {"type": "boolean", "title": "Shareservice Enabled", "description": "Enable share service. To enable URL needs to be configured and dl.php script setup properly.", "default": false}, "shareservice_url": {"type": "string", "title": "Shareservice Url", "description": "URL of php script that is used to serve files and share via QR code. The default is a landingpage with further instructions how to setup.", "default": "https://photobooth-app.org/extras/shareservice-landing/"}, "shareservice_apikey": {"type": "string", "title": "Shareservice Apikey", "description": "Key to secure the download php script. Set the key in dl.php script to same value. Only if correct key is provided the shareservice works properly.", "default": "changedefault!"}, "shareservice_share_original": {"type": "boolean", "title": "Shareservice Share Original", "description": "Upload original image as received from camera. If unchecked, the full processed version is uploaded with filter and texts applied.", "default": false}, "share_custom_qr_url": {"type": "string", "title": "Share Custom Qr Url", "description": "URL displayed as QR code to image for download. Need you to sync the files on your own or allow the user to access via hotspot. {filename} is replaced by actual filename in QR code.", "default": "http://localhost/media/processed/full/{filename}"}}, "type": "object", "title": "\ud83e\udef6 Share Config", "description": "Settings about shareing media"}, "GroupUiSettings": {"properties": {"PRIMARY_COLOR": {"type": "string", "format": "color", "title": "Primary Color", "description": "Primary color (e.g. buttons, title bar).", "default": "#196cb0"}, "SECONDARY_COLOR": {"type": "string", "format": "color", "title": "Secondary Color", "description": "Secondary color (admin interface, accents).", "default": "#b8124f"}, "show_takepic_on_frontpage": {"type": "boolean", "title": "Show Takepic On Frontpage", "description": "Show button to capture single picture on frontpage.", "default": true}, "show_takecollage_on_frontpage": {"type": "boolean", "title": "Show Takecollage On Frontpage", "description": "Show button to capture collage on frontpage.", "default": true}, "show_takeanimation_on_frontpage": {"type": "boolean", "title": "Show Takeanimation On Frontpage", "description": "Show button to capture animated GIF on frontpage.", "default": true}, "show_takevideo_on_frontpage": {"type": "boolean", "title": "Show Takevideo On Frontpage", "description": "Show button to capture video on frontpage.", "default": true}, "show_gallery_on_frontpage": {"type": "boolean", "title": "Show Gallery On Frontpage", "description": "Show button to gallery on frontpage.", "default": true}, "show_admin_on_frontpage": {"type": "boolean", "title": "Show Admin On Frontpage", "description": "Show button to admin center, usually only during setup.", "default": true}, "show_automatic_slideshow_timeout": {"type": "integer", "minimum": 0.0, "title": "Show Automatic Slideshow Timeout", "description": "Timeout (seconds) after which a random order slideshow of all images is started. Set to 0 to disable.", "default": 300}, "livestream_mirror_effect": {"type": "boolean", "title": "Livestream Mirror Effect", "description": "Flip livestream horizontally to create a mirror effect feeling more natural to users.", "default": true}, "FRONTPAGE_TEXT": {"type": "string", "title": "Frontpage Text", "description": "Text/HTML displayed on frontpage.", "default": "
Hey!
Let's take some pictures!
\ud83d\udcf7\ud83d\udc95
"}, "TAKEPIC_MSG_TIME": {"type": "number", "title": "Takepic Msg Time", "description": "Offset in seconds, the smile-icon shall be shown.", "default": 0.5}, "TAKEPIC_MSG_TEXT": {"type": "string", "title": "Takepic Msg Text", "description": "Message to display at the end of the capture countdown.", "default": "\ud83d\ude03"}, "AUTOCLOSE_NEW_ITEM_ARRIVED": {"type": "integer", "title": "Autoclose New Item Arrived", "description": "Timeout in seconds a new item popup closes automatically.", "default": 30}, "GALLERY_EMPTY_MSG": {"type": "string", "title": "Gallery Empty Msg", "description": "Message displayed if gallery is empty.", "default": "
Empty, Zero, Nada! \ud83e\udd37\u200d\u2642\ufe0f
Let's take some pictures!
\ud83d\udcf7\ud83d\udc95
"}, "gallery_show_qrcode": {"type": "boolean", "title": "Gallery Show Qrcode", "description": "Show QR code in gallery. If shareservice is enabled the URL is automatically generated, if not go to share config and provide URL.", "default": true}, "gallery_show_filter": {"type": "boolean", "title": "Gallery Show Filter", "description": "Show instagramlike filter (pilgram2).", "default": true}, "gallery_filter_userselectable": {"items": {"$ref": "#/components/schemas/PilgramFilter"}, "type": "array", "title": "Gallery Filter Userselectable", "default": ["original", "_1977", "aden", "ashby", "amaro", "brannan", "brooklyn", "charmes", "clarendon", "crema", "dogpatch", "earlybird", "gingham", "ginza", "hefe", "helena", "hudson", "inkwell", "juno", "kelvin", "lark", "lofi", "ludwig", "maven", "mayfair", "moon", "nashville", "perpetua", "poprocket", "reyes", "rise", "sierra", "skyline", "slumber", "stinson", "sutro", "toaster", "valencia", "walden", "willow", "xpro2"]}, "gallery_show_download": {"type": "boolean", "title": "Gallery Show Download", "description": "Show download button in gallery.", "default": true}, "gallery_show_delete": {"type": "boolean", "title": "Gallery Show Delete", "description": "Show delete button for items in gallery.", "default": true}, "gallery_show_print": {"type": "boolean", "title": "Gallery Show Print", "description": "Show print button for items in gallery.", "default": true}}, "type": "object", "title": "Personalize the User Interface", "description": "Personalize the booth's UI."}, "HTTPValidationError": {"properties": {"detail": {"items": {"$ref": "#/components/schemas/ValidationError"}, "type": "array", "title": "Detail"}}, "type": "object", "title": "HTTPValidationError"}, "KeyboardTrigger": {"properties": {"keycode": {"type": "string", "title": "Keycode", "description": "Define keyboard keys to trigger actions.", "default": ""}}, "type": "object", "title": "Keyboard triggers configuration", "description": "Configure trigger the user can interact with. Sources are GPIO and keyboard."}, "PathListItem": {"properties": {"name": {"type": "string", "title": "Name"}, "filepath": {"type": "string", "title": "Filepath"}, "is_dir": {"type": "boolean", "title": "Is Dir"}, "size": {"type": "integer", "title": "Size"}}, "type": "object", "required": ["name", "filepath", "is_dir", "size"], "title": "PathListItem"}, "PilgramFilter": {"type": "string", "enum": ["original", "_1977", "aden", "ashby", "amaro", "brannan", "brooklyn", "charmes", "clarendon", "crema", "dogpatch", "earlybird", "gingham", "ginza", "hefe", "helena", "hudson", "inkwell", "juno", "kelvin", "lark", "lofi", "ludwig", "maven", "mayfair", "moon", "nashville", "perpetua", "poprocket", "reyes", "rise", "sierra", "skyline", "slumber", "stinson", "sutro", "toaster", "valencia", "walden", "willow", "xpro2"], "title": "PilgramFilter", "description": "Choose a Pilgram2 filter manipulating the images colors. Original means no filter to apply."}, "PrinterProcessing": {"properties": {"printing_command": {"type": "string", "title": "Printing Command", "description": "Command issued to print. Use {filename} as placeholder for the JPEG image to be printed."}, "printing_blocked_time": {"type": "integer", "title": "Printing Blocked Time", "description": "Block queue print until time is passed. Time in seconds."}}, "type": "object", "required": ["printing_command", "printing_blocked_time"], "title": "Printing Actions", "description": "Configure options to print images."}, "PrintingConfigurationSet": {"properties": {"name": {"type": "string", "title": "Name", "description": "Name to identify, only used for display in admin center.", "default": "default print settings"}, "actions": {"$ref": "#/components/schemas/PrinterProcessing"}, "trigger": {"$ref": "#/components/schemas/Trigger"}}, "type": "object", "required": ["actions", "trigger"], "title": "Process mediaitem before printing on paper", "description": "Configure stages how to process mediaitem before printing on paper."}, "SingleImageConfigurationSet": {"properties": {"name": {"type": "string", "title": "Name", "description": "Name to identify, only used for display in admin center.", "default": "default single image settings"}, "actions": {"$ref": "#/components/schemas/SingleImageProcessing"}, "trigger": {"$ref": "#/components/schemas/Trigger"}}, "type": "object", "required": ["actions", "trigger"], "title": "Postprocess single captures", "description": "Configure stages how to process images after capture."}, "SingleImageProcessing": {"properties": {"filter": {"allOf": [{"$ref": "#/components/schemas/PilgramFilter"}], "default": "original"}, "fill_background_enable": {"type": "boolean", "title": "Fill Background Enable", "description": "Apply solid color background to captured image (useful only if image is extended or background removed)", "default": false}, "fill_background_color": {"type": "string", "format": "color", "title": "Fill Background Color", "description": "Solid color used to fill background.", "default": "#00f"}, "img_background_enable": {"type": "boolean", "title": "Img Background Enable", "description": "Add image from file to background (useful only if image is extended or background removed)", "default": false}, "img_background_file": {"type": "string", "title": "Img Background File", "description": "Image file to use as background filling transparent area. File needs to be located in DATA_DIR/*", "default": ""}, "img_frame_enable": {"type": "boolean", "title": "Img Frame Enable", "description": "Mount captured image to frame.", "default": false}, "img_frame_file": {"type": "string", "title": "Img Frame File", "description": "Image file to which the captured image is mounted to. Frame determines the output image size! Photos are visible through transparant parts. Image needs to be transparent (PNG). File needs to be located in userdata/*", "default": ""}, "texts_enable": {"type": "boolean", "title": "Texts Enable", "description": "General enable apply texts below.", "default": false}, "texts": {"items": {"$ref": "#/components/schemas/TextsConfig"}, "type": "array", "title": "Texts", "description": "Text to overlay on images after capture. Pos_x/Pos_y measure in pixel starting 0/0 at top-left in image. Font to use in text stages. File needs to be located in DATA_DIR/*", "default": []}}, "type": "object", "title": "Postprocess single captures", "description": "Configure stages how to process images after capture."}, "TextsConfig": {"properties": {"text": {"type": "string", "title": "Text", "default": ""}, "pos_x": {"type": "integer", "minimum": 0.0, "title": "Pos X", "default": 50}, "pos_y": {"type": "integer", "minimum": 0.0, "title": "Pos Y", "default": 50}, "rotate": {"type": "integer", "title": "Rotate", "default": 0}, "font_size": {"type": "integer", "exclusiveMinimum": 0.0, "title": "Font Size", "default": 40}, "font": {"type": "string", "title": "Font", "default": "fonts/Roboto-Bold.ttf"}, "color": {"type": "string", "format": "color", "title": "Color", "default": "#f00"}}, "type": "object", "title": "TextsConfig"}, "Trigger": {"properties": {"frontpage_trigger": {"allOf": [{"$ref": "#/components/schemas/FrontpageTrigger"}], "default": {"title": "", "icon": ""}}, "keyboard_trigger": {"allOf": [{"$ref": "#/components/schemas/KeyboardTrigger"}], "default": {"keycode": ""}}, "gpio_trigger": {"allOf": [{"$ref": "#/components/schemas/GpioTrigger"}], "default": {"pin": "", "trigger_on": "pressed"}}}, "type": "object", "title": "Trigger configuration", "description": "Configure trigger the user can interact with. Sources are GPIO and keyboard."}, "ValidationError": {"properties": {"loc": {"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, "type": "array", "title": "Location"}, "msg": {"type": "string", "title": "Message"}, "type": {"type": "string", "title": "Error Type"}}, "type": "object", "required": ["loc", "msg", "type"], "title": "ValidationError"}, "VideoConfigurationSet": {"properties": {"name": {"type": "string", "title": "Name", "description": "Name to identify, only used for display in admin center.", "default": "default video settings"}, "actions": {"$ref": "#/components/schemas/VideoProcessing"}, "trigger": {"$ref": "#/components/schemas/Trigger"}}, "type": "object", "required": ["actions", "trigger"], "title": "Postprocess single captures", "description": "Configure stages how to process images after capture."}, "VideoProcessing": {"properties": {"video_duration": {"type": "integer", "title": "Video Duration", "description": "Maximum duration of the video. Users can stop earlier or capture is automatically stopped after set time.", "default": 5}, "boomerang": {"type": "boolean", "title": "Boomerang", "description": "Create boomerang videos, the video is replayed reverse automatically.", "default": false}, "video_framerate": {"type": "integer", "maximum": 30.0, "minimum": 1.0, "title": "Video Framerate", "description": "Video framerate (frames per second).", "default": 25}}, "type": "object", "title": "Video Actions", "description": "Configure stages how to process collage after capture."}}}} \ No newline at end of file diff --git a/docs/setup/admincenter.md b/docs/setup/admincenter.md index b831b05..04bc71b 100644 --- a/docs/setup/admincenter.md +++ b/docs/setup/admincenter.md @@ -37,50 +37,7 @@ The configuration is divided in logical sections. After changing the config use - Restore: Load current config from disk and display. - Reset: Revert to default settings and delete config files from disk. -
- ![gallery_detail](../assets/screenshots/admincenter-config.jpg){ width="500" } -
Configure the photobooth
-
- -### Common - -TODO - -### Sharing - -TODO - -### Mediaprocessing - -TODO - -### Mediaprocessing Pipeline Singleimage - -TODO - -### Mediaprocessing Pipeline Collage - -TODO - -### Mediaprocessing Pipeline Printing - -TODO - -### UI Settings - -TODO - -### Backends - -TODO - -### Hardware Input / Output - -TODO - -### Misc - -TODO +See [reference for more details](../reference/configuration.md). ## Files diff --git a/mkdocs.yml b/mkdocs.yml index 2443001..4e9e801 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -103,6 +103,7 @@ nav: - setup/printing.md - Reference: - reference/index.md + - reference/configuration.md - reference/foldersandurls.md - reference/customizetheme.md - reference/bulktransferfiles.md