camstream/classes/handler.py

66 lines
1.7 KiB
Python
Raw Permalink Normal View History

2022-02-20 16:21:11 +00:00
from http.server import BaseHTTPRequestHandler
from urllib.request import urlopen, urlcleanup
2022-02-20 16:21:11 +00:00
from urllib.error import URLError
from socket import error, timeout
from io import BytesIO
from time import sleep
from classes.image import Image
from static import START_HEADERS, PART_BOUNDARY
class ImageHandler(BaseHTTPRequestHandler):
def __init__(self, source, fallback, *args, **kwargs):
self.source_image = source
self.fallback_image = fallback
super().__init__(*args, **kwargs)
def get_next_image(self):
try:
bfr = BytesIO()
urlcleanup()
2022-02-20 16:21:11 +00:00
src = urlopen(self.source_image).read()
bfr.write(src)
bfr.seek(0)
img = Image.open(bfr)
except:
with open(self.fallback_image, "rb") as infile:
bfr = BytesIO()
src = infile.read()
bfr.write(src)
bfr.seek(0)
img = Image.open(bfr)
return img
def send_image(self, image=None):
image = image or self.get_next_image()
self.end_headers()
self.wfile.write(PART_BOUNDARY.encode("utf-8"))
self.end_headers()
data, headers = image.prepare_sending()
for key, value in headers.items():
self.send_header(key, value)
self.end_headers()
self.wfile.write(data)
def do_GET(self):
if not self.path == "/":
self.send_response_only(404)
return
self.send_response(200)
for key, value in START_HEADERS.items():
self.send_header(key, value)
try:
while True:
self.send_image()
sleep(5)
except:
pass