mirror of
https://github.com/kevin-DL/services.git
synced 2026-01-11 19:04:35 +00:00
Gifs API (#223)
* gifs service * Commit from GitHub Actions (Publish APIs & Clients) Co-authored-by: domwong <domwong@users.noreply.github.com>
This commit is contained in:
135
clients/go/gifs/gifs.go
Executable file
135
clients/go/gifs/gifs.go
Executable file
@@ -0,0 +1,135 @@
|
|||||||
|
package gifs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/m3o/m3o-go/client"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewGifsService(token string) *GifsService {
|
||||||
|
return &GifsService{
|
||||||
|
client: client.NewClient(&client.Options{
|
||||||
|
Token: token,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type GifsService struct {
|
||||||
|
client *client.Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search for a gif
|
||||||
|
func (t *GifsService) Search(request *SearchRequest) (*SearchResponse, error) {
|
||||||
|
rsp := &SearchResponse{}
|
||||||
|
return rsp, t.client.Call("gifs", "Search", request, rsp)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Gif struct {
|
||||||
|
// URL used for embedding the GIF
|
||||||
|
EmbedUrl string `json:"embedUrl"`
|
||||||
|
// The ID of the GIF
|
||||||
|
Id string `json:"id"`
|
||||||
|
// The different formats available for this GIF
|
||||||
|
Images *ImageFormats `json:"images"`
|
||||||
|
// The content rating for the GIF
|
||||||
|
Rating string `json:"rating"`
|
||||||
|
// A short URL for this GIF
|
||||||
|
ShortUrl string `json:"shortUrl"`
|
||||||
|
// The slug used in the GIF's URL
|
||||||
|
Slug string `json:"slug"`
|
||||||
|
// The page on which this GIF was found
|
||||||
|
Source string `json:"source"`
|
||||||
|
// The title for this GIF
|
||||||
|
Title string `json:"title"`
|
||||||
|
// The URL for this GIF
|
||||||
|
Url string `json:"url"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ImageFormat struct {
|
||||||
|
// height
|
||||||
|
Height int32 `json:"height"`
|
||||||
|
// size of the MP4 version
|
||||||
|
Mp4size int32 `json:"mp4size"`
|
||||||
|
// URL to an MP4 version of the gif
|
||||||
|
Mp4url string `json:"mp4url"`
|
||||||
|
// size in bytes
|
||||||
|
Size int32 `json:"size"`
|
||||||
|
// URL of the gif
|
||||||
|
Url string `json:"url"`
|
||||||
|
// size of the webp version
|
||||||
|
WebpSize int32 `json:"webpSize"`
|
||||||
|
// URL to a webp version of the gif
|
||||||
|
WebpUrl string `json:"webpUrl"`
|
||||||
|
// width
|
||||||
|
Width int32 `json:"width"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ImageFormats struct {
|
||||||
|
// A downsized version of the GIF < 2MB
|
||||||
|
Downsized *ImageFormat `json:"downsized"`
|
||||||
|
// A downsized version of the GIF < 8MB
|
||||||
|
DownsizedLarge *ImageFormat `json:"downsizedLarge"`
|
||||||
|
// A downsized version of the GIF < 5MB
|
||||||
|
DownsizedMedium *ImageFormat `json:"downsizedMedium"`
|
||||||
|
// A downsized version of the GIF < 200kb
|
||||||
|
DownsizedSmall *ImageFormat `json:"downsizedSmall"`
|
||||||
|
// Static image of the downsized version of the GIF
|
||||||
|
DownsizedStill *ImageFormat `json:"downsizedStill"`
|
||||||
|
// Version of the GIF with fixed height of 200 pixels. Good for mobile use
|
||||||
|
FixedHeight *ImageFormat `json:"fixedHeight"`
|
||||||
|
// Version of the GIF with fixed height of 200 pixels and number of frames reduced to 6
|
||||||
|
FixedHeightDownsampled *ImageFormat `json:"fixedHeightDownsampled"`
|
||||||
|
// Version of the GIF with fixed height of 100 pixels. Good for mobile keyboards
|
||||||
|
FixedHeightSmall *ImageFormat `json:"fixedHeightSmall"`
|
||||||
|
// Static image of the GIF with fixed height of 100 pixels
|
||||||
|
FixedHeightSmallStill *ImageFormat `json:"fixedHeightSmallStill"`
|
||||||
|
// Static image of the GIF with fixed height of 200 pixels
|
||||||
|
FixedHeightStill *ImageFormat `json:"fixedHeightStill"`
|
||||||
|
// Version of the GIF with fixed width of 200 pixels. Good for mobile use
|
||||||
|
FixedWidth *ImageFormat `json:"fixedWidth"`
|
||||||
|
// Version of the GIF with fixed width of 200 pixels and number of frames reduced to 6
|
||||||
|
FixedWidthDownsampled *ImageFormat `json:"fixedWidthDownsampled"`
|
||||||
|
// Version of the GIF with fixed width of 100 pixels. Good for mobile keyboards
|
||||||
|
FixedWidthSmall *ImageFormat `json:"fixedWidthSmall"`
|
||||||
|
// Static image of the GIF with fixed width of 100 pixels
|
||||||
|
FixedWidthSmallStill *ImageFormat `json:"fixedWidthSmallStill"`
|
||||||
|
// Static image of the GIF with fixed width of 200 pixels
|
||||||
|
FixedWidthStill *ImageFormat `json:"fixedWidthStill"`
|
||||||
|
// 15 second version of the GIF looping
|
||||||
|
Looping *ImageFormat `json:"looping"`
|
||||||
|
// The original GIF. Good for desktop use
|
||||||
|
Original *ImageFormat `json:"original"`
|
||||||
|
// Static image of the original version of the GIF
|
||||||
|
OriginalStill *ImageFormat `json:"originalStill"`
|
||||||
|
// mp4 version of the GIF <50kb displaying first 1-2 secs
|
||||||
|
Preview *ImageFormat `json:"preview"`
|
||||||
|
// Version of the GIF <50kb displaying first 1-2 secs
|
||||||
|
PreviewGif *ImageFormat `json:"previewGif"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Pagination struct {
|
||||||
|
// total number returned in this response
|
||||||
|
Count int32 `json:"count"`
|
||||||
|
// position in pagination
|
||||||
|
Offset int32 `json:"offset"`
|
||||||
|
// total number of results available
|
||||||
|
TotalCount int32 `json:"totalCount"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SearchRequest struct {
|
||||||
|
// ISO 2 letter language code for regional content
|
||||||
|
Lang string `json:"lang"`
|
||||||
|
// Max number of gifs to return. Defaults to 25
|
||||||
|
Limit int32 `json:"limit"`
|
||||||
|
// The start position of results (used with pagination)
|
||||||
|
Offset int32 `json:"offset"`
|
||||||
|
// The search term
|
||||||
|
Query string `json:"query"`
|
||||||
|
// Apply age related content filter. "g", "pg", "pg-13", or "r". Defaults to "g"
|
||||||
|
Rating string `json:"rating"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SearchResponse struct {
|
||||||
|
// list of results
|
||||||
|
Data []Gif `json:"data"`
|
||||||
|
// information on pagination
|
||||||
|
Pagination *Pagination `json:"pagination"`
|
||||||
|
}
|
||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/micro/services/clients/go/file"
|
"github.com/micro/services/clients/go/file"
|
||||||
"github.com/micro/services/clients/go/forex"
|
"github.com/micro/services/clients/go/forex"
|
||||||
"github.com/micro/services/clients/go/geocoding"
|
"github.com/micro/services/clients/go/geocoding"
|
||||||
|
"github.com/micro/services/clients/go/gifs"
|
||||||
"github.com/micro/services/clients/go/helloworld"
|
"github.com/micro/services/clients/go/helloworld"
|
||||||
"github.com/micro/services/clients/go/holidays"
|
"github.com/micro/services/clients/go/holidays"
|
||||||
"github.com/micro/services/clients/go/id"
|
"github.com/micro/services/clients/go/id"
|
||||||
@@ -57,6 +58,7 @@ func NewClient(token string) *Client {
|
|||||||
FileService: file.NewFileService(token),
|
FileService: file.NewFileService(token),
|
||||||
ForexService: forex.NewForexService(token),
|
ForexService: forex.NewForexService(token),
|
||||||
GeocodingService: geocoding.NewGeocodingService(token),
|
GeocodingService: geocoding.NewGeocodingService(token),
|
||||||
|
GifsService: gifs.NewGifsService(token),
|
||||||
HelloworldService: helloworld.NewHelloworldService(token),
|
HelloworldService: helloworld.NewHelloworldService(token),
|
||||||
HolidaysService: holidays.NewHolidaysService(token),
|
HolidaysService: holidays.NewHolidaysService(token),
|
||||||
IdService: id.NewIdService(token),
|
IdService: id.NewIdService(token),
|
||||||
@@ -101,6 +103,7 @@ type Client struct {
|
|||||||
FileService *file.FileService
|
FileService *file.FileService
|
||||||
ForexService *forex.ForexService
|
ForexService *forex.ForexService
|
||||||
GeocodingService *geocoding.GeocodingService
|
GeocodingService *geocoding.GeocodingService
|
||||||
|
GifsService *gifs.GifsService
|
||||||
HelloworldService *helloworld.HelloworldService
|
HelloworldService *helloworld.HelloworldService
|
||||||
HolidaysService *holidays.HolidaysService
|
HolidaysService *holidays.HolidaysService
|
||||||
IdService *id.IdService
|
IdService *id.IdService
|
||||||
|
|||||||
129
clients/ts/gifs/index.ts
Executable file
129
clients/ts/gifs/index.ts
Executable file
@@ -0,0 +1,129 @@
|
|||||||
|
import * as m3o from "@m3o/m3o-node";
|
||||||
|
|
||||||
|
export class GifsService {
|
||||||
|
private client: m3o.Client;
|
||||||
|
|
||||||
|
constructor(token: string) {
|
||||||
|
this.client = new m3o.Client({ token: token });
|
||||||
|
}
|
||||||
|
// Search for a gif
|
||||||
|
search(request: SearchRequest): Promise<SearchResponse> {
|
||||||
|
return this.client.call(
|
||||||
|
"gifs",
|
||||||
|
"Search",
|
||||||
|
request
|
||||||
|
) as Promise<SearchResponse>;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Gif {
|
||||||
|
// URL used for embedding the GIF
|
||||||
|
embedUrl?: string;
|
||||||
|
// The ID of the GIF
|
||||||
|
id?: string;
|
||||||
|
// The different formats available for this GIF
|
||||||
|
images?: ImageFormats;
|
||||||
|
// The content rating for the GIF
|
||||||
|
rating?: string;
|
||||||
|
// A short URL for this GIF
|
||||||
|
shortUrl?: string;
|
||||||
|
// The slug used in the GIF's URL
|
||||||
|
slug?: string;
|
||||||
|
// The page on which this GIF was found
|
||||||
|
source?: string;
|
||||||
|
// The title for this GIF
|
||||||
|
title?: string;
|
||||||
|
// The URL for this GIF
|
||||||
|
url?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ImageFormat {
|
||||||
|
// height
|
||||||
|
height?: number;
|
||||||
|
// size of the MP4 version
|
||||||
|
mp4Size?: number;
|
||||||
|
// URL to an MP4 version of the gif
|
||||||
|
mp4Url?: string;
|
||||||
|
// size in bytes
|
||||||
|
size?: number;
|
||||||
|
// URL of the gif
|
||||||
|
url?: string;
|
||||||
|
// size of the webp version
|
||||||
|
webpSize?: number;
|
||||||
|
// URL to a webp version of the gif
|
||||||
|
webpUrl?: string;
|
||||||
|
// width
|
||||||
|
width?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ImageFormats {
|
||||||
|
// A downsized version of the GIF < 2MB
|
||||||
|
downsized?: ImageFormat;
|
||||||
|
// A downsized version of the GIF < 8MB
|
||||||
|
downsizedLarge?: ImageFormat;
|
||||||
|
// A downsized version of the GIF < 5MB
|
||||||
|
downsizedMedium?: ImageFormat;
|
||||||
|
// A downsized version of the GIF < 200kb
|
||||||
|
downsizedSmall?: ImageFormat;
|
||||||
|
// Static image of the downsized version of the GIF
|
||||||
|
downsizedStill?: ImageFormat;
|
||||||
|
// Version of the GIF with fixed height of 200 pixels. Good for mobile use
|
||||||
|
fixedHeight?: ImageFormat;
|
||||||
|
// Version of the GIF with fixed height of 200 pixels and number of frames reduced to 6
|
||||||
|
fixedHeightDownsampled?: ImageFormat;
|
||||||
|
// Version of the GIF with fixed height of 100 pixels. Good for mobile keyboards
|
||||||
|
fixedHeightSmall?: ImageFormat;
|
||||||
|
// Static image of the GIF with fixed height of 100 pixels
|
||||||
|
fixedHeightSmallStill?: ImageFormat;
|
||||||
|
// Static image of the GIF with fixed height of 200 pixels
|
||||||
|
fixedHeightStill?: ImageFormat;
|
||||||
|
// Version of the GIF with fixed width of 200 pixels. Good for mobile use
|
||||||
|
fixedWidth?: ImageFormat;
|
||||||
|
// Version of the GIF with fixed width of 200 pixels and number of frames reduced to 6
|
||||||
|
fixedWidthDownsampled?: ImageFormat;
|
||||||
|
// Version of the GIF with fixed width of 100 pixels. Good for mobile keyboards
|
||||||
|
fixedWidthSmall?: ImageFormat;
|
||||||
|
// Static image of the GIF with fixed width of 100 pixels
|
||||||
|
fixedWidthSmallStill?: ImageFormat;
|
||||||
|
// Static image of the GIF with fixed width of 200 pixels
|
||||||
|
fixedWidthStill?: ImageFormat;
|
||||||
|
// 15 second version of the GIF looping
|
||||||
|
looping?: ImageFormat;
|
||||||
|
// The original GIF. Good for desktop use
|
||||||
|
original?: ImageFormat;
|
||||||
|
// Static image of the original version of the GIF
|
||||||
|
originalStill?: ImageFormat;
|
||||||
|
// mp4 version of the GIF <50kb displaying first 1-2 secs
|
||||||
|
preview?: ImageFormat;
|
||||||
|
// Version of the GIF <50kb displaying first 1-2 secs
|
||||||
|
previewGif?: ImageFormat;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Pagination {
|
||||||
|
// total number returned in this response
|
||||||
|
count?: number;
|
||||||
|
// position in pagination
|
||||||
|
offset?: number;
|
||||||
|
// total number of results available
|
||||||
|
totalCount?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SearchRequest {
|
||||||
|
// ISO 2 letter language code for regional content
|
||||||
|
lang?: string;
|
||||||
|
// Max number of gifs to return. Defaults to 25
|
||||||
|
limit?: number;
|
||||||
|
// The start position of results (used with pagination)
|
||||||
|
offset?: number;
|
||||||
|
// The search term
|
||||||
|
query?: string;
|
||||||
|
// Apply age related content filter. "g", "pg", "pg-13", or "r". Defaults to "g"
|
||||||
|
rating?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SearchResponse {
|
||||||
|
// list of results
|
||||||
|
data?: Gif[];
|
||||||
|
// information on pagination
|
||||||
|
pagination?: { [key: string]: any };
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@ import * as evchargers from "./evchargers";
|
|||||||
import * as file from "./file";
|
import * as file from "./file";
|
||||||
import * as forex from "./forex";
|
import * as forex from "./forex";
|
||||||
import * as geocoding from "./geocoding";
|
import * as geocoding from "./geocoding";
|
||||||
|
import * as gifs from "./gifs";
|
||||||
import * as helloworld from "./helloworld";
|
import * as helloworld from "./helloworld";
|
||||||
import * as holidays from "./holidays";
|
import * as holidays from "./holidays";
|
||||||
import * as id from "./id";
|
import * as id from "./id";
|
||||||
@@ -51,6 +52,7 @@ export class Client {
|
|||||||
this.fileService = new file.FileService(token);
|
this.fileService = new file.FileService(token);
|
||||||
this.forexService = new forex.ForexService(token);
|
this.forexService = new forex.ForexService(token);
|
||||||
this.geocodingService = new geocoding.GeocodingService(token);
|
this.geocodingService = new geocoding.GeocodingService(token);
|
||||||
|
this.gifsService = new gifs.GifsService(token);
|
||||||
this.helloworldService = new helloworld.HelloworldService(token);
|
this.helloworldService = new helloworld.HelloworldService(token);
|
||||||
this.holidaysService = new holidays.HolidaysService(token);
|
this.holidaysService = new holidays.HolidaysService(token);
|
||||||
this.idService = new id.IdService(token);
|
this.idService = new id.IdService(token);
|
||||||
@@ -91,6 +93,7 @@ export class Client {
|
|||||||
fileService: file.FileService;
|
fileService: file.FileService;
|
||||||
forexService: forex.ForexService;
|
forexService: forex.ForexService;
|
||||||
geocodingService: geocoding.GeocodingService;
|
geocodingService: geocoding.GeocodingService;
|
||||||
|
gifsService: gifs.GifsService;
|
||||||
helloworldService: helloworld.HelloworldService;
|
helloworldService: helloworld.HelloworldService;
|
||||||
holidaysService: holidays.HolidaysService;
|
holidaysService: holidays.HolidaysService;
|
||||||
idService: id.IdService;
|
idService: id.IdService;
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
"./file": "./dist/file/index.js",
|
"./file": "./dist/file/index.js",
|
||||||
"./forex": "./dist/forex/index.js",
|
"./forex": "./dist/forex/index.js",
|
||||||
"./geocoding": "./dist/geocoding/index.js",
|
"./geocoding": "./dist/geocoding/index.js",
|
||||||
|
"./gifs": "./dist/gifs/index.js",
|
||||||
"./helloworld": "./dist/helloworld/index.js",
|
"./helloworld": "./dist/helloworld/index.js",
|
||||||
"./holidays": "./dist/holidays/index.js",
|
"./holidays": "./dist/holidays/index.js",
|
||||||
"./id": "./dist/id/index.js",
|
"./id": "./dist/id/index.js",
|
||||||
@@ -64,5 +65,5 @@
|
|||||||
},
|
},
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"types": "dist/index.d.ts",
|
"types": "dist/index.d.ts",
|
||||||
"version": "1.0.539"
|
"version": "1.0.540"
|
||||||
}
|
}
|
||||||
@@ -11,8 +11,8 @@ func UpdateArecord() {
|
|||||||
dbService := db.NewDbService(os.Getenv("MICRO_API_TOKEN"))
|
dbService := db.NewDbService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
rsp, err := dbService.Update(&db.UpdateRequest{
|
rsp, err := dbService.Update(&db.UpdateRequest{
|
||||||
Record: map[string]interface{}{
|
Record: map[string]interface{}{
|
||||||
"id": "1",
|
|
||||||
"age": 43,
|
"age": 43,
|
||||||
|
"id": "1",
|
||||||
},
|
},
|
||||||
Table: "users",
|
Table: "users",
|
||||||
})
|
})
|
||||||
|
|||||||
7
examples/gifs/search/curl/search.sh
Executable file
7
examples/gifs/search/curl/search.sh
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
curl "https://api.m3o.com/v1/gifs/Search" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
|
-d '{
|
||||||
|
"limit": 2,
|
||||||
|
"query": "dogs"
|
||||||
|
}'
|
||||||
17
examples/gifs/search/go/search.go
Executable file
17
examples/gifs/search/go/search.go
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/gifs"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Search for a gif
|
||||||
|
func Search() {
|
||||||
|
gifsService := gifs.NewGifsService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := gifsService.Search(&gifs.SearchRequest{
|
||||||
|
Limit: 2,
|
||||||
|
Query: "dogs",
|
||||||
|
})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
13
examples/gifs/search/node/search.js
Executable file
13
examples/gifs/search/node/search.js
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
import * as gifs from "m3o/gifs";
|
||||||
|
|
||||||
|
// Search for a gif
|
||||||
|
async function Search() {
|
||||||
|
let gifsService = new gifs.GifsService(process.env.MICRO_API_TOKEN);
|
||||||
|
let rsp = await gifsService.search({
|
||||||
|
limit: 2,
|
||||||
|
query: "dogs",
|
||||||
|
});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await Search();
|
||||||
2
gifs/.gitignore
vendored
Normal file
2
gifs/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
gifs
|
||||||
3
gifs/Dockerfile
Normal file
3
gifs/Dockerfile
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
FROM alpine
|
||||||
|
ADD gifs /gifs
|
||||||
|
ENTRYPOINT [ "/gifs" ]
|
||||||
28
gifs/Makefile
Normal file
28
gifs/Makefile
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
GOPATH:=$(shell go env GOPATH)
|
||||||
|
.PHONY: init
|
||||||
|
init:
|
||||||
|
go get -u github.com/golang/protobuf/proto
|
||||||
|
go get -u github.com/golang/protobuf/protoc-gen-go
|
||||||
|
go get github.com/micro/micro/v3/cmd/protoc-gen-micro
|
||||||
|
go get github.com/micro/micro/v3/cmd/protoc-gen-openapi
|
||||||
|
|
||||||
|
.PHONY: api
|
||||||
|
api:
|
||||||
|
protoc --openapi_out=. --proto_path=. proto/gifs.proto
|
||||||
|
|
||||||
|
.PHONY: proto
|
||||||
|
proto:
|
||||||
|
protoc --proto_path=. --micro_out=. --go_out=:. proto/gifs.proto
|
||||||
|
|
||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
go build -o gifs *.go
|
||||||
|
|
||||||
|
.PHONY: test
|
||||||
|
test:
|
||||||
|
go test -v ./... -cover
|
||||||
|
|
||||||
|
.PHONY: docker
|
||||||
|
docker:
|
||||||
|
docker build . -t gifs:latest
|
||||||
7
gifs/README.md
Normal file
7
gifs/README.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Quick and simple GIF search
|
||||||
|
|
||||||
|
# Gifs Service
|
||||||
|
|
||||||
|
Add gifs to your project with keyword search and results in multiple sizes and formats.
|
||||||
|
|
||||||
|
Powered by [GIPHY](https://giphy.com).
|
||||||
447
gifs/examples.json
Normal file
447
gifs/examples.json
Normal file
@@ -0,0 +1,447 @@
|
|||||||
|
{
|
||||||
|
"search": [
|
||||||
|
{
|
||||||
|
"title": "Search",
|
||||||
|
"description": "Search for gifs",
|
||||||
|
"run_check": false,
|
||||||
|
"request": {
|
||||||
|
"query": "dogs",
|
||||||
|
"limit": 2
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"id": "gzBwhbjfjdZzIaO9En",
|
||||||
|
"slug": "studiosoriginals-gzBwhbjfjdZzIaO9En",
|
||||||
|
"url": "https://giphy.com/gifs/studiosoriginals-gzBwhbjfjdZzIaO9En",
|
||||||
|
"short_url": "https://gph.is/g/aKQ5Kr6",
|
||||||
|
"embed_url": "https://giphy.com/embed/gzBwhbjfjdZzIaO9En",
|
||||||
|
"source": "",
|
||||||
|
"rating": "g",
|
||||||
|
"title": "Miss You Reaction GIF by GIPHY Studios Originals",
|
||||||
|
"images": {
|
||||||
|
"original": {
|
||||||
|
"height": 480,
|
||||||
|
"width": 338,
|
||||||
|
"size": 726274,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/giphy.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 541901,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 337906
|
||||||
|
},
|
||||||
|
"downsized": {
|
||||||
|
"height": 480,
|
||||||
|
"width": 338,
|
||||||
|
"size": 726274,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/giphy.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"fixed_height": {
|
||||||
|
"height": 200,
|
||||||
|
"width": 141,
|
||||||
|
"size": 157088,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/200.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=200.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 89657,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 91512
|
||||||
|
},
|
||||||
|
"fixed_height_still": {
|
||||||
|
"height": 200,
|
||||||
|
"width": 141,
|
||||||
|
"size": 12751,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/200_s.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=200_s.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"fixed_height_downsampled": {
|
||||||
|
"height": 200,
|
||||||
|
"width": 141,
|
||||||
|
"size": 68558,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/200_d.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=200_d.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 45208
|
||||||
|
},
|
||||||
|
"fixed_width": {
|
||||||
|
"height": 284,
|
||||||
|
"width": 200,
|
||||||
|
"size": 263316,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/200w.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=200w.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 156878,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 155314
|
||||||
|
},
|
||||||
|
"fixed_width_still": {
|
||||||
|
"height": 284,
|
||||||
|
"width": 200,
|
||||||
|
"size": 16413,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/200w_s.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=200w_s.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"fixed_width_downsampled": {
|
||||||
|
"height": 284,
|
||||||
|
"width": 200,
|
||||||
|
"size": 120572,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/200w_d.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=200w_d.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 79232
|
||||||
|
},
|
||||||
|
"fixed_height_small": {
|
||||||
|
"height": 100,
|
||||||
|
"width": 71,
|
||||||
|
"size": 52486,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/100.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=100.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 29938,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 31072
|
||||||
|
},
|
||||||
|
"fixed_height_small_still": {
|
||||||
|
"height": 100,
|
||||||
|
"width": 71,
|
||||||
|
"size": 4102,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/100_s.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=100_s.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"fixed_width_small": {
|
||||||
|
"height": 142,
|
||||||
|
"width": 100,
|
||||||
|
"size": 91804,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/100w.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=100w.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 50386,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 54632
|
||||||
|
},
|
||||||
|
"fixed_width_small_still": {
|
||||||
|
"height": 142,
|
||||||
|
"width": 100,
|
||||||
|
"size": 6503,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/100w_s.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=100w_s.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"downsized_still": {
|
||||||
|
"height": 480,
|
||||||
|
"width": 338,
|
||||||
|
"size": 726274,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/giphy_s.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy_s.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"downsized_large": {
|
||||||
|
"height": 480,
|
||||||
|
"width": 338,
|
||||||
|
"size": 726274,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/giphy.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"downsized_medium": {
|
||||||
|
"height": 480,
|
||||||
|
"width": 338,
|
||||||
|
"size": 726274,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/giphy.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"downsized_small": {
|
||||||
|
"height": 356,
|
||||||
|
"width": 250,
|
||||||
|
"size": 0,
|
||||||
|
"url": "",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 150061,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"original_still": {
|
||||||
|
"height": 480,
|
||||||
|
"width": 338,
|
||||||
|
"size": 58197,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/giphy_s.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy_s.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"looping": {
|
||||||
|
"height": 0,
|
||||||
|
"width": 0,
|
||||||
|
"size": 0,
|
||||||
|
"url": "",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 3811719,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"preview": {
|
||||||
|
"height": 150,
|
||||||
|
"width": 105,
|
||||||
|
"size": 0,
|
||||||
|
"url": "",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 41991,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"preview_gif": {
|
||||||
|
"height": 87,
|
||||||
|
"width": 61,
|
||||||
|
"size": 49669,
|
||||||
|
"url": "https://media2.giphy.com/media/gzBwhbjfjdZzIaO9En/giphy-preview.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy-preview.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cLcxtL1z8t8oo",
|
||||||
|
"slug": "jump-training-rope-cLcxtL1z8t8oo",
|
||||||
|
"url": "https://giphy.com/gifs/jump-training-rope-cLcxtL1z8t8oo",
|
||||||
|
"short_url": "http://gph.is/1TEeoGs",
|
||||||
|
"embed_url": "https://giphy.com/embed/cLcxtL1z8t8oo",
|
||||||
|
"source": "https://www.reddit.com/r/gifs/comments/4itv7w/dogs_rope_jump_training_in_asia/",
|
||||||
|
"rating": "g",
|
||||||
|
"title": "Jump Dogs GIF",
|
||||||
|
"images": {
|
||||||
|
"original": {
|
||||||
|
"height": 352,
|
||||||
|
"width": 300,
|
||||||
|
"size": 3575754,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/giphy.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 1968715,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 1207266
|
||||||
|
},
|
||||||
|
"downsized": {
|
||||||
|
"height": 281,
|
||||||
|
"width": 240,
|
||||||
|
"size": 1475702,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/giphy-downsized.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy-downsized.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"fixed_height": {
|
||||||
|
"height": 200,
|
||||||
|
"width": 170,
|
||||||
|
"size": 923165,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/200.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=200.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 245562,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 377422
|
||||||
|
},
|
||||||
|
"fixed_height_still": {
|
||||||
|
"height": 200,
|
||||||
|
"width": 170,
|
||||||
|
"size": 16606,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/200_s.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=200_s.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"fixed_height_downsampled": {
|
||||||
|
"height": 200,
|
||||||
|
"width": 170,
|
||||||
|
"size": 112472,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/200_d.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=200_d.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 64758
|
||||||
|
},
|
||||||
|
"fixed_width": {
|
||||||
|
"height": 235,
|
||||||
|
"width": 200,
|
||||||
|
"size": 1213931,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/200w.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=200w.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 315433,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 483128
|
||||||
|
},
|
||||||
|
"fixed_width_still": {
|
||||||
|
"height": 235,
|
||||||
|
"width": 200,
|
||||||
|
"size": 21560,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/200w_s.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=200w_s.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"fixed_width_downsampled": {
|
||||||
|
"height": 235,
|
||||||
|
"width": 200,
|
||||||
|
"size": 147663,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/200w_d.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=200w_d.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 84616
|
||||||
|
},
|
||||||
|
"fixed_height_small": {
|
||||||
|
"height": 100,
|
||||||
|
"width": 85,
|
||||||
|
"size": 292401,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/100.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=100.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 90135,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 134976
|
||||||
|
},
|
||||||
|
"fixed_height_small_still": {
|
||||||
|
"height": 100,
|
||||||
|
"width": 85,
|
||||||
|
"size": 5747,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/100_s.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=100_s.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"fixed_width_small": {
|
||||||
|
"height": 118,
|
||||||
|
"width": 100,
|
||||||
|
"size": 418819,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/100w.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=100w.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 48616,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 172170
|
||||||
|
},
|
||||||
|
"fixed_width_small_still": {
|
||||||
|
"height": 118,
|
||||||
|
"width": 100,
|
||||||
|
"size": 7841,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/100w_s.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=100w_s.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"downsized_still": {
|
||||||
|
"height": 281,
|
||||||
|
"width": 240,
|
||||||
|
"size": 26226,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/giphy-downsized_s.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy-downsized_s.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"downsized_large": {
|
||||||
|
"height": 352,
|
||||||
|
"width": 300,
|
||||||
|
"size": 3575754,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/giphy.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"downsized_medium": {
|
||||||
|
"height": 352,
|
||||||
|
"width": 300,
|
||||||
|
"size": 3575754,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/giphy.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"downsized_small": {
|
||||||
|
"height": 152,
|
||||||
|
"width": 129,
|
||||||
|
"size": 0,
|
||||||
|
"url": "",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 90680,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"original_still": {
|
||||||
|
"height": 352,
|
||||||
|
"width": 300,
|
||||||
|
"size": 62137,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/giphy_s.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy_s.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"looping": {
|
||||||
|
"height": 0,
|
||||||
|
"width": 0,
|
||||||
|
"size": 0,
|
||||||
|
"url": "",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 5499938,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"preview": {
|
||||||
|
"height": 156,
|
||||||
|
"width": 132,
|
||||||
|
"size": 0,
|
||||||
|
"url": "",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 44460,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
},
|
||||||
|
"preview_gif": {
|
||||||
|
"height": 73,
|
||||||
|
"width": 62,
|
||||||
|
"size": 47597,
|
||||||
|
"url": "https://media2.giphy.com/media/cLcxtL1z8t8oo/giphy-preview.gif?cid=ea1d2e62g20a2z6zrxsyk0fhlbomzsm3hni8gz7ppq4625qc&rid=giphy-preview.gif&ct=g",
|
||||||
|
"mp4_url": "",
|
||||||
|
"mp4_size": 0,
|
||||||
|
"webp_url": "",
|
||||||
|
"webp_size": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pagination": {
|
||||||
|
"offset": 0,
|
||||||
|
"total_count": 9735,
|
||||||
|
"count": 2
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
2
gifs/generate.go
Normal file
2
gifs/generate.go
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
package main
|
||||||
|
//go:generate make proto
|
||||||
147
gifs/handler/gifs.go
Normal file
147
gifs/handler/gifs.go
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/micro/micro/v3/service/config"
|
||||||
|
"github.com/micro/micro/v3/service/errors"
|
||||||
|
"github.com/micro/micro/v3/service/logger"
|
||||||
|
gifs "github.com/micro/services/gifs/proto"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
giphySearch = "https://api.giphy.com/v1/gifs/search?api_key=%s&q=%s&limit=%d&offset=%d&rating=%s&lang=%s"
|
||||||
|
defaultLimit int32 = 25
|
||||||
|
defaultOffset int32 = 0
|
||||||
|
defaultRating = "g"
|
||||||
|
defaultLang = "en"
|
||||||
|
)
|
||||||
|
|
||||||
|
type conf struct {
|
||||||
|
APIKey string `json:"api_key"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Gifs struct {
|
||||||
|
conf conf
|
||||||
|
}
|
||||||
|
|
||||||
|
func New() *Gifs {
|
||||||
|
v, err := config.Get("micro.gifs")
|
||||||
|
if err != nil {
|
||||||
|
logger.Fatalf("Failed to load config %s", err)
|
||||||
|
}
|
||||||
|
var c conf
|
||||||
|
if err := v.Scan(&c); err != nil {
|
||||||
|
logger.Fatalf("Failed to load config %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Gifs{conf: c}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Gifs) Search(ctx context.Context, request *gifs.SearchRequest, response *gifs.SearchResponse) error {
|
||||||
|
if len(request.Query) == 0 {
|
||||||
|
return errors.BadRequest("gifs.Search", "Missing query field")
|
||||||
|
}
|
||||||
|
limit := defaultLimit
|
||||||
|
if request.Limit > 0 {
|
||||||
|
limit = request.Limit
|
||||||
|
}
|
||||||
|
offset := defaultOffset
|
||||||
|
if request.Offset > 0 {
|
||||||
|
offset = request.Offset
|
||||||
|
}
|
||||||
|
|
||||||
|
rating := defaultRating
|
||||||
|
if len(request.Rating) > 0 {
|
||||||
|
rating = request.Rating
|
||||||
|
}
|
||||||
|
lan := defaultLang
|
||||||
|
if len(request.Lang) > 0 {
|
||||||
|
lan = request.Lang
|
||||||
|
}
|
||||||
|
rsp, err := http.Get(fmt.Sprintf(giphySearch, g.conf.APIKey, request.Query, limit, offset, rating, lan))
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("Error querying giphy %s", err)
|
||||||
|
return errors.InternalServerError("gifs.Search", "Error querying for gifs")
|
||||||
|
}
|
||||||
|
defer rsp.Body.Close()
|
||||||
|
b, err := ioutil.ReadAll(rsp.Body)
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("Error marshalling giphy response %s", err)
|
||||||
|
return errors.InternalServerError("gifs.Search", "Error querying for gifs")
|
||||||
|
}
|
||||||
|
var gRsp searchResponse
|
||||||
|
if err := json.Unmarshal(b, &gRsp); err != nil {
|
||||||
|
logger.Errorf("Error marshalling giphy response %s", err)
|
||||||
|
return errors.InternalServerError("gifs.Search", "Error querying for gifs")
|
||||||
|
}
|
||||||
|
response.Data = marshalGifs(gRsp.Data)
|
||||||
|
response.Pagination = &gifs.Pagination{
|
||||||
|
Offset: gRsp.Pagination.Offset,
|
||||||
|
TotalCount: gRsp.Pagination.TotalCount,
|
||||||
|
Count: gRsp.Pagination.Count,
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func marshalGifs(in []gif) []*gifs.Gif {
|
||||||
|
ret := make([]*gifs.Gif, len(in))
|
||||||
|
for i, v := range in {
|
||||||
|
ret[i] = &gifs.Gif{
|
||||||
|
Id: v.ID,
|
||||||
|
Slug: v.Slug,
|
||||||
|
Url: v.URL,
|
||||||
|
ShortUrl: v.ShortURL,
|
||||||
|
EmbedUrl: v.EmbedURL,
|
||||||
|
Source: v.Source,
|
||||||
|
Rating: v.Rating,
|
||||||
|
Title: v.Title,
|
||||||
|
Images: &gifs.ImageFormats{
|
||||||
|
Original: marshalImageFormat(v.Images.Original),
|
||||||
|
Downsized: marshalImageFormat(v.Images.Downsized),
|
||||||
|
FixedHeight: marshalImageFormat(v.Images.FixedHeight),
|
||||||
|
FixedHeightStill: marshalImageFormat(v.Images.FixedHeightStill),
|
||||||
|
FixedHeightDownsampled: marshalImageFormat(v.Images.FixedHeightDownsampled),
|
||||||
|
FixedWidth: marshalImageFormat(v.Images.FixedWidth),
|
||||||
|
FixedWidthStill: marshalImageFormat(v.Images.FixedWidthStill),
|
||||||
|
FixedWidthDownsampled: marshalImageFormat(v.Images.FixedWidthDownsampled),
|
||||||
|
FixedHeightSmall: marshalImageFormat(v.Images.FixedHeightSmall),
|
||||||
|
FixedHeightSmallStill: marshalImageFormat(v.Images.FixedHeightSmallStill),
|
||||||
|
FixedWidthSmall: marshalImageFormat(v.Images.FixedWidthSmall),
|
||||||
|
FixedWidthSmallStill: marshalImageFormat(v.Images.FixedWidthSmallStill),
|
||||||
|
DownsizedStill: marshalImageFormat(v.Images.DownsizedStill),
|
||||||
|
DownsizedLarge: marshalImageFormat(v.Images.DownsizedLarge),
|
||||||
|
DownsizedMedium: marshalImageFormat(v.Images.DownsizedMedium),
|
||||||
|
DownsizedSmall: marshalImageFormat(v.Images.DownsizedSmall),
|
||||||
|
OriginalStill: marshalImageFormat(v.Images.OriginalStill),
|
||||||
|
Looping: marshalImageFormat(v.Images.Looping),
|
||||||
|
Preview: marshalImageFormat(v.Images.Preview),
|
||||||
|
PreviewGif: marshalImageFormat(v.Images.PreviewGif),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func marshalImageFormat(in format) *gifs.ImageFormat {
|
||||||
|
mustInt32 := func(s string) int32 {
|
||||||
|
i, _ := strconv.Atoi(s)
|
||||||
|
return int32(i)
|
||||||
|
}
|
||||||
|
return &gifs.ImageFormat{
|
||||||
|
Height: mustInt32(in.Height),
|
||||||
|
Width: mustInt32(in.Width),
|
||||||
|
Size: mustInt32(in.Size),
|
||||||
|
Url: in.URL,
|
||||||
|
Mp4Url: in.MP4URL,
|
||||||
|
Mp4Size: mustInt32(in.MP4Size),
|
||||||
|
WebpUrl: in.WebpURL,
|
||||||
|
WebpSize: mustInt32(in.WebpSize),
|
||||||
|
}
|
||||||
|
}
|
||||||
58
gifs/handler/types.go
Normal file
58
gifs/handler/types.go
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
type searchResponse struct {
|
||||||
|
Data []gif `json:"data"`
|
||||||
|
Pagination pagination `json:"pagination"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type gif struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Slug string `json:"slug"`
|
||||||
|
URL string `json:"url"`
|
||||||
|
ShortURL string `json:"bitly_url"`
|
||||||
|
EmbedURL string `json:"embed_url"`
|
||||||
|
Source string `json:"source"`
|
||||||
|
Rating string `json:"rating"`
|
||||||
|
Images formats `json:"images"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type formats struct {
|
||||||
|
Original format `json:"original"`
|
||||||
|
Downsized format `json:"downsized"`
|
||||||
|
FixedHeight format `json:"fixed_height"`
|
||||||
|
FixedHeightStill format `json:"fixed_height_still"`
|
||||||
|
FixedHeightDownsampled format `json:"fixed_height_downsampled"`
|
||||||
|
FixedWidth format `json:"fixed_width"`
|
||||||
|
FixedWidthStill format `json:"fixed_width_still"`
|
||||||
|
FixedWidthDownsampled format `json:"fixed_width_downsampled"`
|
||||||
|
FixedHeightSmall format `json:"fixed_height_small"`
|
||||||
|
FixedHeightSmallStill format `json:"fixed_height_small_still"`
|
||||||
|
FixedWidthSmall format `json:"fixed_width_small"`
|
||||||
|
FixedWidthSmallStill format `json:"fixed_width_small_still"`
|
||||||
|
DownsizedStill format `json:"downsized_still"`
|
||||||
|
DownsizedLarge format `json:"downsized_large"`
|
||||||
|
DownsizedMedium format `json:"downsized_medium"`
|
||||||
|
DownsizedSmall format `json:"downsized_small"`
|
||||||
|
OriginalStill format `json:"original_still"`
|
||||||
|
Looping format `json:"looping"`
|
||||||
|
Preview format `json:"preview"`
|
||||||
|
PreviewGif format `json:"preview_gif"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type format struct {
|
||||||
|
Height string `json:"height"`
|
||||||
|
Width string `json:"width"`
|
||||||
|
Size string `json:"size"`
|
||||||
|
URL string `json:"url"`
|
||||||
|
MP4URL string `json:"mp4_url"`
|
||||||
|
MP4Size string `json:"mp4_size"`
|
||||||
|
WebpURL string `json:"webp_url"`
|
||||||
|
WebpSize string `json:"webp_size"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type pagination struct {
|
||||||
|
Offset int32 `json:"offset"`
|
||||||
|
TotalCount int32 `json:"total_count"`
|
||||||
|
Count int32 `json:"count"`
|
||||||
|
}
|
||||||
25
gifs/main.go
Normal file
25
gifs/main.go
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/micro/services/gifs/handler"
|
||||||
|
pb "github.com/micro/services/gifs/proto"
|
||||||
|
|
||||||
|
"github.com/micro/micro/v3/service"
|
||||||
|
"github.com/micro/micro/v3/service/logger"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// Create service
|
||||||
|
srv := service.New(
|
||||||
|
service.Name("gifs"),
|
||||||
|
service.Version("latest"),
|
||||||
|
)
|
||||||
|
|
||||||
|
// Register handler
|
||||||
|
pb.RegisterGifsHandler(srv.Server(), handler.New())
|
||||||
|
|
||||||
|
// Run service
|
||||||
|
if err := srv.Run(); err != nil {
|
||||||
|
logger.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
1
gifs/micro.mu
Normal file
1
gifs/micro.mu
Normal file
@@ -0,0 +1 @@
|
|||||||
|
service gifs
|
||||||
969
gifs/proto/gifs.pb.go
Normal file
969
gifs/proto/gifs.pb.go
Normal file
@@ -0,0 +1,969 @@
|
|||||||
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// protoc-gen-go v1.26.0
|
||||||
|
// protoc v3.15.5
|
||||||
|
// source: proto/gifs.proto
|
||||||
|
|
||||||
|
package gifs
|
||||||
|
|
||||||
|
import (
|
||||||
|
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||||
|
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||||
|
reflect "reflect"
|
||||||
|
sync "sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Verify that this generated code is sufficiently up-to-date.
|
||||||
|
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||||
|
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||||
|
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Search for a gif
|
||||||
|
type SearchRequest struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// The search term
|
||||||
|
Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"`
|
||||||
|
// Max number of gifs to return. Defaults to 25
|
||||||
|
Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"`
|
||||||
|
// The start position of results (used with pagination)
|
||||||
|
Offset int32 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"`
|
||||||
|
// Apply age related content filter. "g", "pg", "pg-13", or "r". Defaults to "g"
|
||||||
|
Rating string `protobuf:"bytes,4,opt,name=rating,proto3" json:"rating,omitempty"`
|
||||||
|
// ISO 2 letter language code for regional content
|
||||||
|
Lang string `protobuf:"bytes,5,opt,name=lang,proto3" json:"lang,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *SearchRequest) Reset() {
|
||||||
|
*x = SearchRequest{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_proto_gifs_proto_msgTypes[0]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *SearchRequest) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*SearchRequest) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *SearchRequest) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_gifs_proto_msgTypes[0]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use SearchRequest.ProtoReflect.Descriptor instead.
|
||||||
|
func (*SearchRequest) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_gifs_proto_rawDescGZIP(), []int{0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *SearchRequest) GetQuery() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Query
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *SearchRequest) GetLimit() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.Limit
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *SearchRequest) GetOffset() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.Offset
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *SearchRequest) GetRating() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Rating
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *SearchRequest) GetLang() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Lang
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type SearchResponse struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// list of results
|
||||||
|
Data []*Gif `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"`
|
||||||
|
// information on pagination
|
||||||
|
Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *SearchResponse) Reset() {
|
||||||
|
*x = SearchResponse{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_proto_gifs_proto_msgTypes[1]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *SearchResponse) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*SearchResponse) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *SearchResponse) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_gifs_proto_msgTypes[1]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use SearchResponse.ProtoReflect.Descriptor instead.
|
||||||
|
func (*SearchResponse) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_gifs_proto_rawDescGZIP(), []int{1}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *SearchResponse) GetData() []*Gif {
|
||||||
|
if x != nil {
|
||||||
|
return x.Data
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *SearchResponse) GetPagination() *Pagination {
|
||||||
|
if x != nil {
|
||||||
|
return x.Pagination
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type Pagination struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// position in pagination
|
||||||
|
Offset int32 `protobuf:"varint,1,opt,name=offset,proto3" json:"offset,omitempty"`
|
||||||
|
// total number of results available
|
||||||
|
TotalCount int32 `protobuf:"varint,2,opt,name=total_count,json=totalCount,proto3" json:"total_count,omitempty"`
|
||||||
|
// total number returned in this response
|
||||||
|
Count int32 `protobuf:"varint,3,opt,name=count,proto3" json:"count,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Pagination) Reset() {
|
||||||
|
*x = Pagination{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_proto_gifs_proto_msgTypes[2]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Pagination) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*Pagination) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *Pagination) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_gifs_proto_msgTypes[2]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use Pagination.ProtoReflect.Descriptor instead.
|
||||||
|
func (*Pagination) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_gifs_proto_rawDescGZIP(), []int{2}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Pagination) GetOffset() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.Offset
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Pagination) GetTotalCount() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.TotalCount
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Pagination) GetCount() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.Count
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type Gif struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// The ID of the GIF
|
||||||
|
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||||
|
// The slug used in the GIF's URL
|
||||||
|
Slug string `protobuf:"bytes,2,opt,name=slug,proto3" json:"slug,omitempty"`
|
||||||
|
// The URL for this GIF
|
||||||
|
Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"`
|
||||||
|
// A short URL for this GIF
|
||||||
|
ShortUrl string `protobuf:"bytes,4,opt,name=short_url,json=shortUrl,proto3" json:"short_url,omitempty"`
|
||||||
|
// URL used for embedding the GIF
|
||||||
|
EmbedUrl string `protobuf:"bytes,5,opt,name=embed_url,json=embedUrl,proto3" json:"embed_url,omitempty"`
|
||||||
|
// The page on which this GIF was found
|
||||||
|
Source string `protobuf:"bytes,6,opt,name=source,proto3" json:"source,omitempty"`
|
||||||
|
// The content rating for the GIF
|
||||||
|
Rating string `protobuf:"bytes,7,opt,name=rating,proto3" json:"rating,omitempty"`
|
||||||
|
// The title for this GIF
|
||||||
|
Title string `protobuf:"bytes,8,opt,name=title,proto3" json:"title,omitempty"`
|
||||||
|
// The different formats available for this GIF
|
||||||
|
Images *ImageFormats `protobuf:"bytes,9,opt,name=images,proto3" json:"images,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Gif) Reset() {
|
||||||
|
*x = Gif{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_proto_gifs_proto_msgTypes[3]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Gif) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*Gif) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *Gif) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_gifs_proto_msgTypes[3]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use Gif.ProtoReflect.Descriptor instead.
|
||||||
|
func (*Gif) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_gifs_proto_rawDescGZIP(), []int{3}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Gif) GetId() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Id
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Gif) GetSlug() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Slug
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Gif) GetUrl() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Url
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Gif) GetShortUrl() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.ShortUrl
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Gif) GetEmbedUrl() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.EmbedUrl
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Gif) GetSource() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Source
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Gif) GetRating() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Rating
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Gif) GetTitle() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Title
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Gif) GetImages() *ImageFormats {
|
||||||
|
if x != nil {
|
||||||
|
return x.Images
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// A map of different formats (or renditions) of a GIF. See https://developers.giphy.com/docs/optional-settings#rendition-guide
|
||||||
|
type ImageFormats struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// The original GIF. Good for desktop use
|
||||||
|
Original *ImageFormat `protobuf:"bytes,1,opt,name=original,proto3" json:"original,omitempty"`
|
||||||
|
// A downsized version of the GIF < 2MB
|
||||||
|
Downsized *ImageFormat `protobuf:"bytes,2,opt,name=downsized,proto3" json:"downsized,omitempty"`
|
||||||
|
// Version of the GIF with fixed height of 200 pixels. Good for mobile use
|
||||||
|
FixedHeight *ImageFormat `protobuf:"bytes,3,opt,name=fixed_height,json=fixedHeight,proto3" json:"fixed_height,omitempty"`
|
||||||
|
// Static image of the GIF with fixed height of 200 pixels
|
||||||
|
FixedHeightStill *ImageFormat `protobuf:"bytes,4,opt,name=fixed_height_still,json=fixedHeightStill,proto3" json:"fixed_height_still,omitempty"`
|
||||||
|
// Version of the GIF with fixed height of 200 pixels and number of frames reduced to 6
|
||||||
|
FixedHeightDownsampled *ImageFormat `protobuf:"bytes,5,opt,name=fixed_height_downsampled,json=fixedHeightDownsampled,proto3" json:"fixed_height_downsampled,omitempty"`
|
||||||
|
// Version of the GIF with fixed width of 200 pixels. Good for mobile use
|
||||||
|
FixedWidth *ImageFormat `protobuf:"bytes,6,opt,name=fixed_width,json=fixedWidth,proto3" json:"fixed_width,omitempty"`
|
||||||
|
// Static image of the GIF with fixed width of 200 pixels
|
||||||
|
FixedWidthStill *ImageFormat `protobuf:"bytes,7,opt,name=fixed_width_still,json=fixedWidthStill,proto3" json:"fixed_width_still,omitempty"`
|
||||||
|
// Version of the GIF with fixed width of 200 pixels and number of frames reduced to 6
|
||||||
|
FixedWidthDownsampled *ImageFormat `protobuf:"bytes,8,opt,name=fixed_width_downsampled,json=fixedWidthDownsampled,proto3" json:"fixed_width_downsampled,omitempty"`
|
||||||
|
// Version of the GIF with fixed height of 100 pixels. Good for mobile keyboards
|
||||||
|
FixedHeightSmall *ImageFormat `protobuf:"bytes,9,opt,name=fixed_height_small,json=fixedHeightSmall,proto3" json:"fixed_height_small,omitempty"`
|
||||||
|
// Static image of the GIF with fixed height of 100 pixels
|
||||||
|
FixedHeightSmallStill *ImageFormat `protobuf:"bytes,10,opt,name=fixed_height_small_still,json=fixedHeightSmallStill,proto3" json:"fixed_height_small_still,omitempty"`
|
||||||
|
// Version of the GIF with fixed width of 100 pixels. Good for mobile keyboards
|
||||||
|
FixedWidthSmall *ImageFormat `protobuf:"bytes,11,opt,name=fixed_width_small,json=fixedWidthSmall,proto3" json:"fixed_width_small,omitempty"`
|
||||||
|
// Static image of the GIF with fixed width of 100 pixels
|
||||||
|
FixedWidthSmallStill *ImageFormat `protobuf:"bytes,12,opt,name=fixed_width_small_still,json=fixedWidthSmallStill,proto3" json:"fixed_width_small_still,omitempty"`
|
||||||
|
// Static image of the downsized version of the GIF
|
||||||
|
DownsizedStill *ImageFormat `protobuf:"bytes,13,opt,name=downsized_still,json=downsizedStill,proto3" json:"downsized_still,omitempty"`
|
||||||
|
// A downsized version of the GIF < 8MB
|
||||||
|
DownsizedLarge *ImageFormat `protobuf:"bytes,14,opt,name=downsized_large,json=downsizedLarge,proto3" json:"downsized_large,omitempty"`
|
||||||
|
// A downsized version of the GIF < 5MB
|
||||||
|
DownsizedMedium *ImageFormat `protobuf:"bytes,15,opt,name=downsized_medium,json=downsizedMedium,proto3" json:"downsized_medium,omitempty"`
|
||||||
|
// A downsized version of the GIF < 200kb
|
||||||
|
DownsizedSmall *ImageFormat `protobuf:"bytes,16,opt,name=downsized_small,json=downsizedSmall,proto3" json:"downsized_small,omitempty"`
|
||||||
|
// Static image of the original version of the GIF
|
||||||
|
OriginalStill *ImageFormat `protobuf:"bytes,17,opt,name=original_still,json=originalStill,proto3" json:"original_still,omitempty"`
|
||||||
|
// 15 second version of the GIF looping
|
||||||
|
Looping *ImageFormat `protobuf:"bytes,18,opt,name=looping,proto3" json:"looping,omitempty"`
|
||||||
|
// mp4 version of the GIF <50kb displaying first 1-2 secs
|
||||||
|
Preview *ImageFormat `protobuf:"bytes,19,opt,name=preview,proto3" json:"preview,omitempty"`
|
||||||
|
// Version of the GIF <50kb displaying first 1-2 secs
|
||||||
|
PreviewGif *ImageFormat `protobuf:"bytes,20,opt,name=preview_gif,json=previewGif,proto3" json:"preview_gif,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) Reset() {
|
||||||
|
*x = ImageFormats{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_proto_gifs_proto_msgTypes[4]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*ImageFormats) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *ImageFormats) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_gifs_proto_msgTypes[4]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use ImageFormats.ProtoReflect.Descriptor instead.
|
||||||
|
func (*ImageFormats) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_gifs_proto_rawDescGZIP(), []int{4}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetOriginal() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.Original
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetDownsized() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.Downsized
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetFixedHeight() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.FixedHeight
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetFixedHeightStill() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.FixedHeightStill
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetFixedHeightDownsampled() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.FixedHeightDownsampled
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetFixedWidth() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.FixedWidth
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetFixedWidthStill() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.FixedWidthStill
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetFixedWidthDownsampled() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.FixedWidthDownsampled
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetFixedHeightSmall() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.FixedHeightSmall
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetFixedHeightSmallStill() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.FixedHeightSmallStill
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetFixedWidthSmall() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.FixedWidthSmall
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetFixedWidthSmallStill() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.FixedWidthSmallStill
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetDownsizedStill() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.DownsizedStill
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetDownsizedLarge() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.DownsizedLarge
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetDownsizedMedium() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.DownsizedMedium
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetDownsizedSmall() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.DownsizedSmall
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetOriginalStill() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.OriginalStill
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetLooping() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.Looping
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetPreview() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.Preview
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormats) GetPreviewGif() *ImageFormat {
|
||||||
|
if x != nil {
|
||||||
|
return x.PreviewGif
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type ImageFormat struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// height
|
||||||
|
Height int32 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"`
|
||||||
|
// width
|
||||||
|
Width int32 `protobuf:"varint,2,opt,name=width,proto3" json:"width,omitempty"`
|
||||||
|
// size in bytes
|
||||||
|
Size int32 `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"`
|
||||||
|
// URL of the gif
|
||||||
|
Url string `protobuf:"bytes,4,opt,name=url,proto3" json:"url,omitempty"`
|
||||||
|
// URL to an MP4 version of the gif
|
||||||
|
Mp4Url string `protobuf:"bytes,5,opt,name=mp4_url,json=mp4Url,proto3" json:"mp4_url,omitempty"`
|
||||||
|
// size of the MP4 version
|
||||||
|
Mp4Size int32 `protobuf:"varint,6,opt,name=mp4_size,json=mp4Size,proto3" json:"mp4_size,omitempty"`
|
||||||
|
// URL to a webp version of the gif
|
||||||
|
WebpUrl string `protobuf:"bytes,7,opt,name=webp_url,json=webpUrl,proto3" json:"webp_url,omitempty"`
|
||||||
|
// size of the webp version
|
||||||
|
WebpSize int32 `protobuf:"varint,8,opt,name=webp_size,json=webpSize,proto3" json:"webp_size,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormat) Reset() {
|
||||||
|
*x = ImageFormat{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_proto_gifs_proto_msgTypes[5]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormat) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*ImageFormat) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *ImageFormat) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_gifs_proto_msgTypes[5]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use ImageFormat.ProtoReflect.Descriptor instead.
|
||||||
|
func (*ImageFormat) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_gifs_proto_rawDescGZIP(), []int{5}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormat) GetHeight() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.Height
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormat) GetWidth() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.Width
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormat) GetSize() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.Size
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormat) GetUrl() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Url
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormat) GetMp4Url() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Mp4Url
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormat) GetMp4Size() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.Mp4Size
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormat) GetWebpUrl() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.WebpUrl
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ImageFormat) GetWebpSize() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.WebpSize
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
var File_proto_gifs_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
|
var file_proto_gifs_proto_rawDesc = []byte{
|
||||||
|
0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x70, 0x72, 0x6f,
|
||||||
|
0x74, 0x6f, 0x12, 0x04, 0x67, 0x69, 0x66, 0x73, 0x22, 0x7f, 0x0a, 0x0d, 0x53, 0x65, 0x61, 0x72,
|
||||||
|
0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65,
|
||||||
|
0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12,
|
||||||
|
0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05,
|
||||||
|
0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18,
|
||||||
|
0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a,
|
||||||
|
0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72,
|
||||||
|
0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x61, 0x6e, 0x67, 0x18, 0x05, 0x20,
|
||||||
|
0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x61, 0x6e, 0x67, 0x22, 0x61, 0x0a, 0x0e, 0x53, 0x65, 0x61,
|
||||||
|
0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x64,
|
||||||
|
0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x67, 0x69, 0x66, 0x73,
|
||||||
|
0x2e, 0x47, 0x69, 0x66, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x0a, 0x70, 0x61,
|
||||||
|
0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10,
|
||||||
|
0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
||||||
|
0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x0a,
|
||||||
|
0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66,
|
||||||
|
0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73,
|
||||||
|
0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e,
|
||||||
|
0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f,
|
||||||
|
0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01,
|
||||||
|
0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe7, 0x01, 0x0a, 0x03, 0x47, 0x69,
|
||||||
|
0x66, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
|
||||||
|
0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
|
0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01,
|
||||||
|
0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74,
|
||||||
|
0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72,
|
||||||
|
0x74, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x5f, 0x75, 0x72,
|
||||||
|
0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x55, 0x72,
|
||||||
|
0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,
|
||||||
|
0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x74,
|
||||||
|
0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e,
|
||||||
|
0x67, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
|
||||||
|
0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65,
|
||||||
|
0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49,
|
||||||
|
0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x52, 0x06, 0x69, 0x6d, 0x61,
|
||||||
|
0x67, 0x65, 0x73, 0x22, 0xc0, 0x09, 0x0a, 0x0c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72,
|
||||||
|
0x6d, 0x61, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c,
|
||||||
|
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d,
|
||||||
|
0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69,
|
||||||
|
0x6e, 0x61, 0x6c, 0x12, 0x2f, 0x0a, 0x09, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x69, 0x7a, 0x65, 0x64,
|
||||||
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d,
|
||||||
|
0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x77, 0x6e, 0x73,
|
||||||
|
0x69, 0x7a, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x68, 0x65,
|
||||||
|
0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66,
|
||||||
|
0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0b, 0x66,
|
||||||
|
0x69, 0x78, 0x65, 0x64, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x3f, 0x0a, 0x12, 0x66, 0x69,
|
||||||
|
0x78, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x74, 0x69, 0x6c, 0x6c,
|
||||||
|
0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d,
|
||||||
|
0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64,
|
||||||
|
0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x69, 0x6c, 0x6c, 0x12, 0x4b, 0x0a, 0x18, 0x66,
|
||||||
|
0x69, 0x78, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e,
|
||||||
|
0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e,
|
||||||
|
0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74,
|
||||||
|
0x52, 0x16, 0x66, 0x69, 0x78, 0x65, 0x64, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x6f, 0x77,
|
||||||
|
0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x0b, 0x66, 0x69, 0x78, 0x65,
|
||||||
|
0x64, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e,
|
||||||
|
0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74,
|
||||||
|
0x52, 0x0a, 0x66, 0x69, 0x78, 0x65, 0x64, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x3d, 0x0a, 0x11,
|
||||||
|
0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x69, 0x6c,
|
||||||
|
0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49,
|
||||||
|
0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0f, 0x66, 0x69, 0x78, 0x65,
|
||||||
|
0x64, 0x57, 0x69, 0x64, 0x74, 0x68, 0x53, 0x74, 0x69, 0x6c, 0x6c, 0x12, 0x49, 0x0a, 0x17, 0x66,
|
||||||
|
0x69, 0x78, 0x65, 0x64, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73,
|
||||||
|
0x61, 0x6d, 0x70, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67,
|
||||||
|
0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52,
|
||||||
|
0x15, 0x66, 0x69, 0x78, 0x65, 0x64, 0x57, 0x69, 0x64, 0x74, 0x68, 0x44, 0x6f, 0x77, 0x6e, 0x73,
|
||||||
|
0x61, 0x6d, 0x70, 0x6c, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x12, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f,
|
||||||
|
0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x18, 0x09, 0x20, 0x01,
|
||||||
|
0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46,
|
||||||
|
0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x48, 0x65, 0x69, 0x67,
|
||||||
|
0x68, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x18, 0x66, 0x69, 0x78, 0x65, 0x64,
|
||||||
|
0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74,
|
||||||
|
0x69, 0x6c, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73,
|
||||||
|
0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x15, 0x66, 0x69,
|
||||||
|
0x78, 0x65, 0x64, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x53, 0x74,
|
||||||
|
0x69, 0x6c, 0x6c, 0x12, 0x3d, 0x0a, 0x11, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x77, 0x69, 0x64,
|
||||||
|
0x74, 0x68, 0x5f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11,
|
||||||
|
0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61,
|
||||||
|
0x74, 0x52, 0x0f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x57, 0x69, 0x64, 0x74, 0x68, 0x53, 0x6d, 0x61,
|
||||||
|
0x6c, 0x6c, 0x12, 0x48, 0x0a, 0x17, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x77, 0x69, 0x64, 0x74,
|
||||||
|
0x68, 0x5f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x18, 0x0c, 0x20,
|
||||||
|
0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65,
|
||||||
|
0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x14, 0x66, 0x69, 0x78, 0x65, 0x64, 0x57, 0x69, 0x64,
|
||||||
|
0x74, 0x68, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x69, 0x6c, 0x6c, 0x12, 0x3a, 0x0a, 0x0f,
|
||||||
|
0x64, 0x6f, 0x77, 0x6e, 0x73, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x18,
|
||||||
|
0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d, 0x61,
|
||||||
|
0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0e, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x69,
|
||||||
|
0x7a, 0x65, 0x64, 0x53, 0x74, 0x69, 0x6c, 0x6c, 0x12, 0x3a, 0x0a, 0x0f, 0x64, 0x6f, 0x77, 0x6e,
|
||||||
|
0x73, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28,
|
||||||
|
0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f,
|
||||||
|
0x72, 0x6d, 0x61, 0x74, 0x52, 0x0e, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x69, 0x7a, 0x65, 0x64, 0x4c,
|
||||||
|
0x61, 0x72, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x10, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x69, 0x7a, 0x65,
|
||||||
|
0x64, 0x5f, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11,
|
||||||
|
0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61,
|
||||||
|
0x74, 0x52, 0x0f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x64, 0x69,
|
||||||
|
0x75, 0x6d, 0x12, 0x3a, 0x0a, 0x0f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x69, 0x7a, 0x65, 0x64, 0x5f,
|
||||||
|
0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69,
|
||||||
|
0x66, 0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0e,
|
||||||
|
0x64, 0x6f, 0x77, 0x6e, 0x73, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x12, 0x38,
|
||||||
|
0x0a, 0x0e, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x69, 0x6c, 0x6c,
|
||||||
|
0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d,
|
||||||
|
0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x6f, 0x72, 0x69, 0x67, 0x69,
|
||||||
|
0x6e, 0x61, 0x6c, 0x53, 0x74, 0x69, 0x6c, 0x6c, 0x12, 0x2b, 0x0a, 0x07, 0x6c, 0x6f, 0x6f, 0x70,
|
||||||
|
0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73,
|
||||||
|
0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x07, 0x6c, 0x6f,
|
||||||
|
0x6f, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77,
|
||||||
|
0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49, 0x6d,
|
||||||
|
0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x07, 0x70, 0x72, 0x65, 0x76, 0x69,
|
||||||
|
0x65, 0x77, 0x12, 0x32, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x67, 0x69,
|
||||||
|
0x66, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e, 0x49,
|
||||||
|
0x6d, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76,
|
||||||
|
0x69, 0x65, 0x77, 0x47, 0x69, 0x66, 0x22, 0xcd, 0x01, 0x0a, 0x0b, 0x49, 0x6d, 0x61, 0x67, 0x65,
|
||||||
|
0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
|
||||||
|
0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14,
|
||||||
|
0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x77,
|
||||||
|
0x69, 0x64, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01,
|
||||||
|
0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18,
|
||||||
|
0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x70,
|
||||||
|
0x34, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x70, 0x34,
|
||||||
|
0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x70, 0x34, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18,
|
||||||
|
0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x70, 0x34, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19,
|
||||||
|
0x0a, 0x08, 0x77, 0x65, 0x62, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09,
|
||||||
|
0x52, 0x07, 0x77, 0x65, 0x62, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x65, 0x62,
|
||||||
|
0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x77, 0x65,
|
||||||
|
0x62, 0x70, 0x53, 0x69, 0x7a, 0x65, 0x32, 0x3d, 0x0a, 0x04, 0x47, 0x69, 0x66, 0x73, 0x12, 0x35,
|
||||||
|
0x0a, 0x06, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x13, 0x2e, 0x67, 0x69, 0x66, 0x73, 0x2e,
|
||||||
|
0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e,
|
||||||
|
0x67, 0x69, 0x66, 0x73, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
||||||
|
0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x0e, 0x5a, 0x0c, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||||
|
0x3b, 0x67, 0x69, 0x66, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
file_proto_gifs_proto_rawDescOnce sync.Once
|
||||||
|
file_proto_gifs_proto_rawDescData = file_proto_gifs_proto_rawDesc
|
||||||
|
)
|
||||||
|
|
||||||
|
func file_proto_gifs_proto_rawDescGZIP() []byte {
|
||||||
|
file_proto_gifs_proto_rawDescOnce.Do(func() {
|
||||||
|
file_proto_gifs_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_gifs_proto_rawDescData)
|
||||||
|
})
|
||||||
|
return file_proto_gifs_proto_rawDescData
|
||||||
|
}
|
||||||
|
|
||||||
|
var file_proto_gifs_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
|
||||||
|
var file_proto_gifs_proto_goTypes = []interface{}{
|
||||||
|
(*SearchRequest)(nil), // 0: gifs.SearchRequest
|
||||||
|
(*SearchResponse)(nil), // 1: gifs.SearchResponse
|
||||||
|
(*Pagination)(nil), // 2: gifs.Pagination
|
||||||
|
(*Gif)(nil), // 3: gifs.Gif
|
||||||
|
(*ImageFormats)(nil), // 4: gifs.ImageFormats
|
||||||
|
(*ImageFormat)(nil), // 5: gifs.ImageFormat
|
||||||
|
}
|
||||||
|
var file_proto_gifs_proto_depIdxs = []int32{
|
||||||
|
3, // 0: gifs.SearchResponse.data:type_name -> gifs.Gif
|
||||||
|
2, // 1: gifs.SearchResponse.pagination:type_name -> gifs.Pagination
|
||||||
|
4, // 2: gifs.Gif.images:type_name -> gifs.ImageFormats
|
||||||
|
5, // 3: gifs.ImageFormats.original:type_name -> gifs.ImageFormat
|
||||||
|
5, // 4: gifs.ImageFormats.downsized:type_name -> gifs.ImageFormat
|
||||||
|
5, // 5: gifs.ImageFormats.fixed_height:type_name -> gifs.ImageFormat
|
||||||
|
5, // 6: gifs.ImageFormats.fixed_height_still:type_name -> gifs.ImageFormat
|
||||||
|
5, // 7: gifs.ImageFormats.fixed_height_downsampled:type_name -> gifs.ImageFormat
|
||||||
|
5, // 8: gifs.ImageFormats.fixed_width:type_name -> gifs.ImageFormat
|
||||||
|
5, // 9: gifs.ImageFormats.fixed_width_still:type_name -> gifs.ImageFormat
|
||||||
|
5, // 10: gifs.ImageFormats.fixed_width_downsampled:type_name -> gifs.ImageFormat
|
||||||
|
5, // 11: gifs.ImageFormats.fixed_height_small:type_name -> gifs.ImageFormat
|
||||||
|
5, // 12: gifs.ImageFormats.fixed_height_small_still:type_name -> gifs.ImageFormat
|
||||||
|
5, // 13: gifs.ImageFormats.fixed_width_small:type_name -> gifs.ImageFormat
|
||||||
|
5, // 14: gifs.ImageFormats.fixed_width_small_still:type_name -> gifs.ImageFormat
|
||||||
|
5, // 15: gifs.ImageFormats.downsized_still:type_name -> gifs.ImageFormat
|
||||||
|
5, // 16: gifs.ImageFormats.downsized_large:type_name -> gifs.ImageFormat
|
||||||
|
5, // 17: gifs.ImageFormats.downsized_medium:type_name -> gifs.ImageFormat
|
||||||
|
5, // 18: gifs.ImageFormats.downsized_small:type_name -> gifs.ImageFormat
|
||||||
|
5, // 19: gifs.ImageFormats.original_still:type_name -> gifs.ImageFormat
|
||||||
|
5, // 20: gifs.ImageFormats.looping:type_name -> gifs.ImageFormat
|
||||||
|
5, // 21: gifs.ImageFormats.preview:type_name -> gifs.ImageFormat
|
||||||
|
5, // 22: gifs.ImageFormats.preview_gif:type_name -> gifs.ImageFormat
|
||||||
|
0, // 23: gifs.Gifs.Search:input_type -> gifs.SearchRequest
|
||||||
|
1, // 24: gifs.Gifs.Search:output_type -> gifs.SearchResponse
|
||||||
|
24, // [24:25] is the sub-list for method output_type
|
||||||
|
23, // [23:24] is the sub-list for method input_type
|
||||||
|
23, // [23:23] is the sub-list for extension type_name
|
||||||
|
23, // [23:23] is the sub-list for extension extendee
|
||||||
|
0, // [0:23] is the sub-list for field type_name
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { file_proto_gifs_proto_init() }
|
||||||
|
func file_proto_gifs_proto_init() {
|
||||||
|
if File_proto_gifs_proto != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !protoimpl.UnsafeEnabled {
|
||||||
|
file_proto_gifs_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*SearchRequest); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_proto_gifs_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*SearchResponse); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_proto_gifs_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*Pagination); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_proto_gifs_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*Gif); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_proto_gifs_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*ImageFormats); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_proto_gifs_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*ImageFormat); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
type x struct{}
|
||||||
|
out := protoimpl.TypeBuilder{
|
||||||
|
File: protoimpl.DescBuilder{
|
||||||
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
|
RawDescriptor: file_proto_gifs_proto_rawDesc,
|
||||||
|
NumEnums: 0,
|
||||||
|
NumMessages: 6,
|
||||||
|
NumExtensions: 0,
|
||||||
|
NumServices: 1,
|
||||||
|
},
|
||||||
|
GoTypes: file_proto_gifs_proto_goTypes,
|
||||||
|
DependencyIndexes: file_proto_gifs_proto_depIdxs,
|
||||||
|
MessageInfos: file_proto_gifs_proto_msgTypes,
|
||||||
|
}.Build()
|
||||||
|
File_proto_gifs_proto = out.File
|
||||||
|
file_proto_gifs_proto_rawDesc = nil
|
||||||
|
file_proto_gifs_proto_goTypes = nil
|
||||||
|
file_proto_gifs_proto_depIdxs = nil
|
||||||
|
}
|
||||||
93
gifs/proto/gifs.pb.micro.go
Normal file
93
gifs/proto/gifs.pb.micro.go
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
// Code generated by protoc-gen-micro. DO NOT EDIT.
|
||||||
|
// source: proto/gifs.proto
|
||||||
|
|
||||||
|
package gifs
|
||||||
|
|
||||||
|
import (
|
||||||
|
fmt "fmt"
|
||||||
|
proto "github.com/golang/protobuf/proto"
|
||||||
|
math "math"
|
||||||
|
)
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
api "github.com/micro/micro/v3/service/api"
|
||||||
|
client "github.com/micro/micro/v3/service/client"
|
||||||
|
server "github.com/micro/micro/v3/service/server"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ api.Endpoint
|
||||||
|
var _ context.Context
|
||||||
|
var _ client.Option
|
||||||
|
var _ server.Option
|
||||||
|
|
||||||
|
// Api Endpoints for Gifs service
|
||||||
|
|
||||||
|
func NewGifsEndpoints() []*api.Endpoint {
|
||||||
|
return []*api.Endpoint{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Client API for Gifs service
|
||||||
|
|
||||||
|
type GifsService interface {
|
||||||
|
Search(ctx context.Context, in *SearchRequest, opts ...client.CallOption) (*SearchResponse, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type gifsService struct {
|
||||||
|
c client.Client
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGifsService(name string, c client.Client) GifsService {
|
||||||
|
return &gifsService{
|
||||||
|
c: c,
|
||||||
|
name: name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *gifsService) Search(ctx context.Context, in *SearchRequest, opts ...client.CallOption) (*SearchResponse, error) {
|
||||||
|
req := c.c.NewRequest(c.name, "Gifs.Search", in)
|
||||||
|
out := new(SearchResponse)
|
||||||
|
err := c.c.Call(ctx, req, out, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server API for Gifs service
|
||||||
|
|
||||||
|
type GifsHandler interface {
|
||||||
|
Search(context.Context, *SearchRequest, *SearchResponse) error
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterGifsHandler(s server.Server, hdlr GifsHandler, opts ...server.HandlerOption) error {
|
||||||
|
type gifs interface {
|
||||||
|
Search(ctx context.Context, in *SearchRequest, out *SearchResponse) error
|
||||||
|
}
|
||||||
|
type Gifs struct {
|
||||||
|
gifs
|
||||||
|
}
|
||||||
|
h := &gifsHandler{hdlr}
|
||||||
|
return s.Handle(s.NewHandler(&Gifs{h}, opts...))
|
||||||
|
}
|
||||||
|
|
||||||
|
type gifsHandler struct {
|
||||||
|
GifsHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *gifsHandler) Search(ctx context.Context, in *SearchRequest, out *SearchResponse) error {
|
||||||
|
return h.GifsHandler.Search(ctx, in, out)
|
||||||
|
}
|
||||||
126
gifs/proto/gifs.proto
Normal file
126
gifs/proto/gifs.proto
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package gifs;
|
||||||
|
|
||||||
|
option go_package = "./proto;gifs";
|
||||||
|
|
||||||
|
service Gifs {
|
||||||
|
rpc Search(SearchRequest) returns (SearchResponse) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search for a gif
|
||||||
|
message SearchRequest {
|
||||||
|
// The search term
|
||||||
|
string query = 1;
|
||||||
|
// Max number of gifs to return. Defaults to 25
|
||||||
|
int32 limit = 2;
|
||||||
|
// The start position of results (used with pagination)
|
||||||
|
int32 offset = 3;
|
||||||
|
// Apply age related content filter. "g", "pg", "pg-13", or "r". Defaults to "g"
|
||||||
|
string rating = 4;
|
||||||
|
// ISO 2 letter language code for regional content
|
||||||
|
string lang = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
message SearchResponse {
|
||||||
|
// list of results
|
||||||
|
repeated Gif data = 1;
|
||||||
|
// information on pagination
|
||||||
|
Pagination pagination = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Pagination {
|
||||||
|
// position in pagination
|
||||||
|
int32 offset = 1;
|
||||||
|
// total number of results available
|
||||||
|
int32 total_count = 2;
|
||||||
|
// total number returned in this response
|
||||||
|
int32 count = 3;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
message Gif {
|
||||||
|
// The ID of the GIF
|
||||||
|
string id = 1;
|
||||||
|
// The slug used in the GIF's URL
|
||||||
|
string slug = 2;
|
||||||
|
// The URL for this GIF
|
||||||
|
string url = 3;
|
||||||
|
// A short URL for this GIF
|
||||||
|
string short_url = 4;
|
||||||
|
// URL used for embedding the GIF
|
||||||
|
string embed_url = 5;
|
||||||
|
// The page on which this GIF was found
|
||||||
|
string source = 6;
|
||||||
|
// The content rating for the GIF
|
||||||
|
string rating = 7;
|
||||||
|
// The title for this GIF
|
||||||
|
string title = 8;
|
||||||
|
// The different formats available for this GIF
|
||||||
|
ImageFormats images = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A map of different formats (or renditions) of a GIF. See https://developers.giphy.com/docs/optional-settings#rendition-guide
|
||||||
|
message ImageFormats {
|
||||||
|
// The original GIF. Good for desktop use
|
||||||
|
ImageFormat original = 1;
|
||||||
|
// A downsized version of the GIF < 2MB
|
||||||
|
ImageFormat downsized = 2;
|
||||||
|
// Version of the GIF with fixed height of 200 pixels. Good for mobile use
|
||||||
|
ImageFormat fixed_height = 3;
|
||||||
|
// Static image of the GIF with fixed height of 200 pixels
|
||||||
|
ImageFormat fixed_height_still = 4;
|
||||||
|
// Version of the GIF with fixed height of 200 pixels and number of frames reduced to 6
|
||||||
|
ImageFormat fixed_height_downsampled = 5;
|
||||||
|
// Version of the GIF with fixed width of 200 pixels. Good for mobile use
|
||||||
|
ImageFormat fixed_width = 6;
|
||||||
|
// Static image of the GIF with fixed width of 200 pixels
|
||||||
|
ImageFormat fixed_width_still = 7;
|
||||||
|
// Version of the GIF with fixed width of 200 pixels and number of frames reduced to 6
|
||||||
|
ImageFormat fixed_width_downsampled = 8;
|
||||||
|
// Version of the GIF with fixed height of 100 pixels. Good for mobile keyboards
|
||||||
|
ImageFormat fixed_height_small = 9;
|
||||||
|
// Static image of the GIF with fixed height of 100 pixels
|
||||||
|
ImageFormat fixed_height_small_still = 10;
|
||||||
|
// Version of the GIF with fixed width of 100 pixels. Good for mobile keyboards
|
||||||
|
ImageFormat fixed_width_small = 11;
|
||||||
|
// Static image of the GIF with fixed width of 100 pixels
|
||||||
|
ImageFormat fixed_width_small_still = 12;
|
||||||
|
// Static image of the downsized version of the GIF
|
||||||
|
ImageFormat downsized_still = 13;
|
||||||
|
// A downsized version of the GIF < 8MB
|
||||||
|
ImageFormat downsized_large = 14;
|
||||||
|
// A downsized version of the GIF < 5MB
|
||||||
|
ImageFormat downsized_medium = 15;
|
||||||
|
// A downsized version of the GIF < 200kb
|
||||||
|
ImageFormat downsized_small = 16;
|
||||||
|
// Static image of the original version of the GIF
|
||||||
|
ImageFormat original_still = 17;
|
||||||
|
// 15 second version of the GIF looping
|
||||||
|
ImageFormat looping = 18;
|
||||||
|
// mp4 version of the GIF <50kb displaying first 1-2 secs
|
||||||
|
ImageFormat preview = 19;
|
||||||
|
// Version of the GIF <50kb displaying first 1-2 secs
|
||||||
|
ImageFormat preview_gif = 20;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
message ImageFormat {
|
||||||
|
// height
|
||||||
|
int32 height = 1;
|
||||||
|
// width
|
||||||
|
int32 width = 2;
|
||||||
|
// size in bytes
|
||||||
|
int32 size = 3;
|
||||||
|
// URL of the gif
|
||||||
|
string url = 4;
|
||||||
|
// URL to an MP4 version of the gif
|
||||||
|
string mp4_url = 5;
|
||||||
|
// size of the MP4 version
|
||||||
|
int32 mp4_size = 6;
|
||||||
|
// URL to a webp version of the gif
|
||||||
|
string webp_url = 7;
|
||||||
|
// size of the webp version
|
||||||
|
int32 webp_size = 8;
|
||||||
|
}
|
||||||
|
|
||||||
5
gifs/publicapi.json
Normal file
5
gifs/publicapi.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"name": "gifs",
|
||||||
|
"icon": "🎥",
|
||||||
|
"category": "web"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user