syntax = "proto3";
package vodapi;
option go_package = "vodapi";

import "google/protobuf/wrappers.proto";
import "google/protobuf/timestamp.proto";

service VodApi {
    // Methods related to creating a vod

    // CreateUpload will create a vod upload
    rpc CreateUpload (CreateUploadRequest) returns (CreateUploadResponse) {}

    // NOTE: in the long run this should be an infra endpoint, we are keeping it here to allow deprecating vinyl
    // without an infra dependency, but the ingest team may be reluctant to migrate twice so this api endpoint
    // might just end up being deleted and unused depending on timeline

    // CreateArchive will create a vod archive
    rpc CreateArchive (CreateArchiveRequest) returns (CreateArchiveResponse) {}

    // InternalCreateHighlight will create a highlight
    // NOTE: this endpoint is only used for an integration tests in the vod workers and should be removed when
    // that test is updated to hit visage directly.  The jira to track this is http://jira.twitch.com/browse/xxx-xxx
    rpc InternalCreateHighlight (InternalCreateHighlightRequest) returns (InternalCreateHighlightResponse) {}

    // ManagerCreateHighlight will create a highlight
    rpc ManagerCreateHighlight (ManagerCreateHighlightRequest) returns (ManagerCreateHighlightResponse) {}

    // InternalCreateHighlightV2 will create a highlight v2
    // NOTE: this shim in front of Vinyl's CreateHighlightV2 functionality shouldn't be called from Visage/GQL.
    // Once highlight v2's are at 100%, this should be removed/merged, and only 1 create highlight path
    // should exist.
    rpc InternalCreateHighlightV2 (InternalCreateHighlightV2Request) returns (InternalCreateHighlightV2Response) {}

    // Methods related to getting a single vod

    // PublicGetVodByID gets a single vod by id, will not get hidden or processing vods
    rpc PublicGetVodByID (PublicGetVodByIDRequest) returns (PublicGetVodByIDResponse) {}

    // InternalGetVodByID gets a single vod by id, will get hidden and processing vods
    rpc InternalGetVodByID (InternalGetVodByIDRequest) returns (InternalGetVodByIDResponse) {}

    // InternalGetVodByIDIncludeBannedUsers gets a single vod by id, will get hidden, processing, and banned user's vods
    rpc InternalGetVodByIDIncludeBannedUsers (InternalGetVodByIDIncludeBannedUsersRequest) returns (InternalGetVodByIDIncludeBannedUsersResponse) {}

    // ManagerInternalGetVodByID gets a single vod by id, will get hidden and processing vods and populate all user information
    rpc ManagerInternalGetVodByID (ManagerInternalGetVodByIDRequest) returns (ManagerInternalGetVodByIDResponse) {}

    // ManagerGetVodMuteInfo gets the muting and appeal information for a vod
    rpc ManagerGetVodMuteInfo (ManagerGetVodMuteInfoRequest) returns (ManagerGetVodMuteInfoResponse) {}

    // InternalGetVodMuteInfo gets the muting and appeal information for a vod
    rpc InternalGetVodMuteInfo (InternalGetVodMuteInfoRequest) returns (InternalGetVodMuteInfoResponse) {}

    // ManagerGetVodMuteInfos gets the muting and appeal information for vods
    rpc ManagerGetVodMuteInfos (ManagerGetVodMuteInfosRequest) returns (ManagerGetVodMuteInfosResponse) {}

    // GetVodByIDIncludeBannedUsers gets a single vod by id even if the user is banned
    rpc GetVodByIDIncludeBannedUsers (GetVodByIDIncludeBannedUsersRequest) returns (GetVodByIDIncludeBannedUsersResponse) {}

    // ManagerGetVodByID gets a single vod by id populating user information, but does not include hidden or processing vods
    rpc ManagerGetVodByID (ManagerGetVodByIDRequest) returns (ManagerGetVodByIDResponse) {}

    // Methods related to getting multiple vods

    // ManagerSearchVods searches for vods matching a search string
    rpc ManagerSearchVods (ManagerSearchVodsRequest) returns (ManagerSearchVodsResponse) {}

    // PublicGetVodsByUser gets vods by a user, omitting hidden and processing vods
    rpc PublicGetVodsByUser (PublicGetVodsByUserRequest) returns (PublicGetVodsByUserResponse) {}

    // ManagerInternalGetVodsByUser gets vods by a user, including hidden, processing and full user info
    rpc ManagerInternalGetVodsByUser (ManagerInternalGetVodsByUserRequest) returns (ManagerInternalGetVodsByUserResponse) {}

    // InternalGetVodsByUserIncludeBannedUsers gets vods by a user even if the user is banned
    rpc InternalGetVodsByUserIncludeBannedUsers (InternalGetVodsByUserIncludeBannedUsersRequest) returns (InternalGetVodsByUserIncludeBannedUsersResponse) {}

    // TODO: Delete this endpoint after migrating to InternalGetVodsByUserIncludeBannedUsers
    // ManagerGetVodsByUserIncludeBannedUsers gets vods by a user even if the user is banned
    rpc ManagerGetVodsByUserIncludeBannedUsers (ManagerGetVodsByUserIncludeBannedUsersRequest) returns (ManagerGetVodsByUserIncludeBannedUsersResponse) {}

    // InternalGetVodsByBroadcastIDs gets vods by broadcast ids including hidden and processing
    rpc InternalGetVodsByBroadcastIDs (InternalGetVodsByBroadcastIDsRequest) returns (InternalGetVodsByBroadcastIDsResponse) {}

    // PublicGetVodsByIDs gets vods by ids will omit hidden and processing
    rpc PublicGetVodsByIDs (PublicGetVodsByIDsRequest) returns (PublicGetVodsByIDsResponse) {}

    // InternalGetVodsByIDs gets vods by ids including hidden, processing, and deleted
    rpc InternalGetVodsByIDs (InternalGetVodsByIDsRequest) returns (InternalGetVodsByIDsResponse) {}

    // InternalGetPrivateVodsByIDs gets vods by ids including unpublished vods
    rpc InternalGetPrivateVodsByIDs (InternalGetPrivateVodsByIDsRequest) returns (InternalGetPrivateVodsByIDsResponse) {}

    // InternalGetPrivateAndDeletedVodsByIDs gets vods by ids including unpublished and deleted vods
    rpc InternalGetPrivateAndDeletedVodsByIDs (InternalGetPrivateAndDeletedVodsByIDsRequest) returns (InternalGetPrivateAndDeletedVodsByIDsResponse) {}

    // GetVodsByIDsIncludeBannedUsers gets vods by ids even if the user is banned
    rpc GetVodsByIDsIncludeBannedUsers (GetVodsByIDsIncludeBannedUsersRequest) returns (GetVodsByIDsIncludeBannedUsersResponse) {}

    // ManagerGetVodsByUserIncludeBannedUsers gets vods by a user even if the user is banned
    rpc PublicGetVodsByUsers (PublicGetVodsByUsersRequest) returns (PublicGetVodsByUsersResponse) {}

    // GetTopVods gets the top vods for twitch
    rpc GetTopVods (GetTopVodsRequest) returns (GetTopVodsResponse) {}

    // Methods related to updating vods

    // UpdateVod updates the fields on a vod
    rpc UpdateVod (UpdateVodRequest) returns (UpdateVodResponse) {}

    // ManagerUpdateVod updates the fields on a vod
    rpc ManagerUpdateVod (ManagerUpdateVodRequest) returns (ManagerUpdateVodResponse) {}

    // Methods related to deleting vods

    // UndeleteVods removes the deleted flag on a vod
    rpc UndeleteVods (UndeleteVodsRequest) returns (UndeleteVodsResponse) {}

    // SoftDeleteVods marks a vod as deleted
    rpc SoftDeleteVods (SoftDeleteVodsRequest) returns (SoftDeleteVodsResponse) {}

    // TODO: Remove after migrating valkyrie and deletion worker to SoftDeleteVods
    // InternalVodRemoveRecords removes the vod records from the database
    rpc InternalVodRemoveRecords (InternalVodRemoveRecordsRequest) returns (InternalVodRemoveRecordsResponse) {}

    // HardDeleteVods removes the underlying vod manifest and ts data
    rpc HardDeleteVods (HardDeleteVodsRequest) returns (HardDeleteVodsResponse) {}

    // ManagerSoftDeleteVods marks a vod as deleted if the user owns or can edit the vod
    rpc ManagerSoftDeleteVods (ManagerSoftDeleteVodsRequest) returns (ManagerSoftDeleteVodsResponse) {}

    // Methods related to actions on vods

    // YoutubeExport sends a vod to youtube
    rpc YoutubeExport (YoutubeExportRequest) returns (YoutubeExportResponse) {}

    // FinalizeUpload finishes a vod upload
    rpc FinalizeUpload (FinalizeUploadRequest) returns (FinalizeUploadResponse) {}

    // FinalizeHighlightV2 finishes a vod highlight v2
    rpc FinalizeHighlightV2 (FinalizeHighlightV2Request) returns (FinalizeHighlightV2Response) {}

    // UpdateManifest updates the vod manifest
    rpc UpdateManifest (UpdateManifestRequest) returns (UpdateManifestResponse) {}

    // SetViewcounts sets the view counts for a vod
    rpc SetViewcounts (SetViewcountsRequest) returns (SetViewcountsResponse) {}

    // Methods related to vod metadata

    // GetPublicVodAggregationsByIDs gets an aggregated representation of multiple vods
    rpc GetPublicVodAggregationsByIDs (GetPublicVodAggregationsByIDsRequest) returns (PublicVodAggregationsByIDsResponse) {}

    // GetVodPopularity gets whether the vod is popular
    rpc GetVodPopularity (GetVodPopularityRequest) returns (VodPopularityResponse) {}

    // CreateError creates an error associated with a vod when uploading
    rpc CreateError (CreateErrorRequest) returns (CreateErrorResponse) {}

    // Methods related to vod thumbnails

    // CreateThumbnails creates vod thumbnails
    rpc CreateThumbnails (CreateThumbnailsRequest) returns (CreateThumbnailsResponse) {}

    // ManagerCreateCustomThumbnailUploadRequest creates a request to upload a new vod thumbnail
    rpc ManagerCreateCustomThumbnailUploadRequest (ManagerCreateCustomThumbnailUploadRequestRequest) returns (CreateCustomThumbnailUploadRequestResponse) {}

    // ManagerDeleteThumbnails deletes vod thumbnails if the user owns or can edit the vod
    rpc ManagerDeleteThumbnails (ManagerDeleteThumbnailsRequest) returns (ManagerDeleteThumbnailsResponse) {}

    // DeleteThumbnails deletes vod thumbnails
    rpc DeleteThumbnails (DeleteThumbnailsRequest) returns (DeleteThumbnailsResponse) {}

    // Methods related to vod user properties

    // GetUserVodProperties gets the user vod properties
    rpc GetUserVodProperties (GetUserVodPropertiesRequest) returns (UserVodPropertiesResponse) {}

    // ManagerGetUserVodProperties gets the user vod properties
    rpc ManagerGetUserVodProperties (ManagerGetUserVodPropertiesRequest) returns (UserVodPropertiesResponse) {}

    // TODO: Remove after migrating admin panel to InternalUpdateUserVodProperties
    // ManagerUpdateUserVodProperties updates the user vod properties
    rpc ManagerUpdateUserVodProperties (ManagerUpdateUserVodPropertiesRequest) returns (UserVodPropertiesResponse) {}

    // InternalUpdateUserVodProperties updates the user vod properties
    rpc InternalUpdateUserVodProperties (InternalUpdateUserVodPropertiesRequest) returns (UserVodPropertiesResponse) {}

    // InternalGetUserVideoPrivacyProperties gets the user video properties
    rpc InternalGetUserVideoPrivacyProperties (InternalGetUserVideoPrivacyPropertiesRequest) returns (UserVideoPrivacyPropertiesResponse) {}

    // InternalUpdateUserVideoPrivacyProperties updates the user video properties
    rpc InternalUpdateUserVideoPrivacyProperties (InternalUpdateUserVideoPrivacyPropertiesRequest) returns (UserVideoPrivacyPropertiesResponse) {}

    // ManagerGetUserVodProperties gets the user video properties
    rpc ManagerGetUserVideoPrivacyProperties (ManagerGetUserVideoPrivacyPropertiesRequest) returns (UserVideoPrivacyPropertiesResponse) {}

    // ManagerGetUserVodProperties updates the user video properties
    rpc ManagerUpdateUserVideoPrivacyProperties (ManagerUpdateUserVideoPrivacyPropertiesRequest) returns (UserVideoPrivacyPropertiesResponse) {}

    // Methods related to vod appeals

    // ManagerCreateVodAppeals creates vod appeals
    rpc ManagerCreateVodAppeals (ManagerCreateVodAppealsRequest) returns (CreateVodAppealsResponse) {}

    // GetVodAppeals gets vod appeals
    rpc GetVodAppeals (GetVodAppealsRequest) returns (VodAppealsResponse) {}

    // ResolveTrackAppeal resolves a track appeal
    rpc ResolveTrackAppeal (ResolveTrackAppealRequest) returns (ResolveTrackAppealResponse) {}

    // ResolveVodAppeal resolves a vod appeal
    rpc ResolveVodAppeal (ResolveVodAppealRequest) returns (ResolveVodAppealResponse) {}

    // CreateAudibleMagicResponses creates audible magic response objects for vods
    rpc CreateAudibleMagicResponses (CreateAudibleMagicResponsesRequest) returns (AudibleMagicResponsesResponse) {}

    // GetAudibleMagicResponses gets the audible magic response objects for vods
    rpc GetAudibleMagicResponses (GetAudibleMagicResponsesRequest) returns (AudibleMagicResponsesResponse) {}

    // UpdateAudibleMagicResponses updates the audible magic response objects for vods
    rpc UpdateAudibleMagicResponses (UpdateAudibleMagicResponsesRequest) returns (AudibleMagicResponsesResponse) {}

    // ManagerGetVodDownload gets the vod download
    rpc ManagerGetVodDownload (GetVodDownloadRequest) returns (VodDownloadResponse) {}
}

enum VodStatus {
    INVALID_STATUS = 0;
    RECORDED = 1;
    RECORDING = 2;
    UNPROCESSED = 3;
    CREATED = 4;
    UNDER_REVIEW= 5;
    UPLOADING = 6;
    PENDING_TRANSCODE = 7;
    FAILED = 8;
    TRANSCODING = 9;
}

enum VodType {
    INVALID_TYPE = 0;
    ARCHIVE = 1;
    HIGHLIGHT = 2;
    UPLOAD = 3;
    PAST_PREMIERE = 4;
    PREMIERE_UPLOAD = 5;
}

enum VodSort {
    INVALID_SORT = 0;
    TIME = 1;
    TIME_ASC = 2;
    VIEWS = 3;
    TRENDING = 4;
    TRENDING_V3 = 5;
}

enum VodViewable {
    INVALID_VIEWABLE = 0;
    PUBLIC = 1;
    PRIVATE = 2;
}

enum VodThumbnailType {
    INVALID_THUMBNAIL_TYPE = 0;
    GENERATED = 1;
    CUSTOM = 2;
}

enum VodNotificationSettingType {
    INVALID_NOTIFICATION_SETTING_TYPE = 0;
    EMAIL = 1;
    CHANNEL_FEED = 2;
}

enum VodCreateError {
  INVALID_CREATE_ERROR = 0;
  BAD_ASSET = 1;
  BAD_REQUEST = 2;
  NOT_AUTHORIZED = 3;
  FORMAT_NOT_SUPPORTED = 4;
  INTERNAL_ERROR = 5;
}

message CreateUploadRequest {
    // broadcast_type is the broadcast type of the vod
    VodType broadcast_type = 1;
    // broadcast_id is the id related to the broadcast of the vod
    string broadcast_id = 2;
    // owner_id is the owner of the vod
    string owner_id = 3;
    // description is a user provided description of the vod
    string description = 4;
    // title is the vod title that shows up in directory listings
    string title = 5;
    // game is the game for the vod
    string game = 6;
    // communities is what communities the vod is related to
    repeated string communities = 7;
    // language is the language of the vod
    string language = 8;
    // tag_list is a list of tag descriptors of the vod
    repeated string tag_list = 9;
    // viewable is the viewability configuration for the vod
    VodViewable viewable = 10;
    // viewable_at is when the vod became publicly viewable
    google.protobuf.Timestamp viewable_at = 11;
    // duration is the duration of the vod
    int64 duration = 12;
    // uri is the path to the raw archive data
    string uri = 13;
    // manifest is the file describing the different ts chunks
    string manifest = 14;
    // media_type stores the type of media the VOD depicts. Used by Twitch Sings.
    string media_type = 15;
}

message ShowFormatRequest {
    // playlist_preference is an index into the formats for order to play the formats
    int64 playlist_preference = 1;
    // display_name is the display name of the format
    string display_name = 2;
    // bitrate is the bitrate of the format
    int64 bitrate = 3;
    // fps is the frames per second of the format
    double fps = 4;
    // max_idr_interval is the max idr interval for the format
    int64 max_idr_interval = 5;
    // codecs is the list of codecs related to this format
    string codecs = 6;
    // resolution is the resolution of the format
    string resolution = 7;
}

message CreateArchiveRequest {
    // broadcast_id is the id related to the broadcast of the vod
    string broadcast_id = 1;
    // broadcaster_software is what software was used to broadcast the archive
    string broadcaster_software = 2;
    // recorded_on is when the archive became recorded
    google.protobuf.Timestamp recorded_on = 3;
    // title is the title of the archive
    string title = 4;
    // channel_id is the channel creating the archive
    string channel_id = 5;
    // duration is the duration of the vod
    int64 duration = 7;
    // uri is the path to the raw archive data
    string uri = 8;
    // manifest is the file describing the different ts chunks
    string manifest = 9;
    // deleted is whether the vod is deleted
    bool deleted = 10;
    // handwave_latency_ms is the handwave latency milliseconds
    int64 handwave_latency_ms = 11;
}

message InternalCreateHighlightRequest {
    // source_archive_id is the id of the original source vod
    string source_archive_id = 1;
    // owner_id is the owner of the vod
    string owner_id = 2;
    // uri is the path to the raw data
    string uri = 3;
    // broadcast_id is the id related to the broadcast of the vod
    string broadcast_id = 4;
    // show_formats is the new show_formats value for the vod
    map<string, ShowFormatRequest> show_formats = 5;
    // title is the title for the highlight
    string title = 6;
    // duration is the duration of the vod
    int64 duration = 7;
}

message ManagerCreateHighlightRequest {
    // vod_id is the id of the original source vod
    string vod_id = 1;
    // description is the description for the highlight
    string description = 2;
    // game is the game for the highlight
    string game = 3;
    // title is the title for the highlight
    string title = 4;
    // language is the language for the highlight
    string language = 5;
    // start_seconds is the start time in the original vod for the highlight
    int64 start_seconds = 6;
    // end_seconds is the end time in the original vod for the highlight
    int64 end_seconds = 7;
    // tag_list is a list of tag descriptors of the vod
    repeated string tag_list = 8;
    // created_by is the user that created this highlight
    string created_by = 9;
    // user_id is the user id making the create highlight request (could be an editor or staff)
    string user_id = 10;
}

message HighlightRange {
    // vod_id is the id of the source vod to highlight from
    string vod_id = 1;
    // start_ms is the start time in milliseconds the original vod for the highlight
    int64 start_ms = 2;
    // end_ms is the end time in milliseconds the original vod for the highlight
    int64 end_ms = 3;
}

message InternalCreateHighlightV2Request {
    // description is the description for the highlight
    string description = 1;
    // game is the game for the highlight
    string game = 2;
    // title is the title for the highlight
    string title = 3;
    // language is the language for the highlight
    string language = 4;
    // tag_list is a list of tag descriptors of the vod
    repeated string tag_list = 5;
    // created_by is the user that created this highlight
    string created_by = 6;
    // owner_id is the channel that the highlight is being created on
    string owner_id = 7;
    // source_archive_id is the id of the vod that the highlight is being created from
    string source_archive_id = 8;
}

message PublicGetVodByIDRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
}

message InternalGetVodByIDRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
}

message InternalGetVodByIDIncludeBannedUsersRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
}

message ManagerInternalGetVodByIDRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 2;
}

message ManagerGetVodMuteInfoRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 2;
}

message InternalGetVodMuteInfoRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
}

message ManagerGetVodMuteInfosRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 2;
}

message GetVodByIDIncludeBannedUsersRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
}

message ManagerGetVodByIDRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 2;
}

message ManagerSearchVodsRequest {
    // channel_id is the id of the channel we are making the request for
    string channel_id = 1;
    // search is the search string
    string search = 2;
    // limit is the maximum number of response objects from the response list, used for pagination
    int64 limit = 3;
    // offset is the offset into the response list, used for pagination
    int64 offset = 4;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 5;
}

message PublicGetVodsByUserRequest {
    // channel_id is the id of the channel we are making the request for
    string channel_id = 1;
    // broadcast_types is the list of broadcast types that we want to filter by
    repeated VodType broadcast_types = 2;
    // language is the language filter
    string language = 3;
    // status is the filter based on vod status
    VodStatus status = 4;
    // sort is the sort format of the response objects
    VodSort sort = 5;
    // limit is the maximum number of response objects from the response list, used for pagination
    int64 limit = 6;
    // offset is the offset into the response list, used for pagination
    int64 offset = 7;
    // recorded_after is a filter for vods recorded after a time
    google.protobuf.Timestamp recorded_after = 8;
    // recorded_before is a filter for vods recorded before a time
    google.protobuf.Timestamp recorded_before = 9;
}

message ManagerInternalGetVodsByUserRequest {
    // channel_id is the id of the channel we are making the request for
    string channel_id = 1;
    // broadcast_types is the list of broadcast types that we want to filter by
    repeated VodType broadcast_types = 2;
    // language is the language filter
    string language = 3;
    // sort is the sort format of the response objects
    VodSort sort = 5;
    // limit is the maximum number of response objects from the response list, used for pagination
    int64 limit = 6;
    // offset is the offset into the response list, used for pagination
    int64 offset = 7;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 8;
    // published_within is a filter on responses published within some threshold
    string published_within = 9;
    // recorded_after is a filter for vods recorded after a time
    google.protobuf.Timestamp recorded_after = 10;
    // recorded_before is a filter for vods recorded before a time
    google.protobuf.Timestamp recorded_before = 11;
    // statuses is the filter based on vod statuses
    repeated VodStatus statuses = 12;

    // DEPRECATED

    // status is the filter based on vod status
    VodStatus status = 4;
}

message InternalGetVodsByUserIncludeBannedUsersRequest {
    // channel_id is the id of the channel we are making the request for
    string channel_id = 1;
    // broadcast_types is the list of broadcast types that we want to filter by
    repeated VodType broadcast_types = 2;
    // language is the language filter
    string language = 3;
    // status is the filter based on vod status
    VodStatus status = 4;
    // sort is the sort format of the response objects
    VodSort sort = 5;
    // limit is the maximum number of response objects from the response list, used for pagination
    int64 limit = 6;
    // offset is the offset into the response list, used for pagination
    int64 offset = 7;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 8;
    // recorded_after is a filter for vods recorded after a time
    google.protobuf.Timestamp recorded_after = 9;
    // recorded_before is a filter for vods recorded before a time
    google.protobuf.Timestamp recorded_before = 10;
}

message ManagerGetVodsByUserIncludeBannedUsersRequest {
    // channel_id is the id of the channel we are making the request for
    string channel_id = 1;
    // broadcast_types is the list of broadcast types that we want to filter by
    repeated VodType broadcast_types = 2;
    // language is the language filter
    string language = 3;
    // status is the filter based on vod status
    VodStatus status = 4;
    // sort is the sort format of the response objects
    VodSort sort = 5;
    // limit is the maximum number of response objects from the response list, used for pagination
    int64 limit = 6;
    // offset is the offset into the response list, used for pagination
    int64 offset = 7;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 8;
}

message InternalGetVodsByBroadcastIDsRequest {
    // broadcast_ids is the list of broadcast ids to make the request for
    repeated string broadcast_ids = 1;
}

message PublicGetVodsByIDsRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
}

message InternalGetVodsByIDsRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
}

message InternalGetPrivateVodsByIDsRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
}

message InternalGetPrivateAndDeletedVodsByIDsRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
}

message GetVodsByIDsIncludeBannedUsersRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
}

message PublicGetVodsByUsersRequest {
    // channel_ids is the ids of the channels we are making the request for
    repeated string channel_ids = 1;
    // broadcast_types is the list of broadcast types that we want to filter by
    repeated VodType broadcast_types = 2;
    // language is the language filter
    string language = 3;
    // sort is the sort format of the response objects
    VodSort sort = 5;
    // limit is the maximum number of response objects from the response list, used for pagination
    int64 limit = 6;
    // offset is the offset into the response list, used for pagination
    int64 offset = 7;
}

message GetTopVodsRequest {
    // broadcast_types is the list of broadcast types that we want to filter by
    repeated VodType broadcast_types = 1;
    // language is the language filter
    string language = 2;
    // game is the game filter
    string game = 3;
    // period is the period when we are making the request for
    string period = 4;
    // sort is the sort format of the response objects
    VodSort sort = 5;
    // limit is the maximum number of response objects from the response list, used for pagination
    int64 limit = 6;
    // offset is the offset into the response list, used for pagination
    int64 offset = 7;
}

message ThumbnailRequest {
    // path is the path of the thumbnail
    string path = 1;
    // offset is the offset into the thumbnail
    google.protobuf.DoubleValue offset = 2;
}

message UpdateVodRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // broadcast_type is the new broadcast type for the vod
    VodType broadcast_type = 2;
    // description is the new description value for the vod
    google.protobuf.StringValue description = 3;
    // game is the new game value for the vod
    google.protobuf.StringValue game = 4;
    // communities is the new communities value for the vod
    repeated string communities = 5;
    // language is the new language value for the vod
    google.protobuf.StringValue language = 6;
    // tag_list is the new tag_list value for the vod
    repeated string tag_list = 7;
    // thumbnail_path is the new thumbnail_path value for the vod
    google.protobuf.StringValue thumbnail_path = 8;
    // title is the new title value for the vod
    google.protobuf.StringValue title = 9;
    // viewable is the new viewable value for the vod
    VodViewable viewable = 10;
    // viewable_at is the new viewable_at value for the vod
    google.protobuf.Timestamp viewable_at = 11;
    // broadcast_id is the new broadcast_id value for the vod
    google.protobuf.StringValue broadcast_id = 12;
    // offset is the new offset value for the vod
    google.protobuf.Int64Value offset = 13;
    // status is the new status value for the vod
    VodStatus status = 14;
    // duration is the new duration value for the vod
    google.protobuf.Int64Value duration = 16;
    // show_formats is the new show_formats value for the vod
    map<string, ShowFormatRequest> show_formats = 17;
    // uri is the uri of the vod
    google.protobuf.StringValue uri = 18;
}

message ManagerUpdateVodRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // broadcast_type is the new broadcast type for the vod
    VodType broadcast_type = 2;
    // description is the new description value for the vod
    google.protobuf.StringValue description = 3;
    // game is the new game value for the vod
    google.protobuf.StringValue game = 4;
    // communities is the new communities value for the vod
    repeated string communities = 5;
    // language is the new language value for the vod
    google.protobuf.StringValue language = 6;
    // tag_list is the new tag_list value for the vod
    repeated string tag_list = 7;
    // thumbnail_path is the new thumbnail_path value for the vod
    google.protobuf.StringValue thumbnail_path = 8;
    // title is the new title value for the vod
    google.protobuf.StringValue title = 9;
    // viewable is the new viewable value for the vod
    VodViewable viewable = 10;
    // viewable_at is the new viewable_at value for the vod
    google.protobuf.Timestamp viewable_at = 11;
    // broadcast_id is the new broadcast_id value for the vod
    google.protobuf.StringValue broadcast_id = 12;
    // offset is the new offset value for the vod
    google.protobuf.Int64Value offset = 13;
    // status is the new status value for the vod
    VodStatus status = 14;
    // duration is the new duration value for the vod
    google.protobuf.Int64Value duration = 16;
    // show_formats is the new show_formats value for the vod
    map<string, ShowFormatRequest> show_formats = 17;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 18;
    // uri is the uri of the vod
    google.protobuf.StringValue uri = 19;
}

message UndeleteVodsRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
}

message SoftDeleteVodsRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
}

message InternalVodRemoveRecordsRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
}

message HardDeleteVodsRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
}

message ManagerSoftDeleteVodsRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 2;
}

message YoutubeExportRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // title is the title of the youtube exported vod
    string title = 2;
    // description is the description of the youtube exported vod
    string description = 3;
    // tag_list is the tag list of the youtube exported vod
    repeated string tag_list = 4;
    // private is whether the vod is private
    bool private = 5;
    // do_split is whether the vod should be split up
    bool do_split = 6;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 7;
}

message FinalizeUploadRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
}

message FinalizeHighlightV2Request {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // status is the filter based on vod status
    VodStatus status = 3;
    // duration is the duration of the vod
    google.protobuf.Int64Value duration = 4;
    // show_formats is the new show_formats value for the vod
    map<string, ShowFormatRequest> show_formats = 5;
}

message UpdateManifestRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // old_manifest is the old manifest
    string old_manifest = 2;
    // new_manifest is the new manifest
    string new_manifest = 3;
}

message ViewcountsUpdate {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // count is the view count of the vod
    int64 count = 2;
}

message SetViewcountsRequest {
    // viewcounts is the view counts update list
    repeated ViewcountsUpdate viewcounts = 1;
}

message GetPublicVodAggregationsByIDsRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
}

message GetVodPopularityRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
}

message CreateErrorRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // error_code is the error code
    string error_code = 2;
    // error_message is the error message
    string error_message = 3;
}

message CreateThumbnailsRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // thumbnails is the list of thumbnails to create
    repeated ThumbnailRequest thumbnails = 2;
}

message ManagerCreateCustomThumbnailUploadRequestRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // crop_x is the crop x coordinate
    int64 crop_x = 2;
    // crop_y is the crop y coordinate
    int64 crop_y = 3;
    // crop_w is the crop width
    int64 crop_w = 4;
    // crop_h is the crop height
    int64 crop_h = 5;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 6;
}

message ManagerDeleteThumbnailsRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // path is the path to delete
    string path = 2;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 3;
}

message DeleteThumbnailsRequest {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
}

message ManagerGetUserVodPropertiesRequest {
    // channel_id is the channel that we are getting properties for
    string channel_id = 1;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 2;
}

message GetUserVodPropertiesRequest {
    // channel_id is the channel that we are getting properties for
    string channel_id = 1;
}

message InternalUpdateUserVodPropertiesRequest {
    // channel_id is the channel that we are updating properties for
    string channel_id = 1;
    // save_vods_forever is a flag to indicate if vods should be saved forever
    google.protobuf.BoolValue save_vods_forever = 3;
    // vod_storage_days is how many days a vod should be stored
    google.protobuf.Int64Value vod_storage_days = 4;
    // can_upload_vod is a flag to indicate if the user can upload vods
    google.protobuf.BoolValue can_upload_vod = 5;
    // youtube_exporting_disabled is a flag to indicate if the user can export to youtube
    google.protobuf.BoolValue youtube_exporting_disabled = 6;
    // skip_upload_moderation is a flag to indicate if the user's vods skip moderation
    google.protobuf.BoolValue skip_upload_moderation = 7;
    // skip_muting is a flag to indicate if the user's vods skip muting
    google.protobuf.BoolValue skip_muting = 8;
    // can_upload_vod is a flag to indicate if the user can upload unlimited vods
    google.protobuf.BoolValue can_upload_unlimited = 9;
}

message ManagerUpdateUserVodPropertiesRequest {
    // channel_id is the channel that we are updating properties for
    string channel_id = 1;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 2;
    // save_vods_forever is a flag to indicate if vods should be saved forever
    google.protobuf.BoolValue save_vods_forever = 3;
    // vod_storage_days is how many days a vod should be stored
    google.protobuf.Int64Value vod_storage_days = 4;
    // can_upload_vod is a flag to indicate if the user can upload vods
    google.protobuf.BoolValue can_upload_vod = 5;
    // youtube_exporting_disabled is a flag to indicate if the user can export to youtube
    google.protobuf.BoolValue youtube_exporting_disabled = 6;
    // skip_upload_moderation is a flag to indicate if the user's vods skip moderation
    google.protobuf.BoolValue skip_upload_moderation = 7;
    // skip_muting is a flag to indicate if the user's vods skip muting
    google.protobuf.BoolValue skip_muting = 8;
    // can_upload_vod is a flag to indicate if the user can upload unlimited vods
    google.protobuf.BoolValue can_upload_unlimited = 9;
}

message InternalGetUserVideoPrivacyPropertiesRequest {
    // channel_id is the channel that we are getting properties for
    string channel_id = 1;
}

message InternalUpdateUserVideoPrivacyPropertiesRequest {
    // channel_id is the channel that we are updating properties for
    string channel_id = 1;
    // hide_archives is whether the user has archives hidden
    google.protobuf.BoolValue hide_archives = 2;
    // hide_archives_enabled is whether the user has archives hidden enabled
    google.protobuf.BoolValue hide_archives_enabled = 3;
}

message ManagerGetUserVideoPrivacyPropertiesRequest {
    // channel_id is the channel that we are getting properties for
    string channel_id = 1;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 2;
}

message ManagerUpdateUserVideoPrivacyPropertiesRequest {
    // channel_id is the channel that we are updating properties for
    string channel_id = 1;
    // hide_archives is whether the user has archives hidden
    google.protobuf.BoolValue hide_archives = 2;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 3;
    // hide_archives_enabled is whether the user has archives hidden enabled
    google.protobuf.BoolValue hide_archives_enabled = 4;
}

message TrackAppealRequest {
    // audible_magic_response_id is the id of the audible magic response
    string audible_magic_response_id = 1;
    // reason is the reason the track is being appealed
    string reason = 2;
}

message ManagerCreateVodAppealsRequest {
    // vod_id is the id of the vod that this appeal is for
    string vod_id = 1;
    // city is the appeal city
    string city = 2;
    // country is the appeal country
    string country = 3;
    // full_name is the appeal full name
    string full_name = 4;
    // state is the appeal state
    string state = 5;
    // street_address1 is the appeal street address 1
    string street_address1 = 6;
    // street_address2 is the appeal street address 2
    string street_address2 = 7;
    // zipcode is the appeal zipcode
    string zipcode = 8;
    // track_appeals is list of tracks that are being appealed
    repeated TrackAppealRequest track_appeals = 9;
    // user_id is the user id making request (could be an editor or staff)
    string user_id = 10;
}

message GetVodAppealsRequest {
    // priority is whether this appeal is a priority
    google.protobuf.BoolValue priority = 1;
    // resolved is whether this appeal is already resolved
    google.protobuf.BoolValue resolved = 2;
    // limit is the maximum number of response objects from the response list, used for pagination
    int64 limit = 3;
    // offset is the offset into the response list, used for pagination
    int64 offset = 4;
    // vod_id is the id of the vod that this appeal is for
    string vod_id = 5;
    // user_info is a string containing the user info for the appeal
    string user_info = 6;
}

message ResolveTrackAppealRequest {
    // track_appeal_id is the track appeal id
    string track_appeal_id = 1;
    // action is the action being taken on this track appeal
    string action = 2;
}

message ResolveVodAppealRequest {
    // vod_appeal_id is the vod appeal id
    string vod_appeal_id = 1;
}

message CreateAudibleMagicResponseRequest {
    // vod_id is the id of the vod that this audible magic response request is for
    string vod_id = 1;
    // title is the amr title
    string title = 2;
    // performer is the amr performer
    string performer = 3;
    // genre is the amr genre
    string genre = 4;
    // artist is the amr artist
    string artist = 5;
    // album_title is the amr album title
    string album_title = 6;
    // song is the amr song
    string song = 7;
    // isrc is the amr isrc
    string isrc = 8;
    // is_match is whether there is a match for this amr
    bool is_match = 9;
    // match_offset_seconds is the match offset into the vod
    int64 match_offset_seconds = 10;
    // match_duration_seconds is the match duration
    int64 match_duration_seconds = 11;
    // scan_offset_seconds is the scan offset into the vod
    int64 scan_offset_seconds = 12;
    // scan_duration_seconds is the scan duration
    int64 scan_duration_seconds = 13;
    // mute_offset_seconds is the mute offset into the vod
    int64 mute_offset_seconds = 14;
    // mute_duration_seconds is the mute duration
    int64 mute_duration_seconds = 15;
    // audible_magic_item_id is the audible magic item id
    string audible_magic_item_id = 16;
}

message CreateAudibleMagicResponsesRequest {
    // audible_magic_responses is the list of audible magic responses
    repeated CreateAudibleMagicResponseRequest audible_magic_responses = 1;
}

message GetAudibleMagicResponsesRequest {
    // vod_ids is the ids of the vods that is being requested
    repeated string vod_ids = 1;
}

message UpdateAudibleMagicResponseRequest {
    // audible_magic_response_id is the audible magic response id
    string audible_magic_response_id = 1;
    // title is the new title for the amr
    google.protobuf.StringValue title = 3;
    // performer is the new performer for the amr
    google.protobuf.StringValue performer = 4;
    // genre is the new genre for the amr
    google.protobuf.StringValue genre = 5;
    // artist is the new artist for the amr
    google.protobuf.StringValue artist = 6;
    // album_title is the new album title for the amr
    google.protobuf.StringValue album_title = 7;
    // song is the new song for the amr
    google.protobuf.StringValue song = 8;
    // isrc is the new isrc for the amr
    google.protobuf.StringValue isrc = 9;
    // is_match is the whether there is a match
    bool is_match = 10;
    // match_offset_seconds is the match offset into the vod
    google.protobuf.Int64Value match_offset_seconds = 11;
    // match_duration_seconds is the match duration
    google.protobuf.Int64Value match_duration_seconds = 12;
    // scan_offset_seconds is the scan offset into the vod
    google.protobuf.Int64Value scan_offset_seconds = 13;
    // scan_duration_seconds is the scan duration
    google.protobuf.Int64Value scan_duration_seconds = 14;
    // mute_offset_seconds is the mute offset into the vod
    google.protobuf.Int64Value mute_offset_seconds = 15;
    // mute_duration_seconds is the mute duration
    google.protobuf.Int64Value mute_duration_seconds = 16;
    // audible_magic_item_id is the audible magic item id
    google.protobuf.StringValue audible_magic_item_id = 17;
}

message UpdateAudibleMagicResponsesRequest {
    // update_audible_magic_responses is the list of update audible magic responses
    repeated UpdateAudibleMagicResponseRequest update_audible_magic_responses = 1;
}

message GetVodDownloadRequest {
    // vod_id is the id of the vod that is being downloaded
    string vod_id = 1;
}

message ShowFormat {
    // playlist_preference is an index into the formats for order to play the formats
    int64 playlist_preference = 1;
    // display_name is the display name of the format
    string display_name = 2;
    // bitrate is the bitrate of the format
    int64 bitrate = 3;
    // fps is the frames per second of the format
    double fps = 4;
    // max_idr_interval is the max idr interval for the format
    int64 max_idr_interval = 5;
    // codecs is the list of codecs related to this format
    string codecs = 6;
    // resolution is the resolution of the format
    string resolution = 7;
}

message Thumbnail {
    // path is the path of the thumbnail
    string path = 1;
    // offset is the offset into the thumbnail
    google.protobuf.DoubleValue offset = 2;
}

message ThumbnailTemplate {
    // offset is the offset into the thumbnail
    double offset = 1;
    // path is the path of the thumbnail
    string path = 2;
    // type is whether the thumbnail is generated or custom
    VodThumbnailType type = 3;
    // url is the url path to the thumbnail
    string url = 4;
}

message AudibleMagicResponse {
    // audible_magic_response_id is the audible magic response id
    string audible_magic_response_id = 1;
    // vod_id is the id of the vod that this audible magic response request is for
    string vod_id = 2;
    // title is the amr title
    string title = 3;
    // performer is the amr performer
    string performer = 4;
    // genre is the amr genre
    string genre = 5;
    // artist is the amr artist
    string artist = 6;
    // album_title is the amr album title
    string album_title = 7;
    // song is the amr song
    string song = 8;
    // isrc is the amr isrc
    string isrc = 9;
    // is_match is whether there is a match for this amr
    bool is_match = 10;
    // match_offset_seconds is the match offset into the vod
    google.protobuf.Int64Value match_offset_seconds = 11;
    // match_duration_seconds is the match duration
    google.protobuf.Int64Value match_duration_seconds = 12;
    // scan_offset_seconds is the scan offset into the vod
    google.protobuf.Int64Value scan_offset_seconds = 13;
    // scan_duration_seconds is the scan duration
    google.protobuf.Int64Value scan_duration_seconds = 14;
    // mute_offset_seconds is the mute offset into the vod
    google.protobuf.Int64Value mute_offset_seconds = 15;
    // mute_duration_seconds is the mute duration
    google.protobuf.Int64Value mute_duration_seconds = 16;
    // audible_magic_item_id is the audible magic item id
    string audible_magic_item_id = 17;
    // created_at is when this amr was created
    google.protobuf.Timestamp created_at = 18;
    // updated_at is when this amr was updated
    google.protobuf.Timestamp updated_at = 19;
    // song_length is how long the song is
    int64 song_length = 20;
    // unmuted_at is when this amr was unmuted
    google.protobuf.Timestamp unmuted_at = 21;
}

message VodMutedSegment {
    // offset is the offset into the vod for the muted segment
    int64 offset = 1;
    // duration is the duration of the muted segment
    int64 duration = 2;
}

message VodAppeal {
    // vod_appeal_id is the vod appeal id
    string vod_appeal_id = 1;
    // resolved_at is when this appeal was resolved
    google.protobuf.Timestamp resolved_at = 2;
    // created_at is when this appeal was created
    google.protobuf.Timestamp created_at = 3;
    // updated_at is when this appeal was update
    google.protobuf.Timestamp updated_at = 4;
    // vod_id is the id of the vod that this appeal is for
    string vod_id = 5;
    // priority is whether this appeal is a priority
    bool priority = 6;
    // full_name is the appeal full name
    string full_name = 7;
    // street_address1 is the appeal street address 1
    string street_address1 = 8;
    // street_address2 is the appeal street address 2
    string street_address2 = 9;
    // city is the appeal city
    string city = 10;
    // state is the appeal state
    string state = 11;
    // zipcode is the appeal zipcode
    string zipcode = 12;
    // country is the appeal country
    string country = 13;
}

message TrackAppeal {
    // track_appeal_id is the track appeal id
    string track_appeal_id = 1;
    // audible_magic_response_id is the audible magic response id
    string audible_magic_response_id = 2;
    // vod_appeal_id is the vod appeal id
    string vod_appeal_id = 3;
    // reason is the reason for the appeal
    string reason = 4;
    // created_at is when this appeal was created
    google.protobuf.Timestamp created_at = 5;
    // updated_at is when this appeal was update
    google.protobuf.Timestamp updated_at = 6;
    // resolved_at is when this appeal was resolved
    google.protobuf.Timestamp resolved_at = 7;
}

message VodNotificationSetting {
    // id is the id of the notification setting
    string id = 1;
    // vod_id is the id of the vod that this notification setting is for
    string vod_id = 2;
    // type is the notification setting type
    VodNotificationSettingType type = 3;
    // custom_text is the custom text for this notification setting
    google.protobuf.StringValue custom_text = 4;
    // enabled is whether this notification setting is enabled
    bool enabled = 5;
    // sent_at is when the notification was sent
    google.protobuf.Timestamp sent_at = 6;
    // created_at is when this notification setting was created
    google.protobuf.Timestamp created_at = 7;
    // updated_at is when this notification settting was updated
    google.protobuf.Timestamp updated_at = 8;
}

message VodNotificationSettingsMap {
    // email is the notification settings for email
    VodNotificationSetting email = 1;
    // email is the notification settings for channel feed
    VodNotificationSetting channel_feed = 2;
}

message Vod {
    // broadcast_id is the broadcast id for the vod
    string broadcast_id = 1;
    // broadcast_type is the broadcast type for the vod
    VodType broadcast_type = 2;
    // broadcaster_software is the software used to broadcast
    google.protobuf.StringValue broadcaster_software = 3;
    // communities is the set of communities that is related to this vod
    repeated string communities = 4;
    // created_at is when the vod was created
    google.protobuf.Timestamp created_at = 5;
    // created_by is who created the vod, could be an editor
    google.protobuf.StringValue created_by = 6;
    // delete_at is when the vod is deleted
    google.protobuf.Timestamp delete_at = 7;
    // deleted is whether the vod is deleted, might eventually be consolidated with status
    google.protobuf.BoolValue deleted = 8;
    // description is the description for the vod
    google.protobuf.StringValue description = 9;
    // description_html is the html version of the description
    google.protobuf.StringValue description_html = 10;
    // duration is the duration of the vod
    int64 duration = 11;
    // fps is the frames per second formats for a vod, should be consolidated with other format stuff, resolutions and show_formats
    map<string, double> fps = 13;
    // game is the game for the vod
    google.protobuf.StringValue game = 14;
    // id is the identifier for the vod
    string id = 15;
    // language is the language of the vod
    google.protobuf.StringValue language = 16;
    // manifest is the path to the manifest file
    google.protobuf.StringValue manifest = 17;
    // offset is the offset into the source vod, used for highlights and should be deprecated
    int64 offset = 18;
    // origin is the where this vod originated from
    google.protobuf.StringValue origin = 19;
    // owner_id is the owner of the vod
    string owner_id = 20;
    // resolutions is the resolutions formats for a vod, should be consolidated with other format stuff, fps and show_formats
    map<string, string> resolutions = 21;
    // source_archive_id is the id of the source vod, used for highlights and should be deprecated
    google.protobuf.StringValue source_archive_id = 22;
    // started_on is when the vod was started
    google.protobuf.Timestamp started_on = 23;
    // status is the status of the vod
    VodStatus status = 24;
    // tag_list is the list of tags for a vod
    repeated string tag_list = 25;
    // title is the title for the vod
    google.protobuf.StringValue title = 26;
    // total_length is the total length of the vod
    int64 total_length = 27;
    // updated_at is when the vod was updated
    google.protobuf.Timestamp updated_at = 28;
    // uri is the uri path to the vod ts chunks
    string uri = 29;
    // viewable is whether the vod is viewable
    VodViewable viewable = 30;
    // viewable_at is when the vod became viewable
    google.protobuf.Timestamp viewable_at = 31;
    // views is the number of views for the vod
    int64 views = 32;
    // published_at is when the vod was published
    google.protobuf.Timestamp published_at = 33;
    // increment_view_url is the url to increment the view count
    string increment_view_url = 34;
    // qualities is the qualities format for a vod, should be consolidated with other format stuff, fps and show_formats
    repeated string qualities = 35;
    // preview_template is the thumbnail template for preview
    string preview_template = 36;
    // show_formats is the show_formats format for a vod, should be consolidated with other format stuff, fps and resolutions
    map<string, ShowFormat> show_formats = 37;
    // thumbnail_templates is the list of thumbnail templates
    repeated ThumbnailTemplate thumbnail_templates = 38;
    // seek_previews_url is the url for seek previews
    string seek_previews_url = 40;
    // animated_preview_url is the url for animated previews
    string animated_preview_url = 41;
    // path is the path to the vod
    string path = 42;
    // url is the url to the vod
    string url = 43;
    // notifications_setting is the notifications settings for the vod
    VodNotificationSettingsMap notifications_setting = 44;
    // handwave_latency_ms is the handwave latency for the vod
    google.protobuf.Int64Value handwave_latency_ms = 45;
    // failure is the create error response
    CreateErrorResponse failure = 46;
    // media_type is used to designate what type of media the video came from
    string media_type =  47;
    // region is used to designate what region the vod is hosted in
    string region =  48;
}

message CreateUploadResponse {
    // vod is the vod response
    Vod vod = 1;
}

message CreateArchiveResponse {
    // vod is the vod response
    Vod vod = 1;
}

message InternalCreateHighlightResponse {
    // vod is the vod response
    Vod vod = 1;
}

message ManagerCreateHighlightResponse {
    // vod is the vod response
    Vod vod = 1;
}

message InternalCreateHighlightV2Response {
    // vod is the vod response
    Vod vod = 1;
}

message PublicGetVodByIDResponse {
    // vod is the vod response
    Vod vod = 1;
}

message InternalGetVodByIDResponse {
    // vod is the vod response
    Vod vod = 1;
}

message InternalGetVodByIDIncludeBannedUsersResponse {
    // vod is the vod response
    Vod vod = 1;
}

message ManagerInternalGetVodByIDResponse {
    // vod is the vod response
    Vod vod = 1;
}

message VodMuteInfoResponse {
    // id is the vod id
    string id = 1;
    // audible_magic_responses is the list of audible magic responses
    repeated AudibleMagicResponse audible_magic_responses = 2;
    // muted_segments is the list of muted segments
    repeated VodMutedSegment muted_segments = 3;
    // vod_appeal is the vod appeal
    VodAppeal vod_appeal = 4;
    // track_appeals is the list of track appeals
    repeated TrackAppeal track_appeals = 5;
    // is_muted is whether the vod is muted
    google.protobuf.BoolValue is_muted = 6;
    // can_create_appeal is whether the vod can be appealed
    google.protobuf.BoolValue can_create_appeal = 7;
    // can_create_appeal is wehther the appeal is view only
    google.protobuf.BoolValue view_only_appeal = 8;
    // has_pending_appeal is wehther an appeal is already created
    google.protobuf.BoolValue has_pending_appeal = 9;
}

message ManagerGetVodMuteInfoResponse {
    // mute_info is the mute info
    VodMuteInfoResponse mute_info = 1;
}

message InternalGetVodMuteInfoResponse {
    // mute_info is the mute info
    VodMuteInfoResponse mute_info = 1;
}

message ManagerGetVodMuteInfosResponse {
    // mute_infos is the mute infos
    repeated VodMuteInfoResponse mute_infos = 1;
}

message GetVodByIDIncludeBannedUsersResponse {
    // vod is the vod response
    Vod vod = 1;
}

message ManagerGetVodByIDResponse {
    // vod is the vod response
    Vod vod = 1;
}

message ManagerSearchVodsResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message PublicGetVodsByUserResponse {
    // vods is the vods response
    repeated Vod vods = 1;
    // total_count is the total count of vods
    int64 total_count = 2;
}

message ManagerInternalGetVodsByUserResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message InternalGetVodsByUserIncludeBannedUsersResponse {
    // vods is the vods response
    repeated Vod vods = 1;
    // total_count is the total count of vods
    int64 total_count = 2;
}

message ManagerGetVodsByUserIncludeBannedUsersResponse {
    // vods is the vods response
    repeated Vod vods = 1;
    // total_count is the total count of vods
    int64 total_count = 2;
}

message InternalGetVodsByBroadcastIDsResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message PublicGetVodsByIDsResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message InternalGetVodsByIDsResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message InternalGetPrivateVodsByIDsResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message InternalGetPrivateAndDeletedVodsByIDsResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message GetVodsByIDsIncludeBannedUsersResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message PublicGetVodsByUsersResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message GetTopVodsResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message UpdateVodResponse {
    // vod is the vod response
    Vod vod = 1;
}

message ManagerUpdateVodResponse {
    // vod is the vod response
    Vod vod = 1;
}

message UndeleteVodsResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message SoftDeleteVodsResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message InternalVodRemoveRecordsResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message HardDeleteVodsResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

message ManagerSoftDeleteVodsResponse {
    // vods is the vods response
    repeated Vod vods = 1;
}

// empty response object to allow future fields without breaking the api
message YoutubeExportResponse {
}

// empty response object to allow future fields without breaking the api
message FinalizeUploadResponse {
}

// empty response object to allow future fields without breaking the api
message FinalizeHighlightV2Response {
}

// empty response object to allow future fields without breaking the api
message UpdateManifestResponse {
}

// empty response object to allow future fields without breaking the api
message SetViewcountsResponse {
}

message PublicVodAggregationsByIDsResponse {
    // total_count is the total count of vods
    int64 total_count = 1;
    // total_duration is the total duration of vods
    int64 total_duration = 2;
}

message VodPopularityResponse {
    // popular is whether the vod is popular
    bool popular = 1;
}

message CreateErrorResponse {
    // vod_id is the id of the vod that is being requested
    string vod_id = 1;
    // error_code is the error code
    string error_code = 2;
    // error_message is the error message
    string error_message = 3;
    // created_at is when the property was created
    google.protobuf.Timestamp created_at = 4;
}

message CreateThumbnailsResponse {
    // thumbnails is the list of thumbnails
    repeated Thumbnail thumbnails = 1;
}

message CreateCustomThumbnailUploadRequestResponse {
    // url is the url for the custom thumbnail upload
    string url = 1;
    // upload_id is upload id for the thumbnail request
    string upload_id = 2;
}

// empty response object to allow future fields without breaking the api
message ManagerDeleteThumbnailsResponse {
}

// empty response object to allow future fields without breaking the api
message DeleteThumbnailsResponse {
}

message UserVodPropertiesResponse {
    // channel_id is the channel for the properties
    string channel_id = 1;
    // save_vods_forever is a flag to indicate if vods should be saved forever
    bool save_vods_forever = 2;
    // vod_storage_days is how many days a vod should be stored
    int64 vod_storage_days = 3;
    // can_upload_vod is a flag to indicate if the user can upload vods
    bool can_upload_vod = 4;
    // youtube_exporting_disabled is a flag to indicate if the user can export to youtube
    bool youtube_exporting_disabled = 5;
    // skip_upload_moderation is a flag to indicate if the user's vods skip moderation
    bool skip_upload_moderation = 6;
    // skip_muting is a flag to indicate if the user's vods skip muting
    bool skip_muting = 7;
    // can_upload_vod is a flag to indicate if the user can upload unlimited vods
    bool can_upload_unlimited = 8;
    // created_at is when the property was created
    google.protobuf.Timestamp created_at = 9;
    // updated_at is when the property was updated
    google.protobuf.Timestamp updated_at = 10;
}

message UserVideoPrivacyPropertiesResponse {
    // channel_id is the channel for the properties
    string channel_id = 1;
    // hide_archives is whether the archives are hidden
    bool hide_archives = 2;
    // hide_archives is whether the hide archives is enabled
    bool hide_archives_enabled = 3;
    // created_at is when the property was created
    google.protobuf.Timestamp created_at = 4;
    // updated_at is when the property was updated
    google.protobuf.Timestamp updated_at = 5;
}

// empty response object to allow future fields without breaking the api
message CreateVodAppealsResponse {
}

message VodAppealsResponse {
    // total_count is the total count of appeals
    int64 total_count = 1;
    // appeals is the list of appeals
    repeated VodAppeal appeals = 2;
}

// empty response object to allow future fields without breaking the api
message ResolveTrackAppealResponse {
}

// empty response object to allow future fields without breaking the api
message ResolveVodAppealResponse {
}

message AudibleMagicResponsesResponse {
    // audible_magic_responses is the list of audible magic responses
    repeated AudibleMagicResponse audible_magic_responses = 1;
}

message VodDownloadResponse {
    // video_id is the id of the vod that is being downloaded
    string video_id = 1;
    // download_url is the download_url value for the vod download
    google.protobuf.StringValue download_url = 2;
    // status is the status value for the vod download
    google.protobuf.StringValue status = 3;
    // updated_at is when this vod download was updated
    google.protobuf.Timestamp updated_at = 4;
}
