// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.cloud.video.stitcher.v1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/cloud/video/stitcher/v1/ad_tag_details.proto";
import "google/cloud/video/stitcher/v1/cdn_keys.proto";
import "google/cloud/video/stitcher/v1/live_configs.proto";
import "google/cloud/video/stitcher/v1/sessions.proto";
import "google/cloud/video/stitcher/v1/slates.proto";
import "google/cloud/video/stitcher/v1/stitch_details.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";

option go_package = "cloud.google.com/go/video/stitcher/apiv1/stitcherpb;stitcherpb";
option java_multiple_files = true;
option java_outer_classname = "VideoStitcherServiceProto";
option java_package = "com.google.cloud.video.stitcher.v1";

// Video-On-Demand content stitching API allows you to insert ads
// into (VoD) video on demand files. You will be able to render custom
// scrubber bars with highlighted ads, enforce ad policies, allow
// seamless playback and tracking on native players and monetize
// content with any standard VMAP compliant ad server.
service VideoStitcherService {
  option (google.api.default_host) = "videostitcher.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform";

  // Creates a new CDN key.
  rpc CreateCdnKey(CreateCdnKeyRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/cdnKeys"
      body: "cdn_key"
    };
    option (google.api.method_signature) = "parent,cdn_key,cdn_key_id";
    option (google.longrunning.operation_info) = {
      response_type: "google.cloud.video.stitcher.v1.CdnKey"
      metadata_type: "google.cloud.video.stitcher.v1.OperationMetadata"
    };
  }

  // Lists all CDN keys in the specified project and location.
  rpc ListCdnKeys(ListCdnKeysRequest) returns (ListCdnKeysResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/cdnKeys"
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns the specified CDN key.
  rpc GetCdnKey(GetCdnKeyRequest) returns (CdnKey) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/cdnKeys/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Deletes the specified CDN key.
  rpc DeleteCdnKey(DeleteCdnKeyRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/cdnKeys/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "google.cloud.video.stitcher.v1.OperationMetadata"
    };
  }

  // Updates the specified CDN key. Only update fields specified
  // in the call method body.
  rpc UpdateCdnKey(UpdateCdnKeyRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{cdn_key.name=projects/*/locations/*/cdnKeys/*}"
      body: "cdn_key"
    };
    option (google.api.method_signature) = "cdn_key,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "google.cloud.video.stitcher.v1.CdnKey"
      metadata_type: "google.cloud.video.stitcher.v1.OperationMetadata"
    };
  }

  // Creates a client side playback VOD session and returns the full
  // tracking and playback metadata of the session.
  rpc CreateVodSession(CreateVodSessionRequest) returns (VodSession) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/vodSessions"
      body: "vod_session"
    };
    option (google.api.method_signature) = "parent,vod_session";
  }

  // Returns the full tracking, playback metadata, and relevant ad-ops
  // logs for the specified VOD session.
  rpc GetVodSession(GetVodSessionRequest) returns (VodSession) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/vodSessions/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Returns a list of detailed stitching information of the specified VOD
  // session.
  rpc ListVodStitchDetails(ListVodStitchDetailsRequest)
      returns (ListVodStitchDetailsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/vodSessions/*}/vodStitchDetails"
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns the specified stitching information for the specified VOD session.
  rpc GetVodStitchDetail(GetVodStitchDetailRequest) returns (VodStitchDetail) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/vodSessions/*/vodStitchDetails/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Return the list of ad tag details for the specified VOD session.
  rpc ListVodAdTagDetails(ListVodAdTagDetailsRequest)
      returns (ListVodAdTagDetailsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/vodSessions/*}/vodAdTagDetails"
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns the specified ad tag detail for the specified VOD session.
  rpc GetVodAdTagDetail(GetVodAdTagDetailRequest) returns (VodAdTagDetail) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/vodSessions/*/vodAdTagDetails/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Return the list of ad tag details for the specified live session.
  rpc ListLiveAdTagDetails(ListLiveAdTagDetailsRequest)
      returns (ListLiveAdTagDetailsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/liveSessions/*}/liveAdTagDetails"
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns the specified ad tag detail for the specified live session.
  rpc GetLiveAdTagDetail(GetLiveAdTagDetailRequest) returns (LiveAdTagDetail) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/liveSessions/*/liveAdTagDetails/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a slate.
  rpc CreateSlate(CreateSlateRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/slates"
      body: "slate"
    };
    option (google.api.method_signature) = "parent,slate,slate_id";
    option (google.longrunning.operation_info) = {
      response_type: "google.cloud.video.stitcher.v1.Slate"
      metadata_type: "google.cloud.video.stitcher.v1.OperationMetadata"
    };
  }

  // Lists all slates in the specified project and location.
  rpc ListSlates(ListSlatesRequest) returns (ListSlatesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/slates"
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns the specified slate.
  rpc GetSlate(GetSlateRequest) returns (Slate) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/slates/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Updates the specified slate.
  rpc UpdateSlate(UpdateSlateRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{slate.name=projects/*/locations/*/slates/*}"
      body: "slate"
    };
    option (google.api.method_signature) = "slate,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "google.cloud.video.stitcher.v1.Slate"
      metadata_type: "google.cloud.video.stitcher.v1.OperationMetadata"
    };
  }

  // Deletes the specified slate.
  rpc DeleteSlate(DeleteSlateRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/slates/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "google.cloud.video.stitcher.v1.OperationMetadata"
    };
  }

  // Creates a new live session.
  rpc CreateLiveSession(CreateLiveSessionRequest) returns (LiveSession) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/liveSessions"
      body: "live_session"
    };
    option (google.api.method_signature) = "parent,live_session";
  }

  // Returns the details for the specified live session.
  rpc GetLiveSession(GetLiveSessionRequest) returns (LiveSession) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/liveSessions/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Registers the live config with the provided unique ID in
  // the specified region.
  rpc CreateLiveConfig(CreateLiveConfigRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/liveConfigs"
      body: "live_config"
    };
    option (google.api.method_signature) = "parent,live_config,live_config_id";
    option (google.longrunning.operation_info) = {
      response_type: "google.cloud.video.stitcher.v1.LiveConfig"
      metadata_type: "google.cloud.video.stitcher.v1.OperationMetadata"
    };
  }

  // Lists all live configs managed by the Video Stitcher that
  // belong to the specified project and region.
  rpc ListLiveConfigs(ListLiveConfigsRequest)
      returns (ListLiveConfigsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/liveConfigs"
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns the specified live config managed by the Video
  // Stitcher service.
  rpc GetLiveConfig(GetLiveConfigRequest) returns (LiveConfig) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/liveConfigs/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Deletes the specified live config.
  rpc DeleteLiveConfig(DeleteLiveConfigRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/liveConfigs/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "google.cloud.video.stitcher.v1.OperationMetadata"
    };
  }
}

// Request message for VideoStitcherService.createCdnKey.
message CreateCdnKeyRequest {
  // Required. The project in which the CDN key should be created, in the form
  // of `projects/{project_number}/locations/{location}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "videostitcher.googleapis.com/CdnKey"
    }
  ];

  // Required. The CDN key resource to create.
  CdnKey cdn_key = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The ID to use for the CDN key, which will become the final
  // component of the CDN key's resource name.
  //
  // This value should conform to RFC-1034, which restricts to
  // lower-case letters, numbers, and hyphen, with the first character a
  // letter, the last a letter or a number, and a 63 character maximum.
  string cdn_key_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// Request message for VideoStitcherService.listCdnKeys.
message ListCdnKeysRequest {
  // Required. The project that contains the list of CDN keys, in the form of
  // `projects/{project_number}/locations/{location}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "videostitcher.googleapis.com/CdnKey"
    }
  ];

  // Requested page size. Server may return fewer items than requested.
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 2;

  // A token identifying a page of results the server should return.
  string page_token = 3;

  // Filtering results
  string filter = 4;

  // Hint for how to order the results
  string order_by = 5;
}

// Response message for VideoStitcher.ListCdnKeys.
message ListCdnKeysResponse {
  // List of CDN keys.
  repeated CdnKey cdn_keys = 1;

  // A token identifying a page of results the server should return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// Request message for VideoStitcherService.getCdnKey.
message GetCdnKeyRequest {
  // Required. The name of the CDN key to be retrieved, in the form of
  // `projects/{project}/locations/{location}/cdnKeys/{id}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "videostitcher.googleapis.com/CdnKey"
    }
  ];
}

// Request message for VideoStitcherService.deleteCdnKey.
message DeleteCdnKeyRequest {
  // Required. The name of the CDN key to be deleted, in the form of
  // `projects/{project_number}/locations/{location}/cdnKeys/{id}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "videostitcher.googleapis.com/CdnKey"
    }
  ];
}

// Request message for VideoStitcherService.updateCdnKey.
message UpdateCdnKeyRequest {
  // Required. The CDN key resource which replaces the resource on the server.
  CdnKey cdn_key = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The update mask applies to the resource.
  // For the `FieldMask` definition, see
  // https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask
  google.protobuf.FieldMask update_mask = 2
      [(google.api.field_behavior) = REQUIRED];
}

// Request message for VideoStitcherService.createVodSession
message CreateVodSessionRequest {
  // Required. The project and location in which the VOD session should be
  // created, in the form of `projects/{project_number}/locations/{location}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "videostitcher.googleapis.com/VodSession"
    }
  ];

  // Required. Parameters for creating a session.
  VodSession vod_session = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for VideoStitcherService.getVodSession
message GetVodSessionRequest {
  // Required. The name of the VOD session to be retrieved, in the form of
  // `projects/{project_number}/locations/{location}/vodSessions/{id}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "videostitcher.googleapis.com/VodSession"
    }
  ];
}

// Request message for VideoStitcherService.listVodStitchDetails.
message ListVodStitchDetailsRequest {
  // Required. The VOD session where the stitch details belong to, in the form
  // of `projects/{project}/locations/{location}/vodSessions/{id}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "videostitcher.googleapis.com/VodStitchDetail"
    }
  ];

  // The maximum number of items to return.
  int32 page_size = 2;

  // The next_page_token value returned from a previous List request, if any.
  string page_token = 3;
}

// Response message for VideoStitcherService.listVodStitchDetails.
message ListVodStitchDetailsResponse {
  // A List of stitch Details.
  repeated VodStitchDetail vod_stitch_details = 1;

  // The pagination token.
  string next_page_token = 2;
}

// Request message for VideoStitcherService.getVodStitchDetail.
message GetVodStitchDetailRequest {
  // Required. The name of the stitch detail in the specified VOD session, in
  // the form of
  // `projects/{project}/locations/{location}/vodSessions/{vod_session_id}/vodStitchDetails/{id}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "videostitcher.googleapis.com/VodStitchDetail"
    }
  ];
}

// Request message for VideoStitcherService.listVodAdTagDetails.
message ListVodAdTagDetailsRequest {
  // Required. The VOD session which the ad tag details belong to, in the form
  // of `projects/{project}/locations/{location}/vodSessions/{vod_session_id}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "videostitcher.googleapis.com/VodAdTagDetail"
    }
  ];

  // The maximum number of items to return.
  int32 page_size = 2;

  // The next_page_token value returned from a previous List request, if any.
  string page_token = 3;
}

// Response message for VideoStitcherService.listVodAdTagDetails.
message ListVodAdTagDetailsResponse {
  // A List of ad tag details.
  repeated VodAdTagDetail vod_ad_tag_details = 1;

  // The pagination token.
  string next_page_token = 2;
}

// Request message for VideoStitcherService.getVodAdTagDetail
message GetVodAdTagDetailRequest {
  // Required. The name of the ad tag detail for the specified VOD session, in
  // the form of
  // `projects/{project}/locations/{location}/vodSessions/{vod_session_id}/vodAdTagDetails/{vod_ad_tag_detail}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "videostitcher.googleapis.com/VodAdTagDetail"
    }
  ];
}

// Request message for VideoStitcherService.listLiveAdTagDetails.
message ListLiveAdTagDetailsRequest {
  // Required. The resource parent in the form of
  // `projects/{project}/locations/{location}/liveSessions/{live_session}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "videostitcher.googleapis.com/LiveAdTagDetail"
    }
  ];

  // The maximum number of items to return.
  int32 page_size = 2;

  // The pagination token returned from a previous List request.
  string page_token = 3;
}

// Response message for VideoStitcherService.listLiveAdTagDetails.
message ListLiveAdTagDetailsResponse {
  // A list of live session ad tag details.
  repeated LiveAdTagDetail live_ad_tag_details = 1;

  // The pagination token.
  string next_page_token = 2;
}

// Request message for VideoStitcherService.getLiveAdTagDetail
message GetLiveAdTagDetailRequest {
  // Required. The resource name in the form of
  // `projects/{project}/locations/{location}/liveSessions/{live_session}/liveAdTagDetails/{live_ad_tag_detail}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "videostitcher.googleapis.com/LiveAdTagDetail"
    }
  ];
}

// Request message for VideoStitcherService.createSlate.
message CreateSlateRequest {
  // Required. The project in which the slate should be created, in the form of
  // `projects/{project_number}/locations/{location}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "videostitcher.googleapis.com/Slate"
    }
  ];

  // Required. The unique identifier for the slate.
  // This value should conform to RFC-1034, which restricts to
  // lower-case letters, numbers, and hyphen, with the first character a
  // letter, the last a letter or a number, and a 63 character maximum.
  string slate_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The slate to create.
  Slate slate = 3 [(google.api.field_behavior) = REQUIRED];

  // A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported `(00000000-0000-0000-0000-000000000000)`.
  string request_id = 4;
}

// Request message for VideoStitcherService.getSlate.
message GetSlateRequest {
  // Required. The name of the slate to be retrieved, of the slate, in the form
  // of `projects/{project_number}/locations/{location}/slates/{id}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "videostitcher.googleapis.com/Slate"
    }
  ];
}

// Request message for VideoStitcherService.listSlates.
message ListSlatesRequest {
  // Required. The project to list slates, in the form of
  // `projects/{project_number}/locations/{location}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "videostitcher.googleapis.com/Slate"
    }
  ];

  // Requested page size. Server may return fewer items than requested.
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 2;

  // A token identifying a page of results the server should return.
  string page_token = 3;

  // Filtering results
  string filter = 4;

  // Hint for how to order the results
  string order_by = 5;
}

// Response message for VideoStitcherService.listSlates.
message ListSlatesResponse {
  // The list of slates
  repeated Slate slates = 1;

  // A token identifying a page of results the server should return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// Request message for VideoStitcherService.updateSlate.
message UpdateSlateRequest {
  // Required. The resource with updated fields.
  Slate slate = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The update mask which specifies fields which should be updated.
  google.protobuf.FieldMask update_mask = 2
      [(google.api.field_behavior) = REQUIRED];
}

// Request message for VideoStitcherService.deleteSlate.
message DeleteSlateRequest {
  // Required. The name of the slate to be deleted, in the form of
  // `projects/{project_number}/locations/{location}/slates/{id}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "videostitcher.googleapis.com/Slate"
    }
  ];
}

// Request message for VideoStitcherService.createLiveSession.
message CreateLiveSessionRequest {
  // Required. The project and location in which the live session should be
  // created, in the form of `projects/{project_number}/locations/{location}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "videostitcher.googleapis.com/LiveSession"
    }
  ];

  // Required. Parameters for creating a live session.
  LiveSession live_session = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for VideoStitcherService.getSession.
message GetLiveSessionRequest {
  // Required. The name of the live session, in the form of
  // `projects/{project_number}/locations/{location}/liveSessions/{id}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "videostitcher.googleapis.com/LiveSession"
    }
  ];
}

// Request message for VideoStitcherService.createLiveConfig
message CreateLiveConfigRequest {
  // Required. The project in which the live config should be created, in
  // the form of `projects/{project_number}/locations/{location}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "videostitcher.googleapis.com/LiveConfig"
    }
  ];

  // Required. The unique identifier ID to use for the live config.
  string live_config_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The live config resource to create.
  LiveConfig live_config = 3 [(google.api.field_behavior) = REQUIRED];

  // A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported `(00000000-0000-0000-0000-000000000000)`.
  string request_id = 4;
}

// Request message for VideoStitcherService.listLiveConfig.
message ListLiveConfigsRequest {
  // Required. The project that contains the list of live configs, in the
  // form of `projects/{project_number}/locations/{location}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "videostitcher.googleapis.com/LiveConfig"
    }
  ];

  // The maximum number of items to return.
  int32 page_size = 2;

  // The next_page_token value returned from a previous List request, if any.
  string page_token = 3;

  // Optional. The filter to apply to list results (see
  // [Filtering](https://google.aip.dev/160)).
  string filter = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Specifies the ordering of results following
  // [Cloud API
  // syntax](https://cloud.google.com/apis/design/design_patterns#sorting_order).
  string order_by = 5 [(google.api.field_behavior) = OPTIONAL];
}

// Response message for VideoStitcher.ListLiveConfig.
message ListLiveConfigsResponse {
  // List of live configs.
  repeated LiveConfig live_configs = 1;

  // The pagination token.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// Request message for VideoStitcherService.getLiveConfig.
message GetLiveConfigRequest {
  // Required. The name of the live config to be retrieved, in the form
  // of
  // `projects/{project_number}/locations/{location}/liveConfigs/{id}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "videostitcher.googleapis.com/LiveConfig"
    }
  ];
}

// Request message for VideoStitcherService.deleteLiveConfig.
message DeleteLiveConfigRequest {
  // Required. The name of the live config to be deleted, in the form of
  // `projects/{project_number}/locations/{location}/liveConfigs/{id}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "videostitcher.googleapis.com/LiveConfig"
    }
  ];
}

// Represents the metadata of the long-running operation.
message OperationMetadata {
  // The time the operation was created.
  google.protobuf.Timestamp create_time = 1;

  // The time the operation finished running.
  google.protobuf.Timestamp end_time = 2;

  // Server-defined resource path for the target of the operation.
  string target = 3;

  // Name of the verb executed by the operation.
  string verb = 4;
}
