You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.7 KiB
44 lines
1.7 KiB
import aiohttp
|
|
from pymongo.asynchronous.database import AsyncDatabase
|
|
|
|
from logger import logger
|
|
from time import time
|
|
|
|
class TileManager:
|
|
domain = 'a.tile.openstreetmap.org'
|
|
format = "png"
|
|
|
|
def __init__(self, core):
|
|
self.core = core
|
|
self.dbStore:AsyncDatabase = self.core.dbStore
|
|
|
|
def generateHeaders(self):
|
|
return {
|
|
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
"Referer": "http://localhost:4200/",
|
|
"Accept": "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8"
|
|
}
|
|
|
|
async def grabTile(self, z:int, x:int, y:int):
|
|
#grab from db
|
|
collection = self.dbStore['openstreetmap']
|
|
query = {"x":x, "y":y, "z": z}
|
|
t = await collection.find_one(query)
|
|
if t:
|
|
return t["img"]
|
|
else:
|
|
#ищем картинку чтож поделать
|
|
url = f"https://{self.domain}/{z}/{x}/{y}.{self.format}"
|
|
async with aiohttp.ClientSession() as session:
|
|
async with session.get(url, ssl=False, headers=self.generateHeaders()) as resp:
|
|
# Read the entire response body as bytes
|
|
img = await resp.read()
|
|
#logger.info(url, resp.status)
|
|
if resp.status == 200:
|
|
query['ts'] = time()
|
|
query['img'] = img
|
|
query['format'] = self.format
|
|
await collection.insert_one(query)
|
|
return img
|
|
else:
|
|
raise Exception("cannot get img, code: " + str(resp.status))
|