こんにちは!今回は、YouTube Data API v3 と Python の軽量Webフレームワーク Streamlit を使って、世界のサッカー動画のトレンドを一覧できるシンプルなWebアプリケーションを作ったのでご紹介します。
また、今回は環境を汚さない開発にこだわり、OSには NixOS を採用して nix-shell でクリーンな環境構築を行いました。
⚽ なぜ作ったのか?
日本のYouTubeを見ていると、どうしても日本語の動画や国内のトレンドが中心になりがちです。
しかし、「欧州チャンピオンズリーグの現地のリアルな反応は?」「南米で今バズっているスキル動画は?」といった世界のサッカーシーンの『今』を、言語の壁を越えてタイトルベースでざっくりと俯瞰したいと思い、このアプリを開発しました。
🌟 成果物(こんなアプリです)
サイドバーからYouTubeのAPIキーを入力し、検索キーワード(football、highlights、skills など)と並び順(関連度、最新順、視聴回数順)を選んでボタンを押すだけで、世界の動画タイトルが直リンク付きのリスト形式でズラリと列挙されます。

主な特徴:
- 世界仕様: 検索ワードをあえて海外基準(英語)に固定し、グローバルなトレンドをキャッチ。
- 安心設計: APIキーをコードに直接埋め込まず、画面から動的に入力するため安全
- 超軽量: わずか60行ほどのPythonコードで、フロントエンドからAPI連携まで完結。
🛠️ 技術スタック & 開発環境
- OS: NixOS
- Language: Python 3.x
- Framework: Streamlit
- API: YouTube Data API v3
NixOSの強みを活かし、グローバルな環境に pip install することなく、プロジェクト専用の一時的な環境を shell.nix で構築しました。
📦 開発環境の定義(shell.nix)
プロジェクトのルートに以下の shell.nix を作成し、nix-shell コマンドを叩くだけで必要な依存関係(Git、Streamlit、Google APIクライアント)がすべて揃うようにしています。
Nix
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = [
pkgs.git
(pkgs.python3.withPackages (ps: with ps; [
streamlit
google-api-python-client
]))
];
shellHook = ''
echo "⚽ Global Football Video Finder の開発環境へようこそ!"
'';
}
💻 アプリケーションのコード
メインのロジックである football-youtube.py の全容です。
Python
import streamlit as st
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
# ページの設定
st.set_page_config(page_title="Global Football Video Finder", page_icon="⚽")
st.title("⚽ 世界のYouTube サッカー動画タイトル収集アプリ")
st.write("YouTubeから「世界のサッカー動画」のタイトルをリアルタイムで取得し、リスト化します。")
# サイドバー設定
st.sidebar.header("🔧 設定")
api_key = st.sidebar.text_input("YouTube API Keyを入力してください", type="password")
query_options = {
"全般(Football)": "football",
"ハイライト(Highlights)": "football highlights",
"スキル(Skills)": "football skills",
"最新ニュース(News)": "football news"
}
selected_label = st.sidebar.selectbox("検索キーワード", list(query_options.keys()))
search_query = query_options[selected_label]
order_options = {"関連度順": "relevance", "最新順": "date", "視聴回数順": "viewCount"}
search_order = order_options[st.sidebar.selectbox("並び順", list(order_options.keys()))]
max_results = st.sidebar.slider("取得件数", 5, 50, 20)
# メイン処理
if st.button("動画タイトルを取得する"):
if not api_key:
st.error("🔑 サイドバーからYouTube API Keyを入力してください。")
else:
with st.spinner("YouTubeからデータを取得中..."):
try:
youtube = build("youtube", "v3", developerKey=api_key)
request = youtube.search().list(
q=search_query, part="snippet", type="video",
order=search_order, maxResults=max_results, safeSearch="moderate"
)
response = request.execute()
st.success(f"「{selected_label}」の動画タイトルを取得しました!")
st.write("---")
for index, item in enumerate(response.get("items", []), start=1):
video_title = item["snippet"]["title"]
video_id = item["id"]["videoId"]
video_url = f"https://www.youtube.com/watch?v={video_id}"
channel_title = item["snippet"]["channelTitle"]
st.markdown(f"**{index}. [{video_title}]({video_url})**")
st.caption(f"📺 チャンネル: {channel_title}")
except HttpError as e:
st.error(f"APIエラーが発生しました: {e}")
🚀 動かしてみる
使い方は至ってシンプルです。
- ターミナルで
nix-shellを実行して環境に入る - 以下のコマンドでStreamlitアプリを起動
Bash
streamlit run football-youtube.py
自動的にブラウザ(http://localhost:8501)が立ち上がります。Google Cloud Consoleで取得した無料の YouTube API Key をサイドバーに入力し、ボタンを押せば世界のサッカーシーンが箇条書きでリストアップされます!
💡 開発を通じて感じたこと
- Streamlitの爆速感: HTMLやCSS、JavaScriptを一切書かずに、Pythonだけでここまで実用的なUIが組めるのは本当に快適です。
- YouTube APIの仕様: 検索(
search.list)は1回につき100クォータ(ポイント)を消費します。無料枠は1日10,000クォータなので、個人で遊ぶ分(1日100回検索)には完全無料で運用できるのが嬉しいポイントでした。 - NixOSとの相性: プロジェクトごとにクリーンな環境を作れるNixOSと、サクッと作れるStreamlitの組み合わせは、ちょっとしたアイデアを形にするプロトタイピングに最強だと感じました。
📂 ソースコード
GitHubにコードと綺麗なREADMEを公開しています。もし興味があればクローンして触ってみてください!
👉 https://github.com/forestnote/football-youtube
最後までお読みいただきありがとうございました!⚽