From 14fae1ef5f1b5a79894742b9f01887298819b15e Mon Sep 17 00:00:00 2001 From: Shin Fan Date: Thu, 18 May 2017 00:40:19 -0700 Subject: [PATCH] Add video intelligence --- README.md | 27 ++ google-cloud-errorreporting/pom.xml | 4 +- google-cloud-language/pom.xml | 8 +- google-cloud-logging/pom.xml | 4 +- google-cloud-monitoring/pom.xml | 4 +- google-cloud-pubsub/pom.xml | 4 +- google-cloud-spanner/pom.xml | 14 +- google-cloud-speech/pom.xml | 8 +- google-cloud-trace/pom.xml | 4 +- google-cloud-video-intelligence/pom.xml | 165 +++++++++ .../VideoIntelligenceServiceClient.java | 341 ++++++++++++++++++ .../VideoIntelligenceServiceSettings.java | 265 ++++++++++++++ .../spi/v1beta1/package-info.java | 41 +++ .../v1beta1/MockVideoIntelligenceService.java | 55 +++ .../MockVideoIntelligenceServiceImpl.java | 73 ++++ .../VideoIntelligenceServiceClientTest.java | 131 +++++++ google-cloud-vision/pom.xml | 4 +- pom.xml | 19 +- 18 files changed, 1142 insertions(+), 29 deletions(-) create mode 100644 google-cloud-video-intelligence/pom.xml create mode 100644 google-cloud-video-intelligence/src/main/java/com/google/cloud/videointelligence/spi/v1beta1/VideoIntelligenceServiceClient.java create mode 100644 google-cloud-video-intelligence/src/main/java/com/google/cloud/videointelligence/spi/v1beta1/VideoIntelligenceServiceSettings.java create mode 100644 google-cloud-video-intelligence/src/main/java/com/google/cloud/videointelligence/spi/v1beta1/package-info.java create mode 100644 google-cloud-video-intelligence/src/test/java/com/google/cloud/videointelligence/spi/v1beta1/MockVideoIntelligenceService.java create mode 100644 google-cloud-video-intelligence/src/test/java/com/google/cloud/videointelligence/spi/v1beta1/MockVideoIntelligenceServiceImpl.java create mode 100644 google-cloud-video-intelligence/src/test/java/com/google/cloud/videointelligence/spi/v1beta1/VideoIntelligenceServiceClientTest.java diff --git a/README.md b/README.md index 422d30b75fe9..803c3298a2c0 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ This client supports the following Google Cloud Platform services at an [Alpha]( - [Cloud Resource Manager](#google-cloud-resource-manager-alpha) (Alpha) - [Cloud Speech](#google-cloud-speech-alpha) (Alpha) - [Cloud Trace](#google-cloud-trace-alpha) (Alpha) +- [Cloud Video Intelligence](#google-cloud-video-intelligence-alpha) (Alpha) > Note: This client is a work-in-progress, and may occasionally > make backwards-incompatible changes. @@ -805,6 +806,30 @@ Note that you must [supply credentials](#authentication) and a project ID if run } ``` +Google Cloud Video Intelligence (Alpha) +---------------- + +- [Official Documentation][cloud-video-intelligence-docs] + +### Preview + +Here is a code snippet showing a simple usage example of TraceServiceClient. The example assumes that either default application +credentials or a valid api key are available. +Note that you must [supply credentials](#authentication) and a project ID if running this snippet elsewhere. +```java +try (VideoIntelligenceServiceClient videoIntelligenceServiceClient = + VideoIntelligenceServiceClient.create()) { + String inputUri = ""; + List features = new ArrayList<>(); + VideoContext videoContext = VideoContext.newBuilder().build(); + String outputUri = ""; + String locationId = ""; + AnnotateVideoResponse response = + videoIntelligenceServiceClient.annotateVideoAsync( + inputUri, features, videoContext, outputUri, locationId).get(); + } +``` + Troubleshooting --------------- @@ -917,6 +942,8 @@ Apache 2.0 - See [LICENSE] for more information. [vision-api]: http://googlecloudplatform.github.io/google-cloud-java/0.15.0/apidocs/?com/google/cloud/vision/spi/v1/package-summary.html [cloud-vision-docs]: https://cloud.google.com/vision/docs +[cloud-video-intelligence-docs]: https://cloud.google.com/video-intelligence/docs + [logging-api]: https://googlecloudplatform.github.io/google-cloud-java/apidocs/index.html?com/google/cloud/logging/package-summary.html [stackdriver-logging-docs]: https://cloud.google.com/logging/docs [stackdriver-logging-activation]: https://console.cloud.google.com/start/api?id=logging diff --git a/google-cloud-errorreporting/pom.xml b/google-cloud-errorreporting/pom.xml index 51cf00ed778f..197ece50b156 100644 --- a/google-cloud-errorreporting/pom.xml +++ b/google-cloud-errorreporting/pom.xml @@ -35,7 +35,7 @@ com.google.api.grpc proto-google-cloud-error-reporting-v1beta1 - 0.1.9 + 0.1.11 io.grpc @@ -69,7 +69,7 @@ com.google.api.grpc grpc-google-cloud-error-reporting-v1beta1 - 0.1.9 + 0.1.11 test diff --git a/google-cloud-language/pom.xml b/google-cloud-language/pom.xml index ecabf0c58470..74d0db03b2e2 100644 --- a/google-cloud-language/pom.xml +++ b/google-cloud-language/pom.xml @@ -35,12 +35,12 @@ com.google.api.grpc proto-google-cloud-language-v1 - 0.1.9 + 0.1.11 com.google.api.grpc proto-google-cloud-language-v1beta2 - 0.1.9 + 0.1.11 io.grpc @@ -74,13 +74,13 @@ com.google.api.grpc grpc-google-cloud-language-v1 - 0.1.9 + 0.1.11 test com.google.api.grpc grpc-google-cloud-language-v1beta2 - 0.1.9 + 0.1.11 test diff --git a/google-cloud-logging/pom.xml b/google-cloud-logging/pom.xml index ae40872cac50..f05e0c1366c2 100644 --- a/google-cloud-logging/pom.xml +++ b/google-cloud-logging/pom.xml @@ -39,7 +39,7 @@ com.google.api.grpc proto-google-cloud-logging-v2 - 0.1.9 + 0.1.11 io.grpc @@ -62,7 +62,7 @@ com.google.api.grpc grpc-google-cloud-logging-v2 - 0.1.9 + 0.1.11 test diff --git a/google-cloud-monitoring/pom.xml b/google-cloud-monitoring/pom.xml index 6bc0beb496c5..67d3f6844574 100644 --- a/google-cloud-monitoring/pom.xml +++ b/google-cloud-monitoring/pom.xml @@ -35,7 +35,7 @@ com.google.api.grpc proto-google-cloud-monitoring-v3 - 0.1.9 + 0.1.11 io.grpc @@ -69,7 +69,7 @@ com.google.api.grpc grpc-google-cloud-monitoring-v3 - 0.1.9 + 0.1.11 test diff --git a/google-cloud-pubsub/pom.xml b/google-cloud-pubsub/pom.xml index 67c49f8b9f24..d59c4650d7eb 100644 --- a/google-cloud-pubsub/pom.xml +++ b/google-cloud-pubsub/pom.xml @@ -35,12 +35,12 @@ com.google.api.grpc proto-google-cloud-pubsub-v1 - 0.1.9 + 0.1.11 com.google.api.grpc grpc-google-cloud-pubsub-v1 - 0.1.9 + 0.1.11 io.grpc diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index 9b4636c54b65..8bdfa4acfdfe 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -101,37 +101,37 @@ com.google.api.grpc proto-google-cloud-spanner-v1 - 0.1.9 + 0.1.11 com.google.api.grpc proto-google-cloud-spanner-admin-database-v1 - 0.1.9 + 0.1.11 com.google.api.grpc proto-google-cloud-spanner-admin-instance-v1 - 0.1.9 + 0.1.11 com.google.api.grpc grpc-google-cloud-spanner-v1 - 0.1.9 + 0.1.11 com.google.api.grpc grpc-google-cloud-spanner-admin-database-v1 - 0.1.9 + 0.1.11 com.google.api.grpc grpc-google-cloud-spanner-admin-instance-v1 - 0.1.9 + 0.1.11 com.google.api.grpc grpc-google-longrunning-v1 - 0.1.9 + 0.1.11 io.grpc diff --git a/google-cloud-speech/pom.xml b/google-cloud-speech/pom.xml index e5474b82446e..cbfebba83baa 100644 --- a/google-cloud-speech/pom.xml +++ b/google-cloud-speech/pom.xml @@ -35,12 +35,12 @@ com.google.api.grpc proto-google-cloud-speech-v1beta1 - 0.1.9 + 0.1.11 com.google.api.grpc proto-google-cloud-speech-v1 - 0.1.9 + 0.1.11 io.grpc @@ -74,13 +74,13 @@ com.google.api.grpc grpc-google-cloud-speech-v1beta1 - 0.1.9 + 0.1.11 test com.google.api.grpc grpc-google-cloud-speech-v1 - 0.1.9 + 0.1.11 test diff --git a/google-cloud-trace/pom.xml b/google-cloud-trace/pom.xml index c4c59be1ff41..1c68e33a0be6 100644 --- a/google-cloud-trace/pom.xml +++ b/google-cloud-trace/pom.xml @@ -35,7 +35,7 @@ com.google.api.grpc proto-google-cloud-trace-v1 - 0.1.9 + 0.1.11 io.grpc @@ -69,7 +69,7 @@ com.google.api.grpc grpc-google-cloud-trace-v1 - 0.1.9 + 0.1.11 test diff --git a/google-cloud-video-intelligence/pom.xml b/google-cloud-video-intelligence/pom.xml new file mode 100644 index 000000000000..20c06a466ac1 --- /dev/null +++ b/google-cloud-video-intelligence/pom.xml @@ -0,0 +1,165 @@ + + + 4.0.0 + google-cloud-video-intelligence + 0.17.3-alpha-SNAPSHOT + jar + Google Cloud Video Intelligence + https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master/google-cloud-video-intelligence + + Java idiomatic client for Cloud Video Intelligence v1beta1. + + + com.google.cloud + google-cloud-pom + 0.17.3-alpha-SNAPSHOT + + + google-cloud-video-intelligence-v1beta1 + ${project.version} + + + + io.netty + netty-tcnative-boringssl-static + 1.1.33.Fork26 + + + ${project.groupId} + google-cloud-core + + + ${project.groupId} + google-cloud-core-grpc + + + com.google.api.grpc + proto-google-cloud-video-intelligence-v1beta1 + 0.1.11 + + + io.grpc + grpc-netty + + + io.grpc + grpc-stub + + + io.grpc + grpc-auth + + + ${project.groupId} + google-cloud-core + test-jar + test + + + junit + junit + test + + + org.easymock + easymock + 3.4 + test + + + com.google.api.grpc + grpc-google-cloud-video-intelligence-v1beta1 + 0.1.11 + test + + + + + doclint-java8-disable + + [1.8,) + + + + -Xdoclint:none + + + + + + + ./.. + true + + project.properties + + + + + + maven-antrun-plugin + 1.4 + + + process-resources + + + + + + + run + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.9.1 + + + generate-sources + add-source + + + generated/src/main/java + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.3 + + + attach-javadocs + + jar + + + ${javadoc.opts} + + + + + + maven-compiler-plugin + + + + 3.1 + + 1.7 + 1.7 + UTF-8 + -Xlint:unchecked + + + + + diff --git a/google-cloud-video-intelligence/src/main/java/com/google/cloud/videointelligence/spi/v1beta1/VideoIntelligenceServiceClient.java b/google-cloud-video-intelligence/src/main/java/com/google/cloud/videointelligence/spi/v1beta1/VideoIntelligenceServiceClient.java new file mode 100644 index 000000000000..8247102027b4 --- /dev/null +++ b/google-cloud-video-intelligence/src/main/java/com/google/cloud/videointelligence/spi/v1beta1/VideoIntelligenceServiceClient.java @@ -0,0 +1,341 @@ +/* + * Copyright 2017, Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.cloud.videointelligence.spi.v1beta1; + +import com.google.api.core.BetaApi; +import com.google.api.gax.grpc.ChannelAndExecutor; +import com.google.api.gax.grpc.FixedChannelProvider; +import com.google.api.gax.grpc.FixedExecutorProvider; +import com.google.api.gax.grpc.OperationCallable; +import com.google.api.gax.grpc.OperationFuture; +import com.google.api.gax.grpc.UnaryCallable; +import com.google.cloud.videointelligence.v1beta1.AnnotateVideoRequest; +import com.google.cloud.videointelligence.v1beta1.AnnotateVideoResponse; +import com.google.cloud.videointelligence.v1beta1.Feature; +import com.google.cloud.videointelligence.v1beta1.VideoContext; +import com.google.longrunning.Operation; +import com.google.longrunning.OperationsClient; +import com.google.longrunning.OperationsSettings; +import io.grpc.ManagedChannel; +import java.io.Closeable; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ScheduledExecutorService; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND SERVICE +/** + * Service Description: Service that implements Google Cloud Video Intelligence API. + * + *

This class provides the ability to make remote calls to the backing service through method + * calls that map to API methods. Sample code to get started: + * + *

+ * 
+ * try (VideoIntelligenceServiceClient videoIntelligenceServiceClient = VideoIntelligenceServiceClient.create()) {
+ *   String inputUri = "";
+ *   List<Feature> features = new ArrayList<>();
+ *   VideoContext videoContext = VideoContext.newBuilder().build();
+ *   String outputUri = "";
+ *   String locationId = "";
+ *   AnnotateVideoResponse response = videoIntelligenceServiceClient.annotateVideoAsync(inputUri, features, videoContext, outputUri, locationId).get();
+ * }
+ * 
+ * 
+ * + *

Note: close() needs to be called on the videoIntelligenceServiceClient object to clean up + * resources such as threads. In the example above, try-with-resources is used, which automatically + * calls close(). + * + *

The surface of this class includes several types of Java methods for each of the API's + * methods: + * + *

    + *
  1. A "flattened" method. With this type of method, the fields of the request type have been + * converted into function parameters. It may be the case that not all fields are available as + * parameters, and not every API method will have a flattened method entry point. + *
  2. A "request object" method. This type of method only takes one parameter, a request object, + * which must be constructed before the call. Not every API method will have a request object + * method. + *
  3. A "callable" method. This type of method takes no parameters and returns an immutable API + * callable object, which can be used to initiate calls to the service. + *
+ * + *

See the individual methods for example code. + * + *

Many parameters require resource names to be formatted in a particular way. To assist with + * these names, this class includes a format method for each type of name, and additionally a parse + * method to extract the individual identifiers contained within names that are returned. + * + *

This class can be customized by passing in a custom instance of + * VideoIntelligenceServiceSettings to create(). For example: + * + *

+ * 
+ * InstantiatingChannelProvider channelProvider =
+ *     VideoIntelligenceServiceSettings.defaultChannelProviderBuilder()
+ *         .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials))
+ *         .build();
+ * VideoIntelligenceServiceSettings videoIntelligenceServiceSettings =
+ *     VideoIntelligenceServiceSettings.defaultBuilder().setChannelProvider(channelProvider).build();
+ * VideoIntelligenceServiceClient videoIntelligenceServiceClient =
+ *     VideoIntelligenceServiceClient.create(videoIntelligenceServiceSettings);
+ * 
+ * 
+ */ +@Generated("by GAPIC") +@BetaApi +public class VideoIntelligenceServiceClient implements AutoCloseable { + private final VideoIntelligenceServiceSettings settings; + private final ScheduledExecutorService executor; + private final ManagedChannel channel; + private final OperationsClient operationsClient; + private final List closeables = new ArrayList<>(); + + private final UnaryCallable annotateVideoCallable; + private final OperationCallable + annotateVideoOperationCallable; + + /** Constructs an instance of VideoIntelligenceServiceClient with default settings. */ + public static final VideoIntelligenceServiceClient create() throws IOException { + return create(VideoIntelligenceServiceSettings.defaultBuilder().build()); + } + + /** + * Constructs an instance of VideoIntelligenceServiceClient, using the given settings. The + * channels are created based on the settings passed in, or defaults for any settings that are not + * set. + */ + public static final VideoIntelligenceServiceClient create( + VideoIntelligenceServiceSettings settings) throws IOException { + return new VideoIntelligenceServiceClient(settings); + } + + /** + * Constructs an instance of VideoIntelligenceServiceClient, using the given settings. This is + * protected so that it easy to make a subclass, but otherwise, the static factory methods should + * be preferred. + */ + protected VideoIntelligenceServiceClient(VideoIntelligenceServiceSettings settings) + throws IOException { + this.settings = settings; + ChannelAndExecutor channelAndExecutor = settings.getChannelAndExecutor(); + this.executor = channelAndExecutor.getExecutor(); + this.channel = channelAndExecutor.getChannel(); + + FixedExecutorProvider executorProvider = FixedExecutorProvider.create(this.executor); + FixedChannelProvider channelProvider = FixedChannelProvider.create(this.channel); + OperationsSettings operationsSettings = + OperationsSettings.defaultBuilder() + .setExecutorProvider(executorProvider) + .setChannelProvider(channelProvider) + .build(); + this.operationsClient = OperationsClient.create(operationsSettings); + + this.annotateVideoCallable = + UnaryCallable.create( + settings.annotateVideoSettings().getInitialCallSettings(), this.channel, this.executor); + this.annotateVideoOperationCallable = + OperationCallable.create( + settings.annotateVideoSettings(), this.channel, this.executor, this.operationsClient); + + if (settings.getChannelProvider().shouldAutoClose()) { + closeables.add( + new Closeable() { + @Override + public void close() throws IOException { + channel.shutdown(); + } + }); + } + if (settings.getExecutorProvider().shouldAutoClose()) { + closeables.add( + new Closeable() { + @Override + public void close() throws IOException { + executor.shutdown(); + } + }); + } + } + + public final VideoIntelligenceServiceSettings getSettings() { + return settings; + } + + /** + * Returns the OperationsClient that can be used to query the status of a long-running operation + * returned by another API method call. + */ + public final OperationsClient getOperationsClient() { + return operationsClient; + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD + /** + * Performs asynchronous video annotation. Progress and results can be retrieved through the + * `google.longrunning.Operations` interface. `Operation.metadata` contains + * `AnnotateVideoProgress` (progress). `Operation.response` contains `AnnotateVideoResponse` + * (results). + * + *

Sample code: + * + *


+   * try (VideoIntelligenceServiceClient videoIntelligenceServiceClient = VideoIntelligenceServiceClient.create()) {
+   *   String inputUri = "";
+   *   List<Feature> features = new ArrayList<>();
+   *   VideoContext videoContext = VideoContext.newBuilder().build();
+   *   String outputUri = "";
+   *   String locationId = "";
+   *   AnnotateVideoResponse response = videoIntelligenceServiceClient.annotateVideoAsync(inputUri, features, videoContext, outputUri, locationId).get();
+   * }
+   * 
+ * + * @param inputUri Input video location. Currently, only [Google Cloud + * Storage](https://cloud.google.com/storage/) URIs are supported, which must be specified in + * the following format: `gs://bucket-id/object-id` (other URI formats return + * [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]). For more + * information, see [Request URIs](/storage/docs/reference-uris). A video URI may include + * wildcards in `object-id`, and thus identify multiple videos. Supported wildcards: '*' + * to match 0 or more characters; '?' to match 1 character. If unset, the input video should + * be embedded in the request as `input_content`. If set, `input_content` should be unset. + * @param features Requested video annotation features. + * @param videoContext Additional video context and/or feature-specific parameters. + * @param outputUri Optional location where the output (in JSON format) should be stored. + * Currently, only [Google Cloud Storage](https://cloud.google.com/storage/) URIs are + * supported, which must be specified in the following format: `gs://bucket-id/object-id` + * (other URI formats return + * [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]). For more + * information, see [Request URIs](/storage/docs/reference-uris). + * @param locationId Optional cloud region where annotation should take place. Supported cloud + * regions: `us-east1`, `us-west1`, `europe-west1`, `asia-east1`. If no region is specified, a + * region will be determined based on video file location. + * @throws com.google.api.gax.grpc.ApiException if the remote call fails + */ + public final OperationFuture annotateVideoAsync( + String inputUri, + List features, + VideoContext videoContext, + String outputUri, + String locationId) { + + AnnotateVideoRequest request = + AnnotateVideoRequest.newBuilder() + .setInputUri(inputUri) + .addAllFeatures(features) + .setVideoContext(videoContext) + .setOutputUri(outputUri) + .setLocationId(locationId) + .build(); + return annotateVideoAsync(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD + /** + * Performs asynchronous video annotation. Progress and results can be retrieved through the + * `google.longrunning.Operations` interface. `Operation.metadata` contains + * `AnnotateVideoProgress` (progress). `Operation.response` contains `AnnotateVideoResponse` + * (results). + * + *

Sample code: + * + *


+   * try (VideoIntelligenceServiceClient videoIntelligenceServiceClient = VideoIntelligenceServiceClient.create()) {
+   *   String inputUri = "";
+   *   List<Feature> features = new ArrayList<>();
+   *   AnnotateVideoRequest request = AnnotateVideoRequest.newBuilder()
+   *     .setInputUri(inputUri)
+   *     .addAllFeatures(features)
+   *     .build();
+   *   AnnotateVideoResponse response = videoIntelligenceServiceClient.annotateVideoAsync(request).get();
+   * }
+   * 
+ * + * @param request The request object containing all of the parameters for the API call. + * @throws com.google.api.gax.grpc.ApiException if the remote call fails + */ + public final OperationFuture annotateVideoAsync( + AnnotateVideoRequest request) { + return annotateVideoOperationCallable().futureCall(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD + /** + * Performs asynchronous video annotation. Progress and results can be retrieved through the + * `google.longrunning.Operations` interface. `Operation.metadata` contains + * `AnnotateVideoProgress` (progress). `Operation.response` contains `AnnotateVideoResponse` + * (results). + * + *

Sample code: + * + *


+   * try (VideoIntelligenceServiceClient videoIntelligenceServiceClient = VideoIntelligenceServiceClient.create()) {
+   *   String inputUri = "";
+   *   List<Feature> features = new ArrayList<>();
+   *   AnnotateVideoRequest request = AnnotateVideoRequest.newBuilder()
+   *     .setInputUri(inputUri)
+   *     .addAllFeatures(features)
+   *     .build();
+   *   OperationFuture<Operation> future = videoIntelligenceServiceClient.annotateVideoOperationCallable().futureCall(request);
+   *   // Do something
+   *   AnnotateVideoResponse response = future.get();
+   * }
+   * 
+ */ + public final OperationCallable + annotateVideoOperationCallable() { + return annotateVideoOperationCallable; + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD + /** + * Performs asynchronous video annotation. Progress and results can be retrieved through the + * `google.longrunning.Operations` interface. `Operation.metadata` contains + * `AnnotateVideoProgress` (progress). `Operation.response` contains `AnnotateVideoResponse` + * (results). + * + *

Sample code: + * + *


+   * try (VideoIntelligenceServiceClient videoIntelligenceServiceClient = VideoIntelligenceServiceClient.create()) {
+   *   String inputUri = "";
+   *   List<Feature> features = new ArrayList<>();
+   *   AnnotateVideoRequest request = AnnotateVideoRequest.newBuilder()
+   *     .setInputUri(inputUri)
+   *     .addAllFeatures(features)
+   *     .build();
+   *   ApiFuture<Operation> future = videoIntelligenceServiceClient.annotateVideoCallable().futureCall(request);
+   *   // Do something
+   *   Operation response = future.get();
+   * }
+   * 
+ */ + public final UnaryCallable annotateVideoCallable() { + return annotateVideoCallable; + } + + /** + * Initiates an orderly shutdown in which preexisting calls continue but new calls are immediately + * cancelled. + */ + @Override + public final void close() throws Exception { + for (AutoCloseable closeable : closeables) { + closeable.close(); + } + } +} diff --git a/google-cloud-video-intelligence/src/main/java/com/google/cloud/videointelligence/spi/v1beta1/VideoIntelligenceServiceSettings.java b/google-cloud-video-intelligence/src/main/java/com/google/cloud/videointelligence/spi/v1beta1/VideoIntelligenceServiceSettings.java new file mode 100644 index 000000000000..1a4463433dd6 --- /dev/null +++ b/google-cloud-video-intelligence/src/main/java/com/google/cloud/videointelligence/spi/v1beta1/VideoIntelligenceServiceSettings.java @@ -0,0 +1,265 @@ +/* + * Copyright 2017, Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.cloud.videointelligence.spi.v1beta1; + +import com.google.api.core.BetaApi; +import com.google.api.gax.core.GoogleCredentialsProvider; +import com.google.api.gax.core.PropertiesProvider; +import com.google.api.gax.grpc.ChannelProvider; +import com.google.api.gax.grpc.ClientSettings; +import com.google.api.gax.grpc.ExecutorProvider; +import com.google.api.gax.grpc.InstantiatingChannelProvider; +import com.google.api.gax.grpc.InstantiatingExecutorProvider; +import com.google.api.gax.grpc.OperationCallSettings; +import com.google.api.gax.grpc.UnaryCallSettings; +import com.google.api.gax.retrying.RetrySettings; +import com.google.cloud.videointelligence.v1beta1.AnnotateVideoRequest; +import com.google.cloud.videointelligence.v1beta1.AnnotateVideoResponse; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.google.longrunning.Operation; +import io.grpc.Status; +import java.io.IOException; +import java.util.List; +import javax.annotation.Generated; +import org.threeten.bp.Duration; + +// AUTO-GENERATED DOCUMENTATION AND CLASS +/** + * Settings class to configure an instance of {@link VideoIntelligenceServiceClient}. + * + *

The default instance has everything set to sensible defaults: + * + *

    + *
  • The default service address (videointelligence.googleapis.com) and default port (443) are + * used. + *
  • Credentials are acquired automatically through Application Default Credentials. + *
  • Retries are configured for idempotent methods but not for non-idempotent methods. + *
+ * + *

The builder of this class is recursive, so contained classes are themselves builders. When + * build() is called, the tree of builders is called to create the complete settings object. For + * example, to set the total timeout of annotateVideoAsync to 30 seconds: + * + *

+ * 
+ * VideoIntelligenceServiceSettings.Builder videoIntelligenceServiceSettingsBuilder =
+ *     VideoIntelligenceServiceSettings.defaultBuilder();
+ * videoIntelligenceServiceSettingsBuilder.annotateVideoSettings().getRetrySettingsBuilder()
+ *     .setTotalTimeout(Duration.ofSeconds(30));
+ * VideoIntelligenceServiceSettings videoIntelligenceServiceSettings = videoIntelligenceServiceSettingsBuilder.build();
+ * 
+ * 
+ */ +@Generated("by GAPIC v0.0.5") +@BetaApi +public class VideoIntelligenceServiceSettings extends ClientSettings { + /** The default scopes of the service. */ + private static final ImmutableList DEFAULT_SERVICE_SCOPES = + ImmutableList.builder().add("https://www.googleapis.com/auth/cloud-platform").build(); + + private static final String DEFAULT_GAPIC_NAME = "gapic"; + private static final String DEFAULT_GAPIC_VERSION = ""; + + private static final String PROPERTIES_FILE = + "/com/google/cloud/videointelligence/project.properties"; + private static final String META_VERSION_KEY = "artifact.version"; + + private static String gapicVersion; + + private static final io.grpc.MethodDescriptor + METHOD_ANNOTATE_VIDEO = + io.grpc.MethodDescriptor.create( + io.grpc.MethodDescriptor.MethodType.UNARY, + "google.cloud.videointelligence.v1beta1.VideoIntelligenceService/AnnotateVideo", + io.grpc.protobuf.ProtoUtils.marshaller(AnnotateVideoRequest.getDefaultInstance()), + io.grpc.protobuf.ProtoUtils.marshaller(Operation.getDefaultInstance())); + + private final OperationCallSettings + annotateVideoSettings; + + /** Returns the object with the settings used for calls to annotateVideo. */ + public OperationCallSettings + annotateVideoSettings() { + return annotateVideoSettings; + } + + /** Returns a builder for the default ExecutorProvider for this service. */ + public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() { + return InstantiatingExecutorProvider.newBuilder(); + } + + /** Returns the default service endpoint. */ + public static String getDefaultEndpoint() { + return "videointelligence.googleapis.com:443"; + } + + /** Returns the default service scopes. */ + public static List getDefaultServiceScopes() { + return DEFAULT_SERVICE_SCOPES; + } + + /** Returns a builder for the default credentials for this service. */ + public static GoogleCredentialsProvider.Builder defaultCredentialsProviderBuilder() { + return GoogleCredentialsProvider.newBuilder().setScopesToApply(DEFAULT_SERVICE_SCOPES); + } + + /** Returns a builder for the default ChannelProvider for this service. */ + public static InstantiatingChannelProvider.Builder defaultChannelProviderBuilder() { + return InstantiatingChannelProvider.newBuilder() + .setEndpoint(getDefaultEndpoint()) + .setGeneratorHeader(DEFAULT_GAPIC_NAME, getGapicVersion()) + .setCredentialsProvider(defaultCredentialsProviderBuilder().build()); + } + + private static String getGapicVersion() { + if (gapicVersion == null) { + gapicVersion = + PropertiesProvider.loadProperty( + VideoIntelligenceServiceSettings.class, PROPERTIES_FILE, META_VERSION_KEY); + gapicVersion = gapicVersion == null ? DEFAULT_GAPIC_VERSION : gapicVersion; + } + return gapicVersion; + } + + /** Returns a builder for this class with recommended defaults. */ + public static Builder defaultBuilder() { + return Builder.createDefault(); + } + + /** Returns a new builder for this class. */ + public static Builder newBuilder() { + return new Builder(); + } + + /** Returns a builder containing all the values of this settings class. */ + public Builder toBuilder() { + return new Builder(this); + } + + private VideoIntelligenceServiceSettings(Builder settingsBuilder) throws IOException { + super(settingsBuilder.getExecutorProvider(), settingsBuilder.getChannelProvider()); + + annotateVideoSettings = settingsBuilder.annotateVideoSettings().build(); + } + + /** Builder for VideoIntelligenceServiceSettings. */ + public static class Builder extends ClientSettings.Builder { + private final ImmutableList unaryMethodSettingsBuilders; + + private final OperationCallSettings.Builder + annotateVideoSettings; + + private static final ImmutableMap> RETRYABLE_CODE_DEFINITIONS; + + static { + ImmutableMap.Builder> definitions = ImmutableMap.builder(); + definitions.put( + "idempotent", + Sets.immutableEnumSet( + Lists.newArrayList( + Status.Code.DEADLINE_EXCEEDED, Status.Code.UNAVAILABLE))); + definitions.put( + "non_idempotent", + Sets.immutableEnumSet(Lists.newArrayList(Status.Code.UNAVAILABLE))); + RETRYABLE_CODE_DEFINITIONS = definitions.build(); + } + + private static final ImmutableMap RETRY_PARAM_DEFINITIONS; + + static { + ImmutableMap.Builder definitions = ImmutableMap.builder(); + RetrySettings.Builder settingsBuilder = null; + settingsBuilder = + RetrySettings.newBuilder() + .setInitialRetryDelay(Duration.ofMillis(1000L)) + .setRetryDelayMultiplier(2.5) + .setMaxRetryDelay(Duration.ofMillis(120000L)) + .setInitialRpcTimeout(Duration.ofMillis(120000L)) + .setRpcTimeoutMultiplier(1.0) + .setMaxRpcTimeout(Duration.ofMillis(120000L)) + .setTotalTimeout(Duration.ofMillis(600000L)); + definitions.put("default", settingsBuilder); + RETRY_PARAM_DEFINITIONS = definitions.build(); + } + + private Builder() { + super(defaultChannelProviderBuilder().build()); + + annotateVideoSettings = + OperationCallSettings.newBuilder(METHOD_ANNOTATE_VIDEO, AnnotateVideoResponse.class); + + unaryMethodSettingsBuilders = ImmutableList.of(); + } + + private static Builder createDefault() { + Builder builder = new Builder(); + builder + .annotateVideoSettings() + .getInitialCallSettings() + .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("idempotent")) + .setRetrySettingsBuilder(RETRY_PARAM_DEFINITIONS.get("default")); + + return builder; + } + + private Builder(VideoIntelligenceServiceSettings settings) { + super(settings); + + annotateVideoSettings = settings.annotateVideoSettings.toBuilder(); + + unaryMethodSettingsBuilders = ImmutableList.of(); + } + + @Override + public Builder setExecutorProvider(ExecutorProvider executorProvider) { + super.setExecutorProvider(executorProvider); + return this; + } + + @Override + public Builder setChannelProvider(ChannelProvider channelProvider) { + super.setChannelProvider(channelProvider); + return this; + } + + /** + * Applies the given settings to all of the unary API methods in this service. Only values that + * are non-null will be applied, so this method is not capable of un-setting any values. + * + *

Note: This method does not support applying settings to streaming methods. + */ + public Builder applyToAllUnaryMethods(UnaryCallSettings.Builder unaryCallSettings) + throws Exception { + super.applyToAllUnaryMethods(unaryMethodSettingsBuilders, unaryCallSettings); + return this; + } + + /** Returns the builder for the settings used for calls to annotateVideo. */ + public OperationCallSettings.Builder + annotateVideoSettings() { + return annotateVideoSettings; + } + + @Override + public VideoIntelligenceServiceSettings build() throws IOException { + return new VideoIntelligenceServiceSettings(this); + } + } +} diff --git a/google-cloud-video-intelligence/src/main/java/com/google/cloud/videointelligence/spi/v1beta1/package-info.java b/google-cloud-video-intelligence/src/main/java/com/google/cloud/videointelligence/spi/v1beta1/package-info.java new file mode 100644 index 000000000000..c58436c6a0ec --- /dev/null +++ b/google-cloud-video-intelligence/src/main/java/com/google/cloud/videointelligence/spi/v1beta1/package-info.java @@ -0,0 +1,41 @@ +/* + * Copyright 2017, Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * A client to Google Cloud Video Intelligence API. + * + *

The interfaces provided are listed below, along with usage samples. + * + *

============================== VideoIntelligenceServiceClient ============================== + * + *

Service Description: Service that implements Google Cloud Video Intelligence API. + * + *

Sample for VideoIntelligenceServiceClient: + * + *

+ * 
+ * try (VideoIntelligenceServiceClient videoIntelligenceServiceClient = VideoIntelligenceServiceClient.create()) {
+ *   String inputUri = "";
+ *   List<Feature> features = new ArrayList<>();
+ *   VideoContext videoContext = VideoContext.newBuilder().build();
+ *   String outputUri = "";
+ *   String locationId = "";
+ *   AnnotateVideoResponse response = videoIntelligenceServiceClient.annotateVideoAsync(inputUri, features, videoContext, outputUri, locationId);
+ * }
+ * 
+ * 
+ */ +package com.google.cloud.videointelligence.spi.v1beta1; diff --git a/google-cloud-video-intelligence/src/test/java/com/google/cloud/videointelligence/spi/v1beta1/MockVideoIntelligenceService.java b/google-cloud-video-intelligence/src/test/java/com/google/cloud/videointelligence/spi/v1beta1/MockVideoIntelligenceService.java new file mode 100644 index 000000000000..5180c5ab9fb2 --- /dev/null +++ b/google-cloud-video-intelligence/src/test/java/com/google/cloud/videointelligence/spi/v1beta1/MockVideoIntelligenceService.java @@ -0,0 +1,55 @@ +/* + * Copyright 2017, Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.cloud.videointelligence.spi.v1beta1; + +import com.google.api.gax.grpc.testing.MockGrpcService; +import com.google.protobuf.GeneratedMessageV3; +import io.grpc.ServerServiceDefinition; +import java.util.List; + +@javax.annotation.Generated("by GAPIC") +public class MockVideoIntelligenceService implements MockGrpcService { + private final MockVideoIntelligenceServiceImpl serviceImpl; + + public MockVideoIntelligenceService() { + serviceImpl = new MockVideoIntelligenceServiceImpl(); + } + + @Override + public List getRequests() { + return serviceImpl.getRequests(); + } + + @Override + public void addResponse(GeneratedMessageV3 response) { + serviceImpl.addResponse(response); + } + + @Override + public void addException(Exception exception) { + serviceImpl.addException(exception); + } + + @Override + public ServerServiceDefinition getServiceDefinition() { + return serviceImpl.bindService(); + } + + @Override + public void reset() { + serviceImpl.reset(); + } +} diff --git a/google-cloud-video-intelligence/src/test/java/com/google/cloud/videointelligence/spi/v1beta1/MockVideoIntelligenceServiceImpl.java b/google-cloud-video-intelligence/src/test/java/com/google/cloud/videointelligence/spi/v1beta1/MockVideoIntelligenceServiceImpl.java new file mode 100644 index 000000000000..6bc6cefc8a87 --- /dev/null +++ b/google-cloud-video-intelligence/src/test/java/com/google/cloud/videointelligence/spi/v1beta1/MockVideoIntelligenceServiceImpl.java @@ -0,0 +1,73 @@ +/* + * Copyright 2017, Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.cloud.videointelligence.spi.v1beta1; + +import com.google.cloud.videointelligence.v1beta1.AnnotateVideoRequest; +import com.google.cloud.videointelligence.v1beta1.VideoIntelligenceServiceGrpc.VideoIntelligenceServiceImplBase; +import com.google.longrunning.Operation; +import com.google.protobuf.GeneratedMessageV3; +import io.grpc.stub.StreamObserver; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +@javax.annotation.Generated("by GAPIC") +public class MockVideoIntelligenceServiceImpl extends VideoIntelligenceServiceImplBase { + private ArrayList requests; + private Queue responses; + + public MockVideoIntelligenceServiceImpl() { + requests = new ArrayList<>(); + responses = new LinkedList<>(); + } + + public List getRequests() { + return requests; + } + + public void addResponse(GeneratedMessageV3 response) { + responses.add(response); + } + + public void setResponses(List responses) { + this.responses = new LinkedList(responses); + } + + public void addException(Exception exception) { + responses.add(exception); + } + + public void reset() { + requests = new ArrayList<>(); + responses = new LinkedList<>(); + } + + @Override + public void annotateVideo( + AnnotateVideoRequest request, StreamObserver responseObserver) { + Object response = responses.remove(); + if (response instanceof Operation) { + requests.add(request); + responseObserver.onNext((Operation) response); + responseObserver.onCompleted(); + } else if (response instanceof Exception) { + responseObserver.onError((Exception) response); + } else { + responseObserver.onError(new IllegalArgumentException("Unrecognized response type")); + } + } +} diff --git a/google-cloud-video-intelligence/src/test/java/com/google/cloud/videointelligence/spi/v1beta1/VideoIntelligenceServiceClientTest.java b/google-cloud-video-intelligence/src/test/java/com/google/cloud/videointelligence/spi/v1beta1/VideoIntelligenceServiceClientTest.java new file mode 100644 index 000000000000..4f5a06c50bde --- /dev/null +++ b/google-cloud-video-intelligence/src/test/java/com/google/cloud/videointelligence/spi/v1beta1/VideoIntelligenceServiceClientTest.java @@ -0,0 +1,131 @@ +/* + * Copyright 2017, Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.cloud.videointelligence.spi.v1beta1; + +import com.google.api.gax.grpc.ApiException; +import com.google.api.gax.grpc.testing.MockGrpcService; +import com.google.api.gax.grpc.testing.MockServiceHelper; +import com.google.cloud.videointelligence.v1beta1.AnnotateVideoRequest; +import com.google.cloud.videointelligence.v1beta1.AnnotateVideoResponse; +import com.google.cloud.videointelligence.v1beta1.Feature; +import com.google.cloud.videointelligence.v1beta1.VideoContext; +import com.google.longrunning.Operation; +import com.google.protobuf.Any; +import com.google.protobuf.GeneratedMessageV3; +import io.grpc.Status; +import io.grpc.StatusRuntimeException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ExecutionException; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +@javax.annotation.Generated("by GAPIC") +public class VideoIntelligenceServiceClientTest { + private static MockVideoIntelligenceService mockVideoIntelligenceService; + private static MockServiceHelper serviceHelper; + private VideoIntelligenceServiceClient client; + + @BeforeClass + public static void startStaticServer() { + mockVideoIntelligenceService = new MockVideoIntelligenceService(); + serviceHelper = + new MockServiceHelper( + "in-process-1", Arrays.asList(mockVideoIntelligenceService)); + serviceHelper.start(); + } + + @AfterClass + public static void stopServer() { + serviceHelper.stop(); + } + + @Before + public void setUp() throws IOException { + serviceHelper.reset(); + VideoIntelligenceServiceSettings settings = + VideoIntelligenceServiceSettings.defaultBuilder() + .setChannelProvider(serviceHelper.createChannelProvider()) + .build(); + client = VideoIntelligenceServiceClient.create(settings); + } + + @After + public void tearDown() throws Exception { + client.close(); + } + + @Test + @SuppressWarnings("all") + public void annotateVideoTest() throws Exception { + AnnotateVideoResponse expectedResponse = AnnotateVideoResponse.newBuilder().build(); + Operation resultOperation = + Operation.newBuilder() + .setName("annotateVideoTest") + .setDone(true) + .setResponse(Any.pack(expectedResponse)) + .build(); + mockVideoIntelligenceService.addResponse(resultOperation); + + String inputUri = "inputUri1707300727"; + List features = new ArrayList<>(); + VideoContext videoContext = VideoContext.newBuilder().build(); + String outputUri = "outputUri-1273518802"; + String locationId = "locationId552319461"; + + AnnotateVideoResponse actualResponse = + client.annotateVideoAsync(inputUri, features, videoContext, outputUri, locationId).get(); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockVideoIntelligenceService.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + AnnotateVideoRequest actualRequest = (AnnotateVideoRequest) actualRequests.get(0); + + Assert.assertEquals(inputUri, actualRequest.getInputUri()); + Assert.assertEquals(features, actualRequest.getFeaturesList()); + Assert.assertEquals(videoContext, actualRequest.getVideoContext()); + Assert.assertEquals(outputUri, actualRequest.getOutputUri()); + Assert.assertEquals(locationId, actualRequest.getLocationId()); + } + + @Test + @SuppressWarnings("all") + public void annotateVideoExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(Status.INVALID_ARGUMENT); + mockVideoIntelligenceService.addException(exception); + + try { + String inputUri = "inputUri1707300727"; + List features = new ArrayList<>(); + VideoContext videoContext = VideoContext.newBuilder().build(); + String outputUri = "outputUri-1273518802"; + String locationId = "locationId552319461"; + + client.annotateVideoAsync(inputUri, features, videoContext, outputUri, locationId).get(); + Assert.fail("No exception raised"); + } catch (ExecutionException e) { + Assert.assertEquals(ApiException.class, e.getCause().getClass()); + ApiException apiException = (ApiException) e.getCause(); + Assert.assertEquals(Status.INVALID_ARGUMENT.getCode(), apiException.getStatusCode()); + } + } +} diff --git a/google-cloud-vision/pom.xml b/google-cloud-vision/pom.xml index 19cc5aa94876..24619d91533b 100644 --- a/google-cloud-vision/pom.xml +++ b/google-cloud-vision/pom.xml @@ -35,7 +35,7 @@ com.google.api.grpc proto-google-cloud-vision-v1 - 0.1.9 + 0.1.11 io.grpc @@ -69,7 +69,7 @@ com.google.api.grpc grpc-google-cloud-vision-v1 - 0.1.9 + 0.1.11 test diff --git a/pom.xml b/pom.xml index 3c8b4cdb5e96..9e76bdb8a9cb 100644 --- a/pom.xml +++ b/pom.xml @@ -133,7 +133,7 @@ 1.1.0 1.1.0 0.17.0 - 0.1.9 + 0.1.11 0.6.1 1.2.0 19.0 @@ -162,6 +162,7 @@ 0.17.3-alpha-SNAPSHOT 0.17.3-beta-SNAPSHOT 0.17.3-beta-SNAPSHOT + 0.17.3-alpha-SNAPSHOT 0.17.3-alpha-SNAPSHOT @@ -442,6 +443,18 @@ test-jar + + com.google.cloud + google-cloud-video-intelligence + ${videointelligence.version} + + + com.google.cloud + google-cloud-video-intelligence + ${videointelligence.version} + test-jar + + com.google.api api-common @@ -619,6 +632,7 @@ google-cloud-trace google-cloud-translate google-cloud-vision + google-cloud-video-intelligence