1// Copyright 2021 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Code generated by protoc-gen-go_gapic. DO NOT EDIT.
16
17package transcoder
18
19import (
20	"context"
21	"fmt"
22	"math"
23	"net/url"
24	"time"
25
26	"github.com/golang/protobuf/proto"
27	gax "github.com/googleapis/gax-go/v2"
28	"google.golang.org/api/iterator"
29	"google.golang.org/api/option"
30	"google.golang.org/api/option/internaloption"
31	gtransport "google.golang.org/api/transport/grpc"
32	transcoderpb "google.golang.org/genproto/googleapis/cloud/video/transcoder/v1beta1"
33	"google.golang.org/grpc"
34	"google.golang.org/grpc/metadata"
35)
36
37var newClientHook clientHook
38
39// CallOptions contains the retry settings for each method of Client.
40type CallOptions struct {
41	CreateJob         []gax.CallOption
42	ListJobs          []gax.CallOption
43	GetJob            []gax.CallOption
44	DeleteJob         []gax.CallOption
45	CreateJobTemplate []gax.CallOption
46	ListJobTemplates  []gax.CallOption
47	GetJobTemplate    []gax.CallOption
48	DeleteJobTemplate []gax.CallOption
49}
50
51func defaultClientOptions() []option.ClientOption {
52	return []option.ClientOption{
53		internaloption.WithDefaultEndpoint("transcoder.googleapis.com:443"),
54		internaloption.WithDefaultMTLSEndpoint("transcoder.mtls.googleapis.com:443"),
55		internaloption.WithDefaultAudience("https://transcoder.googleapis.com/"),
56		internaloption.WithDefaultScopes(DefaultAuthScopes()...),
57		option.WithGRPCDialOption(grpc.WithDisableServiceConfig()),
58		option.WithGRPCDialOption(grpc.WithDefaultCallOptions(
59			grpc.MaxCallRecvMsgSize(math.MaxInt32))),
60	}
61}
62
63func defaultCallOptions() *CallOptions {
64	return &CallOptions{
65		CreateJob:         []gax.CallOption{},
66		ListJobs:          []gax.CallOption{},
67		GetJob:            []gax.CallOption{},
68		DeleteJob:         []gax.CallOption{},
69		CreateJobTemplate: []gax.CallOption{},
70		ListJobTemplates:  []gax.CallOption{},
71		GetJobTemplate:    []gax.CallOption{},
72		DeleteJobTemplate: []gax.CallOption{},
73	}
74}
75
76// Client is a client for interacting with Transcoder API.
77//
78// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.
79type Client struct {
80	// Connection pool of gRPC connections to the service.
81	connPool gtransport.ConnPool
82
83	// flag to opt out of default deadlines via GOOGLE_API_GO_EXPERIMENTAL_DISABLE_DEFAULT_DEADLINE
84	disableDeadlines bool
85
86	// The gRPC API client.
87	client transcoderpb.TranscoderServiceClient
88
89	// The call options for this service.
90	CallOptions *CallOptions
91
92	// The x-goog-* metadata to be sent with each request.
93	xGoogMetadata metadata.MD
94}
95
96// NewClient creates a new transcoder service client.
97//
98// Using the Transcoder API, you can queue asynchronous jobs for transcoding
99// media into various output formats. Output formats may include different
100// streaming standards such as HTTP Live Streaming (HLS) and Dynamic Adaptive
101// Streaming over HTTP (DASH). You can also customize jobs using advanced
102// features such as Digital Rights Management (DRM), audio equalization, content
103// concatenation, and digital ad-stitch ready content generation.
104func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) {
105	clientOpts := defaultClientOptions()
106
107	if newClientHook != nil {
108		hookOpts, err := newClientHook(ctx, clientHookParams{})
109		if err != nil {
110			return nil, err
111		}
112		clientOpts = append(clientOpts, hookOpts...)
113	}
114
115	disableDeadlines, err := checkDisableDeadlines()
116	if err != nil {
117		return nil, err
118	}
119
120	connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...)
121	if err != nil {
122		return nil, err
123	}
124	c := &Client{
125		connPool:         connPool,
126		disableDeadlines: disableDeadlines,
127		CallOptions:      defaultCallOptions(),
128
129		client: transcoderpb.NewTranscoderServiceClient(connPool),
130	}
131	c.setGoogleClientInfo()
132
133	return c, nil
134}
135
136// Connection returns a connection to the API service.
137//
138// Deprecated.
139func (c *Client) Connection() *grpc.ClientConn {
140	return c.connPool.Conn()
141}
142
143// Close closes the connection to the API service. The user should invoke this when
144// the client is no longer required.
145func (c *Client) Close() error {
146	return c.connPool.Close()
147}
148
149// setGoogleClientInfo sets the name and version of the application in
150// the `x-goog-api-client` header passed on each request. Intended for
151// use by Google-written clients.
152func (c *Client) setGoogleClientInfo(keyval ...string) {
153	kv := append([]string{"gl-go", versionGo()}, keyval...)
154	kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version)
155	c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...))
156}
157
158// CreateJob creates a job in the specified region.
159func (c *Client) CreateJob(ctx context.Context, req *transcoderpb.CreateJobRequest, opts ...gax.CallOption) (*transcoderpb.Job, error) {
160	if _, ok := ctx.Deadline(); !ok && !c.disableDeadlines {
161		cctx, cancel := context.WithTimeout(ctx, 60000*time.Millisecond)
162		defer cancel()
163		ctx = cctx
164	}
165	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent())))
166	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
167	opts = append(c.CallOptions.CreateJob[0:len(c.CallOptions.CreateJob):len(c.CallOptions.CreateJob)], opts...)
168	var resp *transcoderpb.Job
169	err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
170		var err error
171		resp, err = c.client.CreateJob(ctx, req, settings.GRPC...)
172		return err
173	}, opts...)
174	if err != nil {
175		return nil, err
176	}
177	return resp, nil
178}
179
180// ListJobs lists jobs in the specified region.
181func (c *Client) ListJobs(ctx context.Context, req *transcoderpb.ListJobsRequest, opts ...gax.CallOption) *JobIterator {
182	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent())))
183	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
184	opts = append(c.CallOptions.ListJobs[0:len(c.CallOptions.ListJobs):len(c.CallOptions.ListJobs)], opts...)
185	it := &JobIterator{}
186	req = proto.Clone(req).(*transcoderpb.ListJobsRequest)
187	it.InternalFetch = func(pageSize int, pageToken string) ([]*transcoderpb.Job, string, error) {
188		var resp *transcoderpb.ListJobsResponse
189		req.PageToken = pageToken
190		if pageSize > math.MaxInt32 {
191			req.PageSize = math.MaxInt32
192		} else {
193			req.PageSize = int32(pageSize)
194		}
195		err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
196			var err error
197			resp, err = c.client.ListJobs(ctx, req, settings.GRPC...)
198			return err
199		}, opts...)
200		if err != nil {
201			return nil, "", err
202		}
203
204		it.Response = resp
205		return resp.GetJobs(), resp.GetNextPageToken(), nil
206	}
207	fetch := func(pageSize int, pageToken string) (string, error) {
208		items, nextPageToken, err := it.InternalFetch(pageSize, pageToken)
209		if err != nil {
210			return "", err
211		}
212		it.items = append(it.items, items...)
213		return nextPageToken, nil
214	}
215	it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)
216	it.pageInfo.MaxSize = int(req.GetPageSize())
217	it.pageInfo.Token = req.GetPageToken()
218	return it
219}
220
221// GetJob returns the job data.
222func (c *Client) GetJob(ctx context.Context, req *transcoderpb.GetJobRequest, opts ...gax.CallOption) (*transcoderpb.Job, error) {
223	if _, ok := ctx.Deadline(); !ok && !c.disableDeadlines {
224		cctx, cancel := context.WithTimeout(ctx, 60000*time.Millisecond)
225		defer cancel()
226		ctx = cctx
227	}
228	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName())))
229	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
230	opts = append(c.CallOptions.GetJob[0:len(c.CallOptions.GetJob):len(c.CallOptions.GetJob)], opts...)
231	var resp *transcoderpb.Job
232	err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
233		var err error
234		resp, err = c.client.GetJob(ctx, req, settings.GRPC...)
235		return err
236	}, opts...)
237	if err != nil {
238		return nil, err
239	}
240	return resp, nil
241}
242
243// DeleteJob deletes a job.
244func (c *Client) DeleteJob(ctx context.Context, req *transcoderpb.DeleteJobRequest, opts ...gax.CallOption) error {
245	if _, ok := ctx.Deadline(); !ok && !c.disableDeadlines {
246		cctx, cancel := context.WithTimeout(ctx, 60000*time.Millisecond)
247		defer cancel()
248		ctx = cctx
249	}
250	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName())))
251	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
252	opts = append(c.CallOptions.DeleteJob[0:len(c.CallOptions.DeleteJob):len(c.CallOptions.DeleteJob)], opts...)
253	err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
254		var err error
255		_, err = c.client.DeleteJob(ctx, req, settings.GRPC...)
256		return err
257	}, opts...)
258	return err
259}
260
261// CreateJobTemplate creates a job template in the specified region.
262func (c *Client) CreateJobTemplate(ctx context.Context, req *transcoderpb.CreateJobTemplateRequest, opts ...gax.CallOption) (*transcoderpb.JobTemplate, error) {
263	if _, ok := ctx.Deadline(); !ok && !c.disableDeadlines {
264		cctx, cancel := context.WithTimeout(ctx, 60000*time.Millisecond)
265		defer cancel()
266		ctx = cctx
267	}
268	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent())))
269	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
270	opts = append(c.CallOptions.CreateJobTemplate[0:len(c.CallOptions.CreateJobTemplate):len(c.CallOptions.CreateJobTemplate)], opts...)
271	var resp *transcoderpb.JobTemplate
272	err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
273		var err error
274		resp, err = c.client.CreateJobTemplate(ctx, req, settings.GRPC...)
275		return err
276	}, opts...)
277	if err != nil {
278		return nil, err
279	}
280	return resp, nil
281}
282
283// ListJobTemplates lists job templates in the specified region.
284func (c *Client) ListJobTemplates(ctx context.Context, req *transcoderpb.ListJobTemplatesRequest, opts ...gax.CallOption) *JobTemplateIterator {
285	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent())))
286	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
287	opts = append(c.CallOptions.ListJobTemplates[0:len(c.CallOptions.ListJobTemplates):len(c.CallOptions.ListJobTemplates)], opts...)
288	it := &JobTemplateIterator{}
289	req = proto.Clone(req).(*transcoderpb.ListJobTemplatesRequest)
290	it.InternalFetch = func(pageSize int, pageToken string) ([]*transcoderpb.JobTemplate, string, error) {
291		var resp *transcoderpb.ListJobTemplatesResponse
292		req.PageToken = pageToken
293		if pageSize > math.MaxInt32 {
294			req.PageSize = math.MaxInt32
295		} else {
296			req.PageSize = int32(pageSize)
297		}
298		err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
299			var err error
300			resp, err = c.client.ListJobTemplates(ctx, req, settings.GRPC...)
301			return err
302		}, opts...)
303		if err != nil {
304			return nil, "", err
305		}
306
307		it.Response = resp
308		return resp.GetJobTemplates(), resp.GetNextPageToken(), nil
309	}
310	fetch := func(pageSize int, pageToken string) (string, error) {
311		items, nextPageToken, err := it.InternalFetch(pageSize, pageToken)
312		if err != nil {
313			return "", err
314		}
315		it.items = append(it.items, items...)
316		return nextPageToken, nil
317	}
318	it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)
319	it.pageInfo.MaxSize = int(req.GetPageSize())
320	it.pageInfo.Token = req.GetPageToken()
321	return it
322}
323
324// GetJobTemplate returns the job template data.
325func (c *Client) GetJobTemplate(ctx context.Context, req *transcoderpb.GetJobTemplateRequest, opts ...gax.CallOption) (*transcoderpb.JobTemplate, error) {
326	if _, ok := ctx.Deadline(); !ok && !c.disableDeadlines {
327		cctx, cancel := context.WithTimeout(ctx, 60000*time.Millisecond)
328		defer cancel()
329		ctx = cctx
330	}
331	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName())))
332	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
333	opts = append(c.CallOptions.GetJobTemplate[0:len(c.CallOptions.GetJobTemplate):len(c.CallOptions.GetJobTemplate)], opts...)
334	var resp *transcoderpb.JobTemplate
335	err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
336		var err error
337		resp, err = c.client.GetJobTemplate(ctx, req, settings.GRPC...)
338		return err
339	}, opts...)
340	if err != nil {
341		return nil, err
342	}
343	return resp, nil
344}
345
346// DeleteJobTemplate deletes a job template.
347func (c *Client) DeleteJobTemplate(ctx context.Context, req *transcoderpb.DeleteJobTemplateRequest, opts ...gax.CallOption) error {
348	if _, ok := ctx.Deadline(); !ok && !c.disableDeadlines {
349		cctx, cancel := context.WithTimeout(ctx, 60000*time.Millisecond)
350		defer cancel()
351		ctx = cctx
352	}
353	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName())))
354	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
355	opts = append(c.CallOptions.DeleteJobTemplate[0:len(c.CallOptions.DeleteJobTemplate):len(c.CallOptions.DeleteJobTemplate)], opts...)
356	err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
357		var err error
358		_, err = c.client.DeleteJobTemplate(ctx, req, settings.GRPC...)
359		return err
360	}, opts...)
361	return err
362}
363
364// JobIterator manages a stream of *transcoderpb.Job.
365type JobIterator struct {
366	items    []*transcoderpb.Job
367	pageInfo *iterator.PageInfo
368	nextFunc func() error
369
370	// Response is the raw response for the current page.
371	// It must be cast to the RPC response type.
372	// Calling Next() or InternalFetch() updates this value.
373	Response interface{}
374
375	// InternalFetch is for use by the Google Cloud Libraries only.
376	// It is not part of the stable interface of this package.
377	//
378	// InternalFetch returns results from a single call to the underlying RPC.
379	// The number of results is no greater than pageSize.
380	// If there are no more results, nextPageToken is empty and err is nil.
381	InternalFetch func(pageSize int, pageToken string) (results []*transcoderpb.Job, nextPageToken string, err error)
382}
383
384// PageInfo supports pagination. See the google.golang.org/api/iterator package for details.
385func (it *JobIterator) PageInfo() *iterator.PageInfo {
386	return it.pageInfo
387}
388
389// Next returns the next result. Its second return value is iterator.Done if there are no more
390// results. Once Next returns Done, all subsequent calls will return Done.
391func (it *JobIterator) Next() (*transcoderpb.Job, error) {
392	var item *transcoderpb.Job
393	if err := it.nextFunc(); err != nil {
394		return item, err
395	}
396	item = it.items[0]
397	it.items = it.items[1:]
398	return item, nil
399}
400
401func (it *JobIterator) bufLen() int {
402	return len(it.items)
403}
404
405func (it *JobIterator) takeBuf() interface{} {
406	b := it.items
407	it.items = nil
408	return b
409}
410
411// JobTemplateIterator manages a stream of *transcoderpb.JobTemplate.
412type JobTemplateIterator struct {
413	items    []*transcoderpb.JobTemplate
414	pageInfo *iterator.PageInfo
415	nextFunc func() error
416
417	// Response is the raw response for the current page.
418	// It must be cast to the RPC response type.
419	// Calling Next() or InternalFetch() updates this value.
420	Response interface{}
421
422	// InternalFetch is for use by the Google Cloud Libraries only.
423	// It is not part of the stable interface of this package.
424	//
425	// InternalFetch returns results from a single call to the underlying RPC.
426	// The number of results is no greater than pageSize.
427	// If there are no more results, nextPageToken is empty and err is nil.
428	InternalFetch func(pageSize int, pageToken string) (results []*transcoderpb.JobTemplate, nextPageToken string, err error)
429}
430
431// PageInfo supports pagination. See the google.golang.org/api/iterator package for details.
432func (it *JobTemplateIterator) PageInfo() *iterator.PageInfo {
433	return it.pageInfo
434}
435
436// Next returns the next result. Its second return value is iterator.Done if there are no more
437// results. Once Next returns Done, all subsequent calls will return Done.
438func (it *JobTemplateIterator) Next() (*transcoderpb.JobTemplate, error) {
439	var item *transcoderpb.JobTemplate
440	if err := it.nextFunc(); err != nil {
441		return item, err
442	}
443	item = it.items[0]
444	it.items = it.items[1:]
445	return item, nil
446}
447
448func (it *JobTemplateIterator) bufLen() int {
449	return len(it.items)
450}
451
452func (it *JobTemplateIterator) takeBuf() interface{} {
453	b := it.items
454	it.items = nil
455	return b
456}
457