Files
wiki/skills/youtube-search/scripts/youtube_search.py
2026-04-12 21:55:33 +03:00

78 lines
2.3 KiB
Python

#!/usr/bin/env python3
"""YouTube Data API v3 — search and video info."""
import os
import sys
import json
import urllib.request
import urllib.parse
API_KEY = os.environ.get("YOUTUBE_API_KEY") or ""
BASE = "https://www.googleapis.com/youtube/v3"
def search(query: str, max_results: int = 5, lang: str = "ru") -> list[dict]:
params = urllib.parse.urlencode({
"part": "snippet",
"q": query,
"maxResults": max_results,
"key": API_KEY,
"relevanceLanguage": lang,
"type": "video",
})
url = f"{BASE}/search?{params}"
with urllib.request.urlopen(url) as r:
data = json.loads(r.read())
results = []
for item in data.get("items", []):
s = item["snippet"]
vid_id = item["id"]["videoId"]
results.append({
"title": s["title"],
"channel": s["channelTitle"],
"published": s["publishedAt"][:10],
"description": s["description"][:200],
"url": f"https://www.youtube.com/watch?v={vid_id}",
"video_id": vid_id,
})
return results
def video_info(video_id: str) -> dict:
params = urllib.parse.urlencode({
"part": "snippet,statistics,contentDetails",
"id": video_id,
"key": API_KEY,
})
url = f"{BASE}/videos?{params}"
with urllib.request.urlopen(url) as r:
data = json.loads(r.read())
items = data.get("items", [])
if not items:
return {}
item = items[0]
s = item["snippet"]
stats = item.get("statistics", {})
return {
"title": s["title"],
"channel": s["channelTitle"],
"published": s["publishedAt"][:10],
"description": s["description"],
"views": stats.get("viewCount", "?"),
"likes": stats.get("likeCount", "?"),
"duration": item["contentDetails"]["duration"],
"url": f"https://www.youtube.com/watch?v={video_id}",
}
if __name__ == "__main__":
cmd = sys.argv[1] if len(sys.argv) > 1 else "search"
if cmd == "search":
query = sys.argv[2] if len(sys.argv) > 2 else "OpenClaw AI"
results = search(query)
print(json.dumps(results, ensure_ascii=False, indent=2))
elif cmd == "info":
vid_id = sys.argv[2]
info = video_info(vid_id)
print(json.dumps(info, ensure_ascii=False, indent=2))