import asyncio
import aiohttp
import aiofiles
import logging, coloredlogs
from py2Lib import bit
from datetime import datetime
from os import path, listdir, remove
# Open the config file and make it accessible via "cfg"
import json
with open("conf.json", "r") as file:
cfg = json.load(file)
l = logging.getLogger(__name__)
coloredlogs.install(level="DEBUG")
async def getValidTimestamps(radarType:str) -> list:
times = []
maxImages = 0
url = None
series = None
async with aiohttp.ClientSession() as s:
if (radarType == "satrad"):
maxImages = 12
url = "https://api.weather.com/v3/TileServer/series/productSet?apiKey=" + cfg["twcApiKey"] + "&filter=satrad"
series = 'satrad'
elif (radarType == "radarmosaic"):
maxImages = 36
url = "https://api.weather.com/v3/TileServer/series/productSet?apiKey=" + cfg["twcApiKey"] + "&filter=twcRadarMosaic"
series = 'twcRadarMosaic'
else:
l.error(f'Invalid series filter "{radarType}" -- Valid filters include "satrad", "radarmosaic"')
return times
async with s.get(url) as r:
res = await r.json()
for t in range(0, len(res['seriesInfo'][series]['series'])):
if (t <= (maxImages - 1)):
time = res['seriesInfo'][series]['series'][t]['ts']
times.append(time)
return times
async def downloadRadarFrames(radarType:str, timestamps: list) -> list:
url_root = None
imagesToSend = []
if (radarType == "satrad"):
url_root = cfg["radarBaseUrl"]
elif (radarType == "radarmosaic"):
url_root = cfg["radarBaseUrl"]
else:
l.error(f'Invalid radar type "{radarType}" -- Valid radar types include "satrad", "radarmosaic"')
return
# Clear out expired radar frames
for i in listdir(f'.temp/output/{radarType}'):
if i.split('.')[0] not in [str(x) for x in timestamps] and i != "Thumbs.db":
l.debug(f"Deleting {i} as it is no longer valid.")
remove(f".temp/output/{radarType}/" + i)
async with aiohttp.ClientSession() as s:
for ts in timestamps:
if path.exists(f".temp/output/{radarType}/{ts}.tiff"):
l.debug(f"{radarType}/{ts}.tiff exists, skipping.")
continue
async with s.get(url_root + f"{ts}.tiff") as r:
l.info(f"Downloading {radarType} frame {timestamps.index(ts) + 1} / {len(timestamps)}")
if r.status == 404:
l.warning(f"Failed to download {radarType}/{ts}.tiff -- Server likely has not generated this frame yet.")
continue
f = await aiofiles.open(f'.temp/output/{radarType}/{ts}.tiff', mode='wb')
await f.write(await r.read())
await f.close()
imagesToSend.append(f'.temp/output/{radarType}/{ts}.tiff')
return imagesToSend
def getTime(timestamp) -> str:
time:datetime = datetime.utcfromtimestamp(timestamp).strftime("%m/%d/%Y %H:%M:%S")
return str(time)
async def collect(radarType: str):
loop = asyncio.get_running_loop()
ts = await getValidTimestamps(radarType)
frames = await downloadRadarFrames(radarType, ts)
commands = []
for i in range(0, len(frames)):
if radarType == "radarmosaic":
commands.append( '' )
if radarType == "satrad":
commands.append( '' )
bit.sendFile([frames[i]], [commands[i]], 1, 0)