カスタムアクション

Frame.ioアクションは、ダウンロード、名前変更、項目の複製などの一般的なメディア操作への素早いアクセスを提供し、Frame.ioのユーザーインターフェイス内で直接、サードパーティツールやサービスとの統合も可能にします。

アクションについて

カスタムアクションの導入により、デベロッパーはFrame.io V4で独自のアクションを設定し管理できるようになりました。 Webhooksと同じ基盤イベントシステムを活用し、カスタムアクションはデベロッパーがアセットを、Frame.ioアカウント内のユーザーにとって最も重要なツールに接続するための代替メカニズムです。

アクションは、そのアクションが有効になっているFrame.io Workspaceのメンバーであるユーザーならだれでも実行できます。アクションを実行すると、Frame.ioは指定したURLにペイロードを送信します。受信アプリケーションは、受信確認のためHTTPステータスコードで応答するか、Frame.io UIに追加フォームフィールドをレンダリングするカスタムコールバックで応答します。受信アプリケーションは、独自にホストしたプログラム、サービス、またはWorkfront FusionやZapierなどのローコード・ノーコードIPaaSツールでも構いません。

カスタムアクションを使用して、プログラム可能なUIコンポーネントとしてFrame.ioに直接統合を構築します。これにより、アプリ内でユーザーがトリガーできるワークフローが可能になり、webhookと同じ基盤イベントルーティングを活用します。Frame.ioに別のフォームまたは基本的な応答として戻ってくる、ユーザートリガー型の単一または複数ステップフォームを作成できます。そして、ユーザーがアセット上のカスタムアクションをクリックすると、Frame.ioは指定したURLにペイロードを送信します。受信アプリケーションは、受信確認のためHTTPステータスコードで応答するか、Frame.ioに追加UIをレンダリングできるカスタムコールバックで応答します。

V4でのアクション改良

レガシーバージョンのユーザーからの学びを活用し、Frame.io V4のアクション機能セットに多数の拡張を含めました:

新しいフィールドタイプ

以前はテキストフィールドと単一選択フィールドに制限されていましたが、現在は複数選択、テキストエリア(より大きなテキストボックス用)、およびブーリアンフィールド(ラジオボタン用)もサポートしています。

クリック可能なリンク

テキストフィールドでは、ユーザーがURLを簡単にコピー・ペーストできません。代わりに新しいリンクフィールドを使用して、簡単なワンクリックでコピー体験を実現してください。

動的モーダル

返されるデータの量に応じて、アクションのモーダルが動的にサイズ変更され、フォーム内の情報に最適にフィットし、必要に応じてスクロール可能なモーダルも含まれます。

複数アセットアクション

アクションを設定して、一度のリクエストで最大100個のアセットを対象にできます。


NEW

混合アセットタイプ

1つのアセットタイプに制限されません。アクションは、ファイル、フォルダー、バージョンスタックの組み合わせ全体でトリガーできます。

アプリ内フィードバックフォーム

アクションの使用方法について、デベロッパーとエンドユーザーの両方からお聞きしたいので、webの設定ページにフィードバックフォームを表示しています。

移行されたアクション

Frame.ioのレガシーバージョンで以前に作成されたカスタムアクションを含むFrame.io V4アカウントに移行する際に、覚えておくべきいくつかの点があります。

アクションステータス

Frame.io V4へのアカウント移行時、以前のバージョンで作成されたすべてのカスタムアクションのステータスは「null」になり、自動的に無効になります。これにより、ユーザーは最初にアクションを更新してV4 APIを使用してから有効化する機会が得られます。更新されていないアクションは失敗するためです。この状態のアクションを識別するには、アクション設定ページにアクセスして「ステータス」列を参照するか、APIを使用している場合はis_activeフィールドを確認してください。

実行可能なリソース:ファイル、フォルダー、バージョンスタック

Frame.io V4 APIでアセットタイプが別々のリソースとして分離されているため、アクションのペイロードで受信したリソースIDを解釈する際に考慮すべき動作があります。個別ファイルの動作は分かりやすく、IDはアクションが実行された特定のファイルを反映します。同様にフォルダーの場合、アクションが実行されたフォルダーのIDを受信しますが、ユースケースに応じて、アクションの動作を定義する際に複数のオプションがあります。フォルダーリソース自体とやり取りしたい場合は、フォルダーIDを使用してFrame.io APIへの後続の呼び出しを行ってください。または、そのフォルダーの子を取得して、内部のアセットでさらなる処理を実行することもできます。バージョンスタックでアクションが実行されると、ペイロードにはスタックの最上位ファイルである「ヘッドアセット」のIDが含まれ、これがFrame.io UIに表示される内容です。

Frame.ioレガシーAPIとV4の違いについて詳しくは、移行ガイドをご覧ください。

APIでカスタムアクションを設定します。

カスタムアクションには以下が必要です:

フィールド名説明
名前カスタムアクション用に選択する名前。Frame.ioで利用可能なカスタムアクションのメニューに表示されます。
説明アクションの動作を参照用に説明します(説明はFrame.io webアプリには表示されません)。
Event標準webhook イベントと独自のイベントを区別するのに役立つ内部イベントキー。
URLイベントの配信先。
ワークスペースカスタムアクションを使用するWorkspace。

カスタムアクションを設定

ユーザーがカスタムアクションをトリガーすると、Frame.ioは指定されたURLにペイロードを送信します。受信アプリケーションは、受信確認のためにHTTPステータスコードで応答するか、Frame.ioで追加のUIをレンダリングするカスタムコールバックで応答することができます。

Workspaceのカスタムアクションを作成するには、アカウント管理者権限が必要です。アクセス権がない場合は、管理者に権限の変更を依頼してください。

マルチアセット設定

マルチアセットサポートは設定に基づいており、アクションの設定モーダルon webから明示的に有効にする必要があります。これは、新しいアクションの作成時、または既存のアクションの更新時に実行できます。 

マルチアセットサポートが有効になると、ペイロード形式は即座に切り替わります。レガシーとマルチアセットサポートのペイロードは相互排他的です。

Frame.ioからのペイロード

ユーザーがカスタムアクションをクリックすると、URLフィールドで設定したURLにペイロードが送信されます。このペイロードを使用して以下を識別します:

アクションコンテキスト
  • クリックされたカスタムアクション

  • クリックされたリソース

  • アクションを実行したユーザー

  • トリガーされたイベントタイプ

組織コンテキスト
  • カスタムアクションに関連付けられたアカウント

  • カスタムアクションに関連付けられたWorkspace

  • リソースを含むプロジェクト

カスタムアクションは、もともと1つのアセットを含むresourceオブジェクトを使用して、リクエストごとに1つのアセットのみを受け入れていました。複数アセットのサポートが有効になると、ペイロードは1つまたは複数のアセットのresourcesリストを使用します(1回のリクエストで最大100個のアセット)。

1 POST /your/url
2 {
3 "account_id": "1a94720e-f7f5-4c41-ab62-d11eebe3d504",
4 "action_id": "0aeb9feb-f8eb-4100-a8c2-b39b66d354ab",
5 "data": {
6 "description": "Pretty cool video.",
7 "title": "Hey there!"
8 },
9 "interaction_id": "985559de-865a-40e5-a687-2bbed4497eaa",
10 "project": {
11 "id": "3e34e7cb-5c21-49f5-8ca9-a1419584c2ea"
12 },
13 "resources": [
14 {
15 "id": "fe41c5a8-1b8d-417d-a7df-0b88bc19b476",
16 "type": "file"
17 },
18 {
19 "id": "fe81fb2b-1316-4a76-9cf6-0630f474fc39",
20 "type": "file"
21 }
22 ],
23 "type": "some.event",
24 "user": {
25 "id": "68093c1c-4b05-41ce-a3c9-e64d195b1935"
26 },
27 "workspace": {
28 "id": "629086c0-f6aa-4d63-a284-f39bcd415b9f"
29 }
30 }
1 POST /your/url
2 {
3 "account_id": "1a94720e-f7f5-4c41-ab62-d11eebe3d504",
4 "action_id": "0e38b93a-9f10-4bc7-90bc-bd07a16e510a",
5 "data": {
6 "description": "Wow look at this.",
7 "title": "Hey there!!"
8 },
9 "interaction_id": "dff6d369-7150-41f9-8e6f-4f0895f6b416",
10 "project": {
11 "id": "3e34e7cb-5c21-49f5-8ca9-a1419584c2ea"
12 },
13 "resource": {
14 "id": "fe81fb2b-1316-4a76-9cf6-0630f474fc39",
15 "type": "file"
16 },
17 "type": "some.event",
18 "user": {
19 "id": "68093c1c-4b05-41ce-a3c9-e64d195b1935"
20 },
21 "workspace": {
22 "id": "629086c0-f6aa-4d63-a284-f39bcd415b9f"
23 }
24 }

レガシーペイロードからの移行

レガシーペイロードの廃止予定

レガシーペイロードは廃止が予定されており、ユーザーは新しいペイロードを処理するようにサービスを移行することを強く推奨しています。

設定フラグを有効にしてペイロード処理を更新することで、アクションは複数アセットペイロードをサポートするようにシームレスに移行できます。

  1. 単一のresourceオブジェクトの使用をresourcesリストに置き換える 2。resourcesリストを反復するようにコードを更新する

  2. アクション設定で複数アセットフラグを有効にする

フィールド名説明
account_idアクションの一意のアカウントID。
action_idアクションの一意のID。
interaction_idFrame.ioによって生成される一意の識別子で、連鎖したメッセージやフォームコールバックなど、複数のリクエストにわたってトランザクションを追跡するために使用されます。アクションのすべてのシーケンスを通じて同じまま維持されます。
project_idアクションの一意のプロジェクトID。
resource.idアクションをトリガーしたリソースのID。
resource.typeアクションをトリガーしたリソースのタイプ。
typeアクションを設定する際にeventフィールドに指定された名前。
user.idアクションをトリガーしたユーザーのID。
workspace.idアクションを使用しているWorkspaceのID。
dataユーザーが選択したフォームフィールド名と値を含むキーと値のペア。どのような選択がされたかを知るために、アプリケーションがこれを受信します。

インタラクション、再試行、タイムアウト

interaction_idは、時間の経過とともに進化するインタラクションをトラッキングするための一意の識別子です。ユーザーに応答する必要がない場合は、200ステータスコードを返せば完了です。オプションですが、成功メッセージやエラーアラートなど、アクションの結果に関する情報を含めることをお勧めします。カスタムアクションはメッセージコールバックをサポートしています。

Frame.ioは10秒未満での応答を期待し、成功した応答を待つ間に最大5回まで再試行を試みます。理想的には応答は即座で、非同期アクションはカスタムアクションを介したトリガー後に発生します。

メッセージコールバックを作成

WebhookイベントへのHTTP応答で、Frame.io UIで開始ユーザーに返されるメッセージを説明するJSONオブジェクトを返すことができます。

1{
2 "title": "Success!",
3 "description": "The thing worked! Nice."
4}

メッセージを使用すると、Frame.io UIでユーザーに直接フィードバックを提供できます。ユーザーから追加情報を収集する必要がある場合は、代わりにフォームコールバックを使用してください。

フォームコールバックを作成

プロセスを開始する前に、さらに情報が必要だとしましょう。例えば、追加の詳細が必要なシステムにコンテンツをアップロードする場合があります。応答でフォームを記述でき、ユーザーがそれを記入して送信すると、あなたに返されます。以下に例を示します:

1{
2 "title": "Need some more info!",
3 "description": "Getting ready to submit this file!",
4 "fields": [
5 {
6 "type": "text",
7 "label": "Title",
8 "name": "title",
9 "value": "MyVideo.mp4"
10 },
11 {
12 "type": "select",
13 "label": "Captions",
14 "name": "captions",
15 "options": [
16 {
17 "name": "Off",
18 "value": "off"
19 },
20 {
21 "name": "On",
22 "value": "on"
23 }
24 ]
25 }
26 ]
27}

ユーザーがフォームを送信すると、最初のPOSTと同じURLでイベントを受信します:

1POST /your/url
2{
3 "type": "your-specified-event-name",
4 "interaction_id": "the-same-id-as-before",
5 "action_id": "unique-id-for-this-custom-action",
6 "data":{
7 "title": "MyVideo.mp4",
8 "captions": "off"
9 }
10}

フォームに追加されたすべてのカスタムフィールドは、Frame.ioから送信されるJSONペイロードのdataセクションに表示されます。interaction_idを使用して、初期リクエストとこの新しいフォームデータをマッピングします。メッセージで応答するか、別のフォームをチェーンできます。アクション、フォーム、メッセージをチェーンすることで、外部システムからのビジネスロジックを使用して、Frame.ioで多段階のワークフローを効果的にプログラムできます。

フォームの詳細

メッセージと同様に、フォームもフォームの上部にレンダリングされるtitledescription属性をサポートしています。それ以外に、各フォームフィールドは以下の基本属性を受け入れます:

フィールドプロパティ
  • type — Frame.io UIに期待するデータのタイプと、どのコンポーネントをレンダリングするかを伝えます。* label — フィールドの上にヘッダーとしてUIに表示されます。
フィールドデータ
  • name — 後続のペイロードでフィールドが識別されるキー。* value — フィールドに事前入力する値。

サポートされているフィールドタイプ

テキストフィールド

追加パラメーターのないシンプルなテキストフィールド。

1{
2 "type": "text",
3 "label": "Title",
4 "name": "title",
5 "value": "MyVideo.mp4"
6}

テキストエリア

追加パラメーターのないシンプルなテキストエリア。

1{
2 "type": "textarea",
3 "label": "Description",
4 "name": "description",
5 "value": "This video is really, really popular."
6}

選択リスト

ユーザーが選択できるピックリストを定義します。optionsリストを含める必要があり、各メンバーには人間が読めるnameと機械解析可能なvalueを含める必要があります。

1{
2 "type": "select",
3 "label": "Captions",
4 "name": "captions",
5 "value": "off",
6 "options": [
7 {
8 "name": "Off",
9 "value": "off"
10 },
11 {
12 "name": "On",
13 "value": "on"
14 }
15 ]
16}

チェックボックス

追加パラメーターのないシンプルなチェックボックス。

1{
2 "type": "boolean",
3 "name": "enabled",
4 "label": "Enabled",
5 "value": "false"
6}

リンク

追加パラメーターのないシンプルなリンク。

1{
2 "type": "link",
3 "name": "videoLink",
4 "label": "Video Link",
5 "value": "https://www.youtube.com/watch?v=XtX1zv9CEVc"
6}

Frame.io権限モデル

カスタムアクションには特別な権限モデルがあります。これらはアカウント上の特定のユーザーではなく、Workspaceに属します。つまり:

作成と管理
  • すべての管理者がWorkspace上でカスタムアクションを作成できます。

  • すべての管理者がチーム上に存在するカスタムアクションを変更または削除できます。

ライブ更新
  • 変更されると、すべてのユーザーは変更の結果を即座に確認できます。

セキュリティと検証

デフォルトで、すべてのカスタムアクションは作成時に生成される署名キーを持ちます。これは設定できません。このキーは、リクエストがFrame.ioから発信されたことを検証するために使用できます。POSTリクエストには以下が含まれます:

名前説明
X-Frameio-Request-Timestampカスタムアクションがトリガーされた時刻。
X-Frameio-Signature計算された署名。
タイムスタンプ検証

タイムスタンプは、Frame.ioのネットワークから出る途中でリクエストが署名された時刻です。これはリプレイ攻撃を防ぐために使用できます。この時刻がローカル時刻の5分以内であることを検証することをお勧めします。

署名検証

署名は、カスタムアクションが最初に作成されたときに提供される署名キーを使用したHMAC SHA-256ハッシュです。

署名の検証

1

署名の抽出

HTTPヘッダーから署名を抽出します。

2

署名するメッセージを作成

バージョン、配信時間、リクエスト本文を組み合わせて署名するメッセージを作成しますv0:timestamp:body

3

HMAC SHA256を計算

署名シークレットを使用してHMAC SHA256署名を計算します。

4

署名を比較

計算した署名と提供された署名を比較してください!

提供された署名にはv0=の接頭辞が付いています。現在Frame.ioではリクエストの署名にはこのバージョンのみを使用しています。計算した署名にこの接頭辞を追加する必要があります。

Python
1import hmac
2import hashlib
3
4def verify_signature(curr_time, req_time, signature, body, secret):
5 """
6 Verify webhook/custom action signature
7 :Args:
8 curr_time (float): Current epoch time
9 req_time (float): Request epoch time
10 signature (str): Signature provided by the frame.io API for the given request
11 body (str): Custom Action body from the received POST
12 secret (str): The secret for this Custom Action that you saved when you first created it
13 """
14 if int(curr_time) - int(req_time) < 500:
15 message = 'v0:{}:{}'.format(req_time, body)
16 calculated_signature = 'v0={}'.format(hmac.new(
17 bytes(secret, 'latin-1'),
18 msg=bytes(message, 'latin-1'),
19 digestmod=hashlib.sha256).hexdigest())
20 if calculated_signature == signature:
21 return True
22 return False

フィードバック

Frame.io V4でアクションを使用したい方法について、デベロッパーやエンドユーザーからご意見をお聞かせください。優先順位を決定するために、質問、アイデア、ユースケースをお聞かせください