aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/misc/streammon.py
blob: 8f52bb466108ced806af9dba02e65d05946bc62e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python3
# monitor stream APIs for any changes, so I can check they don't break anything
# run via cronjob every now and then

import difflib
import os
import sys
import xml.etree.ElementTree as ET
from datetime import datetime

import requests

s = requests.Session()

DISCORD_WEBHOOK = "PUT WEBHOOK HERE"
STREAMS_API = "https://radiko.jp/v3/station/stream/{device}/{station}.xml"

if len(sys.argv) > 1:
	PATH = sys.argv[1]
else:
	PATH = ""

devices = ('pc_html5', 'aSmartPhone7a', 'aSmartPhone8')
stations = ('FMT', 'CCL', 'NORTHWAVE', 'TBS')

def format_xml(txt):
	root = ET.fromstring(txt)
	res = ""
	for el in root.findall("url"):
		res += el.find("playlist_create_url").text
		for k, v in el.attrib.items():
			res += f" {k}:{v}"

		res += "\n"
	return res

for device in devices:
	for station in stations:
		url = STREAMS_API.format(device=device, station=station)
		now_response = s.get(url)
		now = now_response.text
		now_modified = now_response.headers["last-modified"]
		now_datetime = datetime.strptime(now_modified, "%a, %d %b %Y %H:%M:%S %Z")


		filename = f"{PATH}{station}-{device}.xml"
		with open(filename, "a+") as f:
			f.seek(0)
			past = f.read()

			modtime = datetime.fromtimestamp(os.path.getmtime(filename))
			diff = difflib.unified_diff(
				format_xml(past).splitlines(), format_xml(now).splitlines(),
				fromfile=url, tofile=url,
				fromfiledate=str(modtime), tofiledate=str(now_datetime.now()),
			)

			diff_str = "\n".join(diff)
			if diff_str != "":
				f.truncate(0)
				f.write(now)

				s.post(DISCORD_WEBHOOK, json={
					"content": f"**Streams changed: {station} {device}**\n" + "\n".join(("```diff", diff_str, "```")),
				})
		os.utime(filename, (now_datetime.timestamp(), now_datetime.timestamp()))