satnogs-demo-display/update.py

147 lines
4.3 KiB
Python
Raw Permalink Normal View History

2018-12-24 12:16:47 +01:00
#!/bin/env python3
import os
import requests
import pytz
from datetime import datetime, timedelta
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
from io import BytesIO
2023-12-26 20:17:06 +01:00
from geopy.geocoders import Nominatim
2018-12-24 12:16:47 +01:00
FONT_SIZE = 40
2023-12-26 20:17:06 +01:00
FONT_SIZE_SMALL = 20
2018-12-24 13:00:26 +01:00
TEXT_COLOR = (255, 255, 255, 255)
2023-12-13 18:53:53 +01:00
2018-12-24 13:00:26 +01:00
def invert_back_white(img):
pixels = img.load()
for y in range(img.size[1]):
for x in range(img.size[0]):
2023-12-13 18:53:53 +01:00
r, g, b, _ = pixels[x, y]
2018-12-24 13:00:26 +01:00
if abs(r - g) < 5 and abs(r - g) < 5 and abs(b - g) < 5:
2023-12-13 18:53:53 +01:00
pixels[x, y] = (255 - r, 255 - g, 255 - b, 255)
2018-12-24 13:00:26 +01:00
def scale_to_height(img, new_height):
width, height = img.size
2023-12-13 18:53:53 +01:00
new_width = int(new_height * width / height)
return img.resize((new_width, new_height))
2018-12-24 13:00:26 +01:00
def scale_to_width(img, new_width):
width, height = img.size
2023-12-13 18:53:53 +01:00
new_height = int(new_width * height / width)
return img.resize((new_width, new_height))
2018-12-24 13:00:26 +01:00
2018-12-24 12:16:47 +01:00
def main():
now = datetime.now(pytz.utc)
earlier = now - timedelta(hours=1)
2023-12-13 18:53:53 +01:00
params = {
'start': earlier.isoformat(),
'end': now.isoformat(),
'status': 'good',
}
resp = requests.get('https://network.satnogs.org/api/observations',
params=params)
2018-12-24 12:16:47 +01:00
obs = resp.json()
obs = reversed(sorted(obs, key=lambda x: x['end']))
for ob in obs:
2023-12-13 18:53:53 +01:00
if ob['waterfall'] is not None:
2018-12-24 12:16:47 +01:00
break
2023-12-13 18:53:53 +01:00
if ob['waterfall'] is None:
print("No observations with waterfall found")
2018-12-24 12:16:47 +01:00
return
2023-12-13 18:53:53 +01:00
resp = requests.get('https://db.satnogs.org/api/satellites/%s/' %
ob['norad_cat_id'])
2018-12-24 12:16:47 +01:00
sat_name = resp.json()['name']
2023-12-27 00:38:26 +01:00
sat_img_url = None
if 'image' in resp.json().keys():
sat_img_url = "https://db-satnogs.freetls.fastly.net/media/%s" % (
resp.json()['image'])
2018-12-24 12:16:47 +01:00
2023-12-26 20:17:06 +01:00
geolocator = Nominatim(
user_agent=
"satnogs-demo-display - https://forgejo.zenerdio.de/sebastian/satnogs-demo-display"
)
2019-12-27 03:06:12 +01:00
mode_desc = ob['transmitter_mode']
2023-12-26 19:30:53 +01:00
frequency = ob['observation_frequency'] / 1_000_000
2018-12-24 13:33:53 +01:00
2023-12-26 20:17:06 +01:00
coord = "%f, %f" % (ob['station_lat'], ob['station_lng'])
address = geolocator.reverse(coord, exactly_one=True,
language="en").raw['address']
city = address.get('city', '')
country = address.get('country', '')
station_location = ""
if city != "":
station_location += "near " + city + " "
if country != "":
station_location += "in " + country
2018-12-24 12:16:47 +01:00
resp = requests.get(ob['waterfall'])
2018-12-24 13:00:26 +01:00
waterfall = Image.open(BytesIO(resp.content)).convert('RGBA')
invert_back_white(waterfall)
2018-12-24 12:16:47 +01:00
2018-12-24 13:00:26 +01:00
waterfall = scale_to_height(waterfall, 1024)
water_width, _ = waterfall.size
2018-12-24 12:16:47 +01:00
2018-12-24 13:00:26 +01:00
logo = Image.open("satnogs-logo.png").convert('RGBA')
2018-12-24 12:16:47 +01:00
logo_w, logo_h = logo.size
2018-12-24 13:00:26 +01:00
invert_back_white(logo)
sat_img = None
2023-12-27 00:38:26 +01:00
if sat_img_url is not None:
2018-12-24 13:00:26 +01:00
resp = requests.get(sat_img_url)
2023-12-13 18:53:53 +01:00
sat_img_aplha = Image.open(BytesIO(resp.content)).convert('RGBA')
alpha_chan = sat_img_aplha.convert('RGBA').split()[-1]
2023-12-26 19:30:53 +01:00
sat_img = Image.new("RGBA", sat_img_aplha.size, (255, 255, 255, 255))
2023-12-13 18:53:53 +01:00
sat_img.paste(sat_img_aplha, mask=alpha_chan)
2023-12-26 20:57:31 +01:00
sat_img_width, sat_img_height = sat_img.size
if sat_img_width > sat_img_height:
sat_img = scale_to_width(sat_img, 500)
else:
sat_img = scale_to_height(sat_img, 500)
2018-12-24 12:16:47 +01:00
2023-12-13 18:53:53 +01:00
img = Image.new('RGBA', (1280, 1024))
2018-12-24 12:16:47 +01:00
draw = ImageDraw.Draw(img)
2018-12-24 13:00:26 +01:00
draw.rectangle((0, 0, 1280, 1024), fill=(0, 0, 0, 255))
2018-12-24 12:16:47 +01:00
2018-12-24 13:33:53 +01:00
station_name = ob['station_name']
if len(station_name) > 20:
station_name = station_name[:20] + "..."
2023-12-26 20:17:06 +01:00
infos = "Satellite: %s\nStation: %s\n%s\nMode: %s\nFrequency: %f MHz\nStart: %s\nEnd: %s" % (
sat_name, station_name, station_location, mode_desc, frequency,
ob['start'], ob['end'])
2018-12-24 12:16:47 +01:00
font = ImageFont.truetype("Montserrat-Regular.otf", FONT_SIZE)
2023-12-13 18:53:53 +01:00
draw.text((water_width + 100, logo_h + 50), infos, TEXT_COLOR, font=font)
2018-12-24 12:16:47 +01:00
img.paste(waterfall, (0, 0))
2018-12-24 13:00:26 +01:00
img.paste(logo, (water_width + 100, 20))
if sat_img != None:
2023-12-26 20:57:31 +01:00
img.paste(sat_img, (water_width + 100, 480))
2018-12-24 12:16:47 +01:00
2023-12-26 20:17:06 +01:00
font = ImageFont.truetype("Montserrat-Regular.otf", FONT_SIZE_SMALL)
draw.text((950, 1000), "Geocoding by Nominatim/OSM", TEXT_COLOR, font=font)
2018-12-24 12:16:47 +01:00
img.save('waterfall_tmp.png')
os.rename('waterfall_tmp.png', 'waterfall.png')
if __name__ == '__main__':
main()