アセットのアップロード

概要

このチュートリアルでは、アセットを Frame.io にアップロードする方法について扱います。Frame.io は、すべてのファイルタイプ(ビデオだけでなくスクリプト、写真、マップ、参照ファイル)が含まれます。より専門的な用語で、Frame.io のアセットは、S3 のファイルおよび Frame.io のコンテキスト(トランスコード、ユーザー/チーム/プロジェクトコンテキスト、メタデータなど)の堅牢な表現です。アセットについて詳しくは、リソース定義を参照してください。

主要な階層

また、Frame.io が主要なモデルをどのように構造化しているかを知ることも役立ちます。

アカウントユーザーが属しています)には、多くの プロジェクトがあり、プロジェクトはすべて、アセットを含んでいます。チームは、エンタープライズ版アカウントでのみ使用可能で、追加のレベルの論理的な分離を提供します。アセットは、いずれのチームに属しているかを「認識」しませんが(プロジェクトおよびアカウントのみ認識)、プロジェクトは、アカウントではなくチームによって厳密に所有されているので、チームは、アセットアップロードプロセスの不可欠な要素になります。

前提条件

このチュートリアルでは、次が必要になります。

  • 開発者トークンを持つ Frame.io アカウント(トークンについては、以下で説明します)
  • Frame.io Python SDK

アセットのアップロード

このセクションでは、アセットをアップロードするための手順について説明します。

  1. developer.frame.io で、次のスコープで開発者トークンを作成します。
スコープ理由
**アカウント:**読み取りリクエスト元のユーザーのアカウントリストを取得します。
**チーム:**読み取り目的のアカウントの使用可能なチームを取得します。
**プロジェクト:**読み取り目的のチームの使用可能なプロジェクトを取得します。
**アセット:**作成、読み取り新しいアセットレコードを作成し、使用可能なアセットを取得して、プロジェクト内でフォルダー構造を行き来します。
API トークンの作成にサポートが必要ですか?

こちらの手順を確認してください。

  1. アセットの宛先を見つけます。少なくとも、アセットはプロジェクト内で配置する必要があります。アップロード先のファイル階層内の場所を指定できるように、プロジェクトのルートアセット ID(root_asset_id)またはフォルダーのアセット ID を取得することが必要になります。
注意:

プロジェクト ID のみでアップロードすることはできません。プロジェクトのルートにアップロードするには、リクエストで root_asset_id を指定します。

一般に、(指定された順序で)次を取得する必要があります。

  • アカウント ID を取得し、アカウントを選択
  • チーム ID を取得し、チームを選択
  • チームに関連付けられているプロジェクト
  • 作業するプロジェクトのプロジェクト ID
  • ルートアセット ID またはフォルダー ID

root_asset_id を使用して、プロジェクトのルートに直接、アップロードできます。

アセットのリスト

新しいアセットのアップロード先を選択するために、API を使用して、プロジェクトまたはプロジェクト内のフォルダーにあるすべてのアセットをリストできます。アセットは、フォルダーの場合は、子アセットが入ります。子アセットはファイルやフォルダーにすることもできます。 ** アセット情報をリストする場合は、任意のアセット ID を使用できますが、プロジェクトに関連付けられているすべてのものを確認する場合は、root_asset_id を使用します。

1curl --request GET \
2 --url https://api.frame.io/v2/assets/<ROOT_ASSET_ID>/children \
3 --header 'authorization: Bearer <DEV_TOKEN>'
1from frameioclient import FrameioClient
2import os
3
4ASSET_ID = ""
5TOKEN = ""
6
7client = FrameioClient(TOKEN)
8response_list = client.assets.get_children(ASSET_ID)
9assets = response_list.results
10
11for item in assets:
12 print(item['id'], item['name'])

返されたアセットのリストから、フォルダーである任意のアセットの ID、またはルートアセット ID を使用できます。この ID を使用して、新しいアセットのアップロード先をマークします。

アセットのアップロード

この例では、新しいファイルをアップロードします。次の情報を含んだリクエストを送信します。

パラメーター説明
filesizeアップロードするファイルのサイズを入力します
filetypeアップロードするファイルのタイプを選択します。選択肢には、ビデオおよび画像が含まれます。例:video/mp4image/png
nameファイル名を表している文字列を、スペースなしで入力します。
typeこれは、file を使用しているのか、folder を使用しているのかを表します。バージョンスタックは、複数のファイルを互いにスタッキングする場合です。

新しいフォルダーを作成する場合は、リクエストに filesize または filetype を含める必要はありません。

cURL リクエストの場合は、"source": { "url":"URL_FOR_VIDEO" } パラメーターを使用してファイルへのリンクを含めることで、アセットを Frame.io に素早くアップロードできます。リンクは、一般にアクセス可能である必要があります。そうでない場合は、Python SDK を使用できます。Python SDK は、アップロードリンクごとにファイルのチャンクへの分割を処理します。

1curl --request POST \
2 --url https://api.frame.io/v2/assets/<ASSET_ID>/children \
3 --header 'authorization: Bearer <DEV_TOKEN>' \
4 --header 'content-type: application/json' \
5 --data '{"filesize":200000,"filetype":"video/mp4","name":"test","source":{"url":"URL_FOR_VIDEO"},"type":"file"}'
1# Code sample uses the Python SDK: https://github.com/Frameio/python-frameio-client
2
3from frameioclient import FrameioClient
4
5client = frameioclient("FRAMEIO_TOKEN)
6
7asset = client.assets.upload(
8 destination_id="PARENT_ASSET_ID",
9 filepath="./my_file.mov"
10)
11
12# Create a folder:
13asset = client.assets.create_folder(
14 parent_asset_id=PARENT_ASSET_ID,
15 name="My Awesome Folder"
16)
アセット URL の有効期限が切れます

アセット作成 API 呼び出しで取得した URL は、アップロードを認可するために事前に署名されていますが、24 時間後に期限切れになります。

独自のファイルアップローダーの構築

独自のアップローダーを構築する場合は、最適なパフォーマンスを得るために、チャンクを並列でアップロードすることをお勧めします。各チャンクは、Frame.io API からの応答で提供される Amazon S3 URL に直接、PUT する必要があります。

ファイルチャンクは、最終的な連結およびトランスコード済みアセットのシーケンスを決定するので、提供された upload_urls の順序と一致する必要があります。 **これは、1 番目の URL が 1 番目のチャンクを取り、2 番目の URL が 2 番目のチャンクを取る、などを意味します。

擬似コードの例

Python
1filesize = 30000000
2upload_urls = ["https://...", "https://...", "https://..."]
3chunk_size = filesize / len(upload_urls)
4
5start_byte = 0 # Set to 0 to start
6for i, url in enumerate(upload_urls):
7 end_byte = chunk_size * (i + 1)
8 upload_chunk(url=url, start_byte, end_byte)
9 start_byte = start_byte + chunk_size

S3 への各リクエストのヘッダーには、次のように、Frame.io API への最初の呼び出しから返された新しいアセットの filetype、および、追加のプライバシーヘッダーが含まれる必要があります。

PUT https://frameio-uploads-production.s3/etc/etc
Content-Type: video/mp4
x-amz-acl: private

Python SDK でこれがすべて処理される方法の例は、こちらで確認できます。

AWS エラーは XML 形式

この段階で発生するエラーは AWS から直接返されるエラーなので、XML 形式であり、Frame.io の標準的な JSON エラー処理では対応できません。一般的に、本番環境での使用に合わせて、これらのアップロードに関する再試行ロジックを構築することをお勧めします。不完全にアップロードされたファイル(チャンクが欠落しているファイル)は、トランスコードに失敗し、Frame.io に表示されます

以上です。upload_url への PUT 呼び出しが完了すると、Frame.io に新しいアセットが用意されます。