ナビゲーションにスキップ

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

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


クイックスタート

import os
from frameio import Frameio
from frameio.files import FileCreateLocalUploadParamsData
from frameio.upload import FrameioUploader
client = Frameio(token="YOUR_TOKEN")
file_path = "/path/to/video.mp4"
file_size = os.path.getsize(file_path)
# 1. Create the file resource and get pre-signed upload URLs
response = client.files.create_local_upload(
account_id="YOUR_ACCOUNT_ID",
folder_id="YOUR_FOLDER_ID",
data=FileCreateLocalUploadParamsData(
name="video.mp4",
file_size=file_size,
),
)
# 2. Upload the file to S3
with open(file_path, "rb") as f:
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コールバックを使用してアップロードの進行状況をトラッキングします:

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

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

リッチプログレスバー

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

from rich.progress import Progress, BarColumn, DownloadColumn, TransferSpeedColumn, TimeRemainingColumn
with Progress(
"[progress.description]{task.description}",
BarColumn(),
DownloadColumn(),
TransferSpeedColumn(),
TimeRemainingColumn(),
) as progress:
task = progress.add_task("Uploading...", total=file_size)
with open(file_path, "rb") as f:
FrameioUploader(
response.data, f,
on_progress=lambda done, total: progress.update(task, completed=done),
).upload()

設定

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

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

完全な例

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

import os
from frameio import Frameio
from frameio.auth import ServerToServerAuth
from frameio.files import FileCreateLocalUploadParamsData
from frameio.upload import FrameioUploader
# Authenticate
auth = ServerToServerAuth(
client_id="YOUR_CLIENT_ID",
client_secret="YOUR_CLIENT_SECRET",
)
client = Frameio(token=auth.get_token)
# Prepare the file
file_path = "/path/to/video.mp4"
file_name = os.path.basename(file_path)
file_size = os.path.getsize(file_path)
# Create the file resource
response = client.files.create_local_upload(
account_id="YOUR_ACCOUNT_ID",
folder_id="YOUR_FOLDER_ID",
data=FileCreateLocalUploadParamsData(
name=file_name,
file_size=file_size,
),
)
print(f"Uploading {file_name} ({file_size:,} bytes) in {len(response.data.upload_urls)} chunks...")
# Upload with progress
def on_progress(uploaded: int, total: int) -> None:
print(f"\r{uploaded / total:.0%}", end="", flush=True)
with open(file_path, "rb") as f:
FrameioUploader(response.data, f, on_progress=on_progress).upload()
print(f"\nDone! View at: {response.data.view_url}")

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


リモートアップロード

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

from frameio.files import FileCreateRemoteUploadParamsData
response = client.files.create_remote_upload(
account_id="YOUR_ACCOUNT_ID",
folder_id="YOUR_FOLDER_ID",
data=FileCreateRemoteUploadParamsData(
name="video.mp4",
source_url="https://example.com/video.mp4",
),
)
print(f"File created: {response.data.id}")

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


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

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

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