Compare commits
	
		
			430 Commits
		
	
	
		
			db82f66c5d
			...
			kat/pagina
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8c8dcdd8e1 | |||
| 5085c9af90 | |||
| 85bc743c8e | |||
| b8efa644e3 | |||
| c18628a4ca | |||
| 535e24c9c2 | |||
| 04308b1003 | |||
| 43c626141e | |||
| c49266e4c1 | |||
| 6677b9232f | |||
| 76e792be88 | |||
| 5eac3d9d40 | |||
| 64593f09b7 | |||
| e20b68799f | |||
| 378878967a | |||
| 251ebe7056 | |||
| 615e4d5467 | |||
| a4f602d651 | |||
| c48512fc45 | |||
| d75822c465 | |||
| 4feeba5150 | |||
| e1237363f0 | |||
| b1550b31c5 | |||
| 81b9fd9f12 | |||
| d3559ede21 | |||
| ef6ccca3f9 | |||
| f781e9648f | |||
| 18d2eea029 | |||
| a95bdab8bf | |||
| eaeb1ed0ea | |||
| f9d6377fe4 | |||
| 30cf72de78 | |||
| fd49dec34c | |||
| cdd1cdd526 | |||
| bce363e8ff | |||
| 80f609b8a2 | |||
| 6205e9a353 | |||
| 12f7e1f115 | |||
| 296ad969f4 | |||
| d25c08447e | |||
| 7502a75753 | |||
| 1a14db1a17 | |||
| 67d8bcac21 | |||
| 4ca27317b4 | |||
| dc214e878f | |||
| d669dba320 | |||
| 235f4a58e9 | |||
| 03c1d08d8c | |||
| cc36a8b51d | |||
| d743ad83e3 | |||
| 194c258dcd | |||
| e0e1ae1108 | |||
| ee73443374 | |||
| 88801f9186 | |||
| 524d469a0d | |||
| c7b225ff00 | |||
| ba84f6d9c0 | |||
| 6a72f9f43f | |||
| efc0b2d858 | |||
| f140807886 | |||
| 37a13f1418 | |||
| 1cc0660a93 | |||
| 14da2ae388 | |||
| 9ee4d43c89 | |||
| fcac551806 | |||
| 044d8fa46d | |||
| 33f5404820 | |||
| 04a30e67d3 | |||
| 08183ed952 | |||
| 4fac231c43 | |||
| 30e356e3e0 | |||
| 36712557cb | |||
| c6aeca7e2b | |||
| 92c18f8bf7 | |||
| e86f40c620 | |||
| 072235f032 | |||
| 9b76a6b599 | |||
| d94dbd6c03 | |||
| b2db5bde2b | |||
| f8c5cf74f8 | |||
| 231076496a | |||
| a1b3baa5c9 | |||
| 8378f7ae0b | |||
| d4b75bcb71 | |||
| b0c7de2e92 | |||
| 844e218197 | |||
| a7c8e07eb7 | |||
| 5d99ec7673 | |||
| 2f92820895 | |||
| 527113a099 | |||
| 381b4ce0c2 | |||
| 6d8f5d5d65 | |||
| b74fb2b1d7 | |||
| d67b413860 | |||
| ec1f5afb84 | |||
| 1ce4267945 | |||
|  | 2da00ca814 | ||
|  | f7c0dff73c | ||
|  | 422bb77f61 | ||
|  | d51d2491ca | ||
| db39c5a576 | |||
| c6c5971325 | |||
| 5181612f62 | |||
|  | 5f33fae3d7 | ||
| 24fcac9318 | |||
| 514f2ef928 | |||
| 7d252d3cc8 | |||
| a1581379fd | |||
| a5f90ab105 | |||
| ddd7e2d50b | |||
| 3bacc356af | |||
| 797ca3a387 | |||
| ed751f5cdd | |||
| 01a580cee5 | |||
| 6fd14d3c49 | |||
| a1b524ab9d | |||
| 9bd0e237ea | |||
| 97d4f2cbe9 | |||
| 9307fbcbf4 | |||
| 679150326f | |||
| 773a2eaed0 | |||
| 203d343880 | |||
| 26ed50a7a1 | |||
| 050705c370 | |||
| d3c5979d3e | |||
| 8102a0f40b | |||
| 87fabdc8f9 | |||
|  | 7889476bc9 | ||
| abfaf06f1a | |||
| 8bd9e039da | |||
|  | 5cfccb97b1 | ||
|  | 54428112f8 | ||
| 18c12e60fe | |||
| 1000eb6d2c | |||
| 27114615a5 | |||
| 43c1f7be09 | |||
|  | 09bbbf0b3d | ||
|  | 2db886ea13 | ||
|  | e88d875bd9 | ||
| 57c3ee0360 | |||
| e1600751e0 | |||
| be47dcdba2 | |||
| fd30ae04bf | |||
| 19628736c1 | |||
| 4ced3d39df | |||
| be59f7a2c6 | |||
| 1665cf1eb9 | |||
| 47df3adce5 | |||
| f64fc0e54a | |||
| 314957218e | |||
| babb111fa6 | |||
|  | b051809869 | ||
|  | 32ec7a2339 | ||
| 3bce7ea344 | |||
| 76ed63395c | |||
| 19f324a1cf | |||
| 4b41d3b039 | |||
| 2ce41be8cc | |||
| c9f2187cc2 | |||
| a47fb5fed7 | |||
| 318a2a24fd | |||
| 2224a8ccbd | |||
| 48e2bec9ce | |||
| 6a1807efc8 | |||
| 0ad6e63733 | |||
| 6255e246e7 | |||
| 808fae0480 | |||
|  | 44d2402f4b | ||
|  | 7da14dbb6c | ||
| cc597b3cfb | |||
| 60af058ba4 | |||
|  | 608e784205 | ||
|  | 36041dd41b | ||
| 17aee8f220 | |||
| 294198958d | |||
|  | fe824f90ef | ||
|  | a560ebdb70 | ||
| 63faa9397e | |||
| 4df6e51e82 | |||
| cef4119afa | |||
| bee765714e | |||
| edff79abb6 | |||
|  | 2505fc1bf7 | ||
| d400434e89 | |||
| 4bd438d692 | |||
| 828140ed2b | |||
| 9a2cae0c70 | |||
| 3a621b8323 | |||
| 0360fb413c | |||
| 5b86a0f6d9 | |||
| 24c14fb7ca | |||
| fbbcd51df5 | |||
| 5a9578d554 | |||
|  | 5cb1069c1c | ||
|  | 0c8cad6608 | ||
|  | b865f78e22 | ||
|  | bc7b066864 | ||
|  | 7b4af08296 | ||
| c77bc476aa | |||
| b802bb01e6 | |||
| 61f9add741 | |||
| d8e9eef8b1 | |||
| 7bddeca783 | |||
|  | d03565ba26 | ||
|  | 36fe81cb3e | ||
|  | f9edab8f36 | ||
|  | ffe95a12f2 | ||
|  | bcef200765 | ||
|  | dc0e3989d4 | ||
|  | b9f821652c | ||
|  | b04c6aa345 | ||
| b05e354459 | |||
| ce8cfd6a68 | |||
|  | 234d4d0fa9 | ||
|  | 4d05d9a539 | ||
|  | 3f16310f67 | ||
| 762351f76e | |||
|  | 2f33b7fd86 | ||
| 8efbd676ce | |||
| 2fc7c8ab1e | |||
| dc5a90cf1a | |||
|  | 2e49bc4709 | ||
|  | 4e7046bd28 | ||
|  | 3eab510f5a | ||
|  | 8c3b745d4d | ||
| db9475cf3b | |||
|  | 31c212807b | ||
|  | aca8caa5c3 | ||
|  | b30ef2ef2b | ||
| 62637badcb | |||
|  | ddcd9899b3 | ||
|  | d3db06a90c | ||
|  | 92e211a21a | ||
|  | 1098ba4c7d | ||
| 2c5a843835 | |||
| 204e289627 | |||
| fd731b2ecf | |||
| e733e413ef | |||
|  | e1abd8e85c | ||
|  | 3b1abc9ae8 | ||
|  | 6b8737e182 | ||
|  | baab800a1c | ||
|  | e2bde3bd01 | ||
|  | f849780aac | ||
|  | 37004a1f6e | ||
|  | d483be05a6 | ||
| 0c89178542 | |||
| c8999f8250 | |||
| 2fd1f26325 | |||
|  | 03774a540f | ||
| f559c1e215 | |||
|  | ea130df02b | ||
|  | 2ac780bdaa | ||
|  | a9f474fa62 | ||
|  | 3a476e0db4 | ||
|  | b9221fa949 | ||
|  | 07db6e21db | ||
|  | e5e998df36 | ||
| 112ed5b140 | |||
| a781510a41 | |||
| bbbcffcfcb | |||
|  | 13bdfff9f8 | ||
|  | ef7c39e4e9 | ||
|  | ee085cbbb1 | ||
| 35a94b4a75 | |||
|  | da68d87a5f | ||
|  | af28d5c65b | ||
|  | b5ca868050 | ||
| 4a5dd47bc0 | |||
|  | 71a5f72381 | ||
|  | c1ba1ceb7c | ||
|  | 035ce9f1b9 | ||
|  | eb2534ff94 | ||
|  | d93d73dc3a | ||
|  | 6bfd0621ad | ||
|  | b88f5bf2e4 | ||
| 43ff5d416a | |||
| 90fc81776f | |||
| 0e8316b9f5 | |||
| 838304efdd | |||
| 01f1f94dd6 | |||
| bfd5a58461 | |||
| 240831d6e5 | |||
| 394bff34e5 | |||
| 000918844a | |||
| f44a1597c0 | |||
| 1cfc6a9ae3 | |||
| b4a5fdebab | |||
| 4970018afb | |||
| 8998cc3ac4 | |||
| bee4dc403b | |||
| edbe916247 | |||
| 73334a7dd7 | |||
| 497068627c | |||
| 89361e17e6 | |||
| 18ec4bf9f1 | |||
| 2e75f784dd | |||
| c7179bd0a0 | |||
| b38c099414 | |||
| e7f5d19707 | |||
| 4ae2e70586 | |||
| c93072d9b4 | |||
| 721e728275 | |||
| bfd96d9ccc | |||
| 3f0e0bb9a9 | |||
| 2276605e6d | |||
| a6883a624a | |||
| fc3cf92dcf | |||
| e69f9dc2d8 | |||
| 473d79a32d | |||
| 2f8f0227ba | |||
| 7bf0053974 | |||
| 5f7e7e31bf | |||
| a1bc5377db | |||
| f4b93253a8 | |||
|  | 56733c854c | ||
| 9e170380db | |||
| 23f0beb646 | |||
| a0af0ad300 | |||
|  | 9187021cda | ||
| 4fb8fe7d08 | |||
|  | c882786726 | ||
| 7f6a05c101 | |||
| 06f1aad38e | |||
| 2aa9b4b2d1 | |||
| 152ede26e3 | |||
| 3f43c8d946 | |||
| 85b1cb8759 | |||
| 82069f3bef | |||
| 3a31135807 | |||
|  | 6482d43af0 | ||
|  | e221ef070f | ||
|  | 6b547c4ddd | ||
|  | 63ef099dc3 | ||
| f4cf600d22 | |||
|  | f9111ffe5e | ||
|  | cd3329baae | ||
|  | feafd48443 | ||
|  | eb152bc6c7 | ||
| 4376f9dc26 | |||
|  | 7f7487836c | ||
|  | 7046b23a27 | ||
| 6ebceb4ce7 | |||
|  | 3d9845e1b3 | ||
|  | 07118a870f | ||
| abb718603e | |||
|  | 9f170c1186 | ||
|  | 94d4f13a28 | ||
| 4c6bf597a9 | |||
|  | 4c091745dd | ||
|  | 406f6f5cdd | ||
|  | 4250eca710 | ||
| 3bd414506a | |||
|  | a9dbd503e3 | ||
| ec0904ffb1 | |||
|  | b80b05fbd8 | ||
| d9a4247b8e | |||
|  | 9d5164bd13 | ||
| ec6d36b44c | |||
| 7e7a571f5a | |||
|  | 9a61ea59b2 | ||
|  | 5dc141a14a | ||
|  | a0f8ec156b | ||
|  | 7383c85b58 | ||
|  | aed0faebf0 | ||
| f0b9f8043b | |||
|  | 58dfe98448 | ||
|  | f14ba0e97f | ||
|  | 981b5cebca | ||
| 4e3a93f126 | |||
|  | c391a07d70 | ||
|  | 7faa25e103 | ||
|  | 12c3a6ef6f | ||
| 4c1bd21f3d | |||
| abfc6c4c47 | |||
| afb2ef21f5 | |||
| 06bb8feeb5 | |||
| a112586c2d | |||
|  | 8d40008e5d | ||
|  | a9afd7e0a9 | ||
| 28a0426096 | |||
|  | dee04269bd | ||
|  | 6c7ceb3eb3 | ||
|  | 4dda9eb24c | ||
| 92258f4925 | |||
| 5b1b1cdaaa | |||
| 875989e3a9 | |||
| 74c17f433a | |||
|  | 2903207670 | ||
|  | c0723665af | ||
| 83a648eb90 | |||
| 5204599a08 | |||
| fcdce8706f | |||
| 5192212e0e | |||
| 376d695416 | |||
| e25425ffe9 | |||
| 78d40f1abc | |||
| 78d99da6df | |||
| f797c98d45 | |||
| 491ca28ab2 | |||
| 7f71c89ffb | |||
| 411d5720b9 | |||
| 872dd3fd71 | |||
| 521e9da4e3 | |||
| ed8371e08a | |||
| 160590658b | |||
| 002ac7902d | |||
| e527b198f9 | |||
| d68561b372 | |||
| c292289f29 | |||
| e053517765 | |||
| 66d045c2a7 | |||
| e1410ed402 | |||
| 1031794d85 | |||
| 5d2b45b3e5 | |||
| 73b09fe9cb | |||
| cd2ecb22b1 | |||
| ad66131e01 | |||
| f401c418c5 | |||
| 7b8db90f75 | |||
| 0431ba12c5 | |||
| 3731bb7532 | |||
| a1a3fa45b1 | |||
| 59541ec0e8 | |||
| b334cc377f | |||
| b1467838da | |||
| 20901fb26c | |||
| 295f948104 | |||
| 977ab8f6c9 | |||
| c3e2d23a63 | 
							
								
								
									
										17
									
								
								.gitea/workflows/tests.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								.gitea/workflows/tests.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| name: Tests | ||||
| on: | ||||
|   pull_request: | ||||
|  | ||||
| env: | ||||
|   NIXPKGS_ALLOW_UNFREE: 1 | ||||
|  | ||||
| jobs: | ||||
|   install: | ||||
|     name: Tests | ||||
|     runs-on: nixos-x86_64-linux | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3 | ||||
|         with: | ||||
|           submodules: recursive | ||||
|       - name: codegen causes no changes | ||||
|         run: ./bin/assert-no-changes-wrapper.sh | ||||
							
								
								
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| node_modules | ||||
| dist | ||||
| .direnv | ||||
| /after.txt | ||||
| /before.txt | ||||
| **/__pycache__/** | ||||
							
								
								
									
										6
									
								
								bin/assert-no-changes-wrapper.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								bin/assert-no-changes-wrapper.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| #!/usr/bin/env bash | ||||
| GQL_DIR=$(dirname $(dirname "$(realpath "$BASH_SOURCE")")) | ||||
|  | ||||
| cd $GQL_DIR | ||||
|  | ||||
| LD_LIBRARY_PATH="" nix develop --impure --command bash "$GQL_DIR/bin/assert-no-changes.sh" | ||||
							
								
								
									
										17
									
								
								bin/assert-no-changes.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										17
									
								
								bin/assert-no-changes.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| #!/usr/bin/env bash | ||||
| git ls-files | xargs md5sum > before.txt | ||||
|  | ||||
| yarn install | ||||
| yarn graphql-codegen | ||||
| 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 | ||||
|  | ||||
|  | ||||
| diff before.txt after.txt | ||||
							
								
								
									
										4
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							| @@ -20,9 +20,7 @@ | ||||
|     }, | ||||
|     "gitignore": { | ||||
|       "inputs": { | ||||
|         "nixpkgs": [ | ||||
|           "nixpkgs" | ||||
|         ] | ||||
|         "nixpkgs": ["nixpkgs"] | ||||
|       }, | ||||
|       "locked": { | ||||
|         "lastModified": 1703887061, | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
|     in | ||||
|       with pkgs; { | ||||
|         devShell = mkShell { | ||||
|           buildInputs = [nodejs yarn watchman alejandra nodePackages.prettier]; | ||||
|           buildInputs = [nodejs yarn watchman alejandra nodePackages.prettier just protobuf]; | ||||
|         }; | ||||
|       }); | ||||
| } | ||||
|   | ||||
							
								
								
									
										39
									
								
								justfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								justfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| NIX := "LD_LIBRARY_PATH='' nix" | ||||
| PROTOBUF_DIR := "$PWD/rbproto" | ||||
|  | ||||
| prettier-gql: | ||||
| 	#!/usr/bin/env bash | ||||
| 	set -euxo pipefail | ||||
| 	{{NIX}} develop --impure --command prettier ./src --write | ||||
|  | ||||
| gql-codegen: | ||||
| 	#!/usr/bin/env bash | ||||
| 	set -euxo pipefail | ||||
| 	{{NIX}} develop --impure --command bash -c 'yarn install && yarn graphql-codegen' | ||||
|  | ||||
|  | ||||
| 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 | ||||
							
								
								
									
										10
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								package.json
									
									
									
									
									
								
							| @@ -17,7 +17,15 @@ | ||||
|     "@graphql-codegen/typescript": "^4.0.1", | ||||
|     "@graphql-codegen/typescript-operations": "^4.0.1", | ||||
|     "@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-plugin-organize-imports": "^3.2.4" | ||||
|   }, | ||||
|   "prettier": { | ||||
|     "plugins": [ | ||||
|       "prettier-plugin-organize-imports" | ||||
|     ] | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "typescript": "^4.x" | ||||
|   | ||||
							
								
								
									
										16
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								pyproject.toml
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										1
									
								
								rbproto/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| from .python.shot_pb2 import *  # noqa: F401 | ||||
							
								
								
									
										41
									
								
								rbproto/python/shot_pb2.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								rbproto/python/shot_pb2.py
									
									
									
									
									
										Normal 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) | ||||
							
								
								
									
										86
									
								
								rbproto/python/shot_pb2.pyi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								rbproto/python/shot_pb2.pyi
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										54
									
								
								rbproto/shot.proto
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										1242
									
								
								rbproto/ts/shot.ts
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										4368
									
								
								src/index.tsx
									
									
									
									
									
								
							
							
						
						
									
										4368
									
								
								src/index.tsx
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										12
									
								
								src/operations/aggregate.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/operations/aggregate.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| query GetAggregatedShotMetrics($aggregateInput: AggregateInputGQL!) { | ||||
|   getAggregatedShotMetrics(aggregateInput: $aggregateInput) { | ||||
|     aggregationIdentifiers { | ||||
|       featureName | ||||
|       groupName | ||||
|     } | ||||
|     targetMetrics { | ||||
|       count | ||||
|       makePercentage | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										8
									
								
								src/operations/config.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/operations/config.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| query getDeployedConfig { | ||||
|   getDeployedConfig { | ||||
|     allowNewUsers | ||||
|     devMode | ||||
|     environment | ||||
|     firebase | ||||
|   } | ||||
| } | ||||
							
								
								
									
										38
									
								
								src/operations/feed.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/operations/feed.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| query GetFeed( | ||||
|   $limit: Int! = 5 | ||||
|   $after: String = null | ||||
|   $filters: VideoFilterInput = null | ||||
| ) { | ||||
|   getUserVideos(limit: $limit, after: $after, filters: $filters) { | ||||
|     videos { | ||||
|       id | ||||
|       owner { | ||||
|         username | ||||
|       } | ||||
|       name | ||||
|       screenshotUri | ||||
|       totalShotsMade | ||||
|       totalShots | ||||
|       makePercentage | ||||
|       createdAt | ||||
|       updatedAt | ||||
|       startTime | ||||
|       endTime | ||||
|       elapsedTime | ||||
|       screenshotUri | ||||
|       stream { | ||||
|         isCompleted | ||||
|       } | ||||
|       tags { | ||||
|         tagClasses { | ||||
|           name | ||||
|         } | ||||
|         name | ||||
|       } | ||||
|     } | ||||
|     pageInfo { | ||||
|       hasNextPage | ||||
|       endCursor | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										9
									
								
								src/operations/make_percentage_time_series.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/operations/make_percentage_time_series.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| query GetVideoMakePercentageIntervals($videoId: ID!, $intervalDuration: Int!) { | ||||
|   getVideoMakePercentageIntervals( | ||||
|     videoId: $videoId | ||||
|     intervalDuration: $intervalDuration | ||||
|   ) { | ||||
|     makePercentage | ||||
|     elapsedTime | ||||
|   } | ||||
| } | ||||
							
								
								
									
										52
									
								
								src/operations/shots.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/operations/shots.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| query GetShots( | ||||
|   $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 | ||||
|   $includeShotDirection: Boolean! = false | ||||
|   $includeTargetPocketDistance: Boolean! = false | ||||
|   $includeMake: Boolean! = false | ||||
|   $includeIntendedPocketType: Boolean! = false | ||||
| ) { | ||||
|   getShots( | ||||
|     filterInput: $filterInput | ||||
|     shotsPagination: $shotsPagination | ||||
|     limit: $limit | ||||
|   ) { | ||||
|     id | ||||
|     videoId | ||||
|     startFrame | ||||
|     endFrame | ||||
|     user { | ||||
|       id | ||||
|     } | ||||
|     falsePositiveScore | ||||
|     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) | ||||
|     } | ||||
|     pocketingIntentionFeatures | ||||
|       @include(if: $includePocketingIntentionFeatures) { | ||||
|       targetPocketDistance @include(if: $includeTargetPocketDistance) | ||||
|       make @include(if: $includeMake) | ||||
|       intendedPocketType @include(if: $includeIntendedPocketType) | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetShotAnnotationTypes { | ||||
|   getShotAnnotationTypes { | ||||
|     id | ||||
|     name | ||||
|   } | ||||
| } | ||||
							
								
								
									
										47
									
								
								src/operations/user.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/operations/user.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| mutation getProfileImageUploadLink($fileExt: String = ".png") { | ||||
|   getProfileImageUploadLink(fileExt: $fileExt) { | ||||
|     uploadUrl | ||||
|     headers { | ||||
|       key | ||||
|       value | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation editProfileImageUri($profileImageUri: String!) { | ||||
|   editProfileImageUri(profileImageUri: $profileImageUri) { | ||||
|     id | ||||
|     firebaseUid | ||||
|     username | ||||
|     profileImageUri | ||||
|     createdAt | ||||
|     updatedAt | ||||
|   } | ||||
| } | ||||
|  | ||||
| query getLoggedInUser { | ||||
|   getLoggedInUser { | ||||
|     id | ||||
|     firebaseUid | ||||
|     username | ||||
|     isAdmin | ||||
|     profileImageUri | ||||
|     activeVideoId | ||||
|     createdAt | ||||
|     updatedAt | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetUserPlayTime($userId: Int!) { | ||||
|   getPlayTime(userId: $userId) { | ||||
|     totalSeconds | ||||
|   } | ||||
| } | ||||
|  | ||||
| query getUsernames( | ||||
|   $matchString: String! | ||||
|   $limit: Int = null | ||||
|   $after: String = null | ||||
| ) { | ||||
|   getUsernames(matchString: $matchString, limit: $limit, after: $after) | ||||
| } | ||||
							
								
								
									
										235
									
								
								src/operations/video.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								src/operations/video.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,235 @@ | ||||
| query GetStreamMonitoringDetails($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     totalShots | ||||
|     makePercentage | ||||
|     elapsedTime | ||||
|     homographyHistory { | ||||
|       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 { | ||||
|       linksRequested | ||||
|       uploadsCompleted | ||||
|       segmentProcessingCursor | ||||
|       isCompleted | ||||
|       uploadCompletionCursor | ||||
|       lastIntendedSegmentBound | ||||
|       initPlaylistUploadStatus | ||||
|     } | ||||
|     currentProcessing { | ||||
|       errors { | ||||
|         message | ||||
|         startSegmentIndex | ||||
|         endSegmentIndex | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideoUpdatePageDetails($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     name | ||||
|     totalShots | ||||
|     makePercentage | ||||
|     elapsedTime | ||||
|     tags { | ||||
|       tagClasses { | ||||
|         name | ||||
|       } | ||||
|       name | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation DeleteVideo($videoId: Int!) { | ||||
|   deleteVideo(videoId: $videoId) | ||||
| } | ||||
|  | ||||
| query GetVideoDetails($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     name | ||||
|     screenshotUri | ||||
|     averageTimeBetweenShots | ||||
|     elapsedTime | ||||
|     endTime | ||||
|     makePercentage | ||||
|     medianRun | ||||
|     startTime | ||||
|     totalShots | ||||
|     totalShotsMade | ||||
|     createdAt | ||||
|     updatedAt | ||||
|     owner { | ||||
|       id | ||||
|       firebaseUid | ||||
|       username | ||||
|       profileImageUri | ||||
|     } | ||||
|     tags { | ||||
|       tagClasses { | ||||
|         name | ||||
|       } | ||||
|       name | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideos($videoIds: [Int!]!) { | ||||
|   getVideos(videoIds: $videoIds) { | ||||
|     id | ||||
|     playlist { | ||||
|       segmentDurations | ||||
|     } | ||||
|     stream { | ||||
|       id | ||||
|       segments { | ||||
|         uploaded | ||||
|         valid | ||||
|         segmentIndex | ||||
|         endFrameIndex | ||||
|         framesPerSecond | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideo($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     playlist { | ||||
|       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 { | ||||
|       streamSegmentType | ||||
|       segments { | ||||
|         segmentIndex | ||||
|         endFrameIndex | ||||
|         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 | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -1,40 +1,82 @@ | ||||
| mutation CreateUploadStream( | ||||
|   $videoName: String!, | ||||
|   $deviceType: DeviceTypeEnum, | ||||
|   $osVersion: String, | ||||
|   $appVersion: String, | ||||
|   $browserName: String, | ||||
|   $browserVersion: String, | ||||
|   $locale: String, | ||||
|   $timezone: String, | ||||
|   $networkType: String, | ||||
|   $ipAddress: String | ||||
| ) { | ||||
|   createUploadStream( | ||||
|     videoName: $videoName | ||||
|     uploadMetadata: { | ||||
|       deviceType: $deviceType | ||||
|       osVersion: $osVersion | ||||
|       appVersion: $appVersion | ||||
|       browserName: $browserName | ||||
|       browserVersion: $browserVersion | ||||
|       locale: $locale | ||||
|       timezone: $timezone | ||||
|       networkType: $networkType | ||||
|       ipAddress: $ipAddress | ||||
|     } | ||||
|   ) { | ||||
| mutation CreateUploadStream($videoMetadataInput: VideoMetadataInput!) { | ||||
|   createUploadStream(videoMetadata: $videoMetadataInput) { | ||||
|     videoId | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation GetUploadLink($videoId: Int!, $chunkIndex: Int!) { | ||||
|   getUploadLink(videoId: $videoId, chunkIndex: $chunkIndex) { | ||||
| mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) { | ||||
|   getUploadLink(videoId: $videoId, segmentIndex: $segmentIndex) { | ||||
|     uploadUrl | ||||
|     linksRequested | ||||
|     headers { | ||||
|       key | ||||
|       value | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation TerminateUploadStream($videoId: Int!) { | ||||
|   terminateUploadStream(videoId: $videoId)  | ||||
| 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( | ||||
|   $videoId: Int! | ||||
|   $videoMetadataInput: VideoMetadataInput! | ||||
| ) { | ||||
|   editUploadStream(videoId: $videoId, videoMetadata: $videoMetadataInput) | ||||
| } | ||||
|  | ||||
| query GetUploadStreams( | ||||
|   $limit: Int! = 5 | ||||
|   $after: String = null | ||||
|   $filters: VideoFilterInput = null | ||||
| ) { | ||||
|   getUserVideos(limit: $limit, after: $after, filters: $filters) { | ||||
|     videos { | ||||
|       id | ||||
|     } | ||||
|     pageInfo { | ||||
|       hasNextPage | ||||
|       endCursor | ||||
|     } | ||||
|   } | ||||
| } | ||||
| query GetUploadStreamsWithDetails( | ||||
|   $limit: Int! = 5 | ||||
|   $after: String = null | ||||
|   $filters: VideoFilterInput = null | ||||
| ) { | ||||
|   getUserVideos(limit: $limit, after: $after, filters: $filters) { | ||||
|     videos { | ||||
|       id | ||||
|       name | ||||
|       startTime | ||||
|       stream { | ||||
|         isCompleted | ||||
|         lastIntendedSegmentBound | ||||
|         uploadCompletionCursor | ||||
|       } | ||||
|     } | ||||
|     pageInfo { | ||||
|       hasNextPage | ||||
|       endCursor | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										499
									
								
								src/schema.gql
									
									
									
									
									
								
							
							
						
						
									
										499
									
								
								src/schema.gql
									
									
									
									
									
								
							| @@ -1,31 +1,63 @@ | ||||
| type Query { | ||||
|   getAggregateShots(bucketSets: [BucketSetInputGQL!]!): [AggregateResultGQL!]! | ||||
|   getUser(userId: Int!): UserGQL | ||||
|   getVideo(videoId: Int!): VideoGQL! | ||||
|   getShots(filterInput: FilterInput = null): [ShotGQL!]! | ||||
|   getAggregatedShotMetrics( | ||||
|     aggregateInput: AggregateInputGQL! | ||||
|   ): [AggregateResultGQL!]! | ||||
|   getBucketSet(keyName: String!): BucketSetGQL | ||||
|   getDeployedConfig: DeployedConfigGQL! | ||||
|   waitFor(duration: Float!): Float! | ||||
|   getVideoMakePercentageIntervals( | ||||
|     videoId: ID! | ||||
|     intervalDuration: Int! = 300 | ||||
|   ): [MakePercentageIntervalGQL!]! | ||||
|   getShots( | ||||
|     filterInput: FilterInput! | ||||
|     shotsPagination: GetShotsPagination = null | ||||
|     limit: Int! = 500 | ||||
|   ): [ShotGQL!]! | ||||
|   getShotAnnotationTypes: [ShotAnnotationTypeGQL!]! | ||||
|   getUser(userId: Int!): UserGQL | ||||
|   getLoggedInUser: UserGQL | ||||
|   getUsernames( | ||||
|     matchString: String = null | ||||
|     limit: Int = null | ||||
|     after: String = null | ||||
|   ): [String!]! | ||||
|   getPlayTime(userId: Int!): UserPlayTimeGQL! | ||||
|   getUserVideos( | ||||
|     userId: Int = null | ||||
|     limit: Int! = 5 | ||||
|     after: String = null | ||||
|     filters: VideoFilterInput = null | ||||
|   ): VideoHistoryGQL! | ||||
|   getUserTags: [TagGQL!]! | ||||
|   getVideo(videoId: Int!): VideoGQL! | ||||
|   getVideos(videoIds: [Int!]!): [VideoGQL!]! | ||||
| } | ||||
|  | ||||
| type AggregateResultGQL { | ||||
|   featureBuckets: [BucketGQL!]! | ||||
|   targetMetrics: [TargetMetricGQL!]! | ||||
|   aggregationIdentifiers: [AggregationIdentifierGQL!]! | ||||
|   targetMetrics: TargetMetricsGQL! | ||||
| } | ||||
|  | ||||
| type BucketGQL { | ||||
|   rangeKey: String! | ||||
|   lowerBound: Float! | ||||
| } | ||||
|  | ||||
| type TargetMetricGQL { | ||||
|   count: Int | ||||
|   makePercentage: Float | ||||
|   floatFeature: TargetFloatFeatureGQL | ||||
| } | ||||
|  | ||||
| type TargetFloatFeatureGQL { | ||||
| type AggregationIdentifierGQL { | ||||
|   featureName: String! | ||||
|   average: Float | ||||
|   median: Float | ||||
|   groupName: String! | ||||
| } | ||||
|  | ||||
| type TargetMetricsGQL { | ||||
|   count: Int! | ||||
|   makePercentage: Float | ||||
|   averageDifficulty: Float | ||||
| } | ||||
|  | ||||
| input AggregateInputGQL { | ||||
|   aggregations: [AggregationInput!]! | ||||
|   filterInput: FilterInput | ||||
| } | ||||
|  | ||||
| input AggregationInput @oneOf { | ||||
|   bucketSet: BucketSetInputGQL | ||||
|   enum: EnumAggregation | ||||
| } | ||||
|  | ||||
| input BucketSetInputGQL { | ||||
| @@ -38,67 +70,46 @@ input BucketInputGQL { | ||||
|   lowerBound: Float! | ||||
| } | ||||
|  | ||||
| type UserGQL { | ||||
|   id: Int! | ||||
|   username: String! | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
|   statistics: UserStatisticsGQL! | ||||
| input EnumAggregation { | ||||
|   feature: String! | ||||
| } | ||||
|  | ||||
| """Date with time (isoformat)""" | ||||
| scalar DateTime | ||||
|  | ||||
| type UserStatisticsGQL { | ||||
|   totalShots: Int! | ||||
|   totalShotsMade: Int! | ||||
|   makePercentage: Decimal! | ||||
|   averageTimeBetweenShots: Decimal! | ||||
|   timeSpentPlaying: Decimal! | ||||
|   medianRun: Decimal | ||||
| input FilterInput @oneOf { | ||||
|   andFilters: [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!] | ||||
|   bankAngle: RangeFilter | ||||
|   bankDistance: RangeFilter | ||||
|   kickAngle: RangeFilter | ||||
|   kickDistance: RangeFilter | ||||
|   cueAngleAfterObject: RangeFilter | ||||
|   cueSpeedAfterObject: RangeFilter | ||||
|   spinType: [String!] | ||||
|   falsePositiveScore: RangeFilter | ||||
| } | ||||
|  | ||||
| """Decimal (fixed-point)""" | ||||
| scalar Decimal | ||||
|  | ||||
| type VideoGQL { | ||||
|   id: Int! | ||||
|   totalShotsMade: Int! | ||||
|   totalShots: Int! | ||||
|   makePercentage: Decimal! | ||||
|   medianRun: Decimal! | ||||
|   averageTimeBetweenShots: Decimal | ||||
|   createdAt: DateTime! | ||||
|   updatedAt: DateTime! | ||||
|   shots: [ShotGQL!]! | ||||
|   startTime: DateTime! | ||||
|   endTime: DateTime! | ||||
|   elapsedTime: Decimal! | ||||
|   framesPerSecond: Int! | ||||
|   totalFrames: Int! | ||||
|   stream: UploadStreamGQL | ||||
| } | ||||
|  | ||||
| type ShotGQL { | ||||
|   id: Int | ||||
|   videoId: Int | ||||
|   startFrame: Int | ||||
|   endFrame: Int | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
|   features: ShotFeaturesGQL | ||||
|   cueObjectFeatures: CueObjectFeaturesGQL | ||||
|   pocketingIntentionFeatures: PocketingIntentionFeaturesGQL | ||||
| } | ||||
|  | ||||
| type ShotFeaturesGQL { | ||||
|   cueObjectAngle: Float | ||||
|   cueObjectDistance: Float | ||||
|   targetPocketDistance: Float | ||||
|   intendedPocket: PocketEnum | ||||
|   cueBallSpeed: Float | ||||
|   shotDirection: ShotDirectionEnum | ||||
|   bank: BankFeaturesGQL | ||||
| input RangeFilter { | ||||
|   lessThan: Float = null | ||||
|   greaterThanEqualTo: Float = null | ||||
|   includeOnNone: Boolean! = false | ||||
| } | ||||
|  | ||||
| enum PocketEnum { | ||||
| @@ -112,17 +123,64 @@ enum ShotDirectionEnum { | ||||
|   STRAIGHT | ||||
| } | ||||
|  | ||||
| type BankFeaturesGQL { | ||||
|   wallsHit: [WallTypeEnum!]! | ||||
|   bankAngle: Float! | ||||
|   distance: Float! | ||||
| input VideoTagInput { | ||||
|   tagClasses: [VideoTagClassInput!]! = [] | ||||
|   name: String! | ||||
| } | ||||
|  | ||||
| enum WallTypeEnum { | ||||
|   LONG | ||||
|   SHORT | ||||
| input VideoTagClassInput { | ||||
|   name: String! | ||||
| } | ||||
|  | ||||
| input ShotAnnotationInput { | ||||
|   name: String! | ||||
| } | ||||
|  | ||||
| type BucketSetGQL { | ||||
|   keyName: String! | ||||
|   feature: String! | ||||
|   buckets: [BucketGQL!]! | ||||
| } | ||||
|  | ||||
| type BucketGQL { | ||||
|   rangeKey: String! | ||||
|   lowerBound: Float! | ||||
| } | ||||
|  | ||||
| type DeployedConfigGQL { | ||||
|   allowNewUsers: Boolean! | ||||
|   firebase: Boolean! | ||||
|   devMode: Boolean! | ||||
|   environment: String! | ||||
| } | ||||
|  | ||||
| type MakePercentageIntervalGQL { | ||||
|   makePercentage: Float! | ||||
|   elapsedTime: Float! | ||||
| } | ||||
|  | ||||
| type ShotGQL { | ||||
|   id: Int! | ||||
|   videoId: Int! | ||||
|   startFrame: Int! | ||||
|   endFrame: Int! | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
|   cueObjectFeatures: CueObjectFeaturesGQL | ||||
|   pocketingIntentionFeatures: PocketingIntentionFeaturesGQL | ||||
|   bankFeatures: BankFeaturesGQL | ||||
|   serializedShotPaths: SerializedShotPathsGQL | ||||
|   user: UserGQL | ||||
|   annotations: [ShotAnnotationGQL!]! | ||||
|   falsePositiveScore: Float | ||||
|   video: VideoGQL | ||||
| } | ||||
|  | ||||
| """ | ||||
| Date with time (isoformat) | ||||
| """ | ||||
| scalar DateTime | ||||
|  | ||||
| type CueObjectFeaturesGQL { | ||||
|   cueObjectDistance: Float | ||||
|   cueObjectAngle: Float | ||||
| @@ -134,100 +192,228 @@ type PocketingIntentionFeaturesGQL { | ||||
|   targetPocketDistance: Float | ||||
|   make: Boolean | ||||
|   intendedPocketType: PocketEnum | ||||
|   difficulty: Float | ||||
| } | ||||
|  | ||||
| type BankFeaturesGQL { | ||||
|   wallsHit: [WallTypeEnum!]! | ||||
|   bankAngle: Float! | ||||
|   distance: Float! | ||||
| } | ||||
|  | ||||
| enum WallTypeEnum { | ||||
|   LONG | ||||
|   SHORT | ||||
| } | ||||
|  | ||||
| type SerializedShotPathsGQL { | ||||
|   b64EncodedBuffer: String | ||||
| } | ||||
|  | ||||
| type UserGQL { | ||||
|   id: Int! | ||||
|   firebaseUid: String! | ||||
|   username: String! | ||||
|   isAdmin: Boolean! | ||||
|   activeVideoId: Int | ||||
|   profileImageUri: String | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
| } | ||||
|  | ||||
| type ShotAnnotationGQL { | ||||
|   shotId: Int! | ||||
|   type: ShotAnnotationTypeGQL! | ||||
|   creator: UserGQL! | ||||
|   notes: String! | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
| } | ||||
|  | ||||
| type ShotAnnotationTypeGQL { | ||||
|   id: Int! | ||||
|   name: String! | ||||
| } | ||||
|  | ||||
| type VideoGQL { | ||||
|   id: Int! | ||||
|   owner: UserGQL | ||||
|   name: String | ||||
|   screenshotUri: String | ||||
|   totalShotsMade: Int! | ||||
|   totalShots: Int! | ||||
|   makePercentage: Float! | ||||
|   medianRun: Float | ||||
|   averageTimeBetweenShots: Float | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
|   shots: [ShotGQL!]! | ||||
|   startTime: DateTime | ||||
|   endTime: DateTime | ||||
|   elapsedTime: Float | ||||
|   framesPerSecond: Float! | ||||
|   stream: UploadStreamGQL | ||||
|   playlist: HLSPlaylistGQL | ||||
|   tags: [VideoTag!]! | ||||
|   homographyHistory: [HomographyInfoGQL!]! | ||||
|   currentProcessing: VideoProcessingGQL | ||||
| } | ||||
|  | ||||
| type UploadStreamGQL { | ||||
|   id: ID! | ||||
|   linksRequested: Int! | ||||
|   uploadsCompleted: Int! | ||||
|   segmentProcessingCursor: Int! | ||||
|   lastIntendedSegmentBound: Int | ||||
|   isCompleted: Boolean! | ||||
|   uploadMetadata: UploadStreamMetadata! | ||||
|   initPlaylistUploadStatus: InitPlaylistUploadStatusEnum | ||||
|   lowestUnuploadedSegmentIndex: Int! | ||||
|   uploadCompletionCursor: Int! | ||||
|   errors: [StreamErrorGQL!]! | ||||
|   createdAt: DateTime! | ||||
|   updatedAt: DateTime! | ||||
|   segments: [UploadSegmentGQL!]! | ||||
|   resolution: VideoResolutionGQL! | ||||
|   streamSegmentType: StreamSegmentTypeEnum! | ||||
| } | ||||
|  | ||||
| type UploadStreamMetadata { | ||||
|   deviceType: DeviceTypeEnum | ||||
|   osVersion: String | ||||
|   appVersion: String | ||||
|   browserName: String | ||||
|   browserVersion: String | ||||
|   locale: String | ||||
|   timezone: String | ||||
|   networkType: String | ||||
|   ipAddress: String | ||||
| enum InitPlaylistUploadStatusEnum { | ||||
|   NOT_APPLICABLE | ||||
|   NOT_UPLOADED | ||||
|   UPLOADED | ||||
| } | ||||
|  | ||||
| enum DeviceTypeEnum { | ||||
|   IOS | ||||
|   ANDROID | ||||
|   BROWSER | ||||
| type StreamErrorGQL { | ||||
|   message: String! | ||||
| } | ||||
|  | ||||
| input FilterInput { | ||||
|   andFilters: AndFilter = null | ||||
|   orFilters: OrFilter = null | ||||
|   cueObjectDistance: CueObjectDistanceInput = null | ||||
|   targetPocketDistance: TargetPocketDistanceInput = null | ||||
|   cueObjectAngle: CueObjectAngleInput = null | ||||
|   cueBallSpeed: CueBallSpeedInput = null | ||||
|   intendedPocketType: IntendedPocketTypeInput = null | ||||
|   shotDirection: ShotDirectionInput = null | ||||
| type UploadSegmentGQL { | ||||
|   segmentIndex: Int! | ||||
|   uploaded: Boolean! | ||||
|   valid: Boolean! | ||||
|   endFrameIndex: Int | ||||
|   framesPerSecond: Float | ||||
|   durationInSeconds: Float | ||||
|   linksRequested: Int! | ||||
| } | ||||
|  | ||||
| input AndFilter { | ||||
|   filters: [FilterInput!]! | ||||
| type VideoResolutionGQL { | ||||
|   width: Int | ||||
|   height: Int | ||||
| } | ||||
|  | ||||
| input OrFilter { | ||||
|   filters: [FilterInput!]! | ||||
| enum StreamSegmentTypeEnum { | ||||
|   FRAGMENTED_MP4 | ||||
|   RB_CHUNKED_MP4 | ||||
| } | ||||
|  | ||||
| input CueObjectDistanceInput { | ||||
|   value: RangeFilter! | ||||
| type HLSPlaylistGQL { | ||||
|   videoId: Int! | ||||
|   m3u8Text: String! | ||||
|   segmentDurations: [Float!]! | ||||
| } | ||||
|  | ||||
| input RangeFilter { | ||||
|   lessThan: Float = null | ||||
|   greaterThanEqualTo: Float = null | ||||
| type VideoTag { | ||||
|   tagClasses: [VideoTagClass!]! | ||||
|   name: String! | ||||
| } | ||||
|  | ||||
| input TargetPocketDistanceInput { | ||||
|   value: RangeFilter! | ||||
| type VideoTagClass { | ||||
|   name: String! | ||||
| } | ||||
|  | ||||
| input CueObjectAngleInput { | ||||
|   value: RangeFilter! | ||||
| type HomographyInfoGQL { | ||||
|   frameIndex: Int! | ||||
|   crop: BoundingBoxGQL! | ||||
|   pockets: [BoundingBoxGQL!]! | ||||
|   sourcePoints: PocketPointsGQL! | ||||
|   destPoints: PocketPointsGQL! | ||||
| } | ||||
|  | ||||
| input CueBallSpeedInput { | ||||
|   value: RangeFilter! | ||||
| type BoundingBoxGQL { | ||||
|   left: Float! | ||||
|   top: Float! | ||||
|   width: Float! | ||||
|   height: Float! | ||||
| } | ||||
|  | ||||
| input IntendedPocketTypeInput { | ||||
|   value: EnumFilter! | ||||
| type PocketPointsGQL { | ||||
|   topLeft: IntPoint2D! | ||||
|   topSide: IntPoint2D! | ||||
|   topRight: IntPoint2D! | ||||
|   bottomLeft: IntPoint2D! | ||||
|   bottomSide: IntPoint2D! | ||||
|   bottomRight: IntPoint2D! | ||||
| } | ||||
|  | ||||
| input EnumFilter { | ||||
|   equals: String = null | ||||
| type IntPoint2D { | ||||
|   x: Int! | ||||
|   y: Int! | ||||
| } | ||||
|  | ||||
| input ShotDirectionInput { | ||||
|   value: EnumFilter! | ||||
| type VideoProcessingGQL { | ||||
|   errors: [VideoProcessingErrorGQL!]! | ||||
| } | ||||
|  | ||||
| type BucketSetGQL { | ||||
|   keyName: String! | ||||
|   feature: String! | ||||
|   buckets: [BucketGQL!]! | ||||
| type VideoProcessingErrorGQL { | ||||
|   message: String! | ||||
|   startSegmentIndex: Int | ||||
|   endSegmentIndex: Int | ||||
| } | ||||
|  | ||||
| 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 { | ||||
|   hasNextPage: Boolean! | ||||
|   endCursor: String | ||||
| } | ||||
|  | ||||
| input VideoFilterInput { | ||||
|   isStreamCompleted: Boolean = null | ||||
|   requireCursorCompletion: Boolean! = true | ||||
| } | ||||
|  | ||||
| type TagGQL { | ||||
|   name: String! | ||||
|   id: Int! | ||||
|   group: String | ||||
| } | ||||
|  | ||||
| type Mutation { | ||||
|   createBucketSet(params: CreateBucketSetInput!): BucketSetGQL! | ||||
|   processVideoSource(input: ProcessVideoSourceInput!): ProcessVideoSourceReturn! | ||||
|   createUploadStream(uploadMetadata: UploadMetadataInput, videoName: String = null): CreateUploadStreamReturn! | ||||
|   getUploadLink(videoId: Int!, chunkIndex: Int!): GetUploadLinkReturn! | ||||
|   terminateUploadStream(videoId: Int!): Boolean! | ||||
|   setLoggerLevel(path: String!, level: String!): Boolean! | ||||
|   addAnnotationToShot(shotId: Int!, annotationName: String!): Boolean! | ||||
|   getProfileImageUploadLink(fileExt: String = ".png"): GetUploadLinkReturn! | ||||
|   editProfileImageUri(profileImageUri: String!): UserGQL! | ||||
|   createUploadStream( | ||||
|     videoMetadata: VideoMetadataInput! | ||||
|   ): CreateUploadStreamReturn! | ||||
|   getUploadLink(videoId: Int!, segmentIndex: Int!): GetUploadLinkReturn! | ||||
|   getHlsInitUploadLink(videoId: Int!): GetUploadLinkReturn! | ||||
|   setSegmentDuration( | ||||
|     videoId: Int! | ||||
|     segmentIndex: Int! | ||||
|     duration: Float! | ||||
|   ): Boolean! | ||||
|   editUploadStream(videoId: Int!, videoMetadata: VideoMetadataInput!): Boolean! | ||||
|   deleteVideo(videoId: Int!): Boolean! | ||||
| } | ||||
|  | ||||
| input CreateBucketSetInput { | ||||
| @@ -236,19 +422,35 @@ input CreateBucketSetInput { | ||||
|   buckets: [BucketInputGQL!]! | ||||
| } | ||||
|  | ||||
| type ProcessVideoSourceReturn { | ||||
|   val: Int! | ||||
| type GetUploadLinkReturn { | ||||
|   uploadUrl: String! | ||||
|   headers: [Header]! | ||||
| } | ||||
|  | ||||
| input ProcessVideoSourceInput { | ||||
|   val: Int! | ||||
| type Header { | ||||
|   key: String! | ||||
|   value: String! | ||||
| } | ||||
|  | ||||
| type CreateUploadStreamReturn { | ||||
|   videoId: Int! | ||||
| } | ||||
|  | ||||
| input UploadMetadataInput { | ||||
| input VideoMetadataInput { | ||||
|   videoName: String = null | ||||
|   startTime: DateTime = null | ||||
|   endTime: DateTime = null | ||||
|   gameType: String = null | ||||
|   tableSize: String = null | ||||
|   uploadStreamMetadataInput: UploadStreamMetadataInput = null | ||||
|   lastIntendedSegmentBound: Int = null | ||||
|   streamSegmentType: StreamSegmentTypeEnum = null | ||||
|   endStream: Boolean! = false | ||||
|   resolution: VideoResolution = null | ||||
|   framesPerSecond: Float = null | ||||
| } | ||||
|  | ||||
| input UploadStreamMetadataInput { | ||||
|   deviceType: DeviceTypeEnum = null | ||||
|   osVersion: String = null | ||||
|   appVersion: String = null | ||||
| @@ -260,8 +462,13 @@ input UploadMetadataInput { | ||||
|   ipAddress: String = null | ||||
| } | ||||
|  | ||||
| type GetUploadLinkReturn { | ||||
|   uploadUrl: String! | ||||
|   linksRequested: Int! | ||||
|   uploadsCompleted: Int! | ||||
| enum DeviceTypeEnum { | ||||
|   IOS | ||||
|   ANDROID | ||||
|   BROWSER | ||||
| } | ||||
|  | ||||
| input VideoResolution { | ||||
|   width: Int! | ||||
|   height: Int! | ||||
| } | ||||
|   | ||||
							
								
								
									
										28
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								yarn.lock
									
									
									
									
									
								
							| @@ -1553,6 +1553,11 @@ colorette@^2.0.16: | ||||
|   resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" | ||||
|   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: | ||||
|   version "1.8.2" | ||||
|   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" | ||||
|   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: | ||||
|   version "1.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" | ||||
| @@ -2548,6 +2561,16 @@ picomatch@^2.3.1: | ||||
|   resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" | ||||
|   integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== | ||||
|  | ||||
| prettier-plugin-organize-imports@^3.2.4: | ||||
|   version "3.2.4" | ||||
|   resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.4.tgz#77967f69d335e9c8e6e5d224074609309c62845e" | ||||
|   integrity sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog== | ||||
|  | ||||
| prettier@^3.2.5: | ||||
|   version "3.2.5" | ||||
|   resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" | ||||
|   integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== | ||||
|  | ||||
| promise@^7.1.1: | ||||
|   version "7.3.1" | ||||
|   resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" | ||||
| @@ -2564,6 +2587,11 @@ prop-types@^15.7.2: | ||||
|     object-assign "^4.1.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: | ||||
|   version "1.4.1" | ||||
|   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user