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))