LoginSignup
0
0

APIを利用してeBayに動画をアップロードしてみる

Last updated at Posted at 2023-11-12

ドキュメント

使用するAPIは「MediaAPI」
ドキュメントの内容をざっくり要約すると以下の通り
eBayドキュメントリンク:
https://developer.ebay.com/api-docs/commerce/media/resources/methods

・createVideo,getVideo,uploadVideoの3つのメソッドが用意されている
・createVideoでメタデータを作成するとレスポンスとしてvideo_idが返される
・このvideo_idを指定してuploadVideoで動画ファイルをアップロードする
・getVideoはvideo_idを指定してその動画ファイルの情報を取得できる(今回は使用しない)

ビデオの要件は以下の通り(ドキュメントより抜粋)
・サポートされる最大ビデオ サイズは 150 MB です
・最大アップロード解像度は1080pです
・サポートされている出力解像度は 240p、360p、480p、720p です。
・MP4 ファイル タイプ - MPEG-4 Part 10 または Advanced Videocoding (MPEG-4 AVC)
・YouTube やその他のビデオ プラットフォームへのリンクの提供はサポートされていません
・バリエーションのある商品は動画をサポートしていません

createVideo(メタデータの作成)

リクエスト内容は以下の通り
スクリーンショット 2023-11-12 22.51.28.png
スクリーンショット 2023-11-12 22.21.19.png
Content-Type::application/json
classification:ビデオの利用目的らしいが、'ITEM'と入力すればOKのよう
description:ビデオの説明
size:アップロードするビデオのbyteサイズ
title:ビデオのタイトル

これらを踏まえて以下のようにリクエスト内容を作成してリクエストを実行

        def client_opts
          {
            size:  File.size(video_file),
            title: "Product introduction video",
            description: "Show off product details",
            classification: [
                "ITEM"
            ]
          }
        end

ドキュメントによるとスクリーンショット 2023-11-12 22.45.15.png
ヘッダーにURLを返し、その中にvideo_idが含まれているようなので、
binding.pryで内容を確認し以下のようにvideo_idを取得

[4] pry(#<Ebay::Media::CreateVideo::Client>)> res
=> #<Net::HTTPCreated 201 Created readbody=true>
[5] pry(#<Ebay::Media::CreateVideo::Client>)> res[:Location]
=> "https://apim.ebay.com/commerce/media/v1_beta/video/c3bf3c3818b0ab8e87e3c0xxxxxxxxxx"
[6] pry(#<Ebay::Media::CreateVideo::Client>)> res[:Location].split('/').last
=> "c3bf3c3818b0ab8e87e3c0xxxxxxxxxx"

uploadVideo(動画ファイルのアップロード)

リクエスト内容は先ほど取得したvideo_idのみ

スクリーンショット 2023-11-12 22.49.20.png

headerはapplication/octet-stream
初めてみるタイプだったので調べたところ「ファイルの種類が分からないとき」
「個別のMIMEタイプが用意されていないとき」「ファイルの種類を通知したくないとき」
に使用されるMIMEタイプとのこと。

スクリーンショット 2023-11-12 22.54.20.png

rubyでの動画ファイルアップロードについてはこちらの記事を参考にさせていただき、
以下のように実装。

        def call(video_id, video_file)
          @video_id = video_id
          @request_uri = URI.parse(uri)
          http.start do |http|
            req = Net::HTTP::Post.new(request_uri, headers)
            Rails.logger.info video_file if video_file.present?
            File.open(video_file, 'rb') do |f|
              req.body_stream = f
              req["Content-Length"] = f.size
              res = http.request(req)
            end
          end
        end

        private

        def http
          httq = Net::HTTP.new(request_uri.host, request_uri.port)
          if request_uri.port == 443
            httq.use_ssl = true
            httq.verify_mode = OpenSSL::SSL::VERIFY_NONE
          end
          httq
        end

        def headers
          {
            'Authorization' => "Bearer #{auth_token}",
            'Content-Type' => 'application/octet-stream'
          }
        end

        def uri
          "https://apim.ebay.com/commerce/media/v1_beta/video/#{video_id}/upload"
        end

        def method
          :post
        end

レスポンスは何も返さないので200を確認できればOK

pry(#<ListingsController>)> res
=> #<Net::HTTPOK 200 OK readbody=true>

商品への反映

MediaAPIではあくまで動画ファイルをアップロードするまでしかできないので、
アップロードした動画を商品に紐づけるには出品時(Additemなど)にvideo_idをリクエストすればOK

      VideoDetails: {
        VideoID: video_id
      }

createVideo→uploadVideo→出品まで一連の流れで行うと、
動画がebayにアップロードされるまで時間がかかるため、
出品後しばらくして動画がアップロードされることもあるため注意。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0