コンテンツにスキップ

概要

YouTube、Twitch、TwitCasting をまたいだライブ配信データを集約するアプリケーションを構築するには、3つのまったく異なるAPI — 認証方式、レート制限モデル、データ形式、URL構造がすべて異なる — を扱う必要があります。

YouTube Data API v3Twitch Helix APITwitCasting API v2
認証APIキー(クエリパラメータ)OAuth2 Client CredentialsBasic Auth(base64)
レート制限クォータベース(10,000ユニット/日)トークンバケット(ヘッダー駆動)トークンバケット(60リクエスト/60秒)
コストモデルエンドポイント毎のコスト(1〜100ユニット)定額(1リクエスト = 1トークン)定額(1リクエスト = 1トークン)
配信 vs. アーカイブ同一の動画ID異なる動画ID同一のムービーID
チャンネルIDUC... プレフィックス、@handleログイン名ユーザーID
  • YouTubeのクォータ — 日次10,000ユニットのクォータはすぐに消費されます。search.list 1回で100ユニット。ローカルでの追跡がなければ、日中にサイレントな403エラーが発生します。
  • TwitchのOAuth — トークンには有効期限があり、期限前にリフレッシュが必要です。リフレッシュを見逃すと本番環境で401エラーになります。
  • TwitCastingのレート制限 — 1分間に60リクエストのみ。適切なトークンバケットがなければ、中程度の負荷でも429エラーに遭遇します。
  • 異なるデータモデル — YouTubeの「動画」、Twitchの「VOD」、TwitCastingの「ムービー」は概念的には同じものですが、JSON構造とフィールド名がまったく異なります。
import { UnifiedClient } from "@unified-live/core";
import { createYouTubePlugin } from "@unified-live/youtube";
import { createTwitchPlugin } from "@unified-live/twitch";
import { createTwitCastingPlugin } from "@unified-live/twitcasting";
const client = UnifiedClient.create({
plugins: [
createYouTubePlugin({ apiKey: process.env.YOUTUBE_API_KEY! }),
createTwitchPlugin({
clientId: process.env.TWITCH_CLIENT_ID!,
clientSecret: process.env.TWITCH_CLIENT_SECRET!,
}),
createTwitCastingPlugin({
clientId: process.env.TWITCASTING_CLIENT_ID!,
clientSecret: process.env.TWITCASTING_CLIENT_SECRET!,
}),
],
});
// 1つのインターフェース — SDKが認証、レート制限、データ正規化を処理
const yt = await client.resolve("https://www.youtube.com/watch?v=abc123");
const tw = await client.resolve("https://www.twitch.tv/videos/123456");
const tc = await client.resolve("https://twitcasting.tv/user/movie/789");
// すべて同じ Content 型で返される
console.log(yt.title); // string
console.log(tw.platform); // "twitch"
console.log(tc.type); // "broadcast" | "archive"
関心事unified-live の処理方法
認証APIキー注入(YouTube)、OAuth2自動リフレッシュ(Twitch)、Basic Auth エンコード(TwitCasting)
レート制限QuotaExhaustedError 付きローカルクォータ追跡(YouTube)、ヘッダー解析付きトークンバケット(Twitch)、固定トークンバケット(TwitCasting)
リトライ429/5xx に対する指数バックオフ、401 でのトークンリフレッシュ
データ正規化すべてのプラットフォームを統一された ContentChannelBroadcastArchive 型にマッピング
URL解決URLからプラットフォームを自動検出、プラットフォーム毎に複数のURL形式をサポート
オブザーバビリティすべてのAPIコールに対するOpenTelemetryスパンとメトリクス(OTel未設定時はオーバーヘッドゼロ)
機能YouTubeTwitchTwitCasting
URL からコンテンツ取得対応対応対応
ID からコンテンツ取得対応対応対応
ライブ配信一覧対応対応対応
アーカイブ一覧(ページネーション)対応対応対応
チャンネル情報取得対応対応対応
アーカイブ解決対応対応対応
検索対応対応対応
クリップ非対応対応非対応
コンテンツ一括取得対応対応対応*
配信一括取得対応*対応対応*
チャンネル一括取得対応対応*対応*
クリップ一括取得非対応対応非対応
クロスプラットフォーム配信取得対応対応対応
クロスプラットフォーム検索対応対応対応
OpenTelemetry トレース & メトリクス対応対応対応

* バッチAPIがないプラットフォームでは、1件ずつリクエストして同等の結果を返します