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.
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
ws://[host]:[port]/remote
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.
{"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:
- macroID
- macroName
- macroIndex
{"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"
{"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:
- lookID
- lookName
- lookIndex
{"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)
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"
}
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
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 is0.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 to0
previews will not be generated at all. The remote app asks for quality25
first and then follows it up with a second request for quality100
.
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 ofpresentationRequest
. 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 includepresentationPath
as a field at the root level of the response.
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)
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!
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 theplaylistIndex: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)
COMMAND TO SEND:
{"action":"presentationTriggerNext"}
COMMAND TO SEND:
{"action":"presentationTriggerPrevious"}
COMMAND TO SEND:
{"action":"audioStartCue", "audioChildPath":"[Same as Presentation Path Format]", "audioPath":"0"}
TODO: describe audioPath paramter required for Pro7 on MacOS
COMMAND TO SEND:
{"action":"audioPlayPause"}
COMMAND TO SEND:
{"action":"timelinePlayPause","presentationPath":"[PRESENTATION PATH]"}
COMMAND TO SEND:
{"action":"timelineRewind":,"presentationPath":"[PRESENTATION PATH]"}
COMMAND TO SEND:
{"action":"clockRequest"}
COMMAND TO SEND:
{"action":"clockStartSendingCurrentTime"}
COMMAND TO SEND:
{"action":"clockStopSendingCurrentTime"}
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"
}
COMMAND TO SEND:
{"action":"clockCurrentTimes"}
EXPECTED RESPONSE:
{"action":"clockCurrentTimes","clockTimes":["0:10:00","--:--:--","13:52:23"]}
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.
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.
COMMAND TO SEND:
{"action":"clockReset","clockIndex":"0"}
- Clocks are referenced by index. See reply from "clockRequest" action above to learn indices.
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.
COMMAND TO SEND:
{"action":"clockStartSendingCurrentTime"}
EXPECTED RESPONSE (every second):
{"action":"clockCurrentTimes","clockTimes":["0:10:00","--:--:--","13:52:23"]}
clockResetAll
, clockStopAll
, clockStartAll
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 thisCountdown 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 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"]}
COMMAND TO SEND: Hide a message identified by its index
{"action":"messageHide","messageIndex","0"}
COMMAND TO SEND:
{"action":"clearAll"}
COMMAND TO SEND:
{"action":"clearText"}
COMMAND TO SEND:
{"action":"clearProps"}
COMMAND TO SEND:
{"action":"clearAudio"}
COMMAND TO SEND:
{"action":"clearVideo"}
COMMAND TO SEND:
{"action":"clearTelestrator"}
COMMAND TO SEND:
{"action":"clearToLogo"}
COMMAND TO SEND:
{"action":"stageDisplaySendMessage","stageDisplayMessage":"Type a Message Here"}
COMMAND TO SEND:
{"action":"stageDisplayHideMessage"}
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"
}
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"
}
audioRequest (Get audio Playlist) audioCurrentSong (Get current audio playing) audioIsPlaying (Seems to always return true from MacOS when an image background is triggered)
ws://[host]:[port]/stagedisplay
COMMAND TO SEND:
{"pwd":PASSWORD,"ptl":610,"acn":"ath"}
EXPECTED RESPONSE:
{"acn":"ath","ath":true,"err":""}
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
ofasl
means "all stage layouts"ary
indicates array of stage layoutsnme
indicates layout nameovr
indicates if overrun color should be usedoCl
indicates color for timer overrunsbrd
indicates if borders and labels should be useduid
indicates layout uidzro
indicates if zeroes should be removed from timesfme
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
{
"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
ofsl
indicates this is a single stage layout
COMMAND TO SEND:
{"acn":"psl"}
EXPECTED RESPONSE (also used when stage display is updated):
{"acn":"psl","uid":"[STAGE DISPLAY UID]"}
COMMAND TO SEND:
{"acn":"fv","uid":"[STAGE DISPLAY UID"}
{
"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 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 )
EXPECTED RESPONSE:
{"acn":"sys","txt":" 11:17 AM"}
EXPECTED RESPONSE:
{ acn: 'tmr',
uid: '[TIMER UID]',
txt: '--:--:--' }
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]"
}
]
}