diff --git a/yandex_music/album/album.py b/yandex_music/album/album.py index dcd0156..8f02e45 100644 --- a/yandex_music/album/album.py +++ b/yandex_music/album/album.py @@ -1,7 +1,7 @@ from typing import TYPE_CHECKING, Optional, List if TYPE_CHECKING: - from yandex_music import Client + from yandex_music import Client, Artist, Label, TrackPosition, Track from yandex_music import YandexMusicObject @@ -11,8 +11,8 @@ class Album(YandexMusicObject): id_, title, track_count, - artists, - labels, + artists: List['Artist'], + labels: List['Label'], available, available_for_premium_users, cover_uri=None, @@ -27,11 +27,11 @@ class Album(YandexMusicObject): available_partially=None, bests=None, prerolls=None, - volumes=None, + volumes: List['Track'] = None, year=None, release_date=None, type_=None, - track_position=None, + track_position: Optional['TrackPosition'] = None, regions=None, client: Optional['Client'] = None, **kwargs) -> None: @@ -66,7 +66,7 @@ class Album(YandexMusicObject): self._id_attrs = (self.id, self.title, self.track_count, self.artists, self.labels, self.available_for_premium_users, self.available) - def with_tracks(self, *args, **kwargs): + def with_tracks(self, *args, **kwargs) -> Optional['Album']: """Сокращение для:: client.albums_with_tracks(album.id, *args, **kwargs) @@ -74,7 +74,7 @@ class Album(YandexMusicObject): return self.client.albums_with_tracks(self.id, *args, **kwargs) - def download_cover(self, filename, size='200x200'): + def download_cover(self, filename: str, size: str = '200x200') -> None: """Загрузка обложки. Args: @@ -84,7 +84,7 @@ class Album(YandexMusicObject): self.client.request.download(f'https://{self.cover_uri.replace("%%", size)}', filename) - def download_og_image(self, filename, size='200x200'): + def download_og_image(self, filename: str, size: str = '200x200') -> None: """Загрузка обложки. Предпочтительнее использовать self.download_cover(). @@ -96,14 +96,14 @@ class Album(YandexMusicObject): self.client.request.download(f'https://{self.og_image("%%", size)}', filename) - def like(self, *args, **kwargs): + def like(self, *args, **kwargs) -> bool: """Сокращение для:: client.users_likes_albums_add(album.id, user.id *args, **kwargs) """ return self.client.users_likes_albums_add(self.id, self.client.me.account.uid, *args, **kwargs) - def dislike(self, *args, **kwargs): + def dislike(self, *args, **kwargs) -> bool: """Сокращение для:: client.users_likes_albums_remove(album.id, user.id *args, **kwargs) @@ -111,7 +111,7 @@ class Album(YandexMusicObject): return self.client.users_likes_albums_remove(self.id, self.client.me.account.uid, *args, **kwargs) @classmethod - def de_json(cls, data: dict, client: 'Client'): + def de_json(cls, data: dict, client: 'Client') -> Optional['Album']: if not data: return None @@ -126,7 +126,7 @@ class Album(YandexMusicObject): return cls(client=client, **data) @classmethod - def de_list(cls, data: dict, client: 'Client'): + def de_list(cls, data: dict, client: 'Client') -> List['Album']: if not data: return [] diff --git a/yandex_music/client.py b/yandex_music/client.py index a2cd5a4..9071efb 100644 --- a/yandex_music/client.py +++ b/yandex_music/client.py @@ -70,8 +70,8 @@ class Client(YandexMusicObject): :class:`yandex_music.utils.request.Request`. """ - def __init__(self, token: Optional[str] = None, fetch_account_status: bool = True, base_url: Optional[str] = None, - oauth_url: Optional[str] = None, request: Request = None) -> None: + def __init__(self, token: str = None, fetch_account_status: bool = True, base_url: str = None, + oauth_url: str = None, request: Request = None) -> None: self.logger = logging.getLogger(__name__) self.token = token @@ -94,7 +94,7 @@ class Client(YandexMusicObject): self.me = self.account_status() @classmethod - def from_credentials(cls, username: str, password: str, x_captcha_answer: Optional[str] = None, x_captcha_key: Optional[str] = None, + def from_credentials(cls, username: str, password: str, x_captcha_answer: str = None, x_captcha_key: str = None, captcha_callback: Callable[[Captcha], str] = None, *args, **kwargs) -> 'Client': """Инициализция клиента по логину и паролю. @@ -151,8 +151,8 @@ class Client(YandexMusicObject): @log def generate_token_by_username_and_password(self, username: str, password: str, grant_type: str = 'password', - x_captcha_answer: Optional[str] = None, x_captcha_key: Optional[str] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> str: + x_captcha_answer: str = None, x_captcha_key: str = None, + timeout: Union[int, float] = None, *args, **kwargs) -> str: """Метод получения OAuth токена по логину и паролю. Args: @@ -217,7 +217,7 @@ class Client(YandexMusicObject): return self._request @log - def account_status(self, timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> Status: + def account_status(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Status]: """Получение статуса аккаунта. Нет обязательных параметров. Args: @@ -240,7 +240,7 @@ class Client(YandexMusicObject): return Status.de_json(result, self) @log - def settings(self, timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> Settings: + def settings(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Settings]: """Получение предложений по покупке. Нет обязательных параметров. Args: @@ -263,7 +263,7 @@ class Client(YandexMusicObject): return Settings.de_json(result, self) @log - def permission_alerts(self, timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> PermissionAlerts: + def permission_alerts(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[PermissionAlerts]: """Получение оповещений. Нет обязательных параметров. Args: @@ -286,7 +286,7 @@ class Client(YandexMusicObject): return PermissionAlerts.de_json(result, self) @log - def account_experiments(self, timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> Experiments: + def account_experiments(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Experiments]: """Получение значений экспериментальных функций аккаунта. Args: @@ -309,8 +309,8 @@ class Client(YandexMusicObject): return Experiments.de_json(result, self) @log - def consume_promo_code(self, code: str, language: str = 'en', timeout: Optional[Union[int, float]] = None, - *args, **kwargs) -> PromoCodeStatus: + def consume_promo_code(self, code: str, language: str = 'en', timeout: Union[int, float] = None, + *args, **kwargs) -> Optional[PromoCodeStatus]: """Активация промо-кода. Args: @@ -335,7 +335,7 @@ class Client(YandexMusicObject): return PromoCodeStatus.de_json(result, self) @log - def feed(self, timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> Feed: + def feed(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Feed]: """Получение потока информации (фида) подобранного под пользователя. Содержит умные плейлисты. Args: @@ -358,7 +358,7 @@ class Client(YandexMusicObject): return Feed.de_json(result, self) @log - def feed_wizard_is_passed(self, timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + def feed_wizard_is_passed(self, timeout: Union[int, float] = None, *args, **kwargs) -> bool: url = f'{self.base_url}/feed/wizard/is-passed' result = self._request.get(url, timeout=timeout, *args, **kwargs) @@ -366,7 +366,8 @@ class Client(YandexMusicObject): return result.get('is_wizard_passed') or False @log - def landing(self, blocks: Union[str, List[str]], timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> Landing: + def landing(self, blocks: Union[str, List[str]], timeout: Union[int, float] = None, + *args, **kwargs) -> Optional[Landing]: """Получение лендинг-страницы содержащий блоки с новыми релизами, чартами, плейлистами с новинками и т.д. Поддерживаемые типы блоков: personalplaylists, promotions, new-releases, new-playlists, mixes,c hart, artists, @@ -393,7 +394,7 @@ class Client(YandexMusicObject): return Landing.de_json(result, self) @log - def genres(self, timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> List[Genre]: + def genres(self, timeout: Union[int, float] = None, *args, **kwargs) -> List[Genre]: """Получение жанров музыки. Args: @@ -417,7 +418,7 @@ class Client(YandexMusicObject): @log def tracks_download_info(self, track_id: Union[str, int], get_direct_links: bool = False, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> List[DownloadInfo]: + timeout: Union[int, float] = None, *args, **kwargs) -> List[DownloadInfo]: """Получение информации о доступных вариантах загрузки трека. Args: @@ -442,8 +443,8 @@ class Client(YandexMusicObject): return DownloadInfo.de_list(result, self, get_direct_links) @log - def track_supplement(self, track_id: Union[str, int], timeout: Optional[Union[int, float]] = None, - *args, **kwargs) -> Supplement: + def track_supplement(self, track_id: Union[str, int], timeout: Union[int, float] = None, + *args, **kwargs) -> Optional[Supplement]: """Получение дополнительной информации о треке. Args: @@ -469,16 +470,16 @@ class Client(YandexMusicObject): track_id: Union[str, int], from_: str, album_id: Union[str, int], - playlist_id: Optional[str] = None, + playlist_id: str = None, from_cache: bool = False, - play_id: Optional[str] = None, - uid: Optional[int] = None, - timestamp: Optional[str] = None, - track_length_seconds: Optional[int] = 0, - total_played_seconds: Optional[int] = 0, - end_position_seconds: Optional[int] = 0, - client_now: Optional[str] = None, - timeout: Optional[Union[int, float]] = None, + play_id: str = None, + uid: int = None, + timestamp: str = None, + track_length_seconds: int = 0, + total_played_seconds: int = 0, + end_position_seconds: int = 0, + client_now: str = None, + timeout: Union[int, float] = None, *args, **kwargs) -> bool: """Метод для отправки текущего состояния прослушиваемого трека. @@ -530,8 +531,8 @@ class Client(YandexMusicObject): return result == 'ok' - def albums_with_tracks(self, album_id: Union[str, int], timeout: Optional[Union[int, float]] = None, - *args, **kwargs) -> Album: + def albums_with_tracks(self, album_id: Union[str, int], timeout: Union[int, float] = None, + *args, **kwargs) -> Optional[Album]: """Получение альбома по его уникальному идентификатору вместе с треками. Args: @@ -559,10 +560,10 @@ class Client(YandexMusicObject): text: str, nocorrect: bool = False, type_: str = 'all', - page: Optional[int] = 0, + page: int = 0, playlist_in_best: bool = True, - timeout: Optional[Union[int, float]] = None, - *args, **kwargs) -> Search: + timeout: Union[int, float] = None, + *args, **kwargs) -> Optional[Search]: """Осуществление поиска по запросу и типу, получение результатов. Args: @@ -598,7 +599,7 @@ class Client(YandexMusicObject): return Search.de_json(result, self) @log - def search_suggest(self, part: str, timeout: Optional[Union[int, float]] = None, + def search_suggest(self, part: str, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Suggestions]: """Получение подсказок по введенной части поискового запроса. @@ -623,8 +624,8 @@ class Client(YandexMusicObject): return Suggestions.de_json(result, self) @log - def users_playlists(self, kind: Union[List[Union[str, int]], str, int], user_id: Optional[str] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> List[Playlist]: + def users_playlists(self, kind: Union[List[Union[str, int]], str, int], user_id: str = None, + timeout: Union[int, float] = None, *args, **kwargs) -> List[Playlist]: """Получение плейлиста или списка плейлистов по уникальным идентификаторам. Args: @@ -657,8 +658,8 @@ class Client(YandexMusicObject): return Playlist.de_list(result, self) @log - def users_playlists_create(self, title: str, visibility: str = 'public', user_id: Optional[str] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> Playlist: + def users_playlists_create(self, title: str, visibility: str = 'public', user_id: str = None, + timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]: """Создание плейлиста. Args: @@ -692,8 +693,8 @@ class Client(YandexMusicObject): return Playlist.de_json(result, self) @log - def users_playlists_delete(self, kind: Union[str, int], user_id: Optional[str] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + def users_playlists_delete(self, kind: Union[str, int], user_id: str = None, + timeout: Union[int, float] = None, *args, **kwargs) -> bool: """Удаление плейлиста. Args: @@ -720,8 +721,8 @@ class Client(YandexMusicObject): return result == 'ok' @log - def users_playlists_name(self, kind: Union[str, int], name: str, user_id: Optional[str] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> Playlist: + def users_playlists_name(self, kind: Union[str, int], name: str, user_id: str = None, + timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]: """Изменение названия плейлиста. Args: @@ -750,8 +751,8 @@ class Client(YandexMusicObject): return Playlist.de_json(result, self) @log - def users_playlists_change(self, kind: Union[str, int], diff: str, revision: int = 1, user_id: Optional[str] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> Optional[Playlist]: + def users_playlists_change(self, kind: Union[str, int], diff: str, revision: int = 1, user_id: str = None, + timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]: """Изменение плейлиста. Для получения отличий есть вспомогательный класс :class:`from yandex_music.utils.difference.Difference`. @@ -791,8 +792,8 @@ class Client(YandexMusicObject): @log def users_playlists_insert_track(self, kind: Union[str, int], track_id: Union[str, int], album_id: Union[str, int], - at: Optional[int] = 0, revision: int = 1, user_id: Optional[str] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> Playlist: + at: int = 0, revision: int = 1, user_id: str = None, + timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]: """Добавление трека в плейлист. Трек можно вставить с любое место плейлиста задав индекс вставки (аргумент at). @@ -825,8 +826,8 @@ class Client(YandexMusicObject): @log def users_playlists_delete_track(self, kind: Union[str, int], from_: int, to: int, revision: int = 1, - user_id: Optional[str] = None, timeout: Optional[Union[int, float]] = None, - *args, **kwargs) -> Playlist: + user_id: str = None, timeout: Union[int, float] = None, + *args, **kwargs) -> Optional[Playlist]: """Удаление треков из плейлиста. Для удаление необходимо указать границы с какого по какой элемент (трек) удалить. @@ -857,7 +858,7 @@ class Client(YandexMusicObject): return self.users_playlists_change(kind, diff.to_json(), revision, user_id, timeout, *args, **kwargs) @log - def rotor_account_status(self, timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> Status: + def rotor_account_status(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Status]: url = f'{self.base_url}/rotor/account/status' result = self._request.get(url, timeout=timeout, *args, **kwargs) @@ -865,7 +866,7 @@ class Client(YandexMusicObject): return Status.de_json(result, self) @log - def rotor_stations_dashboard(self, timeout: Optional[Union[int, float]] = None, + def rotor_stations_dashboard(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Dashboard]: url = f'{self.base_url}/rotor/stations/dashboard' @@ -874,7 +875,7 @@ class Client(YandexMusicObject): return Dashboard.de_json(result, self) @log - def rotor_stations_list(self, language: str = 'en', timeout: Optional[Union[int, float]] = None, + def rotor_stations_list(self, language: str = 'en', timeout: Union[int, float] = None, *args, **kwargs) -> List[StationResult]: url = f'{self.base_url}/rotor/stations/list' @@ -883,9 +884,9 @@ class Client(YandexMusicObject): return StationResult.de_list(result, self) @log - def rotor_station_genre_feedback(self, genre: str, type_: str, timestamp: Optional[int] = None, - from_: Optional[str] = None, batch_id: Union[str, int] = None, - track_id: Optional[str] = None, timeout: Optional[Union[int, float]] = None, + def rotor_station_genre_feedback(self, genre: str, type_: str, timestamp: int = None, + from_: str = None, batch_id: Union[str, int] = None, + track_id: str = None, timeout: Union[int, float] = None, *args, **kwargs) -> bool: if timestamp is None: timestamp = datetime.now().timestamp() @@ -910,19 +911,19 @@ class Client(YandexMusicObject): return result == 'ok' @log - def rotor_station_genre_feedback_radio_started(self, genre: str, from_: str, timestamp: Optional[int] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + def rotor_station_genre_feedback_radio_started(self, genre: str, from_: str, timestamp: int = None, + timeout: Union[int, float] = None, *args, **kwargs) -> bool: return self.rotor_station_genre_feedback(genre, 'radioStarted', timestamp, from_, timeout, *args, **kwargs) @log def rotor_station_genre_feedback_track_started(self, genre: str, track_id: str, batch_id: Union[str, int], - timestamp: Optional[int] = None, timeout: Optional[Union[int, float]] = None, + timestamp: int = None, timeout: Union[int, float] = None, *args, **kwargs) -> bool: return self.rotor_station_genre_feedback(genre, 'trackStarted', timestamp, track_id=track_id, batch_id=batch_id, timeout=timeout, *args, **kwargs) @log - def rotor_station_genre_info(self, genre: str, timeout: Optional[Union[int, float]] = None, + def rotor_station_genre_info(self, genre: str, timeout: Union[int, float] = None, *args, **kwargs) -> List[StationResult]: url = f'{self.base_url}/rotor/station/genre:{genre}/info' @@ -931,7 +932,7 @@ class Client(YandexMusicObject): return StationResult.de_list(result, self) @log - def rotor_station_genre_tracks(self, genre: str, timeout: Optional[Union[int, float]] = None, + def rotor_station_genre_tracks(self, genre: str, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[StationTracksResult]: url = f'{self.base_url}/rotor/station/genre:{genre}/tracks' @@ -940,8 +941,8 @@ class Client(YandexMusicObject): return StationTracksResult.de_json(result, self) @log - def artists_brief_info(self, artist_id: Union[str, int], timeout: Optional[Union[int, float]] = None, - *args, **kwargs) -> BriefInfo: + def artists_brief_info(self, artist_id: Union[str, int], timeout: Union[int, float] = None, + *args, **kwargs) -> Optional[BriefInfo]: url = f'{self.base_url}/artists/{artist_id}/brief-info' result = self._request.get(url, timeout=timeout, *args, **kwargs) @@ -949,8 +950,8 @@ class Client(YandexMusicObject): return BriefInfo.de_json(result, self) @log - def artists_tracks(self, artist_id: Union[str, int], page: Optional[int] = 0, page_size: int = 20, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> ArtistTracks: + def artists_tracks(self, artist_id: Union[str, int], page: int = 0, page_size: int = 20, + timeout: Union[int, float] = None, *args, **kwargs) -> Optional[ArtistTracks]: """Получение треков артиста. Args: @@ -981,9 +982,9 @@ class Client(YandexMusicObject): return ArtistTracks.de_json(result, self) @log - def artists_direct_albums(self, artist_id: Union[str, int], page: Optional[int] = 0, page_size: int = 20, - sort_by: str = 'year', timeout: Optional[Union[int, float]] = None, - *args, **kwargs) -> ArtistAlbums: + def artists_direct_albums(self, artist_id: Union[str, int], page: int = 0, page_size: int = 20, + sort_by: str = 'year', timeout: Union[int, float] = None, + *args, **kwargs) -> Optional[ArtistAlbums]: """Получение альбомов артиста. Известные значения для sort_by: year, rating. @@ -1018,7 +1019,7 @@ class Client(YandexMusicObject): return ArtistAlbums.de_json(result, self) def _like_action(self, object_type: str, ids: Union[List[Union[str, int]], str, int], remove: bool = False, - user_id: Union[str, int] = None, timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + user_id: Union[str, int] = None, timeout: Union[int, float] = None, *args, **kwargs) -> bool: if user_id is None and self.me is not None: user_id = self.me.account.uid @@ -1034,51 +1035,51 @@ class Client(YandexMusicObject): @log def users_likes_tracks_add(self, track_ids: Union[List[Union[str, int]], str, int], user_id: Union[str, int] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + timeout: Union[int, float] = None, *args, **kwargs) -> bool: return self._like_action('track', track_ids, False, user_id, timeout, *args, **kwargs) @log def users_likes_tracks_remove(self, track_ids: Union[List[Union[str, int]], str, int], user_id: Union[str, int] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + timeout: Union[int, float] = None, *args, **kwargs) -> bool: return self._like_action('track', track_ids, True, user_id, timeout, *args, **kwargs) @log def users_likes_artists_add(self, artist_ids: Union[List[Union[str, int]], str, int], user_id: Union[str, int] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + timeout: Union[int, float] = None, *args, **kwargs) -> bool: return self._like_action('artist', artist_ids, False, user_id, timeout, *args, **kwargs) def users_likes_artists_remove(self, artist_ids: Union[List[Union[str, int]], str, int], user_id: Union[str, int] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + timeout: Union[int, float] = None, *args, **kwargs) -> bool: return self._like_action('artist', artist_ids, True, user_id, timeout, *args, **kwargs) @log def users_likes_playlists_add(self, playlist_ids: Union[List[Union[str, int]], str, int], user_id: Union[str, int] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + timeout: Union[int, float] = None, *args, **kwargs) -> bool: return self._like_action('playlist', playlist_ids, False, user_id, timeout, *args, **kwargs) @log def users_likes_playlists_remove(self, playlist_ids: Union[List[Union[str, int]], str, int], user_id: Union[str, int] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + timeout: Union[int, float] = None, *args, **kwargs) -> bool: return self._like_action('playlist', playlist_ids, True, user_id, timeout, *args, **kwargs) @log def users_likes_albums_add(self, album_ids: Union[List[Union[str, int]], str, int], user_id: Union[str, int] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + timeout: Union[int, float] = None, *args, **kwargs) -> bool: return self._like_action('album', album_ids, False, user_id, timeout, *args, **kwargs) @log def users_likes_albums_remove(self, album_ids: Union[List[Union[str, int]], str, int], user_id: Union[str, int] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + timeout: Union[int, float] = None, *args, **kwargs) -> bool: return self._like_action('album', album_ids, True, user_id, timeout, *args, **kwargs) def _get_list(self, object_type: str, ids: Union[List[Union[str, int]], int, str], - params: dict = None, timeout: Optional[Union[int, float]] = None, + params: dict = None, timeout: Union[int, float] = None, *args, **kwargs) -> List[Union[Artist, Album, Track, Playlist]]: if params is None: params = {} @@ -1091,27 +1092,27 @@ class Client(YandexMusicObject): return de_list.get(object_type)(result, self) @log - def artists(self, artist_ids: Union[List[Union[str, int]], int, str], timeout: Optional[Union[int, float]] = None, + def artists(self, artist_ids: Union[List[Union[str, int]], int, str], timeout: Union[int, float] = None, *args, **kwargs) -> List[Artist]: return self._get_list('artist', artist_ids, timeout=timeout, *args, **kwargs) @log - def albums(self, album_ids: Union[List[Union[str, int]], int, str], timeout: Optional[Union[int, float]] = None, + def albums(self, album_ids: Union[List[Union[str, int]], int, str], timeout: Union[int, float] = None, *args, **kwargs) -> List[Album]: return self._get_list('album', album_ids, timeout=timeout, *args, **kwargs) @log def tracks(self, track_ids: Union[List[Union[str, int]], int, str], with_positions: bool = True, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> List[Track]: + timeout: Union[int, float] = None, *args, **kwargs) -> List[Track]: return self._get_list('track', track_ids, {'with-positions': with_positions}, timeout, *args, **kwargs) @log - def playlists_list(self, playlist_ids: Union[List[Union[str, int]], int, str], timeout: Optional[Union[int, float]] = None, + def playlists_list(self, playlist_ids: Union[List[Union[str, int]], int, str], timeout: Union[int, float] = None, *args, **kwargs) -> List[Playlist]: return self._get_list('playlist', playlist_ids, timeout=timeout, *args, **kwargs) @log - def users_playlists_list(self, user_id: Union[str, int] = None, timeout: Optional[Union[int, float]] = None, + def users_playlists_list(self, user_id: Union[str, int] = None, timeout: Union[int, float] = None, *args, **kwargs) -> List[Playlist]: if user_id is None and self.me is not None: user_id = self.me.account.uid @@ -1123,8 +1124,8 @@ class Client(YandexMusicObject): return Playlist.de_list(result, self) def _get_likes(self, object_type: str, user_id: Union[str, int] = None, params: dict = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) \ - -> Union[List[ArtistsLikes], List[AlbumsLikes], List[PlaylistsLikes], TracksList]: + timeout: Union[int, float] = None, *args, **kwargs) \ + -> Union[List[ArtistsLikes], List[AlbumsLikes], List[PlaylistsLikes], Optional[TracksList]]: if user_id is None and self.me is not None: user_id = self.me.account.uid @@ -1138,29 +1139,29 @@ class Client(YandexMusicObject): return de_list_likes.get(object_type)(result, self) @log - def users_likes_tracks(self, user_id: Union[str, int] = None, if_modified_since_revision: Optional[int] = 0, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> TracksList: + def users_likes_tracks(self, user_id: Union[str, int] = None, if_modified_since_revision: int = 0, + timeout: Union[int, float] = None, *args, **kwargs) -> Optional[TracksList]: return self._get_likes('track', user_id, {'if-modified-since-revision': if_modified_since_revision}, timeout, *args, **kwargs) @log - def users_likes_albums(self, user_id: Union[str, int] = None, rich: bool = True, timeout: Optional[Union[int, float]] = None, + def users_likes_albums(self, user_id: Union[str, int] = None, rich: bool = True, timeout: Union[int, float] = None, *args, **kwargs) -> List[AlbumsLikes]: return self._get_likes('album', user_id, {'rich': rich}, timeout, *args, **kwargs) @log def users_likes_artists(self, user_id: Union[str, int] = None, with_timestamps: bool = True, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> List[ArtistsLikes]: + timeout: Union[int, float] = None, *args, **kwargs) -> List[ArtistsLikes]: return self._get_likes('artist', user_id, {'with-timestamps': with_timestamps}, timeout, *args, **kwargs) @log - def users_likes_playlists(self, user_id: Union[str, int] = None, timeout: Optional[Union[int, float]] = None, + def users_likes_playlists(self, user_id: Union[str, int] = None, timeout: Union[int, float] = None, *args, **kwargs) -> List[PlaylistsLikes]: return self._get_likes('playlist', user_id, timeout=timeout, *args, **kwargs) @log - def users_dislikes_tracks(self, user_id: Union[str, int] = None, if_modified_since_revision: Optional[int] = 0, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> TracksList: + def users_dislikes_tracks(self, user_id: Union[str, int] = None, if_modified_since_revision: int = 0, + timeout: Union[int, float] = None, *args, **kwargs) -> Optional[TracksList]: if user_id is None and self.me is not None: user_id = self.me.account.uid @@ -1172,7 +1173,7 @@ class Client(YandexMusicObject): return TracksList.de_json(result.get('library'), self) def _dislike_action(self, ids: Union[List[Union[str, int]], str, int], remove: bool = False, - user_id: Union[str, int] = None, timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + user_id: Union[str, int] = None, timeout: Union[int, float] = None, *args, **kwargs) -> bool: if user_id is None and self.me is not None: user_id = self.me.account.uid @@ -1186,13 +1187,13 @@ class Client(YandexMusicObject): @log def users_dislikes_tracks_add(self, track_ids: Union[List[Union[str, int]], str, int], user_id: Union[str, int] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + timeout: Union[int, float] = None, *args, **kwargs) -> bool: return self._dislike_action(track_ids, False, user_id, timeout, *args, **kwargs) @log def users_dislikes_tracks_remove(self, track_ids: Union[List[Union[str, int]], str, int], user_id: Union[str, int] = None, - timeout: Optional[Union[int, float]] = None, *args, **kwargs) -> bool: + timeout: Union[int, float] = None, *args, **kwargs) -> bool: return self._dislike_action(track_ids, True, user_id, timeout, *args, **kwargs) # camelCase псевдонимы diff --git a/yandex_music/cover.py b/yandex_music/cover.py index 2dab1a9..9ddee4c 100644 --- a/yandex_music/cover.py +++ b/yandex_music/cover.py @@ -58,7 +58,7 @@ class Cover(YandexMusicObject): self.client = client self._id_attrs = (self.prefix, self.version, self.uri, self.items_uri) - def download(self, filename: str, index: Optional[int] = 0, size: Optional[str] = '200x200') -> None: + def download(self, filename: str, index: int = 0, size: str = '200x200') -> None: """Загрузка обложки. Args: diff --git a/yandex_music/feed/feed.py b/yandex_music/feed/feed.py index 75b6d98..96a633d 100644 --- a/yandex_music/feed/feed.py +++ b/yandex_music/feed/feed.py @@ -1,7 +1,7 @@ from typing import TYPE_CHECKING, Optional, List if TYPE_CHECKING: - from yandex_music import Client + from yandex_music import Client, GeneratedPlaylist, Day from yandex_music import YandexMusicObject @@ -11,10 +11,10 @@ class Feed(YandexMusicObject): can_get_more_events, pumpkin, is_wizard_passed, - generated_playlists, + generated_playlists: List['GeneratedPlaylist'], headlines, today, - days, + days: Optional['Day'], next_revision=None, client: Optional['Client'] = None, **kwargs) -> None: @@ -32,7 +32,7 @@ class Feed(YandexMusicObject): self._id_attrs = (self.can_get_more_events, self.generated_playlists, self.headlines, self.today, self.days) @classmethod - def de_json(cls, data: dict, client: 'Client'): + def de_json(cls, data: dict, client: 'Client') -> Optional['Feed']: if not data: return None diff --git a/yandex_music/icon.py b/yandex_music/icon.py index a33f282..0bd47ac 100644 --- a/yandex_music/icon.py +++ b/yandex_music/icon.py @@ -34,7 +34,7 @@ class Icon(YandexMusicObject): self.client = client self._id_attrs = (self.background_color, self.image_url) - def download(self, filename: str, size: Optional[str] = '200x200'): + def download(self, filename: str, size: str = '200x200'): """Загрузка иконки. Args: diff --git a/yandex_music/landing/landing.py b/yandex_music/landing/landing.py index 4706011..9bf369a 100644 --- a/yandex_music/landing/landing.py +++ b/yandex_music/landing/landing.py @@ -1,7 +1,7 @@ from typing import TYPE_CHECKING, Optional, List if TYPE_CHECKING: - from yandex_music import Client + from yandex_music import Client, Block from yandex_music import YandexMusicObject @@ -10,7 +10,7 @@ class Landing(YandexMusicObject): def __init__(self, pumpkin, content_id, - blocks, + blocks: List['Block'], client: Optional['Client'] = None, **kwargs) -> None: @@ -25,7 +25,7 @@ class Landing(YandexMusicObject): return self.blocks[item] @classmethod - def de_json(cls, data: dict, client: 'Client'): + def de_json(cls, data: dict, client: 'Client') -> Optional['Landing']: if not data: return None diff --git a/yandex_music/playlist/playlist.py b/yandex_music/playlist/playlist.py index 70545cd..d938f4d 100644 --- a/yandex_music/playlist/playlist.py +++ b/yandex_music/playlist/playlist.py @@ -85,7 +85,7 @@ class Playlist(YandexMusicObject): def playlist_id(self) -> str: return f'{self.owner.uid}:{self.kind}' - def download_animated_cover(self, filename: str, size: Optional[str] = '200x200') -> None: + def download_animated_cover(self, filename: str, size: str = '200x200') -> None: """Загрузка анимированной обложки. Args: @@ -95,7 +95,7 @@ class Playlist(YandexMusicObject): self.client.request.download(f'https://{self.animated_cover_uri.replace("%%", size)}', filename) - def download_og_image(self, filename: str, size: Optional[str] = '200x200') -> None: + def download_og_image(self, filename: str, size: str = '200x200') -> None: """Загрузка обложки. Используйте это только когда нет self.cover! diff --git a/yandex_music/status/account.py b/yandex_music/status/account.py index 117ab95..dc99a0e 100644 --- a/yandex_music/status/account.py +++ b/yandex_music/status/account.py @@ -61,9 +61,9 @@ class Account(YandexMusicObject): display_name: Optional[str] = None, hosted_user: Optional[bool] = None, birthday: Optional[str] = None, - passport_phones: Optional[List['PassportPhone']] = None, + passport_phones: List['PassportPhone'] = None, registered_at: Optional[str] = None, - has_info_for_app_metrica: Optional[bool] = False, + has_info_for_app_metrica: bool = False, client: Optional['Client'] = None, **kwargs) -> None: self.now = now @@ -87,7 +87,7 @@ class Account(YandexMusicObject): if self.uid: self._id_attrs = (self.uid,) - def download_avatar(self, filename: str, format_: Optional[str] = 'normal') -> None: + def download_avatar(self, filename: str, format_: str = 'normal') -> None: """Загрузка изображения пользователя. Args: diff --git a/yandex_music/status/product.py b/yandex_music/status/product.py index eeecee0..a2df139 100644 --- a/yandex_music/status/product.py +++ b/yandex_music/status/product.py @@ -60,14 +60,14 @@ class Product(YandexMusicObject): price: Optional['Price'], feature: str, debug: bool, - features: Optional[List[str]] = None, + features: List[str] = None, description: Optional[str] = None, available: Optional[bool] = None, trial_available: Optional[bool] = None, vendor_trial_available: Optional[bool] = None, button_text: Optional[str] = None, button_additional_text: Optional[str] = None, - payment_method_types: Optional[List[str]] = None, + payment_method_types: List[str] = None, client: Optional['Client'] = None, **kwargs) -> None: self.product_id = product_id diff --git a/yandex_music/status/subscription.py b/yandex_music/status/subscription.py index 422238b..0e47413 100644 --- a/yandex_music/status/subscription.py +++ b/yandex_music/status/subscription.py @@ -30,7 +30,7 @@ class Subscription(YandexMusicObject): """ def __init__(self, - auto_renewable: Optional[List['AutoRenewable']] = None, + auto_renewable: List['AutoRenewable'] = None, can_start_trial: Optional[bool] = None, mcdonalds: Optional[bool] = None, end: Optional[str] = None,