propresenter7-php-lib/proto/proApi.proto
Thorsten Bus 8e80a8af88 Upgrade proto schema to ProPresenter Proto 19beta
Sync the bundled .proto definitions with greyshirtguy/ProPresenter7-Proto
"Proto 19beta" (dumped from ProPresenter v19 beta build 318767123,
2025-06-05). This pulls in the schema for ProPresenter 19 features
including new advertisement groups, custom options, media metadata,
prop API v1, transport API, feature flags, PSB workspace, and zone
definitions, plus refactored analytics tracked events.

Strategy: merge rather than wholesale replace. All Proto 19beta files
overwrite our existing copies so we pick up the field/message updates
upstream made between 7.16.2 and 19beta. Eleven new .proto files are
added: advertisementGroup, analyticsEdit, analyticsMediaManagement,
analyticsPowerPoint, analyticsTrackedEvents, analyticsTriggerCue,
customOptions, mediaMetadata, proCoreFeatureFlags, psbWorkspace, zone.
Three google/protobuf well-known types (any, source_context, type) are
added for completeness; only descriptor.proto is actually imported.

Five proto files are kept that are not part of Proto 19beta upstream:
calendar.proto and keyMappings.proto were extracted from PP binaries
to support our parse-calendar and parse-key-mappings tools, while
analyticsCapture/Update/WHMStore.proto are retained from the prior
7.16.2 set so existing generated descriptors keep loading.

generated/ is regenerated from scratch with `protoc --php_out=generated
--proto_path=proto *.proto` (protoc 29.3, google/protobuf PHP 4.33.5).
The full PHPUnit suite (369 tests, 1298 assertions) still passes
without any source changes - the new schema is wire-compatible with our
reference files and high-level wrappers.

Documentation references to "v7.16.2" are updated to "Proto 19beta" in
LICENSE, doc/formats/pp_song_spec.md, pp_playlist_spec.md,
pp_bundle_spec.md, and doc/internal/decisions.md.
2026-05-04 07:19:24 +02:00

664 lines
18 KiB
Protocol Buffer
Executable file

syntax = "proto3";
package rv.data;
option cc_enable_arenas = true;
option csharp_namespace = "Pro.SerializationInterop.RVProtoData";
option swift_prefix = "RVData_";
import "applicationInfo.proto";
import "messages.proto";
import "proApiV1.proto";
import "timers.proto";
import "rvtimestamp.proto";
import "uuid.proto";
message ProApiIn {
oneof MessageType {
.rv.data.ProLink.HandlerIn handler_in = 1;
.rv.data.NetworkAPI network_api = 2;
.rv.data.NetworkAPI_v1 network_api_v1 = 3;
}
}
message ProApiOut {
oneof MessageType {
.rv.data.ProLink.HandlerOut handler_out = 1;
.rv.data.ProLink.ClientAction client_action = 2;
.rv.data.NetworkAPI network_api = 3;
.rv.data.NetworkAPI_v1 network_api_v1 = 4;
}
}
message AirplayConfiguration {
bool enable = 1;
string fairplay_path = 2;
string service_name = 3;
string password = 4;
bool password_enabled = 5;
string uuid = 6;
}
message ProApiNetworkConfiguration {
bool enable_network = 1;
uint32 port = 2;
string network_name = 3;
bool remote_enable = 4;
bool remote_control_enable = 5;
string remote_control_password = 6;
bool remote_observe_enable = 7;
string remote_observe_password = 8;
bool stage_enable = 9;
string stage_password = 10;
bool link_enable = 11;
string web_resource_root = 12;
uint32 tcp_stream_port = 13;
bool tcp_stream_enable = 14;
.rv.data.AirplayConfiguration airplay = 15;
}
message ProLink {
message GroupDefinition {
message Member {
string ip = 1;
uint32 port = 2;
}
.rv.data.Timestamp timestamp = 1;
string secret = 2;
string name = 3;
repeated .rv.data.ProLink.GroupDefinition.Member members = 4;
.rv.data.UUID group_identifier = 5;
}
message ZeroConfig {
message NetworkEnvironment {
repeated .rv.data.ProLink.GroupDefinition available_groups = 1;
repeated .rv.data.ProLink.MemberStatus available_devices = 2;
}
message MulticastPacket {
.rv.data.ProLink.GroupDefinition group = 1;
.rv.data.ProLink.MemberStatus device = 2;
}
}
message TowerMessage {
message TowerStatusRequest {
}
message TowerStatusResponse {
string member_name = 2;
oneof Response {
.rv.data.ProLink.GroupDefinition group_definition = 1;
}
}
message TowerAddMemberRequest {
oneof Request {
.rv.data.ProLink.GroupDefinition group_definition = 1;
.rv.data.ProLink.GroupDefinition.Member joining_member = 2;
}
}
message TowerRemoveMemberRequest {
.rv.data.ProLink.GroupDefinition.Member removing_member = 1;
}
message TowerAddMemberResponse {
message Accept {
}
enum DeclineReason {
ALREADY_IN_GROUP = 0;
USER_DECLINED = 1;
}
oneof Response {
.rv.data.ProLink.GroupDefinition group_definition = 1;
.rv.data.ProLink.TowerMessage.TowerAddMemberResponse.Accept accept = 2;
.rv.data.ProLink.TowerMessage.TowerAddMemberResponse.DeclineReason decline_reason = 3;
}
}
message TowerHeartbeatRequest {
}
message TowerHeartbeatResponse {
.rv.data.ProLink.GroupDefinition group_definition = 1;
}
}
message MemberStatus {
enum ConnectionStatus {
CONNECTION_STATUS_UNKNOWN = 0;
CONNECTION_STATUS_CONNECTED = 1;
CONNECTION_STATUS_DISCONNECTED = 2;
}
string ip = 1;
uint32 port = 2;
string name = 3;
.rv.data.ApplicationInfo.Platform platform = 4;
string os_version = 5;
string host_description = 6;
string api_version = 7;
.rv.data.ProLink.MemberStatus.ConnectionStatus connection_status = 8;
}
message ClientAction {
message AddConnection {
string ip = 1;
uint32 port = 2;
string group_name = 3;
}
message RemoveConnection {
string ip = 1;
uint32 port = 2;
}
message CancelAction {
}
message RenderTime {
uint64 latency = 1;
uint64 render_time = 2;
}
oneof ActionType {
.rv.data.ProLink.ClientAction.AddConnection add_connection = 1;
.rv.data.ProLink.ClientAction.RemoveConnection remove_connection = 2;
.rv.data.ProLink.ClientAction.CancelAction cancel_action = 3;
.rv.data.ProLink.ClientAction.RenderTime render_time = 4;
}
}
message HandlerIn {
message GroupName {
}
message GroupDefinitionRequest {
}
message GroupJoinConfirmation {
string name = 1;
}
message GroupJoinPassword {
string name = 1;
}
message AddConnectionResult {
message Success {
.rv.data.ProLink.GroupDefinition new_group_definition = 1;
}
message Failure {
message Unexpected {
}
message Declined {
}
message Timeout {
}
message LinkDisabled {
}
message InOtherGroup {
string member_name = 1;
string group_name = 2;
}
message InvalidIpAddress {
}
message AlreadyInGroup {
string member_name = 1;
string group_name = 2;
}
message CouldNotAdd {
string member_name = 1;
}
message CouldNotJoin {
string group_name = 1;
}
oneof Reason {
.rv.data.ProLink.HandlerIn.AddConnectionResult.Failure.Unexpected unexpected = 1;
.rv.data.ProLink.HandlerIn.AddConnectionResult.Failure.Declined declined = 2;
.rv.data.ProLink.HandlerIn.AddConnectionResult.Failure.Timeout timeout = 3;
.rv.data.ProLink.HandlerIn.AddConnectionResult.Failure.LinkDisabled link_disabled = 4;
.rv.data.ProLink.HandlerIn.AddConnectionResult.Failure.InOtherGroup in_other_group = 5;
.rv.data.ProLink.HandlerIn.AddConnectionResult.Failure.InvalidIpAddress invalid_ip_address = 6;
.rv.data.ProLink.HandlerIn.AddConnectionResult.Failure.AlreadyInGroup already_in_group = 7;
.rv.data.ProLink.HandlerIn.AddConnectionResult.Failure.CouldNotAdd could_not_add = 8;
.rv.data.ProLink.HandlerIn.AddConnectionResult.Failure.CouldNotJoin could_not_join = 9;
}
}
oneof Result {
.rv.data.ProLink.HandlerIn.AddConnectionResult.Success success = 1;
.rv.data.ProLink.HandlerIn.AddConnectionResult.Failure failure = 2;
}
}
message MemberStatusChange {
repeated .rv.data.ProLink.MemberStatus members = 1;
}
message ProPresenterInfo {
}
message ServerState {
string local_ip = 1;
string public_ip = 2;
uint32 port = 3;
bool success = 4;
uint32 tcp_stream_port = 5;
bool tcp_stream_success = 6;
}
message ConfigurationRequest {
}
message LogRequest {
enum Severity {
SEVERITY_DEBUG = 0;
SEVERITY_DEBUG_WARNING = 1;
SEVERITY_INFO = 2;
SEVERITY_WARNING = 3;
SEVERITY_ERROR = 4;
SEVERITY_FATAL_ERROR = 5;
}
.rv.data.ProLink.HandlerIn.LogRequest.Severity severity = 1;
string message = 2;
}
oneof Request {
.rv.data.ProLink.HandlerIn.GroupName group_name = 1;
.rv.data.ProLink.HandlerIn.GroupDefinitionRequest group_definition_request = 2;
.rv.data.ProLink.HandlerIn.GroupJoinConfirmation group_join_confirmation = 3;
.rv.data.ProLink.HandlerIn.GroupJoinPassword group_join_password = 4;
.rv.data.ProLink.HandlerIn.AddConnectionResult add_connection_result = 5;
.rv.data.ProLink.GroupDefinition group_update = 6;
.rv.data.ProLink.HandlerIn.MemberStatusChange member_status_change = 7;
.rv.data.ProLink.HandlerIn.ProPresenterInfo propresenter_info = 8;
.rv.data.ProLink.HandlerIn.ServerState server_state = 9;
.rv.data.ProLink.HandlerIn.ConfigurationRequest configuration_request = 10;
.rv.data.ProLink.ZeroConfig.NetworkEnvironment zeroconfig_network_environment_change = 11;
.rv.data.ProLink.HandlerIn.LogRequest log_request = 12;
}
}
message HandlerOut {
message GroupName {
string name = 1;
}
message GroupJoinConfirmation {
bool accept = 1;
}
message GroupJoinPassword {
string password = 1;
}
message ProPresenterInfo {
.rv.data.ApplicationInfo.Platform platform = 1;
string os_version = 2;
string host_description = 3;
}
oneof Response {
.rv.data.ProLink.HandlerOut.GroupName group_name = 1;
.rv.data.ProLink.GroupDefinition group_definition = 2;
.rv.data.ProLink.HandlerOut.GroupJoinConfirmation group_join_confirmation = 3;
.rv.data.ProLink.HandlerOut.GroupJoinPassword group_join_password = 4;
.rv.data.ProLink.HandlerOut.ProPresenterInfo propresenter_info = 5;
.rv.data.ProApiNetworkConfiguration configuration = 6;
}
}
}
message NetworkAPI {
message LinkStatus {
.rv.data.ApplicationInfo.Platform platform = 1;
string os_version = 2;
string version = 3;
string description = 4;
.rv.data.NetworkAPI.Group group_info = 5;
}
message Group {
message Member {
string ip_address = 1;
int32 port = 2;
}
string name = 1;
repeated .rv.data.NetworkAPI.Group.Member members = 2;
}
message GroupChange {
oneof Change {
.rv.data.NetworkAPI.GroupInvite invite = 1;
.rv.data.NetworkAPI.GroupJoin join = 2;
.rv.data.NetworkAPI.GroupKick kick = 3;
.rv.data.NetworkAPI.GroupStatus status = 4;
}
}
message GroupResponse {
message Success {
}
message Status {
string member_name = 1;
string group_name = 2;
}
oneof Response {
.rv.data.NetworkAPI.GroupResponse.Success success = 1;
.rv.data.NetworkAPI.GroupResponse.Status status = 2;
}
}
message GroupStatus {
.rv.data.NetworkAPI.Group.Member member = 1;
}
message GroupInvite {
.rv.data.NetworkAPI.Group group_info = 1;
string secret = 2;
.rv.data.NetworkAPI.Group.Member prospect = 3;
}
message GroupJoin {
.rv.data.NetworkAPI.Group.Member sponsor = 1;
.rv.data.NetworkAPI.Group.Member prospect = 2;
}
message GroupKick {
.rv.data.NetworkAPI.Group.Member member = 1;
}
message ServerState {
string local_ip = 1;
string public_ip = 2;
int32 port = 3;
}
message Action {
message API_Clear {
enum Layer {
LAYER_UNKNOWN = 0;
LAYER_VIDEO_INPUT = 1;
LAYER_MEDIA = 2;
LAYER_PRESENTATION = 3;
LAYER_ANNOUNCEMENT = 4;
LAYER_PROP = 5;
LAYER_MESSAGE = 6;
LAYER_AUDIO = 7;
}
oneof ClearInfo {
.rv.data.NetworkAPI.Action.API_Clear.Layer layer = 1;
.rv.data.NetworkAPI.IndexOrNameIdentifier group_identifier = 2;
}
}
message API_TwoStepTrigger {
enum Operation {
OPERATION_PREROLL = 0;
OPERATION_ACTIVATE = 1;
}
uint64 id = 1;
.rv.data.NetworkAPI.Action.API_TwoStepTrigger.Operation operation = 2;
uint64 render_time = 3;
oneof TriggerData {
.rv.data.NetworkAPI.Action.API_Trigger.Presentation presentation = 4;
.rv.data.NetworkAPI.Action.API_Trigger.Media media = 5;
.rv.data.NetworkAPI.Action.API_Trigger.VideoInput video_input = 6;
.rv.data.NetworkAPI.Action.API_Trigger.Audio audio = 7;
.rv.data.NetworkAPI.Action.API_Prop.TriggerProp prop = 8;
.rv.data.NetworkAPI.Action.API_Message.TriggerMessage message = 9;
}
}
message API_PrerollComplete {
uint64 id = 1;
bool failed = 2;
uint64 latency = 3;
}
message API_Trigger {
message Presentation {
reserved 1;
message PlaylistPresentation {
repeated .rv.data.NetworkAPI.IndexOrNameIdentifier index_path_components = 1;
}
message LibraryPresentation {
.rv.data.NetworkAPI.IndexOrNameIdentifier library_component = 1;
.rv.data.NetworkAPI.IndexOrNameIdentifier presentation_component = 2;
.rv.data.NetworkAPI.IndexOrNameIdentifier cue_component = 3;
}
oneof PresentationSource {
.rv.data.NetworkAPI.Action.API_Trigger.Presentation.PlaylistPresentation playlist_index_path = 2;
.rv.data.NetworkAPI.Action.API_Trigger.Presentation.LibraryPresentation library_index_path = 3;
}
}
message Media {
repeated .rv.data.NetworkAPI.IndexOrNameIdentifier index_path_components = 1;
}
message VideoInput {
.rv.data.NetworkAPI.IndexOrNameIdentifier video_input_id = 1;
}
message Audio {
repeated .rv.data.NetworkAPI.IndexOrNameIdentifier index_path_components = 1;
}
oneof TriggerData {
.rv.data.NetworkAPI.Action.API_Trigger.Presentation presentation = 1;
.rv.data.NetworkAPI.Action.API_Trigger.Media media = 2;
.rv.data.NetworkAPI.Action.API_Trigger.VideoInput video_input = 3;
.rv.data.NetworkAPI.Action.API_Trigger.Audio audio = 4;
}
}
message API_Transport {
message Play {
}
message Pause {
}
message SkipBackward {
int32 seconds = 1;
}
message SkipForward {
int32 seconds = 1;
}
message GoToEnd {
int32 seconds_to_end = 1;
}
enum TransportLayer {
TRANSPORT_LAYER_UNKNOWN = 0;
TRANSPORT_LAYER_PRESENTATION = 1;
TRANSPORT_LAYER_ANNOUNCEMENT = 2;
TRANSPORT_LAYER_AUDIO = 3;
}
.rv.data.NetworkAPI.Action.API_Transport.TransportLayer layer = 1;
oneof TransportAction {
.rv.data.NetworkAPI.Action.API_Transport.Play play = 2;
.rv.data.NetworkAPI.Action.API_Transport.Pause pause = 3;
.rv.data.NetworkAPI.Action.API_Transport.SkipBackward skip_backward = 4;
.rv.data.NetworkAPI.Action.API_Transport.SkipForward skip_forward = 5;
.rv.data.NetworkAPI.Action.API_Transport.GoToEnd go_to_end = 6;
}
}
message API_Prop {
message TriggerProp {
.rv.data.NetworkAPI.IndexOrNameIdentifier identifier = 1;
repeated .rv.data.NetworkAPI.IndexOrNameIdentifier index_path_components = 2;
}
message ClearProp {
.rv.data.NetworkAPI.IndexOrNameIdentifier identifier = 1;
repeated .rv.data.NetworkAPI.IndexOrNameIdentifier index_path_components = 2;
}
oneof PropAction {
.rv.data.NetworkAPI.Action.API_Prop.TriggerProp trigger = 1;
.rv.data.NetworkAPI.Action.API_Prop.ClearProp clear = 2;
}
}
message API_Timer {
message StartTimer {
.rv.data.NetworkAPI.IndexOrNameIdentifier identifier = 1;
}
message StopTimer {
.rv.data.NetworkAPI.IndexOrNameIdentifier identifier = 1;
}
message ResetTimer {
.rv.data.NetworkAPI.IndexOrNameIdentifier identifier = 1;
}
message ConfigureTimer {
.rv.data.NetworkAPI.IndexOrNameIdentifier identifier = 1;
.rv.data.Timer.Configuration configuration = 2;
}
oneof TimerAction {
.rv.data.NetworkAPI.Action.API_Timer.StartTimer start = 1;
.rv.data.NetworkAPI.Action.API_Timer.StopTimer stop = 2;
.rv.data.NetworkAPI.Action.API_Timer.ResetTimer reset = 3;
.rv.data.NetworkAPI.Action.API_Timer.ConfigureTimer configure = 4;
}
}
message API_Message {
message TriggerMessage {
.rv.data.NetworkAPI.IndexOrNameIdentifier identifier = 1;
repeated .rv.data.Message.TokenValue token_values = 2;
}
message ClearMessage {
.rv.data.NetworkAPI.IndexOrNameIdentifier identifier = 1;
}
oneof MessageAction {
.rv.data.NetworkAPI.Action.API_Message.TriggerMessage trigger = 1;
.rv.data.NetworkAPI.Action.API_Message.ClearMessage clear = 2;
}
}
message API_Macro {
.rv.data.NetworkAPI.IndexOrNameIdentifier identifier = 1;
repeated .rv.data.NetworkAPI.IndexOrNameIdentifier index_path_components = 2;
}
message API_Look {
.rv.data.NetworkAPI.IndexOrNameIdentifier identifier = 1;
}
message API_Stage {
message StageLayouts {
repeated .rv.data.NetworkAPI.IndexOrNameIdentifierPair layouts = 1;
}
message StageMessage {
message ShowMessage {
string message = 1;
}
message ClearMessage {
}
message HideMessage {
}
oneof Action {
.rv.data.NetworkAPI.Action.API_Stage.StageMessage.ShowMessage show_message = 1;
.rv.data.NetworkAPI.Action.API_Stage.StageMessage.ClearMessage clear_message = 2;
.rv.data.NetworkAPI.Action.API_Stage.StageMessage.HideMessage hide_message = 3;
}
}
oneof StageAction {
.rv.data.NetworkAPI.Action.API_Stage.StageLayouts layouts = 1;
.rv.data.NetworkAPI.Action.API_Stage.StageMessage message = 2;
}
}
message StatusRequest {
}
message API_Status {
}
message API_StatusResponse {
.rv.data.ProLink.GroupDefinition group_definition = 1;
.rv.data.ProLink.MemberStatus status = 2;
}
oneof Command {
.rv.data.NetworkAPI.Action.API_Clear clear = 1;
.rv.data.NetworkAPI.Action.API_Trigger trigger = 2;
.rv.data.NetworkAPI.Action.API_Transport transport = 3;
.rv.data.NetworkAPI.Action.API_Prop prop = 4;
.rv.data.NetworkAPI.Action.API_Timer timer = 5;
.rv.data.NetworkAPI.Action.API_Message message_ = 6;
.rv.data.NetworkAPI.Action.API_Macro macro = 7;
.rv.data.NetworkAPI.Action.API_Look look = 8;
.rv.data.NetworkAPI.Action.API_Stage stage = 9;
.rv.data.NetworkAPI.Action.API_Status status = 10;
.rv.data.NetworkAPI.Action.API_StatusResponse status_response = 11;
.rv.data.NetworkAPI.Action.API_TwoStepTrigger two_step_trigger = 12;
.rv.data.NetworkAPI.Action.API_PrerollComplete preroll_complete = 13;
}
}
message IndexOrNameIdentifier {
oneof Component {
int32 index = 1;
string name = 2;
}
}
message IndexOrNameIdentifierPair {
.rv.data.NetworkAPI.IndexOrNameIdentifier key = 1;
.rv.data.NetworkAPI.IndexOrNameIdentifier value = 2;
}
oneof Command {
.rv.data.NetworkAPI.Action action = 1;
.rv.data.NetworkAPI.ServerState server_state = 2;
.rv.data.NetworkAPI.GroupChange group_change = 5;
.rv.data.NetworkAPI.GroupResponse group_response = 6;
}
}