СС
Size: a a a
СС
СС
b
b
def search_track(
self,
query: str = None,
limit: int = 50,
offset: int = 0,
market: str = None,
include_external: str = None,
) -> Generator:
response = self.__search(
q=query,
search_type=SEARCH_TYPE.TRACK,
market=market,
limit=limit,
offset=offset,
include_external=include_external,
)
total_results = (
Track(_track) for _track in response.tracks.get("items", [])
)
if limit == 0:
yield from self.__next(
response, total_results, search_type=SEARCH_TYPE.TRACK
)
for item in total_results:
yield item
def __next(
self,
response: aDict = None,
total_results: Generator = None,
search_type: SEARCH_TYPE = None,
):
search_map = {
SEARCH_TYPE.TRACK: Track,
SEARCH_TYPE.ALBUM: Album,
SEARCH_TYPE.ARTIST: Artist,
}
_attrs = {
SEARCH_TYPE.TRACK: "tracks",
SEARCH_TYPE.ALBUM: "albums",
SEARCH_TYPE.ARTIST: "artists",
}
while True:
next_res = response.get(_attrs[search_type]).next
for item in total_results:
yield item
if next_res:
response = self.get(next_res, raw=True)
total_results = (
search_map.get(search_type)(_item)
for _item in response.get(_attrs[search_type]).get(
"items", []
)
)
continue
else:
break
СС
СС
b
def search(
self,
q: str = None,
search_type: SEARCH_TYPE = SEARCH_TYPE.TRACK,
market: Optional[str] = None,
limit: int = 20,
offset: int = 0,
include_external: str = None,
) -> aDict:
if limit > 50 or limit < 0:
raise ValueError("Limit should be less or equal 50")
query = {
"q": q,
"type": search_type,
"limit": 50 if limit == 0 else limit,
"offset": offset,
"market": market,
"include_external": include_external,
}
response = self.get("/search", params=query)
total_results = (
SEARCH_TYPE_MODEL.get(search_type)(_item)
for _item in response.get(SEARCH_TYPE_ATTRS[search_type]).get(
"items", []
)
)
if limit == 0:
yield from self.__next(
response, total_results, search_type=search_type
)
for item in total_results:
yield item
def __next(
self,
response: aDict = None,
total_results: Generator = None,
search_type: SEARCH_TYPE = None,
):
while True:
next_res = response.get(SEARCH_TYPE_ATTRS[search_type]).next
for item in total_results:
yield item
if next_res:
response = self.get(next_res, raw=True)
total_results = (
SEARCH_TYPE_MODEL.get(search_type)(_item)
for _item in response.get(
SEARCH_TYPE_ATTRS[search_type]
).get("items", [])
)
continue
else:
break
ИС
ИС
СС