70 lines
2.7 KiB
Python
Executable File
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()
|