Compare commits

..

No commits in common. "master" and "ivan/add-workflow" have entirely different histories.

22 changed files with 121 additions and 5486 deletions

View File

@ -13,5 +13,5 @@ jobs:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with: with:
submodules: recursive submodules: recursive
- name: codegen causes no changes - name: graphql-codegen causes no changes
run: ./bin/assert-no-changes-wrapper.sh run: ./bin/assert-no-changes-wrapper.sh

1
.gitignore vendored
View File

@ -3,4 +3,3 @@ dist
.direnv .direnv
/after.txt /after.txt
/before.txt /before.txt
**/__pycache__/**

View File

@ -1 +0,0 @@
# rbgql

View File

@ -4,12 +4,6 @@ git ls-files | xargs md5sum > before.txt
yarn install yarn install
yarn graphql-codegen yarn graphql-codegen
prettier ./src --write prettier ./src --write
for proto in $(find ./rbproto -iname '*.proto'); do
name=$(basename "$proto" .proto)
protoc -I=./rbproto --python_out=./rbproto/python --pyi_out=./rbproto/python ./rbproto/shot.proto
yarn pbjs ./rbproto/shot.proto --ts ./rbproto/ts/shot.ts
done
prettier ./rbproto --write
git ls-files | xargs md5sum > after.txt git ls-files | xargs md5sum > after.txt

View File

@ -21,7 +21,7 @@
in in
with pkgs; { with pkgs; {
devShell = mkShell { devShell = mkShell {
buildInputs = [nodejs yarn watchman alejandra nodePackages.prettier just protobuf]; buildInputs = [nodejs yarn watchman alejandra nodePackages.prettier just];
}; };
}); });
} }

View File

@ -1,5 +1,4 @@
NIX := "LD_LIBRARY_PATH='' nix" NIX := "LD_LIBRARY_PATH='' nix"
PROTOBUF_DIR := "$PWD/rbproto"
prettier-gql: prettier-gql:
#!/usr/bin/env bash #!/usr/bin/env bash
@ -13,27 +12,3 @@ gql-codegen:
gql: gql-codegen prettier-gql gql: gql-codegen prettier-gql
protobuf-compile-a-python name:
protoc -I={{ PROTOBUF_DIR }} --python_out={{ PROTOBUF_DIR }}/python --pyi_out={{ PROTOBUF_DIR }}/python {{ PROTOBUF_DIR }}/shot.proto
protobuf-compile-a-js name:
#!/usr/bin/env bash
set -euxo pipefail
{{NIX}} develop --impure --command bash -c 'yarn pbjs {{ PROTOBUF_DIR }}/shot.proto --ts {{ PROTOBUF_DIR }}/ts/shot.ts && yarn prettier ./rbproto --write'
protobuf-compile-all-js:
#!/usr/bin/env bash
for proto in $(find {{ PROTOBUF_DIR }} -iname '*.proto'); do
name=$(basename "$proto" .proto)
just protobuf-compile-a-js $name
done
protobuf-compile-all-python:
#!/usr/bin/env bash
for proto in $(find {{ PROTOBUF_DIR }} -iname '*.proto'); do
name=$(basename "$proto" .proto)
just protobuf-compile-a-python $name
done
protobuf-compile-everything: protobuf-compile-all-js protobuf-compile-all-python

View File

@ -18,7 +18,6 @@
"@graphql-codegen/typescript-operations": "^4.0.1", "@graphql-codegen/typescript-operations": "^4.0.1",
"@graphql-codegen/typescript-react-apollo": "^4.2.0", "@graphql-codegen/typescript-react-apollo": "^4.2.0",
"graphql": "^16.8.1", "graphql": "^16.8.1",
"pbjs": "^0.0.14",
"prettier": "^3.2.5", "prettier": "^3.2.5",
"prettier-plugin-organize-imports": "^3.2.4" "prettier-plugin-organize-imports": "^3.2.4"
}, },

View File

@ -1,16 +0,0 @@
[tool.poetry]
name = "rbproto"
version = "0.1.0"
description = ""
authors = ["Mike Kalange <countablecloud@gmail.com>"]
readme = "README.md"
packages = [{include = "rbproto"}]
[tool.poetry.dependencies]
python = ">=3.10,<3.12"
protobuf = "^4.25.3"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

View File

@ -1 +0,0 @@
from .python.shot_pb2 import * # noqa: F401

View File

@ -1,49 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: shot.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nshot.proto\x12\x0fserialized_shot\"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08\"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r\"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection\"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection\"\xfc\x01\n\rCollisionInfo\x12\x0e\n\x06source\x18\x01 \x01(\r\x12M\n\x10\x62\x61ll_identifiers\x18\x02 \x03(\x0b\x32\x33.serialized_shot.CollisionInfo.BallIdentifiersEntry\x12\x17\n\x0fwall_identifier\x18\x03 \x01(\r\x12\x13\n\x0b\x66rame_index\x18\x04 \x01(\r\x12\x0e\n\x06static\x18\x05 \x01(\x08\x1aN\n\x14\x42\x61llIdentifiersEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.serialized_shot.Point:\x02\x38\x01\"\xcc\x02\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x12\x32\n\nstart_info\x18\x07 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfo\x12\x30\n\x08\x65nd_info\x18\x08 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfoB\x13\n\x11\x64\x65tection_history\"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\"j\n\x12KeyBallIdentifiers\x12\x10\n\x08\x63ue_ball\x18\x01 \x01(\r\x12\x13\n\x0bobject_ball\x18\x02 \x01(\r\x12\x13\n\x0btarget_ball\x18\x03 \x01(\r\x12\x18\n\x10\x63ontact_sequence\x18\x04 \x03(\r\"\xa8\x01\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32\".serialized_shot.IdentifierHistory\x12\x36\n\tkey_balls\x18\x04 \x01(\x0b\x32#.serialized_shot.KeyBallIdentifiers\x12\x13\n\x0bstart_index\x18\x05 \x01(\r\x12\x11\n\tend_index\x18\x06 \x01(\rb\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
_globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._options = None
_globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_options = b'8\001'
_globals['_BOX']._serialized_start=31
_globals['_BOX']._serialized_end=94
_globals['_POINT']._serialized_start=96
_globals['_POINT']._serialized_end=125
_globals['_BALLDETECTION']._serialized_start=127
_globals['_BALLDETECTION']._serialized_end=254
_globals['_RLEBALLDETECTION']._serialized_start=256
_globals['_RLEBALLDETECTION']._serialized_end=340
_globals['_RLEDETECTIONHISTORY']._serialized_start=342
_globals['_RLEDETECTIONHISTORY']._serialized_end=418
_globals['_DETECTIONHISTORY']._serialized_start=420
_globals['_DETECTIONHISTORY']._serialized_end=490
_globals['_COLLISIONINFO']._serialized_start=493
_globals['_COLLISIONINFO']._serialized_end=745
_globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_start=667
_globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_end=745
_globals['_PATH']._serialized_start=748
_globals['_PATH']._serialized_end=1080
_globals['_IDENTIFIERHISTORY']._serialized_start=1082
_globals['_IDENTIFIERHISTORY']._serialized_end=1164
_globals['_KEYBALLIDENTIFIERS']._serialized_start=1166
_globals['_KEYBALLIDENTIFIERS']._serialized_end=1272
_globals['_SHOT']._serialized_start=1275
_globals['_SHOT']._serialized_end=1443
# @@protoc_insertion_point(module_scope)

View File

@ -1,129 +0,0 @@
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class Box(_message.Message):
__slots__ = ["left", "top", "width", "height"]
LEFT_FIELD_NUMBER: _ClassVar[int]
TOP_FIELD_NUMBER: _ClassVar[int]
WIDTH_FIELD_NUMBER: _ClassVar[int]
HEIGHT_FIELD_NUMBER: _ClassVar[int]
left: float
top: float
width: float
height: float
def __init__(self, left: _Optional[float] = ..., top: _Optional[float] = ..., width: _Optional[float] = ..., height: _Optional[float] = ...) -> None: ...
class Point(_message.Message):
__slots__ = ["x", "y"]
X_FIELD_NUMBER: _ClassVar[int]
Y_FIELD_NUMBER: _ClassVar[int]
x: float
y: float
def __init__(self, x: _Optional[float] = ..., y: _Optional[float] = ...) -> None: ...
class BallDetection(_message.Message):
__slots__ = ["plane_position", "annotation", "interpolated"]
PLANE_POSITION_FIELD_NUMBER: _ClassVar[int]
ANNOTATION_FIELD_NUMBER: _ClassVar[int]
INTERPOLATED_FIELD_NUMBER: _ClassVar[int]
plane_position: Point
annotation: Box
interpolated: bool
def __init__(self, plane_position: _Optional[_Union[Point, _Mapping]] = ..., annotation: _Optional[_Union[Box, _Mapping]] = ..., interpolated: bool = ...) -> None: ...
class RLEBallDetection(_message.Message):
__slots__ = ["detection", "count"]
DETECTION_FIELD_NUMBER: _ClassVar[int]
COUNT_FIELD_NUMBER: _ClassVar[int]
detection: BallDetection
count: int
def __init__(self, detection: _Optional[_Union[BallDetection, _Mapping]] = ..., count: _Optional[int] = ...) -> None: ...
class RLEDetectionHistory(_message.Message):
__slots__ = ["detections"]
DETECTIONS_FIELD_NUMBER: _ClassVar[int]
detections: _containers.RepeatedCompositeFieldContainer[RLEBallDetection]
def __init__(self, detections: _Optional[_Iterable[_Union[RLEBallDetection, _Mapping]]] = ...) -> None: ...
class DetectionHistory(_message.Message):
__slots__ = ["detections"]
DETECTIONS_FIELD_NUMBER: _ClassVar[int]
detections: _containers.RepeatedCompositeFieldContainer[BallDetection]
def __init__(self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...) -> None: ...
class CollisionInfo(_message.Message):
__slots__ = ["source", "ball_identifiers", "wall_identifier", "frame_index", "static"]
class BallIdentifiersEntry(_message.Message):
__slots__ = ["key", "value"]
KEY_FIELD_NUMBER: _ClassVar[int]
VALUE_FIELD_NUMBER: _ClassVar[int]
key: int
value: Point
def __init__(self, key: _Optional[int] = ..., value: _Optional[_Union[Point, _Mapping]] = ...) -> None: ...
SOURCE_FIELD_NUMBER: _ClassVar[int]
BALL_IDENTIFIERS_FIELD_NUMBER: _ClassVar[int]
WALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int]
FRAME_INDEX_FIELD_NUMBER: _ClassVar[int]
STATIC_FIELD_NUMBER: _ClassVar[int]
source: int
ball_identifiers: _containers.MessageMap[int, Point]
wall_identifier: int
frame_index: int
static: bool
def __init__(self, source: _Optional[int] = ..., ball_identifiers: _Optional[_Mapping[int, Point]] = ..., wall_identifier: _Optional[int] = ..., frame_index: _Optional[int] = ..., static: bool = ...) -> None: ...
class Path(_message.Message):
__slots__ = ["start_frame", "end_frame", "detections", "rle_detections", "not_present", "is_static", "start_info", "end_info"]
START_FRAME_FIELD_NUMBER: _ClassVar[int]
END_FRAME_FIELD_NUMBER: _ClassVar[int]
DETECTIONS_FIELD_NUMBER: _ClassVar[int]
RLE_DETECTIONS_FIELD_NUMBER: _ClassVar[int]
NOT_PRESENT_FIELD_NUMBER: _ClassVar[int]
IS_STATIC_FIELD_NUMBER: _ClassVar[int]
START_INFO_FIELD_NUMBER: _ClassVar[int]
END_INFO_FIELD_NUMBER: _ClassVar[int]
start_frame: int
end_frame: int
detections: DetectionHistory
rle_detections: RLEDetectionHistory
not_present: bool
is_static: bool
start_info: CollisionInfo
end_info: CollisionInfo
def __init__(self, start_frame: _Optional[int] = ..., end_frame: _Optional[int] = ..., detections: _Optional[_Union[DetectionHistory, _Mapping]] = ..., rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ..., not_present: bool = ..., is_static: bool = ..., start_info: _Optional[_Union[CollisionInfo, _Mapping]] = ..., end_info: _Optional[_Union[CollisionInfo, _Mapping]] = ...) -> None: ...
class IdentifierHistory(_message.Message):
__slots__ = ["ball_identifier", "paths"]
BALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int]
PATHS_FIELD_NUMBER: _ClassVar[int]
ball_identifier: int
paths: _containers.RepeatedCompositeFieldContainer[Path]
def __init__(self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...) -> None: ...
class KeyBallIdentifiers(_message.Message):
__slots__ = ["cue_ball", "object_ball", "target_ball", "contact_sequence"]
CUE_BALL_FIELD_NUMBER: _ClassVar[int]
OBJECT_BALL_FIELD_NUMBER: _ClassVar[int]
TARGET_BALL_FIELD_NUMBER: _ClassVar[int]
CONTACT_SEQUENCE_FIELD_NUMBER: _ClassVar[int]
cue_ball: int
object_ball: int
target_ball: int
contact_sequence: _containers.RepeatedScalarFieldContainer[int]
def __init__(self, cue_ball: _Optional[int] = ..., object_ball: _Optional[int] = ..., target_ball: _Optional[int] = ..., contact_sequence: _Optional[_Iterable[int]] = ...) -> None: ...
class Shot(_message.Message):
__slots__ = ["identifier_histories", "key_balls", "start_index", "end_index"]
IDENTIFIER_HISTORIES_FIELD_NUMBER: _ClassVar[int]
KEY_BALLS_FIELD_NUMBER: _ClassVar[int]
START_INDEX_FIELD_NUMBER: _ClassVar[int]
END_INDEX_FIELD_NUMBER: _ClassVar[int]
identifier_histories: _containers.RepeatedCompositeFieldContainer[IdentifierHistory]
key_balls: KeyBallIdentifiers
start_index: int
end_index: int
def __init__(self, identifier_histories: _Optional[_Iterable[_Union[IdentifierHistory, _Mapping]]] = ..., key_balls: _Optional[_Union[KeyBallIdentifiers, _Mapping]] = ..., start_index: _Optional[int] = ..., end_index: _Optional[int] = ...) -> None: ...

View File

@ -1,73 +0,0 @@
syntax = "proto3";
package serialized_shot;
message Box {
float left = 1;
float top = 2;
float width = 3;
float height = 4;
}
message Point {
float x = 1;
float y = 2;
}
message BallDetection {
Point plane_position = 1;
Box annotation = 2;
bool interpolated = 3;
}
message RLEBallDetection {
BallDetection detection = 1;
uint32 count = 2;
}
message RLEDetectionHistory { repeated RLEBallDetection detections = 1; }
message DetectionHistory { repeated BallDetection detections = 1; }
message CollisionInfo {
uint32 source = 1;
map<uint32, Point> ball_identifiers = 2;
uint32 wall_identifier = 3;
uint32 frame_index = 4;
bool static = 5;
}
message Path {
uint32 start_frame = 1;
uint32 end_frame = 2;
oneof detection_history {
DetectionHistory detections = 3;
RLEDetectionHistory rle_detections = 4;
bool not_present = 5;
}
bool is_static = 6;
CollisionInfo start_info = 7;
CollisionInfo end_info = 8;
}
message IdentifierHistory {
uint32 ball_identifier = 1;
repeated Path paths = 2;
}
message KeyBallIdentifiers {
uint32 cue_ball = 1;
uint32 object_ball = 2;
uint32 target_ball = 3;
// For now this will just be cue->object/target->target
// Long term this will potentially represent a linked list
// of all balls in a shot.
repeated uint32 contact_sequence = 4;
}
message Shot {
repeated IdentifierHistory identifier_histories = 3;
KeyBallIdentifiers key_balls = 4;
uint32 start_index = 5;
uint32 end_index = 6;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,5 @@ query getDeployedConfig {
devMode devMode
environment environment
firebase firebase
minimumAllowedAppVersion
} }
} }

View File

@ -23,7 +23,6 @@ query GetFeed(
stream { stream {
isCompleted isCompleted
} }
tableSize
tags { tags {
tagClasses { tagClasses {
name name

View File

@ -1,7 +1,5 @@
query GetShots( query GetShots(
$filterInput: FilterInput! $filterInput: FilterInput!
$shotsPagination: GetShotsPagination
$limit: Int
$includeCreatedAt: Boolean! = false $includeCreatedAt: Boolean! = false
$includeUpdatedAt: Boolean! = false $includeUpdatedAt: Boolean! = false
$includeCueObjectFeatures: Boolean! = false $includeCueObjectFeatures: Boolean! = false
@ -9,17 +7,12 @@ query GetShots(
$includeCueObjectDistance: Boolean! = false $includeCueObjectDistance: Boolean! = false
$includeCueObjectAngle: Boolean! = false $includeCueObjectAngle: Boolean! = false
$includeCueBallSpeed: Boolean! = false $includeCueBallSpeed: Boolean! = false
$includeSpinType: Boolean! = false
$includeShotDirection: Boolean! = false $includeShotDirection: Boolean! = false
$includeTargetPocketDistance: Boolean! = false $includeTargetPocketDistance: Boolean! = false
$includeMake: Boolean! = false $includeMake: Boolean! = false
$includeIntendedPocketType: Boolean! = false $includeIntendedPocketType: Boolean! = false
) { ) {
getShots( getShots(filterInput: $filterInput) {
filterInput: $filterInput
shotsPagination: $shotsPagination
limit: $limit
) {
id id
videoId videoId
startFrame startFrame
@ -27,15 +20,6 @@ query GetShots(
user { user {
id id
} }
falsePositiveScore
video {
stream {
resolution {
width
height
}
}
}
createdAt @include(if: $includeCreatedAt) createdAt @include(if: $includeCreatedAt)
updatedAt @include(if: $includeUpdatedAt) updatedAt @include(if: $includeUpdatedAt)
cueObjectFeatures @include(if: $includeCueObjectFeatures) { cueObjectFeatures @include(if: $includeCueObjectFeatures) {
@ -43,7 +27,6 @@ query GetShots(
cueObjectAngle @include(if: $includeCueObjectAngle) cueObjectAngle @include(if: $includeCueObjectAngle)
cueBallSpeed @include(if: $includeCueBallSpeed) cueBallSpeed @include(if: $includeCueBallSpeed)
shotDirection @include(if: $includeShotDirection) shotDirection @include(if: $includeShotDirection)
spinType @include(if: $includeSpinType)
} }
pocketingIntentionFeatures pocketingIntentionFeatures
@include(if: $includePocketingIntentionFeatures) { @include(if: $includePocketingIntentionFeatures) {
@ -53,84 +36,3 @@ query GetShots(
} }
} }
} }
query GetSerializedShotPaths($filterInput: FilterInput!) {
getShots(filterInput: $filterInput) {
id
videoId
startFrame
endFrame
serializedShotPaths {
b64EncodedBuffer
}
}
}
query GetShotAnnotationTypes {
getShotAnnotationTypes {
id
name
}
}
query GetShotsWithMetadata(
$filterInput: FilterInput!
$shotsPagination: GetShotsPagination
$limit: Int
$includeCreatedAt: Boolean! = false
$includeUpdatedAt: Boolean! = false
$includeCueObjectFeatures: Boolean! = false
$includePocketingIntentionFeatures: Boolean! = false
$includeCueObjectDistance: Boolean! = false
$includeCueObjectAngle: Boolean! = false
$includeCueBallSpeed: Boolean! = false
$includeSpinType: Boolean! = false
$includeShotDirection: Boolean! = false
$includeTargetPocketDistance: Boolean! = false
$includeMake: Boolean! = false
$includeIntendedPocketType: Boolean! = false
) {
getShotsWithMetadata(
filterInput: $filterInput
shotsPagination: $shotsPagination
limit: $limit
) {
count
shots {
id
videoId
startFrame
endFrame
user {
id
}
falsePositiveScore
video {
stream {
resolution {
width
height
}
}
}
serializedShotPaths {
b64EncodedBuffer
}
createdAt @include(if: $includeCreatedAt)
updatedAt @include(if: $includeUpdatedAt)
cueObjectFeatures @include(if: $includeCueObjectFeatures) {
cueObjectDistance @include(if: $includeCueObjectDistance)
cueObjectAngle @include(if: $includeCueObjectAngle)
cueBallSpeed @include(if: $includeCueBallSpeed)
shotDirection @include(if: $includeShotDirection)
spinType @include(if: $includeSpinType)
}
pocketingIntentionFeatures
@include(if: $includePocketingIntentionFeatures) {
targetPocketDistance @include(if: $includeTargetPocketDistance)
make @include(if: $includeMake)
intendedPocketType @include(if: $includeIntendedPocketType)
}
}
}
}

View File

@ -1,20 +1,9 @@
mutation getProfileImageUploadLink($fileExt: String = ".png") { mutation getProfileImageUploadLink($fileExt: String = ".png") {
getProfileImageUploadLink(fileExt: $fileExt) { getProfileImageUploadLink(fileExt: $fileExt) {
value { uploadUrl
... on UploadLink { headers {
uploadUrl key
headers { value
key
value
}
}
... on GetProfileUploadLinkErrors {
error {
... on TooManyProfileImageUploadsErr {
linksRequested
}
}
}
} }
} }
} }
@ -35,7 +24,6 @@ query getLoggedInUser {
id id
firebaseUid firebaseUid
username username
isAdmin
profileImageUri profileImageUri
activeVideoId activeVideoId
createdAt createdAt
@ -48,18 +36,3 @@ query GetUserPlayTime($userId: Int!) {
totalSeconds totalSeconds
} }
} }
query getUsernames(
$matchString: String!
$limit: Int = null
$after: String = null
) {
getUsernames(matchString: $matchString, limit: $limit, after: $after)
}
query GetUserTags {
getUserTags {
id
name
}
}

View File

@ -1,10 +1,10 @@
query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) { query GetStreamMonitoringDetails($videoId: Int!) {
getVideo(videoId: $videoId, debuggingJson: $debuggingJson) { getVideo(videoId: $videoId) {
id id
totalShots totalShots
makePercentage makePercentage
elapsedTime elapsedTime
currentHomography { homographyHistory {
crop { crop {
left left
top top
@ -51,7 +51,6 @@ query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) {
isCompleted isCompleted
uploadCompletionCursor uploadCompletionCursor
lastIntendedSegmentBound lastIntendedSegmentBound
initPlaylistUploadStatus
} }
currentProcessing { currentProcessing {
errors { errors {
@ -70,7 +69,6 @@ query GetVideoUpdatePageDetails($videoId: Int!) {
totalShots totalShots
makePercentage makePercentage
elapsedTime elapsedTime
tableSize
tags { tags {
tagClasses { tagClasses {
name name
@ -93,13 +91,14 @@ query GetVideoDetails($videoId: Int!) {
elapsedTime elapsedTime
endTime endTime
makePercentage makePercentage
makePercentage
medianRun medianRun
startTime startTime
totalShots totalShots
totalShots
totalShotsMade totalShotsMade
createdAt createdAt
updatedAt updatedAt
tableSize
owner { owner {
id id
firebaseUid firebaseUid
@ -118,10 +117,11 @@ query GetVideoDetails($videoId: Int!) {
query GetVideos($videoIds: [Int!]!) { query GetVideos($videoIds: [Int!]!) {
getVideos(videoIds: $videoIds) { getVideos(videoIds: $videoIds) {
id id
framesPerSecond playlist {
segmentDurations
}
stream { stream {
id id
streamSegmentType
segments { segments {
uploaded uploaded
valid valid
@ -130,9 +130,6 @@ query GetVideos($videoIds: [Int!]!) {
framesPerSecond framesPerSecond
} }
} }
playlist {
segmentDurations
}
} }
} }
@ -142,98 +139,12 @@ query GetVideo($videoId: Int!) {
playlist { playlist {
segmentDurations segmentDurations
} }
homographyHistory {
frameIndex
crop {
left
top
width
height
}
pockets {
left
top
width
height
}
sourcePoints {
topLeft {
x
y
}
topSide {
x
y
}
topRight {
x
y
}
bottomLeft {
x
y
}
bottomSide {
x
y
}
bottomRight {
x
y
}
}
}
stream { stream {
streamSegmentType
segments { segments {
segmentIndex segmentIndex
endFrameIndex endFrameIndex
framesPerSecond framesPerSecond
} }
resolution {
width
height
}
}
}
}
query GetAverageTimePerShotForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
averageTimeBetweenShots
}
}
query GetElapsedTimeForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
elapsedTime
}
}
query GetMedianRunForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
medianRun
}
}
query GetVideoForClipTimes($videoId: Int!) {
getVideo(videoId: $videoId) {
id
framesPerSecond
playlist {
segmentDurations
}
stream {
id
streamSegmentType
segments {
uploaded
valid
segmentIndex
endFrameIndex
framesPerSecond
}
} }
} }
} }

View File

@ -6,79 +6,14 @@ mutation CreateUploadStream($videoMetadataInput: VideoMetadataInput!) {
mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) { mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) {
getUploadLink(videoId: $videoId, segmentIndex: $segmentIndex) { getUploadLink(videoId: $videoId, segmentIndex: $segmentIndex) {
value { uploadUrl
... on UploadLink { headers {
uploadUrl key
headers { value
key
value
}
}
... on GetUploadLinkErrors {
error {
... on MustHaveSetForUploadLinkErr {
resolution
framesPerSecond
}
... on SegmentAlreadyUploadedErr {
segmentId
}
... on ProcessingFailedErr {
processing {
status
errors {
message
}
}
}
}
}
}
stream {
uploadCompletionCursor
} }
} }
} }
mutation GetHlsInitUploadLink($videoId: Int!) {
getHlsInitUploadLink(videoId: $videoId) {
value {
... on UploadLink {
uploadUrl
headers {
key
value
}
}
... on GetUploadLinkErrors {
error {
... on NoInitForChunkedUploadErr {
segmentType
}
... on InitUploadAlreadyCompletedErr {
segmentType
}
... on TooManyInitUploadsErr {
linksRequested
}
}
}
}
}
}
mutation SetSegmentDuration(
$videoId: Int!
$segmentIndex: Int!
$duration: Float!
) {
setSegmentDuration(
videoId: $videoId
segmentIndex: $segmentIndex
duration: $duration
)
}
mutation EditUploadStream( mutation EditUploadStream(
$videoId: Int! $videoId: Int!
$videoMetadataInput: VideoMetadataInput! $videoMetadataInput: VideoMetadataInput!
@ -115,7 +50,6 @@ query GetUploadStreamsWithDetails(
isCompleted isCompleted
lastIntendedSegmentBound lastIntendedSegmentBound
uploadCompletionCursor uploadCompletionCursor
uploadsCompleted
} }
} }
pageInfo { pageInfo {

View File

@ -4,29 +4,13 @@ type Query {
): [AggregateResultGQL!]! ): [AggregateResultGQL!]!
getBucketSet(keyName: String!): BucketSetGQL getBucketSet(keyName: String!): BucketSetGQL
getDeployedConfig: DeployedConfigGQL! getDeployedConfig: DeployedConfigGQL!
waitFor(duration: Float!): Float!
getVideoMakePercentageIntervals( getVideoMakePercentageIntervals(
videoId: ID! videoId: ID!
intervalDuration: Int! = 300 intervalDuration: Int! = 300
): [MakePercentageIntervalGQL!]! ): [MakePercentageIntervalGQL!]!
getShotsWithMetadata( getShots(filterInput: FilterInput!): [ShotGQL!]!
filterInput: FilterInput!
shotsPagination: GetShotsPagination = null
limit: Int! = 500
): GetShotsResult!
getShots(
filterInput: FilterInput!
shotsPagination: GetShotsPagination = null
limit: Int! = 500
): [ShotGQL!]!
getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]!
getUser(userId: Int!): UserGQL getUser(userId: Int!): UserGQL
getLoggedInUser: UserGQL getLoggedInUser: UserGQL
getUsernames(
matchString: String = null
limit: Int = null
after: String = null
): [String!]!
getPlayTime(userId: Int!): UserPlayTimeGQL! getPlayTime(userId: Int!): UserPlayTimeGQL!
getUserVideos( getUserVideos(
userId: Int = null userId: Int = null
@ -34,8 +18,7 @@ type Query {
after: String = null after: String = null
filters: VideoFilterInput = null filters: VideoFilterInput = null
): VideoHistoryGQL! ): VideoHistoryGQL!
getUserTags: [TagGQL!]! getVideo(videoId: Int!): VideoGQL!
getVideo(videoId: Int!, debuggingJson: JSON = null): VideoGQL!
getVideos(videoIds: [Int!]!): [VideoGQL!]! getVideos(videoIds: [Int!]!): [VideoGQL!]!
} }
@ -53,21 +36,6 @@ type TargetMetricsGQL {
count: Int! count: Int!
makePercentage: Float makePercentage: Float
averageDifficulty: Float averageDifficulty: Float
spinTypeCounts: SpinTypeCountsGQL
shotDirectionCounts: ShotDirectionCountsGQL
}
type SpinTypeCountsGQL {
follow: Int!
draw: Int!
center: Int!
unknown: Int!
}
type ShotDirectionCountsGQL {
left: Int!
right: Int!
straight: Int!
} }
input AggregateInputGQL { input AggregateInputGQL {
@ -75,10 +43,9 @@ input AggregateInputGQL {
filterInput: FilterInput filterInput: FilterInput
} }
input AggregationInput @oneOf { input AggregationInput {
bucketSet: BucketSetInputGQL bucketSet: BucketSetInputGQL = null
enum: EnumAggregation enum: EnumAggregation = null
datetimeRange: DatetimeRangeAggregationInput
} }
input BucketSetInputGQL { input BucketSetInputGQL {
@ -95,82 +62,33 @@ input EnumAggregation {
feature: String! feature: String!
} }
input DatetimeRangeAggregationInput { input FilterInput {
startDatetime: DateTime! andFilters: AndFilter = null
endDatetime: DateTime! orFilters: OrFilter = null
interval: TimeInterval! cueObjectDistance: RangeFilter = null
targetPocketDistance: RangeFilter = null
cueObjectAngle: RangeFilter = null
cueBallSpeed: RangeFilter = null
difficulty: RangeFilter = null
intendedPocketType: [PocketEnum!] = null
shotDirection: [ShotDirectionEnum!] = null
videoId: [Int!] = null
userId: [Int!] = null
make: [Boolean!] = null
tags: [VideoTagInput!] = null
} }
""" input AndFilter {
Date with time (isoformat) filters: [FilterInput!]!
"""
scalar DateTime
input TimeInterval {
"""
A second is the base unit and cannot be subdivided
"""
seconds: Int = 0
minutes: Int = 0
hours: Int = 0
days: Int = 0
weeks: Int = 0
"""
Assumes a month is 30 days long
"""
months: Int = 0
"""
Assumes a year is 365 days long
"""
years: Int = 0
} }
input FilterInput @oneOf { input OrFilter {
andFilters: [FilterInput!] filters: [FilterInput!]!
orFilters: [FilterInput!]
notFilter: FilterInput
cueObjectDistance: RangeFilter
targetPocketDistance: RangeFilter
cueObjectAngle: RangeFilter
cueBallSpeed: RangeFilter
difficulty: RangeFilter
intendedPocketType: [PocketEnum!]
shotDirection: [ShotDirectionEnum!]
videoId: [Int!]
userId: [Int!]
make: [Boolean!]
tags: [VideoTagInput!]
annotations: [ShotAnnotationInput!]
isStraight: [Boolean!]
isRight: [Boolean!]
isLeft: [Boolean!]
isLeftMiss: [Boolean!]
isRightMiss: [Boolean!]
isDirect: [Boolean!]
tableSize: RangeFilter
bankAngle: RangeFilter
bankDistance: RangeFilter
kickAngle: RangeFilter
kickDistance: RangeFilter
cueAngleAfterObject: RangeFilter
spinType: [SpinTypeEnum!]
cueSpeedAfterObject: RangeFilter
falsePositiveScore: RangeFilter
backcut: [Boolean!]
targetPocketAngleDirection: [ShotDirectionEnum!]
targetPocketAngle: RangeFilter
missAngleInDegrees: RangeFilter
} }
input RangeFilter { input RangeFilter {
lessThan: Float = null lessThan: Float = null
greaterThanEqualTo: Float = null greaterThanEqualTo: Float = null
greaterThan: Float = null
includeOnNone: Boolean! = false
lessThanInclusive: Boolean! = false
greaterThanInclusive: Boolean! = true
} }
enum PocketEnum { enum PocketEnum {
@ -193,17 +111,6 @@ input VideoTagClassInput {
name: String! name: String!
} }
input ShotAnnotationInput {
name: String!
}
enum SpinTypeEnum {
DRAW
FOLLOW
CENTER
UNKNOWN
}
type BucketSetGQL { type BucketSetGQL {
keyName: String! keyName: String!
feature: String! feature: String!
@ -220,7 +127,6 @@ type DeployedConfigGQL {
firebase: Boolean! firebase: Boolean!
devMode: Boolean! devMode: Boolean!
environment: String! environment: String!
minimumAllowedAppVersion: String!
} }
type MakePercentageIntervalGQL { type MakePercentageIntervalGQL {
@ -228,11 +134,6 @@ type MakePercentageIntervalGQL {
elapsedTime: Float! elapsedTime: Float!
} }
type GetShotsResult {
shots: [ShotGQL!]!
count: Int
}
type ShotGQL { type ShotGQL {
id: Int! id: Int!
videoId: Int! videoId: Int!
@ -242,21 +143,20 @@ type ShotGQL {
updatedAt: DateTime updatedAt: DateTime
cueObjectFeatures: CueObjectFeaturesGQL cueObjectFeatures: CueObjectFeaturesGQL
pocketingIntentionFeatures: PocketingIntentionFeaturesGQL pocketingIntentionFeatures: PocketingIntentionFeaturesGQL
pocketingIntentionInfo: PocketingIntentionInfoGQL
bankFeatures: BankFeaturesGQL bankFeatures: BankFeaturesGQL
serializedShotPaths: SerializedShotPathsGQL
user: UserGQL user: UserGQL
annotations: [ShotAnnotationGQL!]!
falsePositiveScore: Float
video: VideoGQL
} }
"""
Date with time (isoformat)
"""
scalar DateTime
type CueObjectFeaturesGQL { type CueObjectFeaturesGQL {
cueObjectDistance: Float cueObjectDistance: Float
cueObjectAngle: Float cueObjectAngle: Float
cueBallSpeed: Float cueBallSpeed: Float
shotDirection: ShotDirectionEnum shotDirection: ShotDirectionEnum
spinType: SpinTypeEnum
} }
type PocketingIntentionFeaturesGQL { type PocketingIntentionFeaturesGQL {
@ -264,24 +164,6 @@ type PocketingIntentionFeaturesGQL {
make: Boolean make: Boolean
intendedPocketType: PocketEnum intendedPocketType: PocketEnum
difficulty: Float difficulty: Float
targetPocketAngle: Float
targetPocketAngleDirection: ShotDirectionEnum
backcut: Boolean
}
type PocketingIntentionInfoGQL {
ballId: Int!
pocketId: PocketIdentifier!
pathMetadataIndex: Int!
}
enum PocketIdentifier {
TOP_LEFT
TOP_SIDE
TOP_RIGHT
BOTTOM_LEFT
BOTTOM_SIDE
BOTTOM_RIGHT
} }
type BankFeaturesGQL { type BankFeaturesGQL {
@ -295,34 +177,23 @@ enum WallTypeEnum {
SHORT SHORT
} }
type SerializedShotPathsGQL {
b64EncodedBuffer: String
}
type UserGQL { type UserGQL {
id: Int! id: Int!
firebaseUid: String! firebaseUid: String!
username: String! username: String!
isAdmin: Boolean!
activeVideoId: Int activeVideoId: Int
profileImageUri: String profileImageUri: String
createdAt: DateTime createdAt: DateTime
updatedAt: DateTime updatedAt: DateTime
} }
type ShotAnnotationGQL { type UserPlayTimeGQL {
shotId: Int! totalSeconds: Float!
type: ShotAnnotationTypeGQL!
creator: UserGQL!
notes: String!
errorDefault: Boolean!
createdAt: DateTime
updatedAt: DateTime
} }
type ShotAnnotationTypeGQL { type VideoHistoryGQL {
id: Int! videos: [VideoGQL!]!
name: String! pageInfo: PageInfoGQL!
} }
type VideoGQL { type VideoGQL {
@ -342,11 +213,9 @@ type VideoGQL {
endTime: DateTime endTime: DateTime
elapsedTime: Float elapsedTime: Float
framesPerSecond: Float! framesPerSecond: Float!
tableSize: Float!
stream: UploadStreamGQL stream: UploadStreamGQL
playlist: HLSPlaylistGQL playlist: HLSPlaylistGQL
tags: [VideoTag!]! tags: [VideoTag!]!
currentHomography: HomographyInfoGQL
homographyHistory: [HomographyInfoGQL!]! homographyHistory: [HomographyInfoGQL!]!
currentProcessing: VideoProcessingGQL currentProcessing: VideoProcessingGQL
} }
@ -358,21 +227,12 @@ type UploadStreamGQL {
segmentProcessingCursor: Int! segmentProcessingCursor: Int!
lastIntendedSegmentBound: Int lastIntendedSegmentBound: Int
isCompleted: Boolean! isCompleted: Boolean!
initPlaylistUploadStatus: InitPlaylistUploadStatusEnum
lowestUnuploadedSegmentIndex: Int! lowestUnuploadedSegmentIndex: Int!
uploadCompletionCursor: Int! uploadCompletionCursor: Int!
errors: [StreamErrorGQL!]! errors: [StreamErrorGQL!]!
createdAt: DateTime! createdAt: DateTime!
updatedAt: DateTime! updatedAt: DateTime!
segments: [UploadSegmentGQL!]! segments: [UploadSegmentGQL!]!
resolution: VideoResolutionGQL!
streamSegmentType: StreamSegmentTypeEnum!
}
enum InitPlaylistUploadStatusEnum {
NOT_APPLICABLE
NOT_UPLOADED
UPLOADED
} }
type StreamErrorGQL { type StreamErrorGQL {
@ -385,20 +245,10 @@ type UploadSegmentGQL {
valid: Boolean! valid: Boolean!
endFrameIndex: Int endFrameIndex: Int
framesPerSecond: Float framesPerSecond: Float
durationInSeconds: Float durationsInSeconds: Float
linksRequested: Int! linksRequested: Int!
} }
type VideoResolutionGQL {
width: Int
height: Int
}
enum StreamSegmentTypeEnum {
FRAGMENTED_MP4
RB_CHUNKED_MP4
}
type HLSPlaylistGQL { type HLSPlaylistGQL {
videoId: Int! videoId: Int!
m3u8Text: String! m3u8Text: String!
@ -445,8 +295,6 @@ type IntPoint2D {
type VideoProcessingGQL { type VideoProcessingGQL {
errors: [VideoProcessingErrorGQL!]! errors: [VideoProcessingErrorGQL!]!
status: ProcessingStatusEnum!
statuses: [VideoProcessingStatusGQL!]!
} }
type VideoProcessingErrorGQL { type VideoProcessingErrorGQL {
@ -455,44 +303,6 @@ type VideoProcessingErrorGQL {
endSegmentIndex: Int endSegmentIndex: Int
} }
enum ProcessingStatusEnum {
STARTED
FAILED
SUCCEEDED
SUSPENDED
CREATED
QUEUED
RUNNING
REEXTRACTING_FEATURES
}
type VideoProcessingStatusGQL {
status: ProcessingStatusEnum!
appVersion: String!
sequenceId: Int!
createdAt: DateTime
updatedAt: DateTime
}
input GetShotsPagination {
createdAfter: CreatedAfter!
startFrameAfter: Int!
}
input CreatedAfter @oneOf {
videoId: Int
createdAt: DateTime
}
type UserPlayTimeGQL {
totalSeconds: Float!
}
type VideoHistoryGQL {
videos: [VideoGQL!]!
pageInfo: PageInfoGQL!
}
type PageInfoGQL { type PageInfoGQL {
hasNextPage: Boolean! hasNextPage: Boolean!
endCursor: String endCursor: String
@ -503,42 +313,15 @@ input VideoFilterInput {
requireCursorCompletion: Boolean! = true requireCursorCompletion: Boolean! = true
} }
type TagGQL {
name: String!
id: Int!
group: String
}
"""
The `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).
"""
scalar JSON
@specifiedBy(
url: "https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf"
)
type Mutation { type Mutation {
createBucketSet(params: CreateBucketSetInput!): BucketSetGQL! createBucketSet(params: CreateBucketSetInput!): BucketSetGQL!
setLoggerLevel(path: String!, level: String!): Boolean! setLoggerLevel(path: String!, level: String!): Boolean!
addAnnotationToShot( getProfileImageUploadLink(fileExt: String = ".png"): GetUploadLinkReturn!
shotId: Int!
annotationName: String!
notes: String = null
): AddShotAnnotationReturn!
getProfileImageUploadLink(
fileExt: String = ".png"
): GetProfileUploadLinkReturn!
editProfileImageUri(profileImageUri: String!): UserGQL! editProfileImageUri(profileImageUri: String!): UserGQL!
createUploadStream( createUploadStream(
videoMetadata: VideoMetadataInput! videoMetadata: VideoMetadataInput!
): CreateUploadStreamReturn! ): CreateUploadStreamReturn!
getUploadLink(videoId: Int!, segmentIndex: Int!): GetUploadLinkReturn! getUploadLink(videoId: Int!, segmentIndex: Int!): GetUploadLinkReturn!
getHlsInitUploadLink(videoId: Int!): GetUploadLinkReturn!
setSegmentDuration(
videoId: Int!
segmentIndex: Int!
duration: Float!
): Boolean!
editUploadStream(videoId: Int!, videoMetadata: VideoMetadataInput!): Boolean! editUploadStream(videoId: Int!, videoMetadata: VideoMetadataInput!): Boolean!
deleteVideo(videoId: Int!): Boolean! deleteVideo(videoId: Int!): Boolean!
} }
@ -549,44 +332,7 @@ input CreateBucketSetInput {
buckets: [BucketInputGQL!]! buckets: [BucketInputGQL!]!
} }
type AddShotAnnotationReturn { type GetUploadLinkReturn {
value: SuccessfulAddAddShotAnnotationErrors!
}
union SuccessfulAddAddShotAnnotationErrors =
SuccessfulAdd
| AddShotAnnotationErrors
type SuccessfulAdd {
value: Boolean!
}
type AddShotAnnotationErrors {
error: DoesNotOwnShotErrOtherErrorNeedsNote!
}
union DoesNotOwnShotErrOtherErrorNeedsNote =
DoesNotOwnShotErr
| OtherErrorNeedsNote
type DoesNotOwnShotErr {
shotId: Int!
msg: String
}
type OtherErrorNeedsNote {
msg: String
}
type GetProfileUploadLinkReturn {
value: UploadLinkGetProfileUploadLinkErrors!
}
union UploadLinkGetProfileUploadLinkErrors =
UploadLink
| GetProfileUploadLinkErrors
type UploadLink {
uploadUrl: String! uploadUrl: String!
headers: [Header]! headers: [Header]!
} }
@ -596,14 +342,6 @@ type Header {
value: String! value: String!
} }
type GetProfileUploadLinkErrors {
error: TooManyProfileImageUploadsErr!
}
type TooManyProfileImageUploadsErr {
linksRequested: Int!
}
type CreateUploadStreamReturn { type CreateUploadStreamReturn {
videoId: Int! videoId: Int!
} }
@ -613,13 +351,10 @@ input VideoMetadataInput {
startTime: DateTime = null startTime: DateTime = null
endTime: DateTime = null endTime: DateTime = null
gameType: String = null gameType: String = null
tableSize: Float = null tableSize: String = null
uploadStreamMetadataInput: UploadStreamMetadataInput = null uploadStreamMetadataInput: UploadStreamMetadataInput = null
lastIntendedSegmentBound: Int = null lastIntendedSegmentBound: Int = null
streamSegmentType: StreamSegmentTypeEnum = null
endStream: Boolean! = false endStream: Boolean! = false
resolution: VideoResolution = null
framesPerSecond: Float = null
} }
input UploadStreamMetadataInput { input UploadStreamMetadataInput {
@ -639,53 +374,3 @@ enum DeviceTypeEnum {
ANDROID ANDROID
BROWSER BROWSER
} }
input VideoResolution {
width: Int!
height: Int!
}
type GetUploadLinkReturn {
value: UploadLinkGetUploadLinkErrors!
stream: UploadStreamGQL
}
union UploadLinkGetUploadLinkErrors = UploadLink | GetUploadLinkErrors
type GetUploadLinkErrors {
error: MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr!
}
union MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr =
MustHaveSetForUploadLinkErr
| SegmentAlreadyUploadedErr
| ProcessingFailedErr
| NoInitForChunkedUploadErr
| TooManyProfileImageUploadsErr
| InitUploadAlreadyCompletedErr
| TooManyInitUploadsErr
type MustHaveSetForUploadLinkErr {
resolution: Boolean
framesPerSecond: Boolean
}
type SegmentAlreadyUploadedErr {
segmentId: Int!
}
type ProcessingFailedErr {
processing: VideoProcessingGQL!
}
type NoInitForChunkedUploadErr {
segmentType: StreamSegmentTypeEnum!
}
type InitUploadAlreadyCompletedErr {
segmentType: StreamSegmentTypeEnum!
}
type TooManyInitUploadsErr {
linksRequested: Int!
}

View File

@ -1553,11 +1553,6 @@ colorette@^2.0.16:
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
commander@4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c"
integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA==
common-tags@1.8.2: common-tags@1.8.2:
version "1.8.2" version "1.8.2"
resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6"
@ -2543,14 +2538,6 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
pbjs@^0.0.14:
version "0.0.14"
resolved "https://registry.yarnpkg.com/pbjs/-/pbjs-0.0.14.tgz#5ab3d4a5f06a9ab78dd320c63f72877120d4c48d"
integrity sha512-F4aA0ojrQ37kxFPOg4yRLP/vxb76rYQwMQigmVEljYlA7hZKmjaWjP6IkRn4nA0NdIj4Xxe4iqWrrIhJy+MwWQ==
dependencies:
commander "4.0.1"
protocol-buffers-schema "3.1.0"
picocolors@^1.0.0: picocolors@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
@ -2587,11 +2574,6 @@ prop-types@^15.7.2:
object-assign "^4.1.1" object-assign "^4.1.1"
react-is "^16.13.1" react-is "^16.13.1"
protocol-buffers-schema@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.1.0.tgz#d8a819549ead3e6bd189ebe9e50e96636bbc5cc7"
integrity sha512-1g9zFjLFhGN1Dc5UVO8D2loVslp6sVxk5sJqgD66CuWUITh2gOaTLRN/pIakGFfB6e0nNF6hImrYFDurEsA1UQ==
punycode@^1.3.2: punycode@^1.3.2:
version "1.4.1" version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"