78 lines
2.3 KiB
Python
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))
|