Files
t-youtube/scripts/tg_digest.py
T

70 lines
2.7 KiB
Python
Executable File

#!/usr/bin/env python3
"""t-youtube daily Telegram digest"""
import os, json, sys, urllib.request
from datetime import datetime, timezone
BASE_URL = os.environ.get("TY_API_URL", "http://100.78.131.124:8001")
CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID", "-5339190164")
BOT_TOKEN = '8841984381:AAFi12xu4Dj0pDrt7eyBn5Qq6HxhSsi2eEY'
def fetch():
url = BASE_URL + "/api/videos?since=" + datetime.now(timezone.utc).strftime("%Y-%m-%d")
try:
req = urllib.request.Request(url)
with urllib.request.urlopen(req, timeout=15) as resp:
data = json.loads(resp.read().decode())
return data if isinstance(data, list) else data.get("videos", data.get("items", []))
except Exception as e:
print(f"[tg_digest] fetch error: {e}", file=sys.stderr)
return []
def digest(videos):
if not videos:
return chr(0x1f4ed) + " No new videos today."
channels = {}
for v in videos:
ch = v.get("channel", v.get("channel_name", "Unknown"))
channels.setdefault(ch, []).append(v)
now = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC")
header = chr(0x1f4fa) + " **YouTube Digest** _" + now + "_"
total, nch = len(videos), len(channels)
items = []
for cname, cvids in sorted(channels.items()):
titles = [v.get("title", "")[:40] for v in cvids[:3]]
line = "**" + cname + "** (" + str(len(cvids)) + "): " + "; ".join(titles)
if len(cvids) > 3:
line += " +" + str(len(cvids)-3) + " more"
items.append(line)
result = header + chr(10) + chr(10) + chr(10).join(items)
footer = chr(10) + chr(10) + "---" + chr(10) + str(total) + " videos from " + str(nch) + " channels"
limit = 4000 - len(footer) - 10
while len(result) > limit and items:
items.pop()
result = header + chr(10) + chr(10) + chr(10).join(items)
return result + footer
def send(text):
url = "https://api.telegram.org/bot" + BOT_TOKEN + "/sendMessage"
body = json.dumps({"chat_id": CHAT_ID, "text": text, "parse_mode": "Markdown", "disable_web_page_preview": False}).encode()
try:
req = urllib.request.Request(url, data=body, headers={"Content-Type": "application/json"})
with urllib.request.urlopen(req, timeout=30) as resp:
r = json.loads(resp.read().decode())
if r.get("ok"):
print("[tg_digest] Sent to " + CHAT_ID)
return True
print(f"[tg_digest] API error: {r}", file=sys.stderr)
return False
except Exception as e:
print(f"[tg_digest] send error: {e}", file=sys.stderr)
return False
def main():
v = fetch()
d = digest(v)
print(d)
send(d)
if __name__ == "__main__":
main()