Frame.io Python SDK — アップロードガイド

このガイドでは、Frame.io Python SDKframeio)を使用してFrame.ioにファイルをアップロードする方法について説明します。SDKは、事前署名されたURLを介してS3へのチャンク化されたマルチパートアップロードを処理し、並列サブ、自動再試行、およびオプションの進行状況トラッキングを提供します。一般的なアップロードAPIの概念(アップロードURL、ヘッダー、チャンク化)については、ローカル&リモートアップロードの仕組みを参照してください。---


クイックスタート

1import os
2from frameio import Frameio
3from frameio.files import FileCreateLocalUploadParamsData
4from frameio.upload import FrameioUploader
5
6client = Frameio(token="YOUR_TOKEN")
7
8file_path = "/path/to/video.mp4"
9file_size = os.path.getsize(file_path)
10
11# 1. Create the file resource and get pre-signed upload URLs
12response = client.files.create_local_upload(
13 account_id="YOUR_ACCOUNT_ID",
14 folder_id="YOUR_FOLDER_ID",
15 data=FileCreateLocalUploadParamsData(
16 name="video.mp4",
17 file_size=file_size,
18 ),
19)
20
21# 2. Upload the file to S3
22with open(file_path, "rb") as f:
23 FrameioUploader(response.data, f).upload()

これで完了です。 SDKは、APIから返されたアップロードURLに基づいてファイルをチャンクに分割し、並列でアップロードし、自動的に再試行を処理します。


活用方法

これには2段階の手順が必要です。

1

ファイルリソースを作成

client.files.create_local_upload()をファイル名とサイズで呼び出します。APIはプレースホルダーファイルを作成し、事前署名されたS3 PUT URLを返します — チャンクごとに1つ。URLの数(したがってチャンクの数)は、ファイルサイズによって決まります。

2

S3にアップロード

FrameioUploaderは応答からアップロードURLを読み取り、ファイルを対応するチャンクに分割し、スレッドプールを使用して各チャンクを並列でそのURLにPUTします。各リクエストには、必要なx-amz-acl: privateおよびContent-Typeヘッダーが含まれます。

アップロードはアプリケーションからS3に直接行われ、Frame.io APIサーバーを通過しません。これは、YouTube、Vimeo、Dropboxなどのサービスが大きなファイルのアップロードに使用するのと同じパターンです。


FrameioUploaderの使用

FrameioUploaderは、ファイルをアップロードする推奨方法です。低レベルのチャンク化アップローダーをラップし、すべての詳細を処理します — API応答からのアップロードURLの抽出、必要なヘッダーの設定、ファイルのチャンク化、並列アップロード。

進捗管理

on_progressコールバックを使用してアップロードの進行状況をトラッキングします:

1def on_progress(bytes_uploaded: int, total_bytes: int) -> None:
2 pct = bytes_uploaded / total_bytes * 100
3 print(f"\r{pct:.1f}% ({bytes_uploaded:,} / {total_bytes:,} bytes)", end="", flush=True)
4
5with open(file_path, "rb") as f:
6 FrameioUploader(response.data, f, on_progress=on_progress).upload()
7
8print("\nUpload complete!")

コールバックは各チャンクの完了後に一度呼び出され、これまでにアップロードされた累積バイト数と総ファイルサイズが渡されます。

リッチプログレスバー

洗練されたターミナルエクスペリエンスには、Richを使用します:

1from rich.progress import Progress, BarColumn, DownloadColumn, TransferSpeedColumn, TimeRemainingColumn
2
3with Progress(
4 "[progress.description]{task.description}",
5 BarColumn(),
6 DownloadColumn(),
7 TransferSpeedColumn(),
8 TimeRemainingColumn(),
9) as progress:
10 task = progress.add_task("Uploading...", total=file_size)
11
12 with open(file_path, "rb") as f:
13 FrameioUploader(
14 response.data, f,
15 on_progress=lambda done, total: progress.update(task, completed=done),
16 ).upload()

設定

FrameioUploaderはいくつかのオプションパラメータを受け入れます:

パラメータDefault説明
5同時アップロードスレッド数
headers{"x-amz-acl": "private"}すべてのS3 PUT リクエストで送信されるヘッダー。カスタムヘッダーはデフォルトとマージされます。
3チャンクごとの再試行回数(指数バックオフ:1秒、2秒、4秒、…)
on_progressなし各チャンク後に発生するコールバック(bytes_uploaded, total_bytes)
1with open(file_path, "rb") as f:
2 FrameioUploader(
3 response.data,
4 f,
5 max_workers=10, # more parallelism for high-bandwidth connections
6 max_retries=5, # more resilient on flaky networks
7 on_progress=on_progress,
8 ).upload()

完全な例

認証、アップロード、進行状況トラッキングを含む完全な例:

1import os
2from frameio import Frameio
3from frameio.auth import ServerToServerAuth
4from frameio.files import FileCreateLocalUploadParamsData
5from frameio.upload import FrameioUploader
6
7# Authenticate
8auth = ServerToServerAuth(
9 client_id="YOUR_CLIENT_ID",
10 client_secret="YOUR_CLIENT_SECRET",
11)
12client = Frameio(token=auth.get_token)
13
14# Prepare the file
15file_path = "/path/to/video.mp4"
16file_name = os.path.basename(file_path)
17file_size = os.path.getsize(file_path)
18
19# Create the file resource
20response = client.files.create_local_upload(
21 account_id="YOUR_ACCOUNT_ID",
22 folder_id="YOUR_FOLDER_ID",
23 data=FileCreateLocalUploadParamsData(
24 name=file_name,
25 file_size=file_size,
26 ),
27)
28
29print(f"Uploading {file_name} ({file_size:,} bytes) in {len(response.data.upload_urls)} chunks...")
30
31# Upload with progress
32def on_progress(uploaded: int, total: int) -> None:
33 print(f"\r{uploaded / total:.0%}", end="", flush=True)
34
35with open(file_path, "rb") as f:
36 FrameioUploader(response.data, f, on_progress=on_progress).upload()
37
38print(f"\nDone! View at: {response.data.view_url}")

アップロード処理を完全にコントロールする必要がある場合(例:チャンクを手動で処理する、非同期パイプラインと統合する、再試行ロジックをカスタマイズするなど)は、ローカル&リモートアップロードの仕組みで生のAPIフローとスタンドアロンPythonスクリプトの例を参照してください。


リモートアップロード

ファイルが既にパブリックURLでアクセス可能な場合は、代わりにリモートアップロードを使用してください。チャンクは不要です — Frame.ioがファイルを直接取得します:

1from frameio.files import FileCreateRemoteUploadParamsData
2
3response = client.files.create_remote_upload(
4 account_id="YOUR_ACCOUNT_ID",
5 folder_id="YOUR_FOLDER_ID",
6 data=FileCreateRemoteUploadParamsData(
7 name="video.mp4",
8 source_url="https://example.com/video.mp4",
9 ),
10)
11print(f"File created: {response.data.id}")

リモートアップロードには現在50 GBのファイルサイズ制限があります。50 GBを超えるファイルの場合は、代わりにローカルアップロードを使用してください。


アップロードステータスの確認

アップロード後、ファイルが受信されたことを確認できます:

1status = client.files.show_file_upload_status(
2 account_id="YOUR_ACCOUNT_ID",
3 file_id=response.data.id,
4)
5print(f"Upload complete: {status.data.upload_complete}")