maps.chandlerswift.com/layers/dot-cams/de/get_data.py

79 lines
2.2 KiB
Python
Executable File

#!/usr/bin/python3
import requests
import json
cameras = []
res = requests.get("https://tmc.deldot.gov/json/videocamera.json")
res.raise_for_status()
# {
# "timestamp": "2024-02-03T09:00:50Z",
# "timestampMS": "1706950850013",
# "version": "1.1",
# "uid": "-8569684966613574390",
# "status": "normal",
# "message": "",
# "cameraCount": 282,
# "cameraHash": "-1859423038",
# "videoCameras": [
# {
# "urls": {
# "rtmp": "rtmpt://167.21.72.35:80/live/KCAM001.stream",
# "rtsp": "rtsp://167.21.72.35:554/live/KCAM001.stream",
# "f4m": "http://167.21.72.35:1935/live/KCAM001.stream/manifest.f4m",
# "m3u8": "http://167.21.72.35:1935/live/KCAM001.stream/playlist.m3u8",
# "m3u8s": "https://video.deldot.gov:443/live/KCAM001.stream/playlist.m3u8",
# "mssmooth": "http://167.21.72.35:1935/live/KCAM001.stream/Manifest"
# },
# "id": "KCAM001",
# "title": "DE 1 @ MILFORD NECK ROAD (NORTH OFF)",
# "county": "Kent",
# "lat": 38.990771,
# "lon": -75.448487,
# "hash": "966393601",
# "enabled": true
# },
# ...
for c in res.json()['videoCameras']:
try:
if not c['enabled']:
print("warn: camera disabled; ignoring:", c)
continue
if not c['urls']['m3u8s'].startswith('https://'):
raise Exception("invalid hlsUrl")
cameras.append({
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [c['lon'], c['lat']], # yes, [lon, lat] since it's [x, y]
},
"properties": {
"name": c['title'],
"views": [
{
'hasVideo': True,
'src': c['urls']['m3u8s'],
},
# {
# 'hasVideo': False,
# 'src': c['imageUrl'],
# }
]
},
})
except Exception as e:
print(c)
raise e
geojson = {
"type": "FeatureCollection",
"features": cameras,
}
with open("data.geojson", "w") as f:
f.write(json.dumps(geojson))
print(f"{len(cameras)} locations found")