google

Google フォト にAPI経由で画像や動画をアップロード

ご挨拶

この記事は ピクシブ株式会社 Advent Calendar 2017 22日目の記事です。
今年の4月に中途で入社した @yensaki です。
Ruby エンジニアとして pixivFACTORY というサービスを運用・開発しています。
イラストをアップロードして簡単にグッズを作成できるサービスです。

Google フォト

本記事は画像や動画を管理するのに使える Google フォト についてです。
Google フォト はアップロードサイズを「高画質」、「元のサイズ」から選ぶことができ、「高画質」だと変換はされるものの容量制限なしでアップロードできます。
image.png

日常的に蓄積される動画はどこでも観れるようにしたいし、容量も嵩むので悩んでいたところですが、
API 経由で Google フォト にアップロードできれば全部自動で管理できて快適なのでは?
と至ったので、今回は動画の API 経由アップロードについて検証しました。

API

https://developers.google.com/picasa-web/docs/3.0/developers_guide_protocol#PostVideo

Picasa

Google フォト としてのAPIは用意されていませんが Picasa Web Albums Data API がそのまま使えるそうです。
Picasa はクローズされた Google の写真管理サービスだそうですが使ったことがないので詳しくはわかりません。
Picasa Web Albums Data API を使うには対象 Google アカウントの access_token が必要です。

access_token

access_token の取得ではこちらを参考にしました。
https://qiita.com/iwaseasahi/items/2363dc1d246bc06baeae

実装

動画のアップロードは metadata で送信します。

user_id は Gmail アドレスのローカル部(xxxx@gmail.comxxxx)。
アルバムを指定してアップロードする場合は album_id を指定する必要があり、下記 API で取得できます。
既にそのアカウントでログイン済みであればブラウザ上での GET アクセスでも取得できます。
https://developers.google.com/picasa-web/docs/3.0/developers_guide_protocol#ListAlbums

コード

Ruby で実装。
HTTPクライアントは Faraday を使いました。
今回は動画アップロードを検証したいので動画ファイルですが画像ファイルでも同様です。
この形式で数種類の動画ファイル、画像ファイルをアップロードしました。

require 'faraday'

conn = Faraday.new(url: "https://picasaweb.google.com") do |faraday|
  faraday.request :url_encoded
  faraday.response :logger
  faraday.adapter Faraday.default_adapter
end

user_id = "USER_ID"
album_id = "ALBUM_ID"
access_token = "ACCESS_TOKEN"
file = Faraday::UploadIO.new("./file.mp4", "video/mp4")
title = "file.mp4"
description = "DESCRIPTION"
body = <<-EOS
Media multipart posting
--END_OF_PART
Content-Type: application/atom+xml

<entry xmlns='http://www.w3.org/2005/Atom'>
  <title>#{title}</title>
  <summary>#{description}</summary>
  <category scheme="http://schemas.google.com/g/2005#kind"
    term="http://schemas.google.com/photos/2007#photo"/>
</entry>
--END_OF_PART
Content-Type: video/mp4

#{file.read}
--END_OF_PART--
EOS

res = conn.post do |req|
  req.url "/data/feed/api/user/#{user_id}/albumid/#{album_id}?access_token=#{access_token}"
  req.headers['Content-Type'] = 'multipart/related; boundary="END_OF_PART"'
  req.headers['Content-Length'] = file.size.to_s
  req.headers['MIME-version'] = "1.0"
  req.body = body
end

結果

  • 動画は Picasa Web Albums Data API ガイドに記載の通り、指定の形式、画面サイズ(480x360)、容量(~100MB)でなければアップロードできませんでした。
    • Google フォト サイト上でのアップロードが問題ない動画ファイルでもNG
  • 画像は試した範囲では全てアップロードできました
    • アップロード後に保存容量を確認すると使用量が増えていました
    • Google フォト のアップロードサイズ設定自体は「高画質」になっている

まとめ

相当小さい動画にしないとアップロードできないこと、アップロードサイズ「高画質」が適用されないことから
この API を動画の日常的な自動アップロードに利用するのは難しそうでした。
Google フォト 専用の API などができて、動画アップロード機能が拡張されることがあればまた検討してみようと思います。

保存容量は購入すればよいので画像管理としては有効に活用できるのではないでしょうか。

ピクシブ株式会社では定常的な作業をガンガン改善できるエンジニアを募集中です!

次回は @syoichi さんです。
お楽しみに!