chime/chime.py

58 lines
1.6 KiB
Python
Executable file

#!/usr/bin/env python3
import os
import pygame
from time import sleep
from datetime import datetime
from urllib import request
import json
import sys
try:
req = request.Request('http://imp.lan:8123/api/states/input_boolean.on_air')
req.add_header('Authorization', 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhZDVkZDNiNzYwODY0YThjODNmYTg4ZDNhYjc0NGEzOSIsImlhdCI6MTY1NjU4ODIyNCwiZXhwIjoxOTcxOTQ4MjI0fQ.YfH2ntUkLCqx9Fkr9SUi9H7jxBta3mamdU918RlDGfY')
r = request.urlopen(req)
data = json.loads(r.read())
if data["state"] == "on":
print("Currently On Air, won't chime.")
sys.exit(0)
except Exception as exc:
print(exc)
print("Failed to get On Air state, continuing...")
pass
dirname = os.path.dirname(os.path.realpath(__file__))
pygame.mixer.init(frequency=44100, size=-16, buffer=1024, channels=1)
high = pygame.mixer.Sound(f"{dirname}/high.wav")
low = pygame.mixer.Sound(f"{dirname}/low.wav")
off = pygame.mixer.Sound(f"{dirname}/off.wav")
sleep(1)
now = datetime.now()
if now.weekday() in (5,) and 1 < now.hour < 23:
off.play()
print("brng")
else:
hours = now.hour % 12
hours = 12 if hours == 0 else hours
closest_minutes = sorted([0, 15, 30, 45, 60], key=lambda p: abs(now.minute - p))[0]
closest_minutes = 60 if closest_minutes == 0 else closest_minutes
parts = [15, 30, 45, 60].index(closest_minutes) + 1
for i in range(parts):
high.play()
print("ding")
sleep(1)
if parts == 4:
sleep(2)
for i in range(hours):
low.play()
print("bong")
sleep(2)
sleep(5)