Compare commits

..

49 Commits

Author SHA1 Message Date
0999c88797 added resolution
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-07-18 20:10:23 -07:00
d3559ede21 Merge pull request 'Add frames_per_second' (#21) from loewy/add-fps into master
Reviewed-on: #21
Reviewed-by: countablecloud <countablecloud@gmail.com>
2024-07-18 17:51:30 -06:00
ef6ccca3f9 fix black issue
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-07-18 16:46:27 -07:00
f781e9648f add pycache to gitignore
Some checks failed
Tests / Tests (pull_request) Failing after 15s
2024-07-18 16:37:59 -07:00
18d2eea029 add shot_pb2 2024-07-18 16:34:22 -07:00
a95bdab8bf ad frames per second to schema 2024-07-18 16:14:28 -07:00
eaeb1ed0ea Add resolution 2024-07-18 01:14:18 -06:00
f9d6377fe4 Update durations in seconds 2024-07-16 21:48:15 -06:00
30cf72de78 Merge pull request 'Add initPlaylistUploadStatus' (#20) from loewy/update-video-gql-operations into master
Reviewed-on: #20
2024-07-16 20:24:58 -06:00
fd49dec34c add initPlaylistUploadStatus
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-07-16 19:23:54 -07:00
cdd1cdd526 Fix segment parameter again 2024-07-16 20:22:16 -06:00
bce363e8ff Parameter to setSegmentDuration should be segmentIndex 2024-07-16 20:20:37 -06:00
80f609b8a2 Merge pull request 'Add operation for set segment duration' (#19) from loewy/set-segment-duration-operation into master
Reviewed-on: #19
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-07-16 17:54:19 -06:00
6205e9a353 add operation for set segment duration
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-07-16 16:33:22 -07:00
12f7e1f115 Merge pull request 'Add operation getHlsInitUploadLink' (#18) from loewy/operation-get-hls-init-upload-link into master
Reviewed-on: #18
2024-07-16 15:28:43 -06:00
296ad969f4 Merge branch 'master' into loewy/operation-get-hls-init-upload-link
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-07-16 15:27:37 -06:00
d25c08447e Merge pull request 'Adds init playlist status' (#17) from mk/add-init-file-uploaded-marking into master
Reviewed-on: #17
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-07-16 15:26:27 -06:00
7502a75753 Merge remote-tracking branch 'origin' into mk/add-init-file-uploaded-marking
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-07-16 14:23:32 -07:00
1a14db1a17 Adds init playlist status
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-07-16 14:21:45 -07:00
67d8bcac21 add operation for hls init link
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-07-15 17:29:55 -07:00
4ca27317b4 Add operation for shot annotation types 2024-07-15 15:37:43 -06:00
dc214e878f Add annotations to shot gql 2024-07-15 15:32:21 -06:00
d669dba320 Add getUsernames operation 2024-07-14 00:16:02 -06:00
235f4a58e9 Add getUsernames 2024-07-13 23:43:18 -06:00
03c1d08d8c Request isAdmin in getLoggedInUser 2024-07-13 17:47:41 -06:00
cc36a8b51d Add isAdmin 2024-07-13 17:40:30 -06:00
d743ad83e3 Merge pull request 'Expand GQL Interfaces To Accomodate Multiple Stream Types' (#16) from mk/extend-to-additional-stream-types into master
Reviewed-on: #16
2024-07-12 22:08:57 -06:00
194c258dcd Expand GQL Interfaces To Accomodate Multiple Stream Types
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-07-12 18:50:50 -06:00
e0e1ae1108 Merge pull request 'Add new filters' (#15) from dean/add-new-filters into master
Reviewed-on: #15
2024-07-12 17:54:42 -06:00
ee73443374 Add new filters
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-07-12 23:52:06 +00:00
88801f9186 Add not support to filter input gql 2024-07-10 16:17:32 -06:00
524d469a0d Merge pull request 'Add get shot annotations query' (#14) from ivan/add-get-shot-annotations-query into master
Reviewed-on: #14
2024-07-08 14:49:05 -06:00
c7b225ff00 Add get shot annotations query
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-07-08 13:26:03 -06:00
ba84f6d9c0 Merge pull request 'Create shot annotations gql' (#13) from kat/shot-annotations into master
Reviewed-on: #13
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-07-08 11:03:47 -06:00
6a72f9f43f Create shot annotations gql
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-07-08 10:56:05 -06:00
efc0b2d858 Add column property query builder filters 2024-07-02 16:55:30 -06:00
f140807886 Merge pull request 'Add id's to new getMetricForVideo queries to prevent cache merge issues' (#12) from loewy/add-ids-to-get-video-calls into master
Reviewed-on: #12
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-06-05 13:34:41 -06:00
37a13f1418 add id's to new getVideo w/ metric queries to prevent cache merge issues
All checks were successful
Tests / Tests (pull_request) Successful in 12s
2024-06-05 11:51:15 -07:00
1cc0660a93 Merge pull request 'Add operations to get trimmed getVideo queries for metrics' (#11) from loewy/add-get-metrics-for-video-queries into master
Reviewed-on: #11
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-06-05 01:28:16 -06:00
14da2ae388 add averageTimePerShot, elapsedTime and MedianRun forVideo queries
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-06-04 23:20:47 -07:00
9ee4d43c89 Merge pull request 'Restructure protobuf/add annotations' (#10) from ivan/restructure-protobuf-types-and-add-annotations into master
Reviewed-on: #10
2024-05-24 20:26:00 -06:00
fcac551806 Restructure protobuf/add annotations
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-05-24 20:24:24 -06:00
044d8fa46d Merge pull request 'mk/implement-one-of' (#9) from mk/implement-one-of into master
Reviewed-on: #9
2024-05-22 16:49:28 -06:00
33f5404820 Actually incorperate one of stuff
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-05-22 16:41:24 -06:00
04a30e67d3 Add gql mods for implementing one-of 2024-05-22 15:13:18 -06:00
08183ed952 Merge pull request 'rename pkg to rbproto' (#8) from mk/fixing-rbproto into master
Reviewed-on: #8
2024-05-22 12:01:23 -06:00
4fac231c43 rename pkg to rbproto
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-05-22 12:00:39 -06:00
30e356e3e0 Add Protobuf with Testing + Codegen (#7)
Reviewed-on: #7
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
Co-authored-by: Mike Kalange <countablecloud@gmail.com>
Co-committed-by: Mike Kalange <countablecloud@gmail.com>
2024-05-22 11:27:54 -06:00
36712557cb Merge pull request 'Add workflow' (#6) from ivan/add-workflow into master
Reviewed-on: #6
2024-05-21 14:34:15 -06:00
20 changed files with 2960 additions and 58 deletions

View File

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

1
.gitignore vendored
View File

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

1
README.md Normal file
View File

@@ -0,0 +1 @@
# rbgql

View File

@@ -4,6 +4,12 @@ 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]; buildInputs = [nodejs yarn watchman alejandra nodePackages.prettier just protobuf];
}; };
}); });
} }

View File

@@ -1,4 +1,5 @@
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
@@ -12,3 +13,27 @@ 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,6 +18,7 @@
"@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"
}, },

16
pyproject.toml Normal file
View File

@@ -0,0 +1,16 @@
[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"

1
rbproto/__init__.py Normal file
View File

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

View File

@@ -0,0 +1,41 @@
# -*- 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\"\xe6\x01\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\x42\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\"H\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32\".serialized_shot.IdentifierHistoryb\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
_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['_PATH']._serialized_start=493
_globals['_PATH']._serialized_end=723
_globals['_IDENTIFIERHISTORY']._serialized_start=725
_globals['_IDENTIFIERHISTORY']._serialized_end=807
_globals['_SHOT']._serialized_start=809
_globals['_SHOT']._serialized_end=881
# @@protoc_insertion_point(module_scope)

View File

@@ -0,0 +1,86 @@
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 Path(_message.Message):
__slots__ = ["start_frame", "end_frame", "detections", "rle_detections", "not_present", "is_static"]
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_frame: int
end_frame: int
detections: DetectionHistory
rle_detections: RLEDetectionHistory
not_present: bool
is_static: bool
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 = ...) -> 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 Shot(_message.Message):
__slots__ = ["identifier_histories"]
IDENTIFIER_HISTORIES_FIELD_NUMBER: _ClassVar[int]
identifier_histories: _containers.RepeatedCompositeFieldContainer[IdentifierHistory]
def __init__(self, identifier_histories: _Optional[_Iterable[_Union[IdentifierHistory, _Mapping]]] = ...) -> None: ...

54
rbproto/shot.proto Normal file
View File

@@ -0,0 +1,54 @@
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 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;
}
message IdentifierHistory {
uint32 ball_identifier = 1;
repeated Path paths = 2;
}
message Shot {
repeated IdentifierHistory identifier_histories = 3;
}

1242
rbproto/ts/shot.ts Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -36,3 +36,10 @@ query GetShots(
} }
} }
} }
query GetShotAnnotationTypes {
getShotAnnotationTypes {
id
name
}
}

View File

@@ -24,6 +24,7 @@ query getLoggedInUser {
id id
firebaseUid firebaseUid
username username
isAdmin
profileImageUri profileImageUri
activeVideoId activeVideoId
createdAt createdAt
@@ -36,3 +37,11 @@ query GetUserPlayTime($userId: Int!) {
totalSeconds totalSeconds
} }
} }
query getUsernames(
$matchString: String!
$limit: Int = null
$after: String = null
) {
getUsernames(matchString: $matchString, limit: $limit, after: $after)
}

View File

@@ -51,6 +51,7 @@ query GetStreamMonitoringDetails($videoId: Int!) {
isCompleted isCompleted
uploadCompletionCursor uploadCompletionCursor
lastIntendedSegmentBound lastIntendedSegmentBound
initPlaylistUploadStatus
} }
currentProcessing { currentProcessing {
errors { errors {
@@ -91,11 +92,9 @@ query GetVideoDetails($videoId: Int!) {
elapsedTime elapsedTime
endTime endTime
makePercentage makePercentage
makePercentage
medianRun medianRun
startTime startTime
totalShots totalShots
totalShots
totalShotsMade totalShotsMade
createdAt createdAt
updatedAt updatedAt
@@ -148,3 +147,22 @@ query GetVideo($videoId: Int!) {
} }
} }
} }
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
}
}

View File

@@ -14,6 +14,28 @@ mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) {
} }
} }
mutation GetHlsInitUploadLink($videoId: Int!) {
getHlsInitUploadLink(videoId: $videoId) {
uploadUrl
headers {
key
value
}
}
}
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!

View File

@@ -9,8 +9,14 @@ type Query {
intervalDuration: Int! = 300 intervalDuration: Int! = 300
): [MakePercentageIntervalGQL!]! ): [MakePercentageIntervalGQL!]!
getShots(filterInput: FilterInput!): [ShotGQL!]! getShots(filterInput: FilterInput!): [ShotGQL!]!
getShotAnnotationTypes: [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
@@ -43,9 +49,9 @@ input AggregateInputGQL {
filterInput: FilterInput filterInput: FilterInput
} }
input AggregationInput { input AggregationInput @oneOf {
bucketSet: BucketSetInputGQL = null bucketSet: BucketSetInputGQL
enum: EnumAggregation = null enum: EnumAggregation
} }
input BucketSetInputGQL { input BucketSetInputGQL {
@@ -62,28 +68,32 @@ input EnumAggregation {
feature: String! feature: String!
} }
input FilterInput { input FilterInput @oneOf {
andFilters: AndFilter = null andFilters: [FilterInput!]
orFilters: OrFilter = null orFilters: [FilterInput!]
cueObjectDistance: RangeFilter = null notFilter: FilterInput
targetPocketDistance: RangeFilter = null cueObjectDistance: RangeFilter
cueObjectAngle: RangeFilter = null targetPocketDistance: RangeFilter
cueBallSpeed: RangeFilter = null cueObjectAngle: RangeFilter
difficulty: RangeFilter = null cueBallSpeed: RangeFilter
intendedPocketType: [PocketEnum!] = null difficulty: RangeFilter
shotDirection: [ShotDirectionEnum!] = null intendedPocketType: [PocketEnum!]
videoId: [Int!] = null shotDirection: [ShotDirectionEnum!]
userId: [Int!] = null videoId: [Int!]
make: [Boolean!] = null userId: [Int!]
tags: [VideoTagInput!] = null make: [Boolean!]
} tags: [VideoTagInput!]
annotations: [ShotAnnotationInput!]
input AndFilter { isStraight: [Boolean!]
filters: [FilterInput!]! isRight: [Boolean!]
} isLeft: [Boolean!]
isLeftMiss: [Boolean!]
input OrFilter { isRightMiss: [Boolean!]
filters: [FilterInput!]! isDirect: [Boolean!]
bankAngle: RangeFilter
bankDistance: RangeFilter
kickAngle: RangeFilter
kickDistance: RangeFilter
} }
input RangeFilter { input RangeFilter {
@@ -111,6 +121,10 @@ input VideoTagClassInput {
name: String! name: String!
} }
input ShotAnnotationInput {
name: String!
}
type BucketSetGQL { type BucketSetGQL {
keyName: String! keyName: String!
feature: String! feature: String!
@@ -144,7 +158,9 @@ type ShotGQL {
cueObjectFeatures: CueObjectFeaturesGQL cueObjectFeatures: CueObjectFeaturesGQL
pocketingIntentionFeatures: PocketingIntentionFeaturesGQL pocketingIntentionFeatures: PocketingIntentionFeaturesGQL
bankFeatures: BankFeaturesGQL bankFeatures: BankFeaturesGQL
serializedShotPaths: SerializedShotPathsGQL
user: UserGQL user: UserGQL
annotations: [ShotAnnotationGQL!]!
} }
""" """
@@ -177,16 +193,35 @@ 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 {
shotId: Int!
type: ShotAnnotationTypeGQL!
creator: UserGQL!
notes: String!
createdAt: DateTime
updatedAt: DateTime
}
type ShotAnnotationTypeGQL {
id: Int!
name: String!
}
type UserPlayTimeGQL { type UserPlayTimeGQL {
totalSeconds: Float! totalSeconds: Float!
} }
@@ -227,6 +262,7 @@ 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!]!
@@ -235,6 +271,12 @@ type UploadStreamGQL {
segments: [UploadSegmentGQL!]! segments: [UploadSegmentGQL!]!
} }
enum InitPlaylistUploadStatusEnum {
NOT_APPLICABLE
NOT_UPLOADED
UPLOADED
}
type StreamErrorGQL { type StreamErrorGQL {
message: String! message: String!
} }
@@ -245,7 +287,7 @@ type UploadSegmentGQL {
valid: Boolean! valid: Boolean!
endFrameIndex: Int endFrameIndex: Int
framesPerSecond: Float framesPerSecond: Float
durationsInSeconds: Float durationInSeconds: Float
linksRequested: Int! linksRequested: Int!
} }
@@ -322,6 +364,12 @@ type Mutation {
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!
} }
@@ -347,6 +395,7 @@ type CreateUploadStreamReturn {
} }
input VideoMetadataInput { input VideoMetadataInput {
resolution: VideoResolution!
videoName: String = null videoName: String = null
startTime: DateTime = null startTime: DateTime = null
endTime: DateTime = null endTime: DateTime = null
@@ -354,7 +403,14 @@ input VideoMetadataInput {
tableSize: String = 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
framesPerSecond: Float = null
}
input VideoResolution {
width: Int!
height: Int!
} }
input UploadStreamMetadataInput { input UploadStreamMetadataInput {
@@ -374,3 +430,8 @@ enum DeviceTypeEnum {
ANDROID ANDROID
BROWSER BROWSER
} }
enum StreamSegmentTypeEnum {
FRAGMENTED_MP4
RB_CHUNKED_MP4
}

View File

@@ -1553,6 +1553,11 @@ 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"
@@ -2538,6 +2543,14 @@ 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"
@@ -2574,6 +2587,11 @@ 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"