Skip to content

Latest commit

 

History

History
1333 lines (1102 loc) · 53.5 KB

Pro7.md

File metadata and controls

1333 lines (1102 loc) · 53.5 KB

ProPresenter7-API

Documenting RenewedVision's undocumented network protocols with examples.

This document refers to ProPresenter 7.

Warning: Be careful! It's easy to CRASH ProPresenter when sending invalid messages!

Both the Remote Control and the Stage Display protocols are unencrypted text-based WebSocket connections from the client App to the ProPresenter instance.

IMPORTANT DIFFERENCE FROM PRO 6

Pro 7 implements a slightly different WebSocket protocol that most websocket clients should handle transparently; however, in rare cases this implementation can cause problems for developers. Of note is that the protocol requires two http request headers to be included in addition to the standard WebSocket upgrade headers.

Sec-WebSocket-Key and Sec-WebSocket-Version

The key must be a Base64 encoded key similar to this: a8STpzZ6qXqaQvnHNehseA==

The Version must be at least 13.

Note also that Pro7 incorrectly expects the HTTP header keys to appear in CamelCase which violates the HTTP spec, but nonetheless is what it is.

Therefore, a correctly formed connection to the Pro7 server must have headers looking like this:

GET /stagedisplay HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: /8STpzZ6qXqaQvnHNehseA==
Sec-WebSocket-Version: 13

Remote Control

Connecting

ws://[host]:[port]/remote

Authenticate

COMMAND TO SEND:

{"action":"authenticate","protocol":"701","password":"control"}
  • Once connected, you must authenticate first before sending any other messages.
  • The value of the protocol parameter is used to perform a version check on the remote client.
  • ProPresenter 7.0 - 7.4.1 checks for a value here of at least 700 - otherwise it denies authentication and returns "Protocol out of date. Update application"
  • ProPresenter 7.4.2 and later checks for a value here of at least 701 - otherwise it denies authentication and returns "Protocol out of date. Update application"

EXPECTED RESPONSE:

{"controller":1,"authenticated":1,"error":"","majorVersion":7,"minorVersion":6,"action":"authenticate"}
  • authenticated should be 1 when sucessful and 0 when failed. The application version numbers are included in this response.

Trigger a Pro7 Macro

{"action":"macrosTrigger","macroName":"<Case-Sensitive, Name of Macro To Trigger>"}
or
{"action":"macrosTrigger","macroID":"<Internal ID of Macro To Trigger>"}
or
{"action":"macrosTrigger","macroIndex":<Zero-Based, Index of Macro To Trigger>}
  • You can optionally send a macrosTrigger action that includes multiple identifier parameters, they are handled in the following order of precedence:
  1. macroID
  2. macroName
  3. macroIndex

Request list of all Pro7 Macros

{"action":"macrosRequest"}

EXPECTED RESPONSE:

{
	"action": "macrosRequest",
	"macros": [
		{
			"macroName": "<Case-sensitive name of Macro>",
			"macroID": "<Internal ID of Macro>",
			"macroColor": "<red> <green> <blue>",
			"macroIndex": <Zero-based index of Macro>
		}
	]
}
  • Return a list of all Macros.
  • Color is provided as three double values separated by spaces: "r g b"

Trigger a Pro7 Look

{"action":"looksTrigger","lookName":"<Case-Sensitive, Name of Look To Trigger>"}
or
{"action":"looksTrigger","lookID":"<Internal ID of Look To Trigger>"}
or
{"action":"looksTrigger","lookIndex":<Zero-Based, Index of Look To Trigger>}
  • Triggering a Pro7 Look makes that Look "Live"
  • You can optionally send a looksTrigger action that includes multiple identifier parameters, they are handled in the following order of precedence:
  1. lookID
  2. lookName
  3. lookIndex

Request list of all Pro7 Looks

{"action": "looksRequest"}

EXPECTED RESPONSE:

{
	"action": "looksRequest",
	"looks": [
		{
			"lookName": "<Case sensitive name of Look>",
			"lookID": "<Internal ID of Look>",
			"lookIndex": <Zero based index of Look>
		}
	],
	"activeLook": {
		"lookName": "<name>",
		"lookID": "<identifier>"
	}
}
  • Return a list of all Looks.
  • Includes the currently active Look (activeLook)

Get Library (all presentations in all libraries)

COMMAND TO SEND:

{"action":"libraryRequest"}

EXPECTED RESPONSE (MacOS):

{
  "library": [
    "\/Path\/To\/ProPresenter\/Library\/Come Alive (Dry Bones).pro",
    "\/Path\/To\/ProPresenter\/Library\/Pour Out My Heart.pro",
    "\/Path\/To\/ProPresenter\/Library\/Away in a manger.pro",
	"... ALL PRESENTATIONS IN ALL LIBRARIES AS A SINGLE LIST ..."
  ],
  "action": "libraryRequest"
}
  • Note the use of slashes in the response. ProPresenter expects library requests to follow this pattern exactly.

EXPECTED RESPONSE (Windows):

{
  "library": [
        "C:/Users/media/Documents/ProPresenter/Libraries/Default/Alive.pro",
        "C:/Users/media/Documents/ProPresenter/Libraries/Default/All Because of Jesus.pro",
        "C:/Users/media/Documents/ProPresenter/Libraries/Sample/Announcements.pro",
        "C:/Users/media/Documents/ProPresenter/Libraries/Sample/Another In The Fire.pro",
	"... ALL PRESENTATIONS IN ALL LIBRARIES AS A SINGLE LIST ..."
  ],
  "action": "libraryRequest"
}

Get All Playlists

COMMAND TO SEND:

{"action":"playlistRequestAll"}

EXPECTED RESPONSE:

This request returns all playlists according to the following format.

{
  "playlistAll": [
    {
      "playlistLocation": "0",
      "playlistType": "playlistTypePlaylist",
      "playlistName": "Default",
      "playlist": [
        {
          "playlistItemName": "!~ PRE-SERVICE",
          "playlistItemLocation": "0:0",
          "playlistItemType": "playlistItemTypePresentation"
        },
      ]
    },
    {
      "playlistLocation": "1",
      "playlistType": "playlistTypeGroup",
      "playlistName": "2017",
      "playlist": [
        {
          "playlistLocation": "1.0",
          "playlistType": "playlistTypePlaylist",
          "playlistName": "2017-01-28-Vision Dinner",
          "playlist": [
            {
              "playlistItemName": "!MISC2",
              "playlistItemLocation": "1.0:0",
              "playlistItemType": "playlistItemTypePresentation"
            },
            {
              "playlistItemName": "!MISC1",
              "playlistItemLocation": "1.0:1",
              "playlistItemType": "playlistItemTypePresentation"
            },
          ]
        },
      ]
    }
  ],
  "action": "playlistRequestAll"
}

playlistItemThumbnail will be included for some items - these will be Base64 encoded Jpegs

Request Presentation (set of slides)

COMMAND TO SEND:

{
    "action": "presentationRequest",
    "presentationPath": "\/Path\/To\/ProPresenter\/Library\/Song 1 Title.pro",
    "presentationSlideQuality": 25
}
  • presentationPath is required and it can be structured in one of three ways
    • It can be a full path to a pro file but note that all slashes need to be preceeded by a backslash in the request.
    • It can be the basename of a presentation that exists in the library (eg. Song 1 Title.pro) is (sometimes?) good enough.
    • It can be the "playlist location" of the presentation. The playlist location is determined according to the order of items in the playlist window, the items are indexed from 0, and groups are sub-indexed with a dot, then presentations inside the playlist are indexed with a colon and a numeral. That is, the first presentation of the first playlist is 0:0 and if the first playlist item is a group, the first item of the first playlist of that group is 0.0:0
    • A presentationPath specified with a playlist address and not a filename seems to be the most reliable.
  • presentationSlideQuality is optional. It determines the resolution / size of the slide previews sent from ProPresenter. If left blank, high quality previews will be sent. If set to 0 previews will not be generated at all. The remote app asks for quality 25 first and then follows it up with a second request for quality 100.

EXPECTED RESPONSE:

{
    "action": "presentationCurrent",
    "presentation": {
        "presentationSlideGroups": [
            {
                "groupName": "[SLIDE GROUP NAME]",
                "groupColor": "0 0 0 1", // RGBA scale is from 0-1
                "groupSlides": [
                    {
                        "slideEnabled": true,
                        "slideNotes": "",
                        "slideAttachmentMask": 0,
                        "slideText": "[SLIDE TEXT HERE]",
                        "slideImage": "[BASE64 ENCODED IMAGE]",
                        "slideIndex": "0",
                        "slideTransitionType": -1,
                        "slideLabel": "[SLIDE LABEL]",
                        "slideColor": "0 0 0 1"
                    }
                ]
            },
        ],
        "presentationName": "[PRESENTATION TITLE]",
        "presentationHasTimeline": 0,
        "presentationCurrentLocation": "[PRESENTATION PATH OF CURRENTLY ACTIVE SLIDE]"
    }
}
  • The response contains presentationCurrent as the action instead of presentationRequest. This seems to be a bug in the ProPresenter response.
  • The presentationCurrentLocation is not the location of the presentation you requested. It is the path of the presentation whose slide is currently active.
  • You can distinguish this response from the real presentationCurrent request because that response will include presentationPath as a field at the root level of the response.

Request Current Presentation

COMMAND TO SEND:

{ "action":"presentationCurrent", "presentationSlideQuality": 25}

EXPECTED RESPONSE:

Same response as requestPresentation except this response will include presentationPath as a field at the root level of the response.

  • NOTE: This action only seems to work if there is an active slide. When ProPresenter starts, no slide is marked active, so this action returns nothing until a slide has been triggered.

TODO: Investigate impact of presentationSlideQuality values for Pro7 on both MacOS and Win (0 will return slides without any slide image in Pro6, but Pro7 on MacOS seems to always include them)

Get Index of Current Slide

COMMAND TO SEND:

{"action":"presentationSlideIndex"}

EXPECTED RESPONSE:

{"action":"presentationSlideIndex","slideIndex":"0"}
  • NOTE: The ProPresenter remote issues this action every time it issues a presentationRequest action. In Pro7, when a presentation is automatically advancing on the annoucements layer while a user is triggering slides in another presentation on the normal output layer - the index returns can sometimes vary between the two different presentations!

Trigger Slide

COMMAND TO SEND:

{"action":"presentationTriggerIndex","slideIndex":"3","presentationPath":"[PRESENTATION PATH]"}

EXPECTED RESPONSE:

{"slideIndex":3,"action":"presentationTriggerIndex","presentationPath":"[PRESENTATION PATH]"}

NOTES:

  • Currently, the protocol requires SENDING the slideIndex as a string value even though the response delivers it as an integer value.
  • Also, the presentation path needs to be either a full pathname to the .pro file on the computer or the playlistIndex:playlistItemIndex style

presentationTriggerIndex messages are sent to all connected clients to inform them all when a slide is triggered (if a user triggers a slide, you will get this message sent to you)

Trigger Next Slide

COMMAND TO SEND:

{"action":"presentationTriggerNext"}

Trigger Previous Slide

COMMAND TO SEND:

{"action":"presentationTriggerPrevious"}

Start Audio Cue

COMMAND TO SEND:

{"action":"audioStartCue", "audioChildPath":"[Same as Presentation Path Format]", "audioPath":"0"}

TODO: describe audioPath paramter required for Pro7 on MacOS

Audio Play/Pause Toggle

COMMAND TO SEND:

{"action":"audioPlayPause"}

TimeLine Play/Pause Toggle

COMMAND TO SEND:

{"action":"timelinePlayPause","presentationPath":"[PRESENTATION PATH]"}

TimeLine Rewind

COMMAND TO SEND:

{"action":"timelineRewind":,"presentationPath":"[PRESENTATION PATH]"}

Get Clock (Timers) Info

COMMAND TO SEND:

{"action":"clockRequest"}

Start Recieving Updates for Clocks (Timers)

COMMAND TO SEND:

{"action":"clockStartSendingCurrentTime"}

Stop Recieving Updates for Clocks (Timers)

COMMAND TO SEND:

{"action":"clockStopSendingCurrentTime"}

Request all Clocks

COMMAND TO SEND:

{"action":"clockRequest"}

EXPECTED RESPONSE:

{
  "clockInfo": [
    {
      "clockType": 0,
      "clockState": false,
      "clockName": "Countdown 1",
      "clockIsPM": 0,
      "clockDuration": "0:10:00",
      "clockOverrun": false,
      "clockEndTime": "--:--:--",
      "clockTime": "--:--:--"
    },
    {
      "clockType": 1,
      "clockState": false,
      "clockName": "Countdown 2",
      "clockIsPM": 1,
      "clockDuration": "7:00:00",
      "clockOverrun": false,
      "clockEndTime": "--:--:--",
      "clockTime": "--:--:--"
    },
    {
      "clockType": 2,
      "clockState": false,
      "clockName": "Elapsed Time",
      "clockIsPM": 0,
      "clockDuration": "0:00:00",
      "clockOverrun": false,
      "clockEndTime": "--:--:--",
      "clockTime": "13:52:23"
    }
  ],
  "action": "clockRequest"
}

Get Clock Current Times

COMMAND TO SEND:

{"action":"clockCurrentTimes"}

EXPECTED RESPONSE:

{"action":"clockCurrentTimes","clockTimes":["0:10:00","--:--:--","13:52:23"]}

Start a Clock (Timer)

COMMAND TO SEND:

{"action":"clockStart","clockIndex":"0"}

EXPECTED RESPONSE:

{"clockTime":"0:00:00","clockState":1,"clockIndex":0,"clockInfo":[1,1,"0:00:00"],"action":"clockStartStop"}
  • clockState indicates if the clock is running or not
  • Clocks are referenced by index. See reply from "clockRequest" action above to learn indices.

Stop a Clock (Timer)

COMMAND TO SEND:

{"action":"clockStop","clockIndex":"0"}

EXPECTED RESPONSE:

{"clockTime":"0:00:00","clockState":0,"clockIndex":0,"clockInfo":[1,1,"0:00:00"],"action":"clockStartStop"}
  • clockState indicates if the clock is running or not
  • Clocks are referenced by index. See reply from "clockRequest" action above to learn indices.

Reset a Clock (Timer)

COMMAND TO SEND:

{"action":"clockReset","clockIndex":"0"}
  • Clocks are referenced by index. See reply from "clockRequest" action above to learn indices.

Update a Clock (Timer) (eg edit time)

COMMAND TO SEND:

{
  "action":"clockUpdate",
  "clockIndex":"1",
  "clockType":"0",
  "clockTime":"09:04:00",
  "clockOverrun":"false",
  "clockIsPM":"1",
  "clockName":"Countdown 2",
  "clockElapsedTime":"0:02:00"
}
  • Clocks are referenced by index. See reply from "clockRequest" action above to learn indexes.
  • Not all parameters are required for each clock type.
    • Countdown clocks only need "clockTime".
    • Elapsed Time Clocks need "clockTime" and optionally will use "clockElapsedTime" if you send it (to set the End Time).
    • You can rename a clock by optionally including the clockName.
    • Type 0 is Countdown
    • Type 1 is CountDown to Time
    • Type 2 is Elapsed Time.
    • Overrun can be modified if you choose to include that as well.

Start Getting Clock Updates

COMMAND TO SEND:

{"action":"clockStartSendingCurrentTime"}

EXPECTED RESPONSE (every second):

{"action":"clockCurrentTimes","clockTimes":["0:10:00","--:--:--","13:52:23"]}

Additional Clock Actions

clockResetAll, clockStopAll, clockStartAll

Get all Messages

COMMAND TO SEND:

{"action":"messageRequest"}

EXPECTED RESPONSE:

{
  "action": "messageRequest",
  "messages": [
    {
      "messageComponents": [
        "message:",
        "${Message}"
      ],
      "messageTitle": "Message"
    },
    {
      "messageComponents": [
        "Session will begin in: ",
        "${Countdown 1: H:MM:SS}"
      ],
      "messageTitle": "Countdown"
    },
    {
      "messageComponents": [
        "${Message}"
      ],
      "messageTitle": "Message"
    },
    {
      "messageComponents": [
        "Service starts in ",
        "${countDownTimerName_1: H:MM:SS}"
      ],
      "messageTitle": "Countdown"
    }
  ]
}
  • The key is everything inside the curly braces ${} so that the key for a countdown looks like this Countdown 1: H:MM:SS.
  • If the key refers to a countdown, the value is used to update the duration field of the countdown timer, but will not perform a "reset".
  • If the key refers to a countdown and the countdown is not running, this will resume it from its current value.

Display a Message

Display a message identified by its index. Add as many key, value pairs as you like. Keys can be name of timers.

COMMAND TO SEND:

{"action":"messageSend","messageIndex":0,"messageKeys":"["key1","key2"....]","messageValues":"["Value1","Value2"...]"}

AN EXAMPLE USING THE DATA ABOVE:

{"action":"messageSend","messageIndex":0,"messageKeys":["Message"],"messageValues":["Test"]}

Hide a Message

COMMAND TO SEND: Hide a message identified by its index

{"action":"messageHide","messageIndex","0"}

Clear All

COMMAND TO SEND:

{"action":"clearAll"}

Clear Slide

COMMAND TO SEND:

{"action":"clearText"}

Clear Props

COMMAND TO SEND:

{"action":"clearProps"}

Clear Audio

COMMAND TO SEND:

{"action":"clearAudio"}

Clear Video

COMMAND TO SEND:

{"action":"clearVideo"}

Clear Telestrator

COMMAND TO SEND:

{"action":"clearTelestrator"}

Clear To Logo

COMMAND TO SEND:

{"action":"clearToLogo"}

Show Stage Display Message

COMMAND TO SEND:

{"action":"stageDisplaySendMessage","stageDisplayMessage":"Type a Message Here"}

Hide Stage Display Message

COMMAND TO SEND:

{"action":"stageDisplayHideMessage"}

Get Stage Display Layouts

COMMAND TO SEND:

{"action":"stageDisplaySets"}

EXPECTED RESPONSE:

{
    "stageScreens": [
        {
            "stageScreenName": "Stage Screen",
            "stageScreenUUID": "8e383232-2a89-4802-a507-93c09642fa68",
            "stageLayoutSelectedLayoutUUID": "54cc1c01-606c-434f-ad02-91b090d8ea41"
        }
    ],
    "stageLayouts": [
        {
            "stageLayoutName": "Current/Next Stacked - Music",
            "stageLayoutUUID": "687e061b-c3fc-48a7-be8c-40837b622fed"
        },
        {
            "stageLayoutName": "Music - text only",
            "stageLayoutUUID": "54cc1c01-606c-434f-ad02-91b090d8ea41"
        }
    ],
    "action": "stageDisplaySets"
}

Select Stage Display Layout

COMMAND TO SEND:

{"action":"stageDisplayChangeLayout","stageLayoutUUID":"687e061b-c3fc-48a7-be8c-40837b622fed","stageScreenUUID":"8e383232-2a89-4802-a507-93c09642fa68"}

EXPECTED RESPONSE:

{
    "stageScreens": [
        {
            "stageScreenName": "Stage Screen",
            "stageScreenUUID": "8e383232-2a89-4802-a507-93c09642fa68",
            "stageLayoutSelectedLayoutUUID": "687e061b-c3fc-48a7-be8c-40837b622fed"
        }
    ],
    "stageLayouts": [
        {
            "stageLayoutName": "Current/Next Stacked - Music",
            "stageLayoutUUID": "687e061b-c3fc-48a7-be8c-40837b622fed"
        },
        {
            "stageLayoutName": "Music - text only",
            "stageLayoutUUID": "54cc1c01-606c-434f-ad02-91b090d8ea41"
        }
    ],
    "action": "stageDisplaySets"
}

TODO: Complete documentation for remaining remote commands...

audioRequest (Get audio Playlist) audioCurrentSong (Get current audio playing) audioIsPlaying (Seems to always return true from MacOS when an image background is triggered)

Stage Display API

Connecting

ws://[host]:[port]/stagedisplay

Authenticate

COMMAND TO SEND:

{"pwd":PASSWORD,"ptl":610,"acn":"ath"}

EXPECTED RESPONSE:

{"acn":"ath","ath":true,"err":""}

Get All Stage Display Layouts

COMMAND TO SEND:

{"acn":"asl"}

EXPECTED RESPONSE:

{
  "acn": "asl",
  "ary": [
    {
      "brd": true,
      "uid": "753B184F-CCCD-42F9-A883-D1DF86E1FFB8",
      "zro": 0,
      "oCl": "1.000000 0.000000 0.000000",
      "fme": [
        {
          "ufr": "{{0.025000000000000001, 0.37418655097613884}, {0.40000000000000002, 0.50108459869848154}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 60,
          "nme": "Current Slide",
          "typ": 1
        },
        {
          "ufr": "{{0.024390243902439025, 0.27223427331887201}, {0.40182926829268295, 0.10412147505422993}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 60,
          "nme": "Current Slide Notes",
          "typ": 3
        },
        {
          "ufr": "{{0.45000000000000001, 0.47396963123644253}, {0.29999999999999999, 0.40021691973969631}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 60,
          "nme": "Next Slide",
          "typ": 2
        },
        {
          "ufr": "{{0.45000000000000001, 0.37310195227765725}, {0.29999999999999999, 0.1019522776572668}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 60,
          "nme": "Next Slide Notes",
          "typ": 4
        },
        {
          "ufr": "{{0.77500000000000002, 0.37418655097613884}, {0.20000000000000001, 0.40130151843817785}}",
          "nme": "Chord Chart",
          "mde": 1,
          "typ": 9
        },
        {
          "ufr": "{{0.050000000000000003, 0.89913232104121477}, {0.20000000000000001, 0.1019522776572668}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 200,
          "nme": "Clock",
          "typ": 6
        },
        {
          "ufr": "{{0.40000000000000002, 0.89913232104121477}, {0.20000000000000001, 0.1019522776572668}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 200,
          "nme": "Video Countdown",
          "typ": 8
        },
        {
          "ufr": "{{0.050000000000000003, 0.024945770065075923}, {0.90000000000000002, 0.10086767895878525}}",
          "fCl": "0.000000 1.000000 0.000000",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "fCh": true,
          "tSz": 60,
          "nme": "Message",
          "typ": 5
        },
        {
          "ufr": "{{0.68978420350609759, 0.89488713394793928}, {0.20000000000000001, 0.1019522776572668}}",
          "uid": "47E8B48C-0D61-4EFC-9517-BF9FB894C8E2",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 200,
          "nme": "Countdown 1",
          "typ": 7
        }
      ],
      "ovr": true,
      "acn": "sl",
      "nme": "Default"
    },
    {
      "brd": false,
      "uid": "50AF3434-4328-40AC-846F-CC9583381311",
      "zro": 0,
      "oCl": "0.985948 0.000000 0.026951",
      "fme": [
        {
          "ufr": "{{0.60304878048780486, 0.1963123644251627}, {0.39695121951219514, 0.80043383947939262}}",
          "mde": 1,
          "tCl": "0.990463 1.000000 0.041173",
          "tAl": 1,
          "tSz": 80,
          "nme": "Current Slide",
          "typ": 1
        },
        {
          "ufr": "{{0.0024390243902439024, 0.0021691973969631237}, {0.599390243902439, 0.99457700650759218}}",
          "mde": 1,
          "tCl": "0.679783 1.000000 0.885215",
          "tAl": 0,
          "tSz": 120,
          "nme": "Current Slide Notes",
          "typ": 3
        },
        {
          "ufr": "{{0.60304878048780486, 0.0021691973969631237}, {0.39512195121951221, 0.19305856832971802}}",
          "uid": "D1096B85-CF31-4365-A6E6-ED94264E7DCA",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 200,
          "nme": "Elapsed Time",
          "typ": 7
        }
      ],
      "ovr": false,
      "acn": "sl",
      "nme": "Easter Closer"
    },
    {
      "brd": false,
      "uid": "F8260B13-9C5B-4D2C-80F1-C72346759F11",
      "zro": 0,
      "oCl": "0.985948 0.000000 0.026951",
      "fme": [
        {
          "ufr": "{{0.025000000000000001, 0.37418655097613884}, {0.40000000000000002, 0.50108459869848154}}",
          "mde": 2,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 60,
          "nme": "Current Slide",
          "typ": 1
        },
        {
          "ufr": "{{0.025000000000000001, 0.27440347071583515}, {0.40000000000000002, 0.10086767895878525}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 60,
          "nme": "Current Slide Notes",
          "typ": 3
        },
        {
          "ufr": "{{0.45000000000000001, 0.47396963123644253}, {0.29999999999999999, 0.40021691973969631}}",
          "mde": 0,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 60,
          "nme": "Next Slide",
          "typ": 2
        },
        {
          "ufr": "{{0.45000000000000001, 0.37310195227765725}, {0.29999999999999999, 0.1019522776572668}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 60,
          "nme": "Next Slide Notes",
          "typ": 4
        },
        {
          "ufr": "{{0.77500000000000002, 0.37418655097613884}, {0.20000000000000001, 0.40130151843817785}}",
          "nme": "Chord Chart",
          "mde": 1,
          "typ": 9
        },
        {
          "ufr": "{{0, 0.89804772234273322}, {0.20060975609756099, 0.10303687635574837}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 200,
          "nme": "Clock",
          "typ": 6
        },
        {
          "ufr": "{{0.79878048780487809, 0.89696312364425168}, {0.20060975609756099, 0.10303687635574837}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 200,
          "nme": "Video Countdown",
          "typ": 8
        },
        {
          "ufr": "{{0.050000000000000003, 0.024945770065075923}, {0.90000000000000002, 0.10086767895878525}}",
          "fCl": "0.135296 1.000000 0.024919",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "fCh": true,
          "tSz": 60,
          "nme": "Message",
          "typ": 5
        }
      ],
      "ovr": false,
      "acn": "sl",
      "nme": "Live Current - Static Next - no borders"
    },
    {
      "brd": true,
      "uid": "12CB7383-FA02-47BB-B501-747ADCA860D3",
      "zro": 0,
      "oCl": "0.985948 0.000000 0.026951",
      "fme": [
        {
          "ufr": "{{0.025000000000000001, 0.37418655097613884}, {0.40000000000000002, 0.50108459869848154}}",
          "mde": 0,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 60,
          "nme": "Current Slide",
          "typ": 1
        },
        {
          "ufr": "{{0.025000000000000001, 0.27440347071583515}, {0.40000000000000002, 0.10086767895878525}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 60,
          "nme": "Current Slide Notes",
          "typ": 3
        },
        {
          "ufr": "{{0.45000000000000001, 0.47396963123644253}, {0.29999999999999999, 0.40021691973969631}}",
          "mde": 0,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 60,
          "nme": "Next Slide",
          "typ": 2
        },
        {
          "ufr": "{{0.45000000000000001, 0.37310195227765725}, {0.29999999999999999, 0.1019522776572668}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 60,
          "nme": "Next Slide Notes",
          "typ": 4
        },
        {
          "ufr": "{{0.77500000000000002, 0.37418655097613884}, {0.20000000000000001, 0.40130151843817785}}",
          "nme": "Chord Chart",
          "mde": 1,
          "typ": 9
        },
        {
          "ufr": "{{0, 0.89804772234273322}, {0.20060975609756099, 0.10303687635574837}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 200,
          "nme": "Clock",
          "typ": 6
        },
        {
          "ufr": "{{0.79878048780487809, 0.89696312364425168}, {0.20060975609756099, 0.10303687635574837}}",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "tSz": 200,
          "nme": "Video Countdown",
          "typ": 8
        },
        {
          "ufr": "{{0.050000000000000003, 0.024945770065075923}, {0.90000000000000002, 0.10086767895878525}}",
          "fCl": "0.135296 1.000000 0.024919",
          "mde": 1,
          "tCl": "1.000000 1.000000 1.000000",
          "tAl": 2,
          "fCh": true,
          "tSz": 60,
          "nme": "Message",
          "typ": 5
        }
      ],
      "ovr": false,
      "acn": "sl",
      "nme": "Static Current - Static Next"
    }
  ]
}
  • acn of asl means "all stage layouts"
  • ary indicates array of stage layouts
  • nme indicates layout name
  • ovr indicates if overrun color should be used
  • oCl indicates color for timer overruns
  • brd indicates if borders and labels should be used
  • uid indicates layout uid
  • zro indicates if zeroes should be removed from times
  • fme indicates array of frame layout specifications
  • frame positions are indicated by ufr and specified in terms of screen percentages
  • frame name is indicated by nme
  • frame text color is indicated by tCl
  • frame font size is indicated by tSz
  • frame message flash color is indicated by fCl
  • frame use message flash indicated by fCh
  • frame timer uid is indicated by uid
  • frame mode is indicated by mde
    • mode 0: static image
    • mode 1: text
    • mode 2: live slide
  • frame type is indicated by typ and determines what content goes in this frame
    • type 1: current slide
    • type 2: next slide
    • type 3: current slide notes
    • type 4: next slide notes
    • type 5: Stage Message (uses message flash values)
    • type 6: Clock
    • type 7: Timer Display (uses uid to specify timer)
    • type 8: Video Countdown
    • type 9: Chord Chart

On New Stage Display Selected

{
  "brd": true,
  "uid": "12CB7383-FA02-47BB-B501-747ADCA860D3",
  "zro": 0,
  "oCl": "0.985948 0.000000 0.026951",
  "fme": [
    {
      "ufr": "{{0.025000000000000001, 0.37418655097613884}, {0.40000000000000002, 0.50108459869848154}}",
      "mde": 0,
      "tCl": "1.000000 1.000000 1.000000",
      "tAl": 2,
      "tSz": 60,
      "nme": "Current Slide",
      "typ": 1
    },
    {
      "ufr": "{{0.025000000000000001, 0.27440347071583515}, {0.40000000000000002, 0.10086767895878525}}",
      "mde": 1,
      "tCl": "1.000000 1.000000 1.000000",
      "tAl": 2,
      "tSz": 60,
      "nme": "Current Slide Notes",
      "typ": 3
    },
    {
      "ufr": "{{0.45000000000000001, 0.47396963123644253}, {0.29999999999999999, 0.40021691973969631}}",
      "mde": 0,
      "tCl": "1.000000 1.000000 1.000000",
      "tAl": 2,
      "tSz": 60,
      "nme": "Next Slide",
      "typ": 2
    },
    {
      "ufr": "{{0.45000000000000001, 0.37310195227765725}, {0.29999999999999999, 0.1019522776572668}}",
      "mde": 1,
      "tCl": "1.000000 1.000000 1.000000",
      "tAl": 2,
      "tSz": 60,
      "nme": "Next Slide Notes",
      "typ": 4
    },
    {
      "ufr": "{{0.77500000000000002, 0.37418655097613884}, {0.20000000000000001, 0.40130151843817785}}",
      "nme": "Chord Chart",
      "mde": 1,
      "typ": 9
    },
    {
      "ufr": "{{0, 0.89804772234273322}, {0.20060975609756099, 0.10303687635574837}}",
      "mde": 1,
      "tCl": "1.000000 1.000000 1.000000",
      "tAl": 2,
      "tSz": 200,
      "nme": "Clock",
      "typ": 6
    },
    {
      "ufr": "{{0.79878048780487809, 0.89696312364425168}, {0.20060975609756099, 0.10303687635574837}}",
      "mde": 1,
      "tCl": "1.000000 1.000000 1.000000",
      "tAl": 2,
      "tSz": 200,
      "nme": "Video Countdown",
      "typ": 8
    },
    {
      "ufr": "{{0.050000000000000003, 0.024945770065075923}, {0.90000000000000002, 0.10086767895878525}}",
      "fCl": "0.135296 1.000000 0.024919",
      "mde": 1,
      "tCl": "1.000000 1.000000 1.000000",
      "tAl": 2,
      "fCh": true,
      "tSz": 60,
      "nme": "Message",
      "typ": 5
    }
  ],
  "ovr": false,
  "acn": "sl",
  "nme": "Static Current - Static Next"
}
  • acn of sl indicates this is a single stage layout

Request Current Stage Display Layout

COMMAND TO SEND:

{"acn":"psl"}

EXPECTED RESPONSE (also used when stage display is updated):

{"acn":"psl","uid":"[STAGE DISPLAY UID]"}

Request Frame Values for Stage Display

COMMAND TO SEND:

{"acn":"fv","uid":"[STAGE DISPLAY UID"}

On New Live Slide Frame

{
  "RVLiveStream_action": "RVLiveStream_frameData",
  "RVLiveStream_frameDataLength": 14625,
  "RVLiveStream_frameData": "/9j//gAQTGF2YzU3LjUzLjEwMAD/2wBDAAgEBAQEBAUFBQUFBQYGBgYGBgYGBgYGBgYHBwcICAgHBwcGBgcHCAgICAkJCQgICAgJCQoKCgwMCwsODg4RERT/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/wAARCAEOAeADASIAAhIAAxIA/9oADAMBAAIRAxEAPwDwqiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKKAAAooooAACiiigAAKKKOtAAAUUux/7p/I0bH/ALp/I0AACUUux/7p/I0bH/un8jQAAJRS7H/un8jRsf8Aun8jQAAJRS7H/un8jRsf+6fyNAAAlFLsf+6fyNGx/wC6fyNAAAlFLsf+6fyNGx/7p/I0AACUUux/7p/I0bH/ALp/I0AACUUux/7p/I0bH/un8jQAAJRS7H/un8jRsf8Aun8jQAAJRS7H/un8jRsf+6fyNAAAlFLsf+6fyNGx/wC6fyNAAAlFLsf+6fyNGx/7p/I0AACUUux/7p/I0bH/ALp/I0AACUUux/7p/I0bH/un8jQAAJRS7H/un8jRsf8Aun8jQAAJRS7H/un8jRsf+6fyNAAAlFLsf+6fyNGx/wC6fyNAAAlFLsf+6fyNGx/7p/I0AACUUux/7p/I0bH/ALp/I0AACUUux/7p/I0bH/un8jQAAJRS7H/un8jRsf8Aun8jQAAJRS7H/un8jRsf+6fyNAAAlFLsf+6fyNGx/wC6fyNAAAlFLsf+6fyNGx/7p/I0AACUUux/7p/I0bH/ALp/I0AACUUux/7p/I0bH/un8jQAAJRRRQAAFFFFAAAUUUUAABXafs9wQXPxg8LRTxRzRtcT7o5EV0b/AEWY8qwIPPqK4uu2/Z0/5LL4U/6+bj/0kmoAAPrL/hH9B/6BOm/+Adv/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"
}
  • Base64 Encoded Image Bytes
  • Only the Current Slide can be "Live"
  • Live slide images are pushed to the client over the websocket.

To Get Static Slide Images

TO RETRIEVE STATIC SLIDE IMAGES:

Issue a normal GET request to the following URL:

http://PROPRESENTER_IP:PROPRESENTER_PORT/stage/image/SLIDE_UID

EXPECTED RESPONSE:

rgba tiff image

( DIFFERENCE FROM 6: Pro6 would send images as standard jpeg, but Pro7 transmits them as rgba tiff images with no content-type set in the header )

On New Time

EXPECTED RESPONSE:

{"acn":"sys","txt":" 11:17 AM"}

On Timer Update

EXPECTED RESPONSE:

{ acn: 'tmr',
  uid: '[TIMER UID]',
  txt: '--:--:--' }

On New Slide

EXPECTED RESPONSE:

{
	"acn": "fv",
	"ary": [
		{
			"acn": "cs",			# CURRENT SLIDE
			"uid": "[SLIDE UID]",
			"txt": "[SLIDE TEXT]"
		},
		{
			"acn": "ns",			# NEXT SLIDE
			"uid": "[SLIDE UID]",
			"txt": "[SLIDE TEXT]"
		},
		{
			"acn": "csn",			# CURRENT SLIDE NOTES
			"txt": "[SLIDE NOTES]"
		},
		{
			"acn": "nsn",			# NEXT SLIDE NOTES
			"txt": "[SLIDE NOTES]"
		}
	]
}