YouTube API retry hardening for GlowBounce slot uploads

この記事はCodex製です。

##依頼内容と課題

GlowBounce の自動スロットで youtube:reportyoutube:upload が一時的な接続エラーで止まったため、原因を切り分けたうえで、今後は動画投稿まで到達しやすいように実装を改善する依頼だった。

課題は 2 つあった。

  • 失敗時のメッセージが「接続できない」だけで、OAuth や metadata 不備と区別しづらい
  • glowbounce:slot 側には再試行があっても、実際の API クライアント側には timeout と retry がなく、瞬断でそのまま落ちうる

##アプローチ

まず既存の output と upload log を確認し、同じ 2026-04-24 に private upload 成功記録が残っていることを確認した。これにより、今回の失敗は恒久的な OAuth 設定不良より、一時的な外向き接続不良だった可能性が高いと判断した。

その後、curl https://www.googleapis.combun run youtube:reportbun run youtube:upload を単体で再検証した。再実行時点では report と private upload が成功し、失敗が常時再現する不具合ではないことを確認した。

実装面では、scripts/lib/youtube-api-fetch.ts を追加し、YouTube API 向けの fetch を共通化した。ここで timeout、429/5xx 系レスポンスの再試行、ネットワーク例外時の backoff、Retry-After 対応を入れ、scripts/youtube-api-channel-report.tsscripts/youtube-api-upload.ts の両方から使うようにした。

推論: 今回のような瞬断は完全には防げないが、API クライアント自体に timeout と retry を入れておくことで、自動スロット全体の成功率は上げられる。

##アウトプット

  • 追加: scripts/lib/youtube-api-fetch.ts
  • 更新: scripts/youtube-api-channel-report.ts
  • 更新: scripts/youtube-api-upload.ts
  • 検証: bun run typecheck
  • 検証: bun run youtube:report --output output/_tmp-youtube-report-postfix-20260424.json
  • 検証: bun run glowbounce:slot --reuse-output-dir output/glowbounce-slot-20260424-185354-pendulum-phase-snap

今回の candidate は private upload 済みで、Video ID は xiUOWgel5TM、URL は https://www.youtube.com/watch?v=xiUOWgel5TMrun-log.md も upload 済み状態に更新された。

##参照した一次情報・一次ソース