FFHub SDK コード例

FFHub API を各種言語で利用するコード例(Node.js、Python、cURL、Webhook)。

FFHub はシンプルな REST API を提供します。主要な言語のコード例を以下に示します。

-i の入力はすべて公開された http/https URL である必要があります。API はお使いのマシン上のファイルを読み取れません。ソースファイルがローカルにある場合は、本ページ末尾の ファイルアップロードの流れ で先にアップロードしてください。

Node.js / JavaScript

const response = await fetch('https://api.ffhub.io/v1/tasks', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    command: 'ffmpeg -i https://storage.ffhub.io/sample.mp4 -c:v libx264 -crf 28 output.mp4'
  })
});
const { task_id } = await response.json();

// Poll for completion
const checkStatus = async (taskId) => {
  const res = await fetch(`https://api.ffhub.io/v1/tasks/${taskId}`, {
    headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
  });
  return res.json();
};

Python

import requests

response = requests.post(
    'https://api.ffhub.io/v1/tasks',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={'command': 'ffmpeg -i https://storage.ffhub.io/sample.mp4 -c:v libx264 -crf 28 output.mp4'}
)
task_id = response.json()['task_id']

# Poll for completion
def check_status(task_id):
    res = requests.get(
        f'https://api.ffhub.io/v1/tasks/{task_id}',
        headers={'Authorization': 'Bearer YOUR_API_KEY'}
    )
    return res.json()

cURL

curl -X POST https://api.ffhub.io/v1/tasks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"command": "ffmpeg -i https://storage.ffhub.io/sample.mp4 -c:v libx264 output.mp4"}'

ステータスの確認:

curl https://api.ffhub.io/v1/tasks/TASK_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

Webhook コールバック

ポーリングの代わりに、webhook URL を指定すると完了時に通知を受け取れます:

const response = await fetch('https://api.ffhub.io/v1/tasks', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    command: 'ffmpeg -i https://storage.ffhub.io/sample.mp4 -c:v libx264 -crf 28 output.mp4',
    webhook: 'https://your-server.com/api/ffhub-callback'
  })
});

タスク完了時、FFHub は指定の webhook URL に POST リクエストでタスク結果を送信します:

{
  "event_id": "task_abc123",
  "type": "task.succeeded",
  "created_at": "2026-09-17T12:00:00Z",
  "data": {
    "task_id": "task_abc123",
    "status": "succeeded",
    "progress": 100,
    "outputs": [
      {
        "filename": "output.mp4",
        "url": "https://storage.ffhub.io/outputs/task_abc123/output.mp4",
        "size": 10485760
      }
    ],
    "error": "",
    "created_at": "2026-09-17T11:59:00Z",
    "finished_at": "2026-09-17T12:00:00Z"
  }
}

タスク失敗時も構造は同じで、type は task.failed、理由は data.error に入ります。

ファイルアップロードの流れ

ソースファイルがローカルにある場合は、まず FFHub Storage にアップロードします。署名 URL を取得 → PUT → 返ってきた公開 URL を FFmpeg コマンドで使います。ファイルはストレージに直接送られ、API を経由しません。

Step 1: 署名 URL を取得

const signRes = await fetch('https://api.ffhub.io/v1/uploads/sign', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    filename: 'input.mp4',
    size: file.size,
    content_type: 'video/mp4'
  })
});
const { upload_url, public_url } = await signRes.json();

Step 2: ストレージへ直接 PUT

const putRes = await fetch(upload_url, {
  method: 'PUT',
  headers: { 'Content-Type': 'video/mp4' },
  body: file
});
if (!putRes.ok) throw new Error(`Upload failed: ${putRes.status}`);

Content-Type は署名時の content_type と一致させてください。一致しないとストレージが署名を拒否します。署名 URL の有効期限は 15 分です。

Step 3: 公開 URL をコマンドで使う

const taskRes = await fetch('https://api.ffhub.io/v1/tasks', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    command: `ffmpeg -i ${public_url} -c:v libx264 -crf 28 output.mp4`
  })
});