fix: ditch search completely

This commit is contained in:
Xoconoch
2025-08-28 06:52:04 -06:00
parent 573098ca6e
commit c0cc9a6b6f
3 changed files with 0 additions and 197 deletions

View File

@@ -5,7 +5,6 @@ from .track import Track
from .album import Album from .album import Album
from .playlist import Playlist, PlaylistItem, TrackStub, TracksPage, Owner, UserMini from .playlist import Playlist, PlaylistItem, TrackStub, TracksPage, Owner, UserMini
from .artist import Artist from .artist import Artist
from .search import SearchResult, SearchTracksPage, SearchAlbumsPage, SearchArtistsPage, SearchPlaylistsPage
__all__ = [ __all__ = [
"Image", "Image",

View File

@@ -1,179 +0,0 @@
#!/usr/bin/python3
from dataclasses import dataclass, field
from typing import Optional, Dict, Any, List
from .track import Track
from .album import Album
from .artist import Artist
from .playlist import Playlist
from .types import _int
@dataclass
class SearchTracksPage:
limit: int = 0
offset: int = 0
total: int = 0
items: List[Track] = field(default_factory=list)
@staticmethod
def from_dict(obj: Any) -> "SearchTracksPage":
if not isinstance(obj, dict):
return SearchTracksPage()
items: List[Track] = []
for it in obj.get("items", []) or []:
if isinstance(it, dict):
items.append(Track.from_dict(it))
return SearchTracksPage(
limit=_int(obj.get("limit")) or 0,
offset=_int(obj.get("offset")) or 0,
total=_int(obj.get("total")) or len(items),
items=items,
)
def to_dict(self) -> Dict[str, Any]:
return {
"limit": self.limit,
"offset": self.offset,
"total": self.total,
"items": [it.to_dict() for it in (self.items or [])]
}
@dataclass
class SearchAlbumsPage:
limit: int = 0
offset: int = 0
total: int = 0
items: List[Album] = field(default_factory=list)
@staticmethod
def from_dict(obj: Any) -> "SearchAlbumsPage":
if not isinstance(obj, dict):
return SearchAlbumsPage()
items: List[Album] = []
for it in obj.get("items", []) or []:
if isinstance(it, dict):
items.append(Album.from_dict(it))
return SearchAlbumsPage(
limit=_int(obj.get("limit")) or 0,
offset=_int(obj.get("offset")) or 0,
total=_int(obj.get("total")) or len(items),
items=items,
)
def to_dict(self) -> Dict[str, Any]:
return {
"limit": self.limit,
"offset": self.offset,
"total": self.total,
"items": [it.to_dict() for it in (self.items or [])]
}
@dataclass
class SearchArtistsPage:
limit: int = 0
offset: int = 0
total: int = 0
items: List[Artist] = field(default_factory=list)
@staticmethod
def from_dict(obj: Any) -> "SearchArtistsPage":
if not isinstance(obj, dict):
return SearchArtistsPage()
items: List[Artist] = []
for it in obj.get("items", []) or []:
if isinstance(it, dict):
items.append(Artist.from_dict(it))
return SearchArtistsPage(
limit=_int(obj.get("limit")) or 0,
offset=_int(obj.get("offset")) or 0,
total=_int(obj.get("total")) or len(items),
items=items,
)
def to_dict(self) -> Dict[str, Any]:
return {
"limit": self.limit,
"offset": self.offset,
"total": self.total,
"items": [it.to_dict() for it in (self.items or [])]
}
@dataclass
class SearchPlaylistsPage:
limit: int = 0
offset: int = 0
total: int = 0
items: List[Playlist] = field(default_factory=list)
@staticmethod
def from_dict(obj: Any) -> "SearchPlaylistsPage":
if not isinstance(obj, dict):
return SearchPlaylistsPage()
items: List[Playlist] = []
for it in obj.get("items", []) or []:
if isinstance(it, dict):
items.append(Playlist.from_dict(it))
return SearchPlaylistsPage(
limit=_int(obj.get("limit")) or 0,
offset=_int(obj.get("offset")) or 0,
total=_int(obj.get("total")) or len(items),
items=items,
)
def to_dict(self) -> Dict[str, Any]:
return {
"limit": self.limit,
"offset": self.offset,
"total": self.total,
"items": [it.to_dict() for it in (self.items or [])]
}
@dataclass
class SearchResult:
query: Optional[str] = None
tracks: Optional[SearchTracksPage] = None
albums: Optional[SearchAlbumsPage] = None
artists: Optional[SearchArtistsPage] = None
playlists: Optional[SearchPlaylistsPage] = None
# raw passthrough for unsupported sections (e.g., shows, episodes)
other: Dict[str, Any] = field(default_factory=dict)
@staticmethod
def from_dict(obj: Any) -> "SearchResult":
if not isinstance(obj, dict):
return SearchResult()
tracks = SearchTracksPage.from_dict(obj.get("tracks", {})) if isinstance(obj.get("tracks"), dict) else None
albums = SearchAlbumsPage.from_dict(obj.get("albums", {})) if isinstance(obj.get("albums"), dict) else None
artists = SearchArtistsPage.from_dict(obj.get("artists", {})) if isinstance(obj.get("artists"), dict) else None
playlists = SearchPlaylistsPage.from_dict(obj.get("playlists", {})) if isinstance(obj.get("playlists"), dict) else None
known = {k for k in ("query", "tracks", "albums", "artists", "playlists")}
other = {k: v for k, v in obj.items() if k not in known}
return SearchResult(
query=obj.get("query"),
tracks=tracks,
albums=albums,
artists=artists,
playlists=playlists,
other=other,
)
def to_dict(self) -> Dict[str, Any]:
out: Dict[str, Any] = {}
if self.query is not None:
out["query"] = self.query
if self.tracks is not None:
out["tracks"] = self.tracks.to_dict()
if self.albums is not None:
out["albums"] = self.albums.to_dict()
if self.artists is not None:
out["artists"] = self.artists.to_dict()
if self.playlists is not None:
out["playlists"] = self.playlists.to_dict()
out.update(self.other or {})
return out

View File

@@ -189,23 +189,6 @@ playlist_expanded = client.get_playlist("spotify:playlist:...", expand_items=Tru
``` ```
### search(query, limit=10, country=None, locale=None, catalogue=None, image_size=None) -> dict
Performs a full-featured search using librespot's SearchManager.
- Country precedence: explicit `country` > session country code > unset
- Returns librespot's JSON-like mapping (tracks, albums, artists, playlists, etc.)
Usage:
```python
res = client.search(
"artist:daft punk track:one more time",
limit=10,
country="US",
locale="en_US"
)
tracks = res.get("tracks", {}).get("items", [])
```
## Concurrency and caching ## Concurrency and caching