Module genshinstats.map

The official genshin map

Gets data from the official genshin map such as categories, points and similar.

Expand source code Browse git
"""The official genshin map

Gets data from the official genshin map such as categories, points and similar.
"""
import json
from typing import Any, Dict, List
from urllib.parse import urljoin

from .caching import permanent_cache
from .genshinstats import fetch_endpoint

OS_MAP_URL = "https://api-os-takumi-static.hoyoverse.com/common/map_user/ys_obc/v1/map/"

__all__ = [
    "fetch_map_endpoint",
    "get_map_image",
    "get_map_icons",
    "get_map_labels",
    "get_map_locations",
    "get_map_points",
    "get_map_tile",
]


def fetch_map_endpoint(endpoint: str, **kwargs) -> Dict[str, Any]:
    """Fetch an enpoint from mihoyo's webstatic map api.

    Only currently liyue is supported.

    Takes in an endpoint url which is joined with the base url.
    A request is then sent and returns a parsed response.
    """
    kwargs.setdefault("params", {}).update({"map_id": 2, "app_sn": "ys_obc", "lang": "en-us"})
    url = urljoin(OS_MAP_URL, endpoint)
    return fetch_endpoint(url, cookie={}, **kwargs)


@permanent_cache()
def get_map_image() -> str:
    """Get the url to the entire map image"""
    data = fetch_map_endpoint("info")["info"]["detail"]
    return json.loads(data)["slices"][0][0]["url"]


@permanent_cache()
def get_map_icons() -> Dict[int, str]:
    """Get all icons for the map"""
    data = fetch_map_endpoint("spot_kind/get_icon_list")["icons"]
    return {i["id"]: i["url"] for i in data}


@permanent_cache()
def get_map_labels() -> List[Dict[str, Any]]:
    """Get labels and label categories"""
    return fetch_map_endpoint("label/tree")["tree"]


def get_map_locations() -> List[Dict[str, Any]]:
    """Get all locations on the map"""
    return fetch_map_endpoint("map_anchor/list")["list"]


def get_map_points() -> List[Dict[str, Any]]:
    """Get points on the map"""
    return fetch_map_endpoint("point/list")["point_list"]


def get_map_tile(
    x: int, y: int, width: int, height: int, resolution: int = 1, image: str = None
) -> str:
    """Gets a map tile at a position

    You may set an x, y, width and height of the resulting image
    however you shoudl prefer to use multiples of 256 because they are cached
    on the mihoyo servers.

    Resolution dictates the resolution of the image as a percentage. 100 is highest and 0 is lowest.
    You should pick values from 100, 50, 25 and 12.5
    """
    image = image or get_map_image()
    return (
        image
        + f"?x-oss-process=image/resize,p_{round(resolution)}/crop,x_{x},y_{y},w_{width},h_{height}"
    )

Functions

def fetch_map_endpoint(endpoint: str, **kwargs) ‑> Dict[str, Any]

Fetch an enpoint from mihoyo's webstatic map api.

Only currently liyue is supported.

Takes in an endpoint url which is joined with the base url. A request is then sent and returns a parsed response.

Expand source code Browse git
def fetch_map_endpoint(endpoint: str, **kwargs) -> Dict[str, Any]:
    """Fetch an enpoint from mihoyo's webstatic map api.

    Only currently liyue is supported.

    Takes in an endpoint url which is joined with the base url.
    A request is then sent and returns a parsed response.
    """
    kwargs.setdefault("params", {}).update({"map_id": 2, "app_sn": "ys_obc", "lang": "en-us"})
    url = urljoin(OS_MAP_URL, endpoint)
    return fetch_endpoint(url, cookie={}, **kwargs)
def get_map_icons() ‑> Dict[int, str]

Get all icons for the map

Expand source code Browse git
@permanent_cache()
def get_map_icons() -> Dict[int, str]:
    """Get all icons for the map"""
    data = fetch_map_endpoint("spot_kind/get_icon_list")["icons"]
    return {i["id"]: i["url"] for i in data}
def get_map_image() ‑> str

Get the url to the entire map image

Expand source code Browse git
@permanent_cache()
def get_map_image() -> str:
    """Get the url to the entire map image"""
    data = fetch_map_endpoint("info")["info"]["detail"]
    return json.loads(data)["slices"][0][0]["url"]
def get_map_labels() ‑> List[Dict[str, Any]]

Get labels and label categories

Expand source code Browse git
@permanent_cache()
def get_map_labels() -> List[Dict[str, Any]]:
    """Get labels and label categories"""
    return fetch_map_endpoint("label/tree")["tree"]
def get_map_locations() ‑> List[Dict[str, Any]]

Get all locations on the map

Expand source code Browse git
def get_map_locations() -> List[Dict[str, Any]]:
    """Get all locations on the map"""
    return fetch_map_endpoint("map_anchor/list")["list"]
def get_map_points() ‑> List[Dict[str, Any]]

Get points on the map

Expand source code Browse git
def get_map_points() -> List[Dict[str, Any]]:
    """Get points on the map"""
    return fetch_map_endpoint("point/list")["point_list"]
def get_map_tile(x: int, y: int, width: int, height: int, resolution: int = 1, image: str = None) ‑> str

Gets a map tile at a position

You may set an x, y, width and height of the resulting image however you shoudl prefer to use multiples of 256 because they are cached on the mihoyo servers.

Resolution dictates the resolution of the image as a percentage. 100 is highest and 0 is lowest. You should pick values from 100, 50, 25 and 12.5

Expand source code Browse git
def get_map_tile(
    x: int, y: int, width: int, height: int, resolution: int = 1, image: str = None
) -> str:
    """Gets a map tile at a position

    You may set an x, y, width and height of the resulting image
    however you shoudl prefer to use multiples of 256 because they are cached
    on the mihoyo servers.

    Resolution dictates the resolution of the image as a percentage. 100 is highest and 0 is lowest.
    You should pick values from 100, 50, 25 and 12.5
    """
    image = image or get_map_image()
    return (
        image
        + f"?x-oss-process=image/resize,p_{round(resolution)}/crop,x_{x},y_{y},w_{width},h_{height}"
    )