import logging from http import HTTPStatus from typing import List import requests from update_market_vendors.config import Config from update_market_vendors.util import MarketsResult, get_session, send_request, get_headers def get_markets(config: Config, logger: logging.Logger, all_markets: List[str]) -> MarketsResult: """Returns set of market codes defined for Spotify API. There is no endpoint for getting markets in Spotify API, so list of defined markets is created by sequential search requests with random valid parameters. Spotify API returns 400 for every request with nonexistent market, so it is possible to distinguish existent markets by response status. :param config: config object. :param logger: logger object. :param all_markets: list of market codes existing in our database. """ headers = get_headers(config) if not headers: return MarketsResult(confirmed=[], skipped=all_markets) session = get_session(headers) allowed_markets = [] skipped_markets = [] # random q and limit=1 just to get any response with status base_params = { "q": "name:abacab", "type": "album", "offset": 0, "limit": 1 } for market in all_markets: params = {"market": market, **base_params} request = requests.Request("GET", config.SPOTIFY_SEARCH_URL, params=params) response = send_request(session, request, logger, allowed_statuses=(HTTPStatus.OK, HTTPStatus.BAD_REQUEST)) if not response: skipped_markets.append(market) elif response.status_code == HTTPStatus.OK: allowed_markets.append(market) logger.info(f"Spotify markets request returned {len(allowed_markets)}/{len(all_markets)}.") return MarketsResult(confirmed=allowed_markets, skipped=skipped_markets)