画像横断検索できるライブラリ作ろうと思ったけど、1日で作るの無理っぽかったのであきらめて、とりあえず1サービスだけAPIライブラリ作ったので公開します。
懺悔
Advent Calendarにあげ忘れておりました。
期間中プログラム大量生産してたので、記事書いてないことに気がついてませんでした
What is pexels?
Pexelsは画像素材のシェアサービスです。
Getty ImageやUnsplashなんかみたいな感じのやつです。
Pexels選んだのはAPIがシンプルだったのと、他のサービスは試してはいないもののとりあえずGoのライブラリがありそうだったため。
あとそれなりの知名度。
使い方
Pexels公式のAPIはこちらです。
とてもシンプル(シンプルすぎて逆に分かりづらい)
https://www.pexels.com/ja-jp/api/documentation/
ライブラリはシンプルにAPIドキュメント丸写ししたような作りにしました。
// create new instance
s, _ := pixels.New(http.DefaultClient, "your pixels api key")
// Get a photo
result, err := s.GetPhoto(406014)
// Search photos
result, err := s.SearchPhotos(pixels.PhotoOptions{
Query: "dog",
})
// Get curated photos
result, err := s.CuratedPhotos(pixels.PhotoOptions{
PerPage: 15,
Page: 1,
})
// Get a video
result, err := s.GetVideo(2035391)
// Search videos
result, err := s.SearchVideos(pixels.VideoOptions{
Query: "cat",
})
// Get popular videos
result, err := s.PopularVideos(pixels.VideoOptions{
PerPage: 15,
Page: 1,
})
ポイント
特に苦労したポイントも少なかったので、やってみてよかったポイントだけ取り上げてみます。
クエリパラメータをStructで定義する
GoogleがStructからQuery stringを生成するパッケージを作っています。
https://github.com/google/go-querystring
今回作ったライブラリの該当箇所を例にするとこんな感じになります。
// PhotoOptions is define that search photos API's query options
type PhotoOptions struct {
Query string `url:"query"`
PerPage int `url:"per_page"`
Page int `url:"page"`
}
// ToQuery builds query string from PhotoOptions
func (po PhotoOptions) ToQuery() (q string, err error) {
if po.PerPage == 0 {
po.PerPage = minPerPage
}
if po.Page < 1 {
po.Page = 1
}
v, err := query.Values(po)
if err != nil {
return
}
return v.Encode(), nil
}
種類が少ないときはこういう方法もありだと思いました。
APIが大量にある場合は定義が増えぎて死んでしまいそうです、
あとがき
作り終わるまで、Pexels
じゃなくてPixels
だと思ってました。
恥ずかしい...
ライブラリもgo-pixelsにしてしまったので、どっかのタイミングで直します