Merge pull request #172 from MarshalX/issue-120

Тайп хинты
このコミットが含まれているのは:
Il'ya 2019-12-28 18:27:52 +03:00 committed by GitHub
コミット e22361c2eb
この署名に対応する既知のキーがデータベースに存在しません
GPGキーID: 4AEE18F83AFDEB23
99個のファイルの変更1183行の追加780行の削除

ファイルの表示

@ -519,9 +519,9 @@ def block_entity(request, results, types):
@pytest.fixture(scope='session') @pytest.fixture(scope='session')
def block(block_entity, data_with_type): def block(block_entity, data_with_type):
data, type = data_with_type data, type_ = data_with_type
return Block(TestBlock.id, type, TestBlock.type_for_from, TestBlock.title, [block_entity], return Block(TestBlock.id, type_, TestBlock.type_for_from, TestBlock.title, [block_entity],
TestBlock.description, data) TestBlock.description, data)

ファイルの表示

@ -43,8 +43,8 @@ class TestAccount:
json_dict = {'now': self.now, 'region': self.region, 'service_available': self.service_available, json_dict = {'now': self.now, 'region': self.region, 'service_available': self.service_available,
'uid': self.uid, 'login': self.login, 'full_name': self.full_name, 'second_name': self.second_name, 'uid': self.uid, 'login': self.login, 'full_name': self.full_name, 'second_name': self.second_name,
'first_name': self.first_name, 'display_name': self.display_name, 'hosted_user': self.hosted_user, 'first_name': self.first_name, 'display_name': self.display_name, 'hosted_user': self.hosted_user,
'birthday': self.birthday, 'passport_phones': [passport_phone.to_dict()], 'registered_at': self.registered_at, 'birthday': self.birthday, 'passport_phones': [passport_phone.to_dict()],
'has_info_for_app_metrica': self.has_info_for_app_metrica} 'registered_at': self.registered_at, 'has_info_for_app_metrica': self.has_info_for_app_metrica}
account = Account.de_json(json_dict, client) account = Account.de_json(json_dict, client)
assert account.now == self.now assert account.now == self.now

ファイルの表示

@ -55,7 +55,7 @@ class TestBlock:
def test_equality(self, block_entity): def test_equality(self, block_entity):
a = Block(self.id, self.type, self.type_for_from, self.title, [block_entity]) a = Block(self.id, self.type, self.type_for_from, self.title, [block_entity])
b = Block('', self.type, self.type_for_from, self.title, None) b = Block('', self.type, self.type_for_from, self.title, [])
c = Block(self.id, self.type, self.type_for_from, self.title, [block_entity]) c = Block(self.id, self.type, self.type_for_from, self.title, [block_entity])
assert a != b assert a != b

ファイルの表示

@ -26,30 +26,30 @@ class TestBlockEntity:
assert block_entity.data == data assert block_entity.data == data
def test_de_json_required(self, client, block_entity_data_with_type): def test_de_json_required(self, client, block_entity_data_with_type):
data, type = block_entity_data_with_type data, type_ = block_entity_data_with_type
json_dict = {'id_': self.id, 'type_': type, 'data': data.to_dict()} json_dict = {'id_': self.id, 'type_': type_, 'data': data.to_dict()}
block_entity = BlockEntity.de_json(json_dict, client) block_entity = BlockEntity.de_json(json_dict, client)
assert block_entity.id == self.id assert block_entity.id == self.id
assert block_entity.type == type assert block_entity.type == type_
assert block_entity.data == data assert block_entity.data == data
def test_de_json_all(self, client, block_entity_data_with_type): def test_de_json_all(self, client, block_entity_data_with_type):
data, type = block_entity_data_with_type data, type_ = block_entity_data_with_type
json_dict = {'id_': self.id, 'type_': type, 'data': data.to_dict()} json_dict = {'id_': self.id, 'type_': type_, 'data': data.to_dict()}
block_entity = BlockEntity.de_json(json_dict, client) block_entity = BlockEntity.de_json(json_dict, client)
assert block_entity.id == self.id assert block_entity.id == self.id
assert block_entity.type == type assert block_entity.type == type_
assert block_entity.data == data assert block_entity.data == data
def test_equality(self, block_entity_data_with_type): def test_equality(self, block_entity_data_with_type):
data, type = block_entity_data_with_type data, type = block_entity_data_with_type
a = BlockEntity(self.id, type, data) a = BlockEntity(self.id, type, data)
b = BlockEntity(self.id, None, data) b = BlockEntity(self.id, '', data)
c = BlockEntity('', type, data) c = BlockEntity('', type, data)
d = BlockEntity(self.id, type, data) d = BlockEntity(self.id, type, data)

ファイルの表示

@ -75,9 +75,9 @@ class TestBriefInfo:
def test_equality(self, artist, track, album, cover, playlist_id, video, vinyl): def test_equality(self, artist, track, album, cover, playlist_id, video, vinyl):
a = BriefInfo(artist, [album], [album], self.last_release_ids, [track], [artist], [cover], self.concerts, a = BriefInfo(artist, [album], [album], self.last_release_ids, [track], [artist], [cover], self.concerts,
[video], [vinyl], self.has_promotions, [playlist_id]) [video], [vinyl], self.has_promotions, [playlist_id])
b = BriefInfo(artist, [album], [album], self.last_release_ids, None, [artist], [cover], self.concerts, b = BriefInfo(artist, [album], [album], self.last_release_ids, [], [artist], [cover], self.concerts,
[video], [vinyl], True, [playlist_id]) [video], [vinyl], True, [playlist_id])
c = BriefInfo(artist, [album], [album], [1, 2, 3], [track], [artist], None, self.concerts, c = BriefInfo(artist, [album], [album], [1, 2, 3], [track], [artist], [], self.concerts,
[video], [vinyl], self.has_promotions, [playlist_id]) [video], [vinyl], self.has_promotions, [playlist_id])
d = BriefInfo(artist, [album], [album], self.last_release_ids, [track], [artist], [cover], self.concerts, d = BriefInfo(artist, [album], [album], self.last_release_ids, [track], [artist], [cover], self.concerts,
[video], [vinyl], self.has_promotions, [playlist_id]) [video], [vinyl], self.has_promotions, [playlist_id])

ファイルの表示

@ -11,7 +11,7 @@ def download_info():
class TestDownloadInfo: class TestDownloadInfo:
codec = 'mp3' codec = 'mp3'
bitrate_in_kbps = 'mp3' bitrate_in_kbps = 192
gain = False gain = False
preview = False preview = False
download_info_url = 'https://storage.mds.yandex.net/file-download-info/136146_d158926e.14534319.6.10994777/320' \ download_info_url = 'https://storage.mds.yandex.net/file-download-info/136146_d158926e.14534319.6.10994777/320' \

ファイルの表示

@ -60,7 +60,7 @@ class TestFeed:
def test_equality(self, generated_playlist, day): def test_equality(self, generated_playlist, day):
a = Feed(self.can_get_more_events, self.pumpkin, self.is_wizard_passed, [generated_playlist], self.headlines, a = Feed(self.can_get_more_events, self.pumpkin, self.is_wizard_passed, [generated_playlist], self.headlines,
self.today, [day]) self.today, [day])
b = Feed(False, self.pumpkin, self.is_wizard_passed, None, self.headlines, self.today, [day]) b = Feed(False, self.pumpkin, self.is_wizard_passed, [], self.headlines, self.today, [day])
c = Feed(self.can_get_more_events, self.pumpkin, self.is_wizard_passed, [generated_playlist], self.headlines, c = Feed(self.can_get_more_events, self.pumpkin, self.is_wizard_passed, [generated_playlist], self.headlines,
self.today, [day]) self.today, [day])

ファイルの表示

@ -4,7 +4,7 @@ from yandex_music import InvocationInfo
class TestInvocationInfo: class TestInvocationInfo:
hostname = 'myt1-0261-c2e-msk-myt-music-st-e72-18274.gencfg-c.yandex.net' hostname = 'myt1-0261-c2e-msk-myt-music-st-e72-18274.gencfg-c.yandex.net'
req_id = '1573172241066040-16981638052883278246' req_id = '1573172241066040-16981638052883278246'
exec_duration_millis = '0' exec_duration_millis = 0
def test_expected_values(self, invocation_info): def test_expected_values(self, invocation_info):
assert invocation_info.hostname == self.hostname assert invocation_info.hostname == self.hostname

ファイルの表示

@ -36,7 +36,7 @@ class TestLanding:
def test_equality(self, block): def test_equality(self, block):
a = Landing(self.pumpkin, self.content_id, [block]) a = Landing(self.pumpkin, self.content_id, [block])
b = Landing(self.pumpkin, '', [block]) b = Landing(self.pumpkin, '', [block])
c = Landing(self.pumpkin, self.content_id, None) c = Landing(self.pumpkin, self.content_id, [])
d = Landing(self.pumpkin, self.content_id, [block]) d = Landing(self.pumpkin, self.content_id, [block])
assert a != b != c assert a != b != c

ファイルの表示

@ -19,7 +19,7 @@ class TestPlayContextsData:
def test_equality(self, track_short_old): def test_equality(self, track_short_old):
a = PlayContextsData([track_short_old]) a = PlayContextsData([track_short_old])
b = PlayContextsData(None) b = PlayContextsData([])
assert a != b != track_short_old assert a != b != track_short_old
assert hash(a) != hash(b) != hash(track_short_old) assert hash(a) != hash(b) != hash(track_short_old)

ファイルの表示

@ -8,9 +8,9 @@ class TestProduct:
description = None description = None
duration = 30 duration = 30
trial_duration = 0 trial_duration = 0
feature = ['basic-music'] feature = 'basic-music'
debug = False debug = False
features = 'basic-music' features = ['basic-music']
available = None available = None
trial_available = None trial_available = None
vendor_trial_available = None vendor_trial_available = None
@ -83,7 +83,7 @@ class TestProduct:
def test_equality(self, price): def test_equality(self, price):
a = Product(self.product_id, self.type, self.common_period_duration, self.duration, self.trial_duration, price, a = Product(self.product_id, self.type, self.common_period_duration, self.duration, self.trial_duration, price,
self.feature, self.debug) self.feature, self.debug)
b = Product(10, self.type, self.common_period_duration, self.duration, self.trial_duration, price, b = Product('', self.type, self.common_period_duration, self.duration, self.trial_duration, price,
self.feature, self.debug) self.feature, self.debug)
c = Product(self.product_id, self.type, self.common_period_duration, self.duration, self.trial_duration, price, c = Product(self.product_id, self.type, self.common_period_duration, self.duration, self.trial_duration, price,
self.feature, self.debug) self.feature, self.debug)

ファイルの表示

@ -49,10 +49,10 @@ class TestStation:
assert station.parent_id == id_ assert station.parent_id == id_
def test_equality(self, id_, icon, restrictions): def test_equality(self, id_, icon, restrictions):
a = Station(id_, icon, self.name, icon, icon, icon, self.id_for_from, restrictions, restrictions) a = Station(id_, self.name, icon, icon, icon, self.id_for_from, restrictions, restrictions)
b = Station(id_, icon, self.name, None, icon, icon, self.id_for_from, restrictions, restrictions) b = Station(id_, self.name, None, icon, icon, self.id_for_from, restrictions, restrictions)
c = Station(id_, icon, '', icon, icon, None, self.id_for_from, restrictions, restrictions) c = Station(id_, '', icon, icon, icon, self.id_for_from, restrictions, restrictions)
d = Station(id_, icon, self.name, icon, icon, icon, self.id_for_from, restrictions, restrictions) d = Station(id_, self.name, icon, icon, icon, self.id_for_from, restrictions, restrictions)
assert a != b != c assert a != b != c
assert hash(a) != hash(b) != hash(c) assert hash(a) != hash(b) != hash(c)

ファイルの表示

@ -40,7 +40,7 @@ class TestSuggestions:
def test_equality(self, best): def test_equality(self, best):
a = Suggestions(best, self.suggestions) a = Suggestions(best, self.suggestions)
b = Suggestions(None, self.suggestions) b = Suggestions(None, self.suggestions)
c = Suggestions(best, '') c = Suggestions(best, [])
d = Suggestions(best, self.suggestions) d = Suggestions(best, self.suggestions)
assert a != b != c assert a != b != c

ファイルの表示

@ -98,7 +98,7 @@ class TestTrack:
def test_equality(self, artist, album): def test_equality(self, artist, album):
a = Track(self.id, self.title, self.available, [artist], [album]) a = Track(self.id, self.title, self.available, [artist], [album])
b = Track(self.id, '', self.available, [artist], [None]) b = Track(self.id, '', self.available, [artist], [])
c = Track(self.id, self.title, self.available, [artist], [album]) c = Track(self.id, self.title, self.available, [artist], [album])
assert a != b assert a != b

ファイルの表示

@ -1,35 +1,40 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Artist, Label, TrackPosition, Track
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Album(YandexMusicObject): class Album(YandexMusicObject):
def __init__(self, def __init__(self,
id_, id_: int,
title, title: str,
track_count, track_count: int,
artists, artists: List['Artist'],
labels, labels: List['Label'],
available, available: bool,
available_for_premium_users, available_for_premium_users: bool,
cover_uri=None, cover_uri: Optional[str] = None,
content_warning=None, content_warning=None,
original_release_year=None, original_release_year=None,
genre=None, genre: Optional[str] = None,
og_image=None, og_image: Optional[str] = None,
buy=None, buy: Optional[list] = None,
recent=None, recent: Optional[bool] = None,
very_important=None, very_important: Optional[bool] = None,
available_for_mobile=None, available_for_mobile: Optional[bool] = None,
available_partially=None, available_partially: Optional[bool] = None,
bests=None, bests: Optional[List[int]] = None,
prerolls=None, prerolls: Optional[list] = None,
volumes=None, volumes: List['Track'] = None,
year=None, year: Optional[int] = None,
release_date=None, release_date: Optional[str] = None,
type_=None, type_: Optional[str] = None,
track_position=None, track_position: Optional['TrackPosition'] = None,
regions=None, regions=None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.title = title self.title = title
self.track_count = track_count self.track_count = track_count
@ -61,7 +66,7 @@ class Album(YandexMusicObject):
self._id_attrs = (self.id, self.title, self.track_count, self.artists, self.labels, self._id_attrs = (self.id, self.title, self.track_count, self.artists, self.labels,
self.available_for_premium_users, self.available) 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) client.albums_with_tracks(album.id, *args, **kwargs)
@ -69,7 +74,7 @@ class Album(YandexMusicObject):
return self.client.albums_with_tracks(self.id, *args, **kwargs) 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: Args:
@ -79,7 +84,7 @@ class Album(YandexMusicObject):
self.client.request.download(f'https://{self.cover_uri.replace("%%", size)}', filename) 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(). Предпочтительнее использовать self.download_cover().
@ -89,16 +94,16 @@ class Album(YandexMusicObject):
size (:obj:`str`, optional): Размер обложки. size (:obj:`str`, optional): Размер обложки.
""" """
self.client.request.download(f'https://{self.og_image("%%", size)}', filename) self.client.request.download(f'https://{self.og_image.replace("%%", size)}', filename)
def like(self, *args, **kwargs): def like(self, *args, **kwargs) -> bool:
"""Сокращение для:: """Сокращение для::
client.users_likes_albums_add(album.id, user.id *args, **kwargs) 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) 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) client.users_likes_albums_remove(album.id, user.id *args, **kwargs)
@ -106,7 +111,7 @@ class Album(YandexMusicObject):
return self.client.users_likes_albums_remove(self.id, self.client.me.account.uid, *args, **kwargs) return self.client.users_likes_albums_remove(self.id, self.client.me.account.uid, *args, **kwargs)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Album']:
if not data: if not data:
return None return None
@ -121,7 +126,7 @@ class Album(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Album']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -12,15 +17,15 @@ class Label(YandexMusicObject):
Args: Args:
id_ (:obj:`int`): Идентификатор альбома. id_ (:obj:`int`): Идентификатор альбома.
name (:obj:`str`): Название альбома. name (:obj:`str`): Название альбома.
client (:obj:`yandex_music.Client`, optional): Объект класса :class:`yandex_music.Client` представляющий клиент client (:obj:`yandex_music.Client`, optional): Объект класса :class:`yandex_music.Client` представляющий
Yandex Music. клиент Yandex Music.
**kwargs: Произвольные ключевые аргументы полученные от API. **kwargs: Произвольные ключевые аргументы полученные от API.
""" """
def __init__(self, def __init__(self,
id_, id_: int,
name, name: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.name = name self.name = name
@ -28,7 +33,7 @@ class Label(YandexMusicObject):
self._id_attrs = (self.id, self.name) self._id_attrs = (self.id, self.name)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Label']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:
@ -46,13 +51,13 @@ class Label(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Label']:
"""Десериализация списка объектов. """Десериализация списка объектов.
Args: Args:
data (:obj:`list`): Список словарей с полями и значениями десериализуемого объекта. data (:obj:`list`): Список словарей с полями и значениями десериализуемого объекта.
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент
Music. Yandex Music.
Returns: Returns:
:obj:`list` из :obj:`yandex_music.Label`: Список объектов класса :class:`yandex_music.Label`. :obj:`list` из :obj:`yandex_music.Label`: Список объектов класса :class:`yandex_music.Label`.
""" """

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class TrackPosition(YandexMusicObject): class TrackPosition(YandexMusicObject):
def __init__(self, def __init__(self,
volume, volume: int,
index, index: int,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.volume = volume self.volume = volume
self.index = index self.index = index
@ -14,7 +19,7 @@ class TrackPosition(YandexMusicObject):
self._id_attrs = (self.volume, self.index) self._id_attrs = (self.volume, self.index)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['TrackPosition']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,35 +1,40 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Cover, Ratings, Counts, Link, Track, Description, ArtistTracks, ArtistAlbums
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Artist(YandexMusicObject): class Artist(YandexMusicObject):
def __init__(self, def __init__(self,
id_, id_: int,
name, name: str,
cover, cover: Optional['Cover'],
various=None, various: Optional[bool] = None,
composer=None, composer=None,
genres=None, genres=None,
op_image=None, op_image=None,
no_pictures_from_search=None, no_pictures_from_search=None,
counts=None, counts: Optional['Counts'] = None,
available=None, available: Optional[bool] = None,
ratings=None, ratings: Optional['Ratings'] = None,
links=None, links: List['Link'] = None,
tickets_available=None, tickets_available: Optional[bool] = None,
likes_count=None, likes_count: Optional[int] = None,
popular_tracks=None, popular_tracks: List['Track'] = None,
regions=None, regions=None,
decomposed=None, decomposed=None,
full_names=None, full_names=None,
description=None, description: Optional['Description'] = None,
countries=None, countries=None,
en_wikipedia_link=None, en_wikipedia_link=None,
db_aliases=None, db_aliases=None,
aliases=None, aliases=None,
init_date=None, init_date: Optional[str] = None,
end_date=None, end_date=None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.name = name self.name = name
self.cover = cover self.cover = cover
@ -62,7 +67,7 @@ class Artist(YandexMusicObject):
self.client = client self.client = client
self._id_attrs = (self.id, self.name, self.cover) self._id_attrs = (self.id, self.name, self.cover)
def download_op_image(self, filename, size='200x200'): def download_op_image(self, filename: str, size: str = '200x200') -> None:
"""Загрузка обложки. """Загрузка обложки.
Используйте это только когда нет self.cover! Используйте это только когда нет self.cover!
@ -74,28 +79,28 @@ class Artist(YandexMusicObject):
self.client.request.download(f'https://{self.op_image.replace("%%", size)}', filename) self.client.request.download(f'https://{self.op_image.replace("%%", size)}', filename)
def like(self, *args, **kwargs): def like(self, *args, **kwargs) -> bool:
"""Сокращение для:: """Сокращение для::
client.users_likes_artists_add(artist.id, user.id *args, **kwargs) client.users_likes_artists_add(artist.id, user.id *args, **kwargs)
""" """
return self.client.users_likes_artists_add(self.id, self.client.me.account.uid, *args, **kwargs) return self.client.users_likes_artists_add(self.id, self.client.me.account.uid, *args, **kwargs)
def dislike(self, *args, **kwargs): def dislike(self, *args, **kwargs) -> bool:
"""Сокращение для:: """Сокращение для::
client.users_likes_artists_remove(artist.id, user.id *args, **kwargs) client.users_likes_artists_remove(artist.id, user.id *args, **kwargs)
""" """
return self.client.users_likes_artists_remove(self.id, self.client.me.account.uid, *args, **kwargs) return self.client.users_likes_artists_remove(self.id, self.client.me.account.uid, *args, **kwargs)
def get_tracks(self, page=0, page_size=20, *args, **kwargs): def get_tracks(self, page=0, page_size=20, *args, **kwargs) -> Optional['ArtistTracks']:
"""Сокращение для:: """Сокращение для::
client.artists_tracks(artist.id, page, page_size, *args, **kwargs) client.artists_tracks(artist.id, page, page_size, *args, **kwargs)
""" """
return self.client.artists_tracks(self.id, page, page_size, *args, **kwargs) return self.client.artists_tracks(self.id, page, page_size, *args, **kwargs)
def get_albums(self, page=0, page_size=20, sort_by='year', *args, **kwargs): def get_albums(self, page=0, page_size=20, sort_by='year', *args, **kwargs) -> Optional['ArtistAlbums']:
"""Сокращение для:: """Сокращение для::
client.artists_direct_albums(artist.id, page, page_size, sort_by, *args, **kwargs) client.artists_direct_albums(artist.id, page, page_size, sort_by, *args, **kwargs)
@ -103,7 +108,7 @@ class Artist(YandexMusicObject):
return self.client.artists_direct_albums(self.id, page, page_size, sort_by, *args, **kwargs) return self.client.artists_direct_albums(self.id, page, page_size, sort_by, *args, **kwargs)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Artist']:
if not data: if not data:
return None return None
@ -120,7 +125,7 @@ class Artist(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Artist']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Album, Pager
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -19,10 +24,10 @@ class ArtistAlbums(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
albums, albums: List['Album'],
pager, pager: Optional['Pager'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.albums = albums self.albums = albums
self.pager = pager self.pager = pager
@ -30,7 +35,7 @@ class ArtistAlbums(YandexMusicObject):
self._id_attrs = (self.pager, self.albums) self._id_attrs = (self.pager, self.albums)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['ArtistAlbums']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Track, Pager
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -19,10 +24,10 @@ class ArtistTracks(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
tracks, tracks: List['Track'],
pager, pager: Optional['Pager'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.tracks = tracks self.tracks = tracks
self.pager = pager self.pager = pager
@ -30,7 +35,7 @@ class ArtistTracks(YandexMusicObject):
self._id_attrs = (self.pager, self.tracks) self._id_attrs = (self.pager, self.tracks)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['ArtistTracks']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,23 +1,28 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Artist, Track, Album, Cover, PlaylistId, Video, Chart, Vinyl
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class BriefInfo(YandexMusicObject): class BriefInfo(YandexMusicObject):
def __init__(self, def __init__(self,
artist, artist: Optional['Artist'],
albums, albums: List['Album'],
also_albums, also_albums: List['Album'],
last_release_ids, last_release_ids: List[int],
popular_tracks, popular_tracks: List['Track'],
similar_artists, similar_artists: List['Artist'],
all_covers, all_covers: List['Cover'],
concerts, concerts,
videos, videos: List['Video'],
vinyls, vinyls: List['Vinyl'],
has_promotions, has_promotions: bool,
playlist_ids, playlist_ids: List['PlaylistId'],
tracks_in_chart=None, tracks_in_chart: List['Chart'] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.artist = artist self.artist = artist
self.albums = albums self.albums = albums
self.also_albums = also_albums self.also_albums = also_albums
@ -39,7 +44,7 @@ class BriefInfo(YandexMusicObject):
self.has_promotions, self.playlist_ids) self.has_promotions, self.playlist_ids)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['BriefInfo']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,14 +1,19 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Counts(YandexMusicObject): class Counts(YandexMusicObject):
def __init__(self, def __init__(self,
tracks, tracks: int,
direct_albums, direct_albums: int,
also_albums, also_albums: int,
also_tracks, also_tracks: int,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.tracks = tracks self.tracks = tracks
self.direct_albums = direct_albums self.direct_albums = direct_albums
self.also_albums = also_albums self.also_albums = also_albums
@ -18,7 +23,7 @@ class Counts(YandexMusicObject):
self._id_attrs = (self.tracks, self.direct_albums, self.also_albums, self.also_tracks) self._id_attrs = (self.tracks, self.direct_albums, self.also_albums, self.also_tracks)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Counts']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Description(YandexMusicObject): class Description(YandexMusicObject):
def __init__(self, def __init__(self,
text, text: str,
url, url: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.text = text self.text = text
self.url = url self.url = url
@ -14,7 +19,7 @@ class Description(YandexMusicObject):
self._id_attrs = (self.text, self.url) self._id_attrs = (self.text, self.url)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Description']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,14 +1,19 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Link(YandexMusicObject): class Link(YandexMusicObject):
def __init__(self, def __init__(self,
title, title: str,
href, href: str,
type_, type_: str,
social_network=None, social_network: Optional[str] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.title = title self.title = title
self.href = href self.href = href
self.type = type_ self.type = type_
@ -19,7 +24,7 @@ class Link(YandexMusicObject):
self._id_attrs = (self.title, self.href, self.type) self._id_attrs = (self.title, self.href, self.type)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Link']:
if not data: if not data:
return None return None
@ -28,7 +33,7 @@ class Link(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Link']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,13 +1,18 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Ratings(YandexMusicObject): class Ratings(YandexMusicObject):
def __init__(self, def __init__(self,
week, week: int,
month, month: int,
day=None, day: Optional[int] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.week = week self.week = week
self.month = month self.month = month
@ -17,7 +22,7 @@ class Ratings(YandexMusicObject):
self._id_attrs = (self.week, self.month) self._id_attrs = (self.week, self.month)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Ratings']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,16 +1,21 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Vinyl(YandexMusicObject): class Vinyl(YandexMusicObject):
def __init__(self, def __init__(self,
url, url: str,
picture, picture: str,
title, title: str,
year, year: int,
price, price: int,
media, media: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.url = url self.url = url
self.picture = picture self.picture = picture
self.title = title self.title = title
@ -22,7 +27,7 @@ class Vinyl(YandexMusicObject):
self._id_attrs = (self.title, self.price, self.year, self.url, self.price, self.media) self._id_attrs = (self.title, self.price, self.year, self.url, self.price, self.media)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Vinyl']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:
@ -42,7 +47,7 @@ class Vinyl(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Vinyl']:
"""Десериализация списка объектов. """Десериализация списка объектов.
Args: Args:

ファイルの表示

@ -1,7 +1,7 @@
import logging import logging
import functools import functools
from datetime import datetime from datetime import datetime
from typing import Callable, Union, List from typing import Callable, Union, List, Optional
from yandex_music import YandexMusicObject, Status, Settings, PermissionAlerts, Experiments, Artist, Album, Playlist, \ from yandex_music import YandexMusicObject, Status, Settings, PermissionAlerts, Experiments, Artist, Album, Playlist, \
TracksList, Track, AlbumsLikes, ArtistsLikes, PlaylistsLikes, Feed, PromoCodeStatus, DownloadInfo, Search, \ TracksList, Track, AlbumsLikes, ArtistsLikes, PlaylistsLikes, Feed, PromoCodeStatus, DownloadInfo, Search, \
@ -217,7 +217,7 @@ class Client(YandexMusicObject):
return self._request return self._request
@log @log
def account_status(self, timeout: Union[int, float] = None, *args, **kwargs) -> Status: def account_status(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Status]:
"""Получение статуса аккаунта. Нет обязательных параметров. """Получение статуса аккаунта. Нет обязательных параметров.
Args: Args:
@ -240,7 +240,7 @@ class Client(YandexMusicObject):
return Status.de_json(result, self) return Status.de_json(result, self)
@log @log
def settings(self, timeout: Union[int, float] = None, *args, **kwargs) -> Settings: def settings(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Settings]:
"""Получение предложений по покупке. Нет обязательных параметров. """Получение предложений по покупке. Нет обязательных параметров.
Args: Args:
@ -263,7 +263,7 @@ class Client(YandexMusicObject):
return Settings.de_json(result, self) return Settings.de_json(result, self)
@log @log
def permission_alerts(self, timeout: Union[int, float] = None, *args, **kwargs) -> PermissionAlerts: def permission_alerts(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[PermissionAlerts]:
"""Получение оповещений. Нет обязательных параметров. """Получение оповещений. Нет обязательных параметров.
Args: Args:
@ -286,7 +286,7 @@ class Client(YandexMusicObject):
return PermissionAlerts.de_json(result, self) return PermissionAlerts.de_json(result, self)
@log @log
def account_experiments(self, timeout: Union[int, float] = None, *args, **kwargs) -> Experiments: def account_experiments(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Experiments]:
"""Получение значений экспериментальных функций аккаунта. """Получение значений экспериментальных функций аккаунта.
Args: Args:
@ -310,7 +310,7 @@ class Client(YandexMusicObject):
@log @log
def consume_promo_code(self, code: str, language: str = 'en', timeout: Union[int, float] = None, def consume_promo_code(self, code: str, language: str = 'en', timeout: Union[int, float] = None,
*args, **kwargs) -> PromoCodeStatus: *args, **kwargs) -> Optional[PromoCodeStatus]:
"""Активация промо-кода. """Активация промо-кода.
Args: Args:
@ -335,7 +335,7 @@ class Client(YandexMusicObject):
return PromoCodeStatus.de_json(result, self) return PromoCodeStatus.de_json(result, self)
@log @log
def feed(self, timeout: Union[int, float] = None, *args, **kwargs) -> Feed: def feed(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Feed]:
"""Получение потока информации (фида) подобранного под пользователя. Содержит умные плейлисты. """Получение потока информации (фида) подобранного под пользователя. Содержит умные плейлисты.
Args: Args:
@ -366,7 +366,8 @@ class Client(YandexMusicObject):
return result.get('is_wizard_passed') or False return result.get('is_wizard_passed') or False
@log @log
def landing(self, blocks: Union[str, List[str]], timeout: 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, Поддерживаемые типы блоков: personalplaylists, promotions, new-releases, new-playlists, mixes,c hart, artists,
@ -443,7 +444,7 @@ class Client(YandexMusicObject):
@log @log
def track_supplement(self, track_id: Union[str, int], timeout: Union[int, float] = None, def track_supplement(self, track_id: Union[str, int], timeout: Union[int, float] = None,
*args, **kwargs) -> Supplement: *args, **kwargs) -> Optional[Supplement]:
"""Получение дополнительной информации о треке. """Получение дополнительной информации о треке.
Args: Args:
@ -531,7 +532,7 @@ class Client(YandexMusicObject):
return result == 'ok' return result == 'ok'
def albums_with_tracks(self, album_id: Union[str, int], timeout: Union[int, float] = None, def albums_with_tracks(self, album_id: Union[str, int], timeout: Union[int, float] = None,
*args, **kwargs) -> Album: *args, **kwargs) -> Optional[Album]:
"""Получение альбома по его уникальному идентификатору вместе с треками. """Получение альбома по его уникальному идентификатору вместе с треками.
Args: Args:
@ -562,7 +563,7 @@ class Client(YandexMusicObject):
page: int = 0, page: int = 0,
playlist_in_best: bool = True, playlist_in_best: bool = True,
timeout: Union[int, float] = None, timeout: Union[int, float] = None,
*args, **kwargs) -> Search: *args, **kwargs) -> Optional[Search]:
"""Осуществление поиска по запросу и типу, получение результатов. """Осуществление поиска по запросу и типу, получение результатов.
Args: Args:
@ -598,7 +599,8 @@ class Client(YandexMusicObject):
return Search.de_json(result, self) return Search.de_json(result, self)
@log @log
def search_suggest(self, part: str, timeout: Union[int, float] = None, *args, **kwargs) -> Suggestions: def search_suggest(self, part: str, timeout: Union[int, float] = None,
*args, **kwargs) -> Optional[Suggestions]:
"""Получение подсказок по введенной части поискового запроса. """Получение подсказок по введенной части поискового запроса.
Args: Args:
@ -657,7 +659,7 @@ class Client(YandexMusicObject):
@log @log
def users_playlists_create(self, title: str, visibility: str = 'public', user_id: str = None, def users_playlists_create(self, title: str, visibility: str = 'public', user_id: str = None,
timeout: Union[int, float] = None, *args, **kwargs) -> Playlist: timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]:
"""Создание плейлиста. """Создание плейлиста.
Args: Args:
@ -720,7 +722,7 @@ class Client(YandexMusicObject):
@log @log
def users_playlists_name(self, kind: Union[str, int], name: str, user_id: str = None, def users_playlists_name(self, kind: Union[str, int], name: str, user_id: str = None,
timeout: Union[int, float] = None, *args, **kwargs) -> Playlist: timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]:
"""Изменение названия плейлиста. """Изменение названия плейлиста.
Args: Args:
@ -750,7 +752,7 @@ class Client(YandexMusicObject):
@log @log
def users_playlists_change(self, kind: Union[str, int], diff: str, revision: int = 1, user_id: str = None, 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) -> Playlist: timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]:
"""Изменение плейлиста. """Изменение плейлиста.
Для получения отличий есть вспомогательный класс :class:`from yandex_music.utils.difference.Difference`. Для получения отличий есть вспомогательный класс :class:`from yandex_music.utils.difference.Difference`.
@ -791,7 +793,7 @@ class Client(YandexMusicObject):
@log @log
def users_playlists_insert_track(self, kind: Union[str, int], track_id: Union[str, int], album_id: Union[str, int], def users_playlists_insert_track(self, kind: Union[str, int], track_id: Union[str, int], album_id: Union[str, int],
at: int = 0, revision: int = 1, user_id: str = None, at: int = 0, revision: int = 1, user_id: str = None,
timeout: Union[int, float] = None, *args, **kwargs) -> Playlist: timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]:
"""Добавление трека в плейлист. """Добавление трека в плейлист.
Трек можно вставить с любое место плейлиста задав индекс вставки (аргумент at). Трек можно вставить с любое место плейлиста задав индекс вставки (аргумент at).
@ -825,7 +827,7 @@ class Client(YandexMusicObject):
@log @log
def users_playlists_delete_track(self, kind: Union[str, int], from_: int, to: int, revision: int = 1, def users_playlists_delete_track(self, kind: Union[str, int], from_: int, to: int, revision: int = 1,
user_id: str = None, timeout: Union[int, float] = None, user_id: str = None, timeout: Union[int, float] = None,
*args, **kwargs) -> Playlist: *args, **kwargs) -> Optional[Playlist]:
"""Удаление треков из плейлиста. """Удаление треков из плейлиста.
Для удаление необходимо указать границы с какого по какой элемент (трек) удалить. Для удаление необходимо указать границы с какого по какой элемент (трек) удалить.
@ -856,7 +858,7 @@ class Client(YandexMusicObject):
return self.users_playlists_change(kind, diff.to_json(), revision, user_id, timeout, *args, **kwargs) return self.users_playlists_change(kind, diff.to_json(), revision, user_id, timeout, *args, **kwargs)
@log @log
def rotor_account_status(self, timeout: 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' url = f'{self.base_url}/rotor/account/status'
result = self._request.get(url, timeout=timeout, *args, **kwargs) result = self._request.get(url, timeout=timeout, *args, **kwargs)
@ -864,7 +866,8 @@ class Client(YandexMusicObject):
return Status.de_json(result, self) return Status.de_json(result, self)
@log @log
def rotor_stations_dashboard(self, timeout: Union[int, float] = None, *args, **kwargs) -> Dashboard: def rotor_stations_dashboard(self, timeout: Union[int, float] = None,
*args, **kwargs) -> Optional[Dashboard]:
url = f'{self.base_url}/rotor/stations/dashboard' url = f'{self.base_url}/rotor/stations/dashboard'
result = self._request.get(url, timeout=timeout, *args, **kwargs) result = self._request.get(url, timeout=timeout, *args, **kwargs)
@ -881,9 +884,10 @@ class Client(YandexMusicObject):
return StationResult.de_list(result, self) return StationResult.de_list(result, self)
@log @log
def rotor_station_genre_feedback(self, genre: str, type_: str, timestamp: int = None, from_: str = None, def rotor_station_genre_feedback(self, genre: str, type_: str, timestamp: int = None,
batch_id: Union[str, int] = None, track_id: str = None, from_: str = None, batch_id: Union[str, int] = None,
timeout: Union[int, float] = None, *args, **kwargs) -> bool: track_id: str = None, timeout: Union[int, float] = None,
*args, **kwargs) -> bool:
if timestamp is None: if timestamp is None:
timestamp = datetime.now().timestamp() timestamp = datetime.now().timestamp()
@ -929,7 +933,7 @@ class Client(YandexMusicObject):
@log @log
def rotor_station_genre_tracks(self, genre: str, timeout: Union[int, float] = None, def rotor_station_genre_tracks(self, genre: str, timeout: Union[int, float] = None,
*args, **kwargs) -> StationTracksResult: *args, **kwargs) -> Optional[StationTracksResult]:
url = f'{self.base_url}/rotor/station/genre:{genre}/tracks' url = f'{self.base_url}/rotor/station/genre:{genre}/tracks'
result = self._request.get(url, timeout=timeout, *args, **kwargs) result = self._request.get(url, timeout=timeout, *args, **kwargs)
@ -938,7 +942,7 @@ class Client(YandexMusicObject):
@log @log
def artists_brief_info(self, artist_id: Union[str, int], timeout: Union[int, float] = None, def artists_brief_info(self, artist_id: Union[str, int], timeout: Union[int, float] = None,
*args, **kwargs) -> BriefInfo: *args, **kwargs) -> Optional[BriefInfo]:
url = f'{self.base_url}/artists/{artist_id}/brief-info' url = f'{self.base_url}/artists/{artist_id}/brief-info'
result = self._request.get(url, timeout=timeout, *args, **kwargs) result = self._request.get(url, timeout=timeout, *args, **kwargs)
@ -947,7 +951,7 @@ class Client(YandexMusicObject):
@log @log
def artists_tracks(self, artist_id: Union[str, int], page: int = 0, page_size: int = 20, def artists_tracks(self, artist_id: Union[str, int], page: int = 0, page_size: int = 20,
timeout: Union[int, float] = None, *args, **kwargs) -> ArtistTracks: timeout: Union[int, float] = None, *args, **kwargs) -> Optional[ArtistTracks]:
"""Получение треков артиста. """Получение треков артиста.
Args: Args:
@ -980,7 +984,7 @@ class Client(YandexMusicObject):
@log @log
def artists_direct_albums(self, artist_id: Union[str, int], page: int = 0, page_size: int = 20, 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, sort_by: str = 'year', timeout: Union[int, float] = None,
*args, **kwargs) -> ArtistAlbums: *args, **kwargs) -> Optional[ArtistAlbums]:
"""Получение альбомов артиста. """Получение альбомов артиста.
Известные значения для sort_by: year, rating. Известные значения для sort_by: year, rating.
@ -1121,7 +1125,7 @@ class Client(YandexMusicObject):
def _get_likes(self, object_type: str, user_id: Union[str, int] = None, params: dict = None, def _get_likes(self, object_type: str, user_id: Union[str, int] = None, params: dict = None,
timeout: Union[int, float] = None, *args, **kwargs) \ timeout: Union[int, float] = None, *args, **kwargs) \
-> Union[List[ArtistsLikes], List[AlbumsLikes], List[PlaylistsLikes], TracksList]: -> Union[List[ArtistsLikes], List[AlbumsLikes], List[PlaylistsLikes], Optional[TracksList]]:
if user_id is None and self.me is not None: if user_id is None and self.me is not None:
user_id = self.me.account.uid user_id = self.me.account.uid
@ -1136,7 +1140,7 @@ class Client(YandexMusicObject):
@log @log
def users_likes_tracks(self, user_id: Union[str, int] = None, if_modified_since_revision: int = 0, def users_likes_tracks(self, user_id: Union[str, int] = None, if_modified_since_revision: int = 0,
timeout: Union[int, float] = None, *args, **kwargs) -> TracksList: 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, return self._get_likes('track', user_id, {'if-modified-since-revision': if_modified_since_revision}, timeout,
*args, **kwargs) *args, **kwargs)
@ -1157,7 +1161,7 @@ class Client(YandexMusicObject):
@log @log
def users_dislikes_tracks(self, user_id: Union[str, int] = None, if_modified_since_revision: int = 0, def users_dislikes_tracks(self, user_id: Union[str, int] = None, if_modified_since_revision: int = 0,
timeout: Union[int, float] = None, *args, **kwargs) -> TracksList: timeout: Union[int, float] = None, *args, **kwargs) -> Optional[TracksList]:
if user_id is None and self.me is not None: if user_id is None and self.me is not None:
user_id = self.me.account.uid user_id = self.me.account.uid

ファイルの表示

@ -45,7 +45,7 @@ class Cover(YandexMusicObject):
prefix: Optional[str] = None, prefix: Optional[str] = None,
error: Optional[str] = None, error: Optional[str] = None,
client: Optional['Client'] = None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.type = type_ self.type = type_
self.uri = uri self.uri = uri
self.items_uri = items_uri self.items_uri = items_uri

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Album, Track
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class AlbumEvent(YandexMusicObject): class AlbumEvent(YandexMusicObject):
def __init__(self, def __init__(self,
album, album: Optional['Album'],
tracks, tracks: List['Track'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.album = album self.album = album
self.tracks = tracks self.tracks = tracks
@ -14,7 +19,7 @@ class AlbumEvent(YandexMusicObject):
self._id_attrs = (self.album, self.tracks) self._id_attrs = (self.album, self.tracks)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['AlbumEvent']:
if not data: if not data:
return None return None
@ -26,7 +31,7 @@ class AlbumEvent(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['AlbumEvent']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,13 +1,18 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Artist, Track
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class ArtistEvent(YandexMusicObject): class ArtistEvent(YandexMusicObject):
def __init__(self, def __init__(self,
artist, artist: Optional['Artist'],
tracks, tracks: List['Track'],
similar_to_artists_from_history, similar_to_artists_from_history: List['Artist'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.artist = artist self.artist = artist
self.tracks = tracks self.tracks = tracks
self.similar_to_artists_from_history = similar_to_artists_from_history self.similar_to_artists_from_history = similar_to_artists_from_history
@ -16,7 +21,7 @@ class ArtistEvent(YandexMusicObject):
self._id_attrs = (self.artist, self.tracks, self.similar_to_artists_from_history) self._id_attrs = (self.artist, self.tracks, self.similar_to_artists_from_history)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['ArtistEvent']:
if not data: if not data:
return None return None
@ -29,7 +34,7 @@ class ArtistEvent(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['ArtistEvent']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,14 +1,19 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Event, Track, TrackWithAds
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Day(YandexMusicObject): class Day(YandexMusicObject):
def __init__(self, def __init__(self,
day, day: str,
events, events: List['Event'],
tracks_to_play_with_ads, tracks_to_play_with_ads: List['TrackWithAds'],
tracks_to_play, tracks_to_play: List['Track'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.day = day self.day = day
self.events = events self.events = events
self.tracks_to_play_with_ads = tracks_to_play_with_ads self.tracks_to_play_with_ads = tracks_to_play_with_ads
@ -18,7 +23,7 @@ class Day(YandexMusicObject):
self._id_attrs = (self.day, self.events, self.tracks_to_play_with_ads, self.tracks_to_play) self._id_attrs = (self.day, self.events, self.tracks_to_play_with_ads, self.tracks_to_play)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Day']:
if not data: if not data:
return None return None
@ -31,7 +36,7 @@ class Day(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Day']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,20 +1,25 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Track, AlbumEvent, ArtistEvent
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Event(YandexMusicObject): class Event(YandexMusicObject):
def __init__(self, def __init__(self,
id_, id_: str,
type_, type_: str,
type_for_from=None, type_for_from: Optional[str] = None,
title=None, title: Optional[str] = None,
tracks=None, tracks: List['Track'] = None,
artists=None, artists: List['ArtistEvent'] = None,
albums=None, albums: List['AlbumEvent'] = None,
message=None, message=None,
device=None, device=None,
tracks_count=None, tracks_count: Optional[int] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.type = type_ self.type = type_
@ -31,7 +36,7 @@ class Event(YandexMusicObject):
self._id_attrs = (self.id, self.type) self._id_attrs = (self.id, self.type)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Event']:
if not data: if not data:
return None return None
@ -44,7 +49,7 @@ class Event(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Event']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,18 +1,23 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, GeneratedPlaylist, Day
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Feed(YandexMusicObject): class Feed(YandexMusicObject):
def __init__(self, def __init__(self,
can_get_more_events, can_get_more_events: bool,
pumpkin, pumpkin: bool,
is_wizard_passed, is_wizard_passed: bool,
generated_playlists, generated_playlists: List['GeneratedPlaylist'],
headlines, headlines: list,
today, today: str,
days, days: List['Day'],
next_revision=None, next_revision: Optional[str] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.can_get_more_events = can_get_more_events self.can_get_more_events = can_get_more_events
self.pumpkin = pumpkin self.pumpkin = pumpkin
self.is_wizard_passed = is_wizard_passed self.is_wizard_passed = is_wizard_passed
@ -27,7 +32,7 @@ class Feed(YandexMusicObject):
self._id_attrs = (self.can_get_more_events, self.generated_playlists, self.headlines, self.today, self.days) self._id_attrs = (self.can_get_more_events, self.generated_playlists, self.headlines, self.today, self.days)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Feed']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,14 +1,19 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Playlist
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class GeneratedPlaylist(YandexMusicObject): class GeneratedPlaylist(YandexMusicObject):
def __init__(self, def __init__(self,
type_, type_: str,
ready, ready: bool,
notify, notify: bool,
data, data: Optional['Playlist'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.type = type_ self.type = type_
self.ready = ready self.ready = ready
self.notify = notify self.notify = notify
@ -18,7 +23,7 @@ class GeneratedPlaylist(YandexMusicObject):
self._id_attrs = (self.type, self.ready, self.notify, self.data) self._id_attrs = (self.type, self.ready, self.notify, self.data)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['GeneratedPlaylist']:
if not data: if not data:
return None return None
@ -29,7 +34,7 @@ class GeneratedPlaylist(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['GeneratedPlaylist']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Track
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class TrackWithAds(YandexMusicObject): class TrackWithAds(YandexMusicObject):
def __init__(self, def __init__(self,
type_, type_: str,
track, track: Optional['Track'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.type = type_ self.type = type_
self.track = track self.track = track
@ -14,7 +19,7 @@ class TrackWithAds(YandexMusicObject):
self._id_attrs = (self.type, self.track) self._id_attrs = (self.type, self.track)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['TrackWithAds']:
if not data: if not data:
return None return None
@ -25,7 +30,7 @@ class TrackWithAds(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['TrackWithAds']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,23 +1,28 @@
from typing import TYPE_CHECKING, Optional, List, Dict
if TYPE_CHECKING:
from yandex_music import Client, Title, Icon, Images
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Genre(YandexMusicObject): class Genre(YandexMusicObject):
def __init__(self, def __init__(self,
id_, id_: str,
weight, weight: int,
composer_top, composer_top: bool,
title, title: str,
titles, titles: Dict[str, Optional['Title']],
images, images: Optional['Images'],
show_in_menu, show_in_menu: bool,
full_title=None, full_title: Optional[str] = None,
url_part=None, url_part: Optional[str] = None,
color=None, color: Optional[str] = None,
radio_icon=None, radio_icon: Optional['Icon'] = None,
sub_genres=None, sub_genres: List['Genre'] = None,
hide_in_regions=None, hide_in_regions=None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.weight = weight self.weight = weight
self.composer_top = composer_top self.composer_top = composer_top
@ -37,7 +42,7 @@ class Genre(YandexMusicObject):
self._id_attrs = (self.id, self.weight, self.composer_top, self.title, self.images, self.show_in_menu) self._id_attrs = (self.id, self.weight, self.composer_top, self.title, self.images, self.show_in_menu)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Genre']:
if not data: if not data:
return None return None
@ -51,7 +56,7 @@ class Genre(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Genre']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,18 +1,23 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Images(YandexMusicObject): class Images(YandexMusicObject):
def __init__(self, def __init__(self,
_208x208=None, _208x208: Optional[str] = None,
_300x300=None, _300x300: Optional[str] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self._208x208 = _208x208 self._208x208 = _208x208
self._300x300 = _300x300 self._300x300 = _300x300
self.client = client self.client = client
def download_208x208(self, filename): def download_208x208(self, filename: str) -> None:
"""Загрузка изображения 208x208. """Загрузка изображения 208x208.
Args: Args:
@ -21,7 +26,7 @@ class Images(YandexMusicObject):
self.client.request.download(self._208x208, filename) self.client.request.download(self._208x208, filename)
def download_300x300(self, filename): def download_300x300(self, filename: str) -> None:
"""Загрузка изображения 300x300. """Загрузка изображения 300x300.
Args: Args:
@ -31,7 +36,7 @@ class Images(YandexMusicObject):
self.client.request.download(self._300x300, filename) self.client.request.download(self._300x300, filename)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Images']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional, Dict
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Title(YandexMusicObject): class Title(YandexMusicObject):
def __init__(self, def __init__(self,
title, title: str,
full_title=None, full_title: Optional[str] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.title = title self.title = title
self.full_title = full_title self.full_title = full_title
@ -14,7 +19,7 @@ class Title(YandexMusicObject):
self._id_attrs = (self.title, self.full_title) self._id_attrs = (self.title, self.full_title)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Title']:
if not data: if not data:
return None return None
@ -23,7 +28,7 @@ class Title(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_dict(cls, data, client): def de_dict(cls, data, client) -> Dict[str, Optional['Title']]:
if not data: if not data:
return {} return {}

ファイルの表示

@ -34,7 +34,7 @@ class Icon(YandexMusicObject):
self.client = client self.client = client
self._id_attrs = (self.background_color, self.image_url) self._id_attrs = (self.background_color, self.image_url)
def download(self, filename: str, size: str = '200x200'): def download(self, filename: str, size: str = '200x200') -> None:
"""Загрузка иконки. """Загрузка иконки.
Args: Args:

ファイルの表示

@ -28,7 +28,7 @@ class InvocationInfo(YandexMusicObject):
def __init__(self, def __init__(self,
hostname: str, hostname: str,
req_id: str, req_id: str,
exec_duration_millis: Optional[str] = None, exec_duration_millis: Optional[int] = None,
client: Optional['Client'] = None, client: Optional['Client'] = None,
**kwargs): **kwargs):
self.hostname = hostname self.hostname = hostname

ファイルの表示

@ -1,17 +1,22 @@
from typing import TYPE_CHECKING, Optional, List, Union
if TYPE_CHECKING:
from yandex_music import Client, BlockEntity, PersonalPlaylistsData, PlayContextsData
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Block(YandexMusicObject): class Block(YandexMusicObject):
def __init__(self, def __init__(self,
id_, id_: str,
type_, type_: str,
type_for_from, type_for_from: str,
title, title: str,
entities, entities: List['BlockEntity'],
description=None, description: Optional[str] = None,
data=None, data: Optional[Union['PersonalPlaylistsData', 'PlayContextsData']] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.type = type_ self.type = type_
@ -25,11 +30,11 @@ class Block(YandexMusicObject):
self.client = client self.client = client
self._id_attrs = (self.id, self.type, self.type_for_from, self.title, self.entities) self._id_attrs = (self.id, self.type, self.type_for_from, self.title, self.entities)
def __getitem__(self, item): def __getitem__(self, item: int) -> 'BlockEntity':
return self.entities[item] return self.entities[item]
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Block']:
if not data: if not data:
return None return None
@ -46,7 +51,7 @@ class Block(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Block']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List, Union
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject, Promotion, Album, Playlist, MixLink, PlayContext, ChartItem,\ from yandex_music import YandexMusicObject, Promotion, Album, Playlist, MixLink, PlayContext, ChartItem,\
GeneratedPlaylist GeneratedPlaylist
@ -15,11 +20,12 @@ de_json = {
class BlockEntity(YandexMusicObject): class BlockEntity(YandexMusicObject):
def __init__(self, def __init__(self,
id_, id_: str,
type_, type_: str,
data, data: Optional[Union['GeneratedPlaylist', 'Promotion', 'Album',
client=None, 'Playlist', 'ChartItem', 'PlayContext', 'MixLink']],
**kwargs): client: Optional['Client'] = None,
**kwargs) -> None:
self.id = id_ self.id = id_
self.type = type_ self.type = type_
@ -29,7 +35,7 @@ class BlockEntity(YandexMusicObject):
self._id_attrs = (self.id, self.type, self.data) self._id_attrs = (self.id, self.type, self.data)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['BlockEntity']:
if not data: if not data:
return None return None
@ -39,7 +45,7 @@ class BlockEntity(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['BlockEntity']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,15 +1,20 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, TrackId
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Chart(YandexMusicObject): class Chart(YandexMusicObject):
def __init__(self, def __init__(self,
position, position: int,
progress, progress: str,
listeners, listeners: int,
shift, shift: int,
track_id=None, track_id: Optional['TrackId'] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.position = position self.position = position
self.progress = progress self.progress = progress
self.listeners = listeners self.listeners = listeners
@ -21,7 +26,7 @@ class Chart(YandexMusicObject):
self._id_attrs = (self.position, self.progress, self.listeners, self.shift, self.track_id) self._id_attrs = (self.position, self.progress, self.listeners, self.shift, self.track_id)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Chart']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:
@ -43,7 +48,7 @@ class Chart(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Chart']:
"""Десериализация списка объектов. """Десериализация списка объектов.
Args: Args:

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Track, Chart
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class ChartItem(YandexMusicObject): class ChartItem(YandexMusicObject):
def __init__(self, def __init__(self,
track, track: Optional['Track'],
chart, chart: Optional['Chart'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.track = track self.track = track
self.chart = chart self.chart = chart
@ -14,7 +19,7 @@ class ChartItem(YandexMusicObject):
self._id_attrs = (self.track, self.chart) self._id_attrs = (self.track, self.chart)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['ChartItem']:
if not data: if not data:
return None return None
@ -26,7 +31,7 @@ class ChartItem(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['ChartItem']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,13 +1,18 @@
from typing import TYPE_CHECKING, Optional, List, Union
if TYPE_CHECKING:
from yandex_music import Client, Block
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Landing(YandexMusicObject): class Landing(YandexMusicObject):
def __init__(self, def __init__(self,
pumpkin, pumpkin: bool,
content_id, content_id: Union[str, int],
blocks, blocks: List['Block'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.pumpkin = pumpkin self.pumpkin = pumpkin
self.content_id = content_id self.content_id = content_id
@ -20,7 +25,7 @@ class Landing(YandexMusicObject):
return self.blocks[item] return self.blocks[item]
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Landing']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,17 +1,22 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class MixLink(YandexMusicObject): class MixLink(YandexMusicObject):
def __init__(self, def __init__(self,
title, title: str,
url, url: str,
url_scheme, url_scheme: str,
text_color, text_color: str,
background_color, background_color: str,
background_image_uri, background_image_uri: str,
cover_white, cover_white: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.title = title self.title = title
self.url = url self.url = url
self.url_scheme = url_scheme self.url_scheme = url_scheme
@ -24,7 +29,7 @@ class MixLink(YandexMusicObject):
self._id_attrs = (self.url, self.title, self.url_scheme, self.text_color, self._id_attrs = (self.url, self.title, self.url_scheme, self.text_color,
self.background_color, self.background_image_uri, self.cover_white) self.background_color, self.background_image_uri, self.cover_white)
def download_background_image(self, filename, size='200x200'): def download_background_image(self, filename: str, size: str = '200x200') -> None:
"""Загрузка заднего фона. """Загрузка заднего фона.
Args: Args:
@ -35,7 +40,7 @@ class MixLink(YandexMusicObject):
self.client.request.download(f'https://{self.background_image_uri.replace("%%", size)}', filename) self.client.request.download(f'https://{self.background_image_uri.replace("%%", size)}', filename)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['MixLink']:
if not data: if not data:
return None return None
@ -44,7 +49,7 @@ class MixLink(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['MixLink']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,18 +1,23 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class PersonalPlaylistsData(YandexMusicObject): class PersonalPlaylistsData(YandexMusicObject):
def __init__(self, def __init__(self,
is_wizard_passed, is_wizard_passed: bool,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.is_wizard_passed = is_wizard_passed self.is_wizard_passed = is_wizard_passed
self.client = client self.client = client
self._id_attrs = (self.is_wizard_passed,) self._id_attrs = (self.is_wizard_passed,)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['PersonalPlaylistsData']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,14 +1,19 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, TrackShortOld
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class PlayContext(YandexMusicObject): class PlayContext(YandexMusicObject):
def __init__(self, def __init__(self,
client_, client_: str,
context, context: str,
context_item, context_item: str,
tracks, tracks: List['TrackShortOld'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.client_ = client_ self.client_ = client_
self.context = context self.context = context
self.context_item = context_item self.context_item = context_item
@ -18,7 +23,7 @@ class PlayContext(YandexMusicObject):
self._id_attrs = (self.client_, self.context_item, self.context_item, self.tracks) self._id_attrs = (self.client_, self.context_item, self.context_item, self.tracks)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['PlayContext']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,18 +1,23 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, TrackShortOld
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class PlayContextsData(YandexMusicObject): class PlayContextsData(YandexMusicObject):
def __init__(self, def __init__(self,
other_tracks, other_tracks: List['TrackShortOld'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.other_tracks = other_tracks self.other_tracks = other_tracks
self.client = client self.client = client
self._id_attrs = (self.other_tracks,) self._id_attrs = (self.other_tracks,)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['PlayContextsData']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,19 +1,24 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Promotion(YandexMusicObject): class Promotion(YandexMusicObject):
def __init__(self, def __init__(self,
promo_id, promo_id: str,
title, title: str,
subtitle, subtitle: str,
heading, heading: str,
url, url: str,
url_scheme, url_scheme: str,
text_color, text_color: str,
gradient, gradient: str,
image, image: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.promo_id = promo_id self.promo_id = promo_id
self.title = title self.title = title
self.subtitle = subtitle self.subtitle = subtitle
@ -29,7 +34,7 @@ class Promotion(YandexMusicObject):
self.url, self.url_scheme, self.text_color, self.gradient, self.image) self.url, self.url_scheme, self.text_color, self.gradient, self.image)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Promotion']:
if not data: if not data:
return None return None
@ -38,7 +43,7 @@ class Promotion(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Promotion']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class TrackId(YandexMusicObject): class TrackId(YandexMusicObject):
def __init__(self, def __init__(self,
id_, id_: int,
album_id=None, album_id: Optional[int] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.album_id = album_id self.album_id = album_id
@ -14,7 +19,7 @@ class TrackId(YandexMusicObject):
self._id_attrs = (self.id, self.album_id) self._id_attrs = (self.id, self.album_id)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['TrackId']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, TrackId
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class TrackShortOld(YandexMusicObject): class TrackShortOld(YandexMusicObject):
def __init__(self, def __init__(self,
track_id, track_id: Optional['TrackId'],
timestamp, timestamp: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.track_id = track_id self.track_id = track_id
self.timestamp = timestamp self.timestamp = timestamp
@ -14,7 +19,7 @@ class TrackShortOld(YandexMusicObject):
self._id_attrs = (self.track_id,) self._id_attrs = (self.track_id,)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['TrackShortOld']:
if not data: if not data:
return None return None
@ -25,7 +30,7 @@ class TrackShortOld(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['TrackShortOld']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,13 +1,18 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Album
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class AlbumsLikes(YandexMusicObject): class AlbumsLikes(YandexMusicObject):
def __init__(self, def __init__(self,
timestamp, timestamp: str,
id_=None, id_: Optional[int] = None,
album=None, album: Optional['Album'] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.album = album self.album = album
self.timestamp = timestamp self.timestamp = timestamp
@ -16,7 +21,7 @@ class AlbumsLikes(YandexMusicObject):
self._id_attrs = (self.id, self.album) self._id_attrs = (self.id, self.album)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['AlbumsLikes']:
if not data: if not data:
return None return None
@ -27,7 +32,7 @@ class AlbumsLikes(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['AlbumsLikes']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,13 +1,18 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Artist
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class ArtistsLikes(YandexMusicObject): class ArtistsLikes(YandexMusicObject):
def __init__(self, def __init__(self,
id_=None, id_=None,
artist=None, artist: Optional['Artist'] = None,
timestamp=None, timestamp: str = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.artist = artist self.artist = artist
self.timestamp = timestamp self.timestamp = timestamp
@ -16,7 +21,7 @@ class ArtistsLikes(YandexMusicObject):
self._id_attrs = (self.id, self.artist) self._id_attrs = (self.id, self.artist)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['ArtistsLikes']:
if not data: if not data:
return None return None
@ -32,7 +37,7 @@ class ArtistsLikes(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['ArtistsLikes']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,13 +1,18 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Playlist
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class PlaylistsLikes(YandexMusicObject): class PlaylistsLikes(YandexMusicObject):
def __init__(self, def __init__(self,
timestamp, timestamp: str,
id_=None, id_=None,
playlist=None, playlist: Optional['Playlist'] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.playlist = playlist self.playlist = playlist
self.timestamp = timestamp self.timestamp = timestamp
@ -16,7 +21,7 @@ class PlaylistsLikes(YandexMusicObject):
self._id_attrs = (self.id, self.playlist) self._id_attrs = (self.id, self.playlist)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['PlaylistsLikes']:
if not data: if not data:
return None return None
@ -27,7 +32,7 @@ class PlaylistsLikes(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['PlaylistsLikes']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,4 +1,4 @@
from typing import TYPE_CHECKING, Optional from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING: if TYPE_CHECKING:
from yandex_music import Client from yandex_music import Client
@ -22,7 +22,7 @@ class PermissionAlerts(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
alerts, alerts: List[str],
client: Optional['Client'] = None, client: Optional['Client'] = None,
**kwargs): **kwargs):
self.alerts = alerts self.alerts = alerts

ファイルの表示

@ -1,16 +1,21 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class CaseForms(YandexMusicObject): class CaseForms(YandexMusicObject):
def __init__(self, def __init__(self,
nominative, nominative: str,
genitive, genitive: str,
dative, dative: str,
accusative, accusative: str,
instrumental, instrumental: str,
prepositional, prepositional: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.nominative = nominative self.nominative = nominative
self.genitive = genitive self.genitive = genitive
self.dative = dative self.dative = dative
@ -23,7 +28,7 @@ class CaseForms(YandexMusicObject):
self.accusative, self.instrumental, self.prepositional) self.accusative, self.instrumental, self.prepositional)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['CaseForms']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client, User, CaseForms
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class MadeFor(YandexMusicObject): class MadeFor(YandexMusicObject):
def __init__(self, def __init__(self,
user_info, user_info: Optional['User'],
case_forms, case_forms: Optional['CaseForms'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.user_info = user_info self.user_info = user_info
self.case_forms = case_forms self.case_forms = case_forms
@ -14,7 +19,7 @@ class MadeFor(YandexMusicObject):
self._id_attrs = (self.user_info, self.case_forms) self._id_attrs = (self.user_info, self.case_forms)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['MadeFor']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,13 +1,18 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class PlayCounter(YandexMusicObject): class PlayCounter(YandexMusicObject):
def __init__(self, def __init__(self,
value, value: int,
description, description: str,
updated, updated: bool,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.value = value self.value = value
self.description = description self.description = description
self.updated = updated self.updated = updated
@ -16,7 +21,7 @@ class PlayCounter(YandexMusicObject):
self._id_attrs = (self.value, self.description, self.updated) self._id_attrs = (self.value, self.description, self.updated)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['PlayCounter']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,41 +1,46 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, User, Cover, MadeFor, TrackShort, PlaylistAbsence, PlayCounter
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Playlist(YandexMusicObject): class Playlist(YandexMusicObject):
def __init__(self, def __init__(self,
owner, owner: Optional['User'],
cover, cover: Optional['Cover'],
made_for, made_for: Optional['MadeFor'],
play_counter, play_counter: Optional['PlayCounter'],
playlist_absence, playlist_absence: Optional['PlaylistAbsence'],
uid=None, uid: Optional[int] = None,
kind=None, kind: Optional[int] = None,
title=None, title: Optional[str] = None,
track_count=None, track_count: Optional[int] = None,
tags=None, tags: Optional[list] = None,
revision=None, revision: Optional[int] = None,
snapshot=None, snapshot: Optional[int] = None,
visibility=None, visibility: Optional[str] = None,
collective=None, collective: Optional[bool] = None,
created=None, created: Optional[str] = None,
modified=None, modified: Optional[str] = None,
available=None, available: Optional[bool] = None,
is_banner=None, is_banner: Optional[bool] = None,
is_premiere=None, is_premiere: Optional[bool] = None,
duration_ms=None, duration_ms: Optional[int] = None,
og_image=None, og_image: Optional[str] = None,
tracks=None, tracks: List['TrackShort'] = None,
prerolls=None, prerolls: Optional[list] = None,
likes_count=None, likes_count: Optional[int] = None,
generated_playlist_type=None, generated_playlist_type: Optional[str] = None,
animated_cover_uri=None, animated_cover_uri: Optional[str] = None,
ever_played=None, ever_played: Optional[bool] = None,
description=None, description: Optional[str] = None,
description_formatted=None, description_formatted: Optional[str] = None,
is_for_from=None, is_for_from=None,
regions=None, regions=None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.owner = owner self.owner = owner
self.cover = cover self.cover = cover
self.made_for = made_for self.made_for = made_for
@ -73,14 +78,14 @@ class Playlist(YandexMusicObject):
self._id_attrs = (self.uid, self.kind, self.title, self.playlist_absence) self._id_attrs = (self.uid, self.kind, self.title, self.playlist_absence)
@property @property
def is_mine(self): def is_mine(self) -> bool:
return self.owner.uid == self.client.me.account.uid return self.owner.uid == self.client.me.account.uid
@property @property
def playlist_id(self): def playlist_id(self) -> str:
return f'{self.owner.uid}:{self.kind}' return f'{self.owner.uid}:{self.kind}'
def download_animated_cover(self, filename, size='200x200'): def download_animated_cover(self, filename: str, size: str = '200x200') -> None:
"""Загрузка анимированной обложки. """Загрузка анимированной обложки.
Args: Args:
@ -90,7 +95,7 @@ class Playlist(YandexMusicObject):
self.client.request.download(f'https://{self.animated_cover_uri.replace("%%", size)}', filename) self.client.request.download(f'https://{self.animated_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.cover! Используйте это только когда нет self.cover!
@ -102,20 +107,20 @@ class Playlist(YandexMusicObject):
self.client.request.download(f'https://{self.og_image.replace("%%", size)}', filename) self.client.request.download(f'https://{self.og_image.replace("%%", size)}', filename)
def rename(self, name): def rename(self, name: str) -> None:
client, kind = self.client, self.kind client, kind = self.client, self.kind
self.__dict__.clear() self.__dict__.clear()
self.__dict__.update(client.users_playlists_name(kind, name).__dict__) self.__dict__.update(client.users_playlists_name(kind, name).__dict__)
def like(self, *args, **kwargs): def like(self, *args, **kwargs) -> bool:
"""Сокращение для:: """Сокращение для::
client.users_likes_playlists_add(playlist.uid, user.id *args, **kwargs) client.users_likes_playlists_add(playlist.uid, user.id *args, **kwargs)
""" """
return self.client.users_likes_playlists_add(self.uid, self.client.me.account.uid, *args, **kwargs) return self.client.users_likes_playlists_add(self.uid, self.client.me.account.uid, *args, **kwargs)
def dislike(self, *args, **kwargs): def dislike(self, *args, **kwargs) -> bool:
"""Сокращение для:: """Сокращение для::
client.users_likes_playlists_remove(playlist.uid, user.id *args, **kwargs) client.users_likes_playlists_remove(playlist.uid, user.id *args, **kwargs)
@ -123,7 +128,7 @@ class Playlist(YandexMusicObject):
return self.client.users_likes_playlists_remove(self.uid, self.client.me.account.uid, *args, **kwargs) return self.client.users_likes_playlists_remove(self.uid, self.client.me.account.uid, *args, **kwargs)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Playlist']:
if not data: if not data:
return None return None
@ -143,7 +148,7 @@ class Playlist(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Playlist']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -19,10 +24,10 @@ class PlaylistAbsence(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
kind, kind: int,
reason, reason: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.kind = kind self.kind = kind
self.reason = reason self.reason = reason
@ -30,7 +35,7 @@ class PlaylistAbsence(YandexMusicObject):
self._id_attrs = (self.kind, self.reason) self._id_attrs = (self.kind, self.reason)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['PlaylistAbsence']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class PlaylistId(YandexMusicObject): class PlaylistId(YandexMusicObject):
def __init__(self, def __init__(self,
uid, uid: int,
kind, kind: int,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.uid = uid self.uid = uid
self.kind = kind self.kind = kind
@ -14,7 +19,7 @@ class PlaylistId(YandexMusicObject):
self._id_attrs = (self.uid, self.kind) self._id_attrs = (self.uid, self.kind)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['PlaylistId']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:
@ -34,7 +39,7 @@ class PlaylistId(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['PlaylistId']:
"""Десериализация списка объектов. """Десериализация списка объектов.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -10,7 +15,8 @@ class User(YandexMusicObject):
name (:obj:`str`): Имя пользователя. name (:obj:`str`): Имя пользователя.
sex (:obj:`str`): Пол пользователя. sex (:obj:`str`): Пол пользователя.
verified (:obj:`bool`): Участвует ли пользователь в генерации плейлистов дня и т.д., и т.п. verified (:obj:`bool`): Участвует ли пользователь в генерации плейлистов дня и т.д., и т.п.
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex Music. client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex
Music.
Args: Args:
uid (:obj:`int`): Идентификатор пользователя. uid (:obj:`int`): Идентификатор пользователя.
@ -18,18 +24,19 @@ class User(YandexMusicObject):
name (:obj:`str`): Имя пользователя. name (:obj:`str`): Имя пользователя.
sex (:obj:`str`): Пол пользователя. sex (:obj:`str`): Пол пользователя.
verified (:obj:`bool`): Участвует ли пользователь в генерации плейлистов дня и т.д., и т.п. verified (:obj:`bool`): Участвует ли пользователь в генерации плейлистов дня и т.д., и т.п.
client (:obj:`yandex_music.Client`, optional): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex Music. client (:obj:`yandex_music.Client`, optional): Объект класса :class:`yandex_music.Client` представляющий клиент
Yandex Music.
**kwargs: Произвольные ключевые аргументы полученные от API. **kwargs: Произвольные ключевые аргументы полученные от API.
""" """
def __init__(self, def __init__(self,
uid, uid: int,
login, login: str,
name, name: str,
sex, sex: str,
verified, verified: bool,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.uid = uid self.uid = uid
self.login = login self.login = login
self.name = name self.name = name
@ -39,7 +46,7 @@ class User(YandexMusicObject):
self.client = client self.client = client
self._id_attrs = (self.uid, self.login) self._id_attrs = (self.uid, self.login)
def download_avatar(self, filename, format_='normal'): def download_avatar(self, filename: str, format_: str = 'normal') -> None:
"""Загрузка изображения пользователя. """Загрузка изображения пользователя.
Args: Args:
@ -50,7 +57,7 @@ class User(YandexMusicObject):
self.client.request.download(f'https://upics.yandex.net/{self.uid}/{format_}', filename) self.client.request.download(f'https://upics.yandex.net/{self.uid}/{format_}', filename)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['User']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -30,7 +30,7 @@ class PromoCodeStatus(YandexMusicObject):
def __init__(self, def __init__(self,
status: str, status: str,
status_desc: str, status_desc: str,
account_status: 'Status', account_status: Optional['Status'],
client: Optional['Client'] = None, client: Optional['Client'] = None,
**kwargs): **kwargs):
self.status = status self.status = status

ファイルの表示

@ -1,18 +1,23 @@
from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class AdParams(YandexMusicObject): class AdParams(YandexMusicObject):
def __init__(self, def __init__(self,
partner_id, partner_id: Union[str, int],
category_id, category_id: Union[str, int],
page_ref, page_ref: str,
target_ref, target_ref: str,
other_params, other_params: str,
ad_volume, ad_volume: int,
genre_id=None, genre_id=None,
genre_name=None, genre_name=None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.partner_id = partner_id self.partner_id = partner_id
self.category_id = category_id self.category_id = category_id
self.page_ref = page_ref self.page_ref = page_ref
@ -28,7 +33,7 @@ class AdParams(YandexMusicObject):
self.target_ref, self.other_params, self.ad_volume) self.target_ref, self.other_params, self.ad_volume)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['AdParams']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,13 +1,18 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, StationResult
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Dashboard(YandexMusicObject): class Dashboard(YandexMusicObject):
def __init__(self, def __init__(self,
dashboard_id, dashboard_id: str,
stations, stations: List['StationResult'],
pumpkin, pumpkin: bool,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.dashboard_id = dashboard_id self.dashboard_id = dashboard_id
self.stations = stations self.stations = stations
self.pumpkin = pumpkin self.pumpkin = pumpkin
@ -16,7 +21,7 @@ class Dashboard(YandexMusicObject):
self._id_attrs = (self.dashboard_id, self.stations, self.pumpkin) self._id_attrs = (self.dashboard_id, self.stations, self.pumpkin)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Dashboard']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,14 +1,19 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client, Value
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class DiscreteScale(YandexMusicObject): class DiscreteScale(YandexMusicObject):
def __init__(self, def __init__(self,
type_, type_: str,
name, name: str,
min_, min_: Optional['Value'],
max_, max_: Optional['Value'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.type = type_ self.type = type_
self.name = name self.name = name
self.min = min_ self.min = min_
@ -18,7 +23,7 @@ class DiscreteScale(YandexMusicObject):
self._id_attrs = (self.type, self.name, self.min, self.max) self._id_attrs = (self.type, self.name, self.min, self.max)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['DiscreteScale']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,13 +1,18 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Value
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Enum(YandexMusicObject): class Enum(YandexMusicObject):
def __init__(self, def __init__(self,
type_, type_: str,
name, name: str,
possible_values, possible_values: List['Value'],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.type = type_ self.type = type_
self.name = name self.name = name
self.possible_values = possible_values self.possible_values = possible_values
@ -16,7 +21,7 @@ class Enum(YandexMusicObject):
self._id_attrs = (self.type, self.name, self.possible_values) self._id_attrs = (self.type, self.name, self.possible_values)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Enum']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Id(YandexMusicObject): class Id(YandexMusicObject):
def __init__(self, def __init__(self,
type_, type_: str,
tag, tag: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.type = type_ self.type = type_
self.tag = tag self.tag = tag
@ -14,7 +19,7 @@ class Id(YandexMusicObject):
self._id_attrs = (self.type, self.tag) self._id_attrs = (self.type, self.tag)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Id']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject, Enum, DiscreteScale from yandex_music import YandexMusicObject, Enum, DiscreteScale
@ -9,13 +14,13 @@ de_json = {
class Restrictions(YandexMusicObject): class Restrictions(YandexMusicObject):
def __init__(self, def __init__(self,
language, language: Optional[Union['Enum', 'DiscreteScale']],
diversity, diversity: Optional[Union['Enum', 'DiscreteScale']],
mood=None, mood: Optional[Union['Enum', 'DiscreteScale']] = None,
energy=None, energy: Optional[Union['Enum', 'DiscreteScale']] = None,
mood_energy=None, mood_energy: Optional[Union['Enum', 'DiscreteScale']] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.language = language self.language = language
self.diversity = diversity self.diversity = diversity
self.mood = mood self.mood = mood
@ -26,7 +31,7 @@ class Restrictions(YandexMusicObject):
self._id_attrs = (self.language, self.diversity) self._id_attrs = (self.language, self.diversity)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Restrictions']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,15 +1,20 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class RotorSettings(YandexMusicObject): class RotorSettings(YandexMusicObject):
def __init__(self, def __init__(self,
language, language: str,
diversity, diversity: str,
mood=None, mood: Optional[int] = None,
energy=None, energy: Optional[int] = None,
mood_energy=None, mood_energy=None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.language = language self.language = language
self.diversity = diversity self.diversity = diversity
@ -21,7 +26,7 @@ class RotorSettings(YandexMusicObject):
self._id_attrs = (self.language, self.diversity) self._id_attrs = (self.language, self.diversity)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['RotorSettings']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,13 +1,18 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Track
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Sequence(YandexMusicObject): class Sequence(YandexMusicObject):
def __init__(self, def __init__(self,
type_, type_: str,
track, track: Optional['Track'],
liked, liked: bool,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.type = type_ self.type = type_
self.track = track self.track = track
self.liked = liked self.liked = liked
@ -16,7 +21,7 @@ class Sequence(YandexMusicObject):
self._id_attrs = (self.type, self.track, self.liked) self._id_attrs = (self.type, self.track, self.liked)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Sequence']:
if not data: if not data:
return None return None
@ -27,7 +32,7 @@ class Sequence(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Sequence']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,19 +1,24 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client, Id, Icon, Restrictions
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Station(YandexMusicObject): class Station(YandexMusicObject):
def __init__(self, def __init__(self,
id_, id_: Optional['Id'],
name, name: str,
icon, icon: Optional['Icon'],
mts_icon, mts_icon: Optional['Icon'],
geocell_icon, geocell_icon: Optional['Icon'],
id_for_from, id_for_from: str,
restrictions, restrictions: Optional['Restrictions'],
restrictions2, restrictions2: Optional['Restrictions'],
parent_id=None, parent_id: Optional['Id'] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.name = name self.name = name
self.icon = icon self.icon = icon
@ -30,7 +35,7 @@ class Station(YandexMusicObject):
self.id_for_from, self.restrictions, self.restrictions2) self.id_for_from, self.restrictions, self.restrictions2)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Station']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,16 +1,21 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Station, RotorSettings, AdParams
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class StationResult(YandexMusicObject): class StationResult(YandexMusicObject):
def __init__(self, def __init__(self,
station, station: Optional['Station'],
settings, settings: Optional['RotorSettings'],
settings2, settings2: Optional['RotorSettings'],
ad_params, ad_params: Optional['AdParams'],
explanation=None, explanation: Optional[str] = None,
prerolls=None, prerolls: Optional[list] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.station = station self.station = station
self.settings = settings self.settings = settings
self.settings2 = settings2 self.settings2 = settings2
@ -22,7 +27,7 @@ class StationResult(YandexMusicObject):
self._id_attrs = (self.station, self.settings, self.settings2, self.ad_params) self._id_attrs = (self.station, self.settings, self.settings2, self.ad_params)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['StationResult']:
if not data: if not data:
return None return None
@ -36,7 +41,7 @@ class StationResult(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['StationResult']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,14 +1,19 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Id, Sequence
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class StationTracksResult(YandexMusicObject): class StationTracksResult(YandexMusicObject):
def __init__(self, def __init__(self,
id_, id_: Optional['Id'],
sequence, sequence: List['Sequence'],
batch_id, batch_id: str,
pumpkin, pumpkin: bool,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.sequence = sequence self.sequence = sequence
self.batch_id = batch_id self.batch_id = batch_id
@ -18,7 +23,7 @@ class StationTracksResult(YandexMusicObject):
self._id_attrs = (self.id, self.sequence, self.batch_id, self.pumpkin) self._id_attrs = (self.id, self.sequence, self.batch_id, self.pumpkin)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data, client) -> Optional['StationTracksResult']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Value(YandexMusicObject): class Value(YandexMusicObject):
def __init__(self, def __init__(self,
value, value: str,
name, name: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.value = value self.value = value
self.name = name self.name = name
@ -14,7 +19,7 @@ class Value(YandexMusicObject):
self._id_attrs = (self.value, self.name) self._id_attrs = (self.value, self.name)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Value']:
if not data: if not data:
return None return None
@ -23,7 +28,7 @@ class Value(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Value']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject, Artist, Album, Track, Playlist, Video from yandex_music import YandexMusicObject, Artist, Album, Track, Playlist, Video
@ -12,11 +17,11 @@ de_json_result = {
class Best(YandexMusicObject): class Best(YandexMusicObject):
def __init__(self, def __init__(self,
type_, type_: str,
result, result: Optional[Union[Track, Artist, Album, Playlist, Video]],
text=None, text: Optional[str] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.type = type_ self.type = type_
self.result = result self.result = result
@ -26,7 +31,7 @@ class Best(YandexMusicObject):
self._id_attrs = (self.type, self.result) self._id_attrs = (self.type, self.result)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client'):
if not data: if not data:
return None return None

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client, Best, SearchResult
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -8,11 +13,16 @@ class Search(YandexMusicObject):
search_request_id (:obj:`str`): ID запроса. search_request_id (:obj:`str`): ID запроса.
text (:obj:`str`): Текст запроса. text (:obj:`str`): Текст запроса.
best (:obj:`yandex_music.Best`): Объект класса :class:`yandex_music.Best` представляющий лучший результат. best (:obj:`yandex_music.Best`): Объект класса :class:`yandex_music.Best` представляющий лучший результат.
albums (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий найденные альбомы. albums (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
artists (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий найденных исполнителей. найденные альбомы.
playlists (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий найденные плейлисты. artists (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
tracks (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий найденные треки. найденных исполнителей.
videos (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий найденные видео. playlists (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
найденные плейлисты.
tracks (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
найденные треки.
videos (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
найденные видео.
misspell_corrected (:obj:`bool`): Был ли исправлен запрос. misspell_corrected (:obj:`bool`): Был ли исправлен запрос.
nocorrect (:obj:`bool`): Было ли отключено исправление результата. nocorrect (:obj:`bool`): Было ли отключено исправление результата.
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex
@ -22,31 +32,36 @@ class Search(YandexMusicObject):
search_request_id (:obj:`str`): ID запроса. search_request_id (:obj:`str`): ID запроса.
text (:obj:`str`): Текст запроса. text (:obj:`str`): Текст запроса.
best (:obj:`yandex_music.Best`): Объект класса :class:`yandex_music.Best` представляющий лучший результат. best (:obj:`yandex_music.Best`): Объект класса :class:`yandex_music.Best` представляющий лучший результат.
albums (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий найденные альбомы. albums (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
artists (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий найденных исполнителей. найденные альбомы.
playlists (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий найденные плейлисты. artists (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
tracks (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий найденные треки. найденных исполнителей.
videos (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий найденные видео. playlists (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
найденные плейлисты.
tracks (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
найденные треки.
videos (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
найденные видео.
misspell_corrected (:obj:`bool`, optional): Был ли исправлен запрос. misspell_corrected (:obj:`bool`, optional): Был ли исправлен запрос.
nocorrect (:obj:`bool`, optional): Было ли отключено исправление результата. nocorrect (:obj:`bool`, optional): Было ли отключено исправление результата.
client (:obj:`yandex_music.Client`, optional): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex client (:obj:`yandex_music.Client`, optional): Объект класса :class:`yandex_music.Client` представляющий клиент
Music. Yandex Music.
**kwargs: Произвольные ключевые аргументы полученные от API. **kwargs: Произвольные ключевые аргументы полученные от API.
""" """
def __init__(self, def __init__(self,
search_request_id, search_request_id: str,
text, text: str,
best, best: Optional['Best'],
albums, albums: Optional['SearchResult'],
artists, artists: Optional['SearchResult'],
playlists, playlists: Optional['SearchResult'],
tracks, tracks: Optional['SearchResult'],
videos, videos: Optional['SearchResult'],
misspell_corrected=None, misspell_corrected: Optional[bool] = None,
nocorrect=None, nocorrect: Optional[bool] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.search_request_id = search_request_id self.search_request_id = search_request_id
self.text = text self.text = text
self.best = best self.best = best
@ -64,7 +79,7 @@ class Search(YandexMusicObject):
self.artists, self.playlists, self.tracks, self.videos) self.artists, self.playlists, self.tracks, self.videos)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Search']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List, Union
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject, Artist, Album, Track, Playlist, Video from yandex_music import YandexMusicObject, Artist, Album, Track, Playlist, Video
@ -12,12 +17,12 @@ de_json_result = {
class SearchResult(YandexMusicObject): class SearchResult(YandexMusicObject):
def __init__(self, def __init__(self,
total, total: int,
per_page, per_page: int,
order, order: int,
results, results: List[Union[Track, Artist, Album, Playlist, Video]],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.total = total self.total = total
self.per_page = per_page self.per_page = per_page
self.order = order self.order = order
@ -27,7 +32,7 @@ class SearchResult(YandexMusicObject):
self._id_attrs = (self.total, self.per_page, self.order, self.results) self._id_attrs = (self.total, self.per_page, self.order, self.results)
@classmethod @classmethod
def de_json(cls, data, client, type_=None): def de_json(cls, data: dict, client: 'Client', type_: str = None) -> Optional['SearchResult']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Best
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Suggestions(YandexMusicObject): class Suggestions(YandexMusicObject):
def __init__(self, def __init__(self,
best, best: Optional['Best'],
suggestions, suggestions: List[str],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.best = best self.best = best
self.suggestions = suggestions self.suggestions = suggestions
@ -20,7 +25,7 @@ class Suggestions(YandexMusicObject):
return iter(self.suggestions) return iter(self.suggestions)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Suggestions']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, PassportPhone
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -45,22 +50,22 @@ class Account(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
now, now: str,
service_available, service_available: bool,
region=None, region: Optional[int] = None,
uid=None, uid: Optional[int] = None,
login=None, login: Optional[str] = None,
full_name=None, full_name: Optional[str] = None,
second_name=None, second_name: Optional[str] = None,
first_name=None, first_name: Optional[str] = None,
display_name=None, display_name: Optional[str] = None,
hosted_user=None, hosted_user: Optional[bool] = None,
birthday=None, birthday: Optional[str] = None,
passport_phones=None, passport_phones: List['PassportPhone'] = None,
registered_at=None, registered_at: Optional[str] = None,
has_info_for_app_metrica=False, has_info_for_app_metrica: bool = False,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.now = now self.now = now
self.service_available = service_available self.service_available = service_available
@ -82,7 +87,7 @@ class Account(YandexMusicObject):
if self.uid: if self.uid:
self._id_attrs = (self.uid,) self._id_attrs = (self.uid,)
def download_avatar(self, filename, format_='normal'): def download_avatar(self, filename: str, format_: str = 'normal') -> None:
"""Загрузка изображения пользователя. """Загрузка изображения пользователя.
Args: Args:
@ -93,7 +98,7 @@ class Account(YandexMusicObject):
self.client.request.download(f'https://upics.yandex.net/{self.uid}/{format_}', filename) self.client.request.download(f'https://upics.yandex.net/{self.uid}/{format_}', filename)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Account']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Product
from yandex_music import YandexMusicObject, Product from yandex_music import YandexMusicObject, Product
@ -29,15 +34,15 @@ class AutoRenewable(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
expires, expires: str,
vendor, vendor: str,
vendor_help_url, vendor_help_url: str,
product_id, product_id: str,
product, product: Optional['Product'],
finished, finished: bool,
order_id=None, order_id: Optional[int] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.expires = expires self.expires = expires
self.vendor = vendor self.vendor = vendor
self.vendor_help_url = vendor_help_url self.vendor_help_url = vendor_help_url
@ -51,7 +56,7 @@ class AutoRenewable(YandexMusicObject):
self._id_attrs = (self.expires, self.vendor, self.vendor_help_url, self.product_id, self.product, self.finished) self._id_attrs = (self.expires, self.vendor, self.vendor_help_url, self.product_id, self.product, self.finished)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['AutoRenewable']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:
@ -71,7 +76,7 @@ class AutoRenewable(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['AutoRenewable']:
"""Десериализация списка объектов. """Десериализация списка объектов.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -17,16 +22,16 @@ class PassportPhone(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
phone, phone: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.phone = phone self.phone = phone
self.client = client self.client = client
self._id_attrs = (self.phone,) self._id_attrs = (self.phone,)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['PassportPhone']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:
@ -45,7 +50,7 @@ class PassportPhone(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['PassportPhone']:
"""Десериализация списка объектов. """Десериализация списка объектов.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -21,11 +26,11 @@ class Permissions(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
until, until: str,
values, values: List[str],
default, default: List[str],
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.until = until self.until = until
self.values = values self.values = values
self.default = default self.default = default
@ -34,7 +39,7 @@ class Permissions(YandexMusicObject):
self._id_attrs = (self.until, self.values, self.default) self._id_attrs = (self.until, self.values, self.default)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Permissions']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -19,10 +24,10 @@ class Plus(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
has_plus, has_plus: bool,
is_tutorial_completed, is_tutorial_completed: bool,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.has_plus = has_plus self.has_plus = has_plus
self.is_tutorial_completed = is_tutorial_completed self.is_tutorial_completed = is_tutorial_completed
@ -30,7 +35,7 @@ class Plus(YandexMusicObject):
self._id_attrs = (self.has_plus, self.is_tutorial_completed) self._id_attrs = (self.has_plus, self.is_tutorial_completed)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Plus']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -19,10 +24,10 @@ class Price(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
amount, amount: int,
currency, currency: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.amount = amount self.amount = amount
self.currency = currency self.currency = currency
@ -30,7 +35,7 @@ class Price(YandexMusicObject):
self._id_attrs = (self.amount, self.currency) self._id_attrs = (self.amount, self.currency)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Price']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Price
from yandex_music import YandexMusicObject, Price from yandex_music import YandexMusicObject, Price
@ -47,24 +52,24 @@ class Product(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
product_id, product_id: str,
type_, type_: str,
common_period_duration, common_period_duration: str,
duration, duration: int,
trial_duration, trial_duration: int,
price, price: Optional['Price'],
feature, feature: str,
debug, debug: bool,
features=None, features: List[str] = None,
description=None, description: Optional[str] = None,
available=None, available: Optional[bool] = None,
trial_available=None, trial_available: Optional[bool] = None,
vendor_trial_available=None, vendor_trial_available: Optional[bool] = None,
button_text=None, button_text: Optional[str] = None,
button_additional_text=None, button_additional_text: Optional[str] = None,
payment_method_types=None, payment_method_types: List[str] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.product_id = product_id self.product_id = product_id
self.type = type_ self.type = type_
self.common_period_duration = common_period_duration self.common_period_duration = common_period_duration
@ -88,7 +93,7 @@ class Product(YandexMusicObject):
self.trial_duration, self.product_id, self.feature, self.debug) self.trial_duration, self.product_id, self.feature, self.debug)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Product']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:
@ -108,7 +113,7 @@ class Product(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Product']:
"""Десериализация списка объектов. """Десериализация списка объектов.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client, Account, Permissions, Subscription, Plus
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -45,19 +50,19 @@ class Status(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
account, account: Optional['Account'],
permissions, permissions: Optional['Permissions'],
subscription=None, subscription: Optional['Subscription'] = None,
cache_limit=None, cache_limit: Optional[int] = None,
subeditor=None, subeditor: Optional[bool] = None,
subeditor_level=None, subeditor_level: Optional[int] = None,
plus=None, plus: Optional['Plus'] = None,
default_email=None, default_email: Optional[str] = None,
skips_per_hour=None, skips_per_hour: Optional[int] = None,
station_exists=None, station_exists: Optional[bool] = None,
premium_region=None, premium_region: Optional[int] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.account = account self.account = account
self.permissions = permissions self.permissions = permissions
@ -75,7 +80,7 @@ class Status(YandexMusicObject):
self._id_attrs = (self.account, self.permissions) self._id_attrs = (self.account, self.permissions)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Status']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, AutoRenewable
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -25,12 +30,12 @@ class Subscription(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
auto_renewable=None, auto_renewable: List['AutoRenewable'] = None,
can_start_trial=None, can_start_trial: Optional[bool] = None,
mcdonalds=None, mcdonalds: Optional[bool] = None,
end=None, end: Optional[str] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.auto_renewable = auto_renewable self.auto_renewable = auto_renewable
self.can_start_trial = can_start_trial self.can_start_trial = can_start_trial
self.mcdonalds = mcdonalds self.mcdonalds = mcdonalds
@ -40,7 +45,7 @@ class Subscription(YandexMusicObject):
self._id_attrs = (self.auto_renewable,) self._id_attrs = (self.auto_renewable,)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Subscription']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -27,14 +32,14 @@ class Lyrics(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
id_, id_: int,
lyrics, lyrics: str,
full_lyrics, full_lyrics: str,
has_rights, has_rights: bool,
text_language, text_language: str,
show_translation, show_translation: bool,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.lyrics = lyrics self.lyrics = lyrics
self.full_lyrics = full_lyrics self.full_lyrics = full_lyrics
@ -47,7 +52,7 @@ class Lyrics(YandexMusicObject):
self.text_language, self.show_translation) self.text_language, self.show_translation)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Lyrics']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client, Lyrics, VideoSupplement
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -25,12 +30,12 @@ class Supplement(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
id_, id_: int,
lyrics, lyrics: Optional['Lyrics'],
videos, videos: List['VideoSupplement'],
radio_is_available, radio_is_available: bool,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.lyrics = lyrics self.lyrics = lyrics
self.videos = videos self.videos = videos
@ -40,7 +45,7 @@ class Supplement(YandexMusicObject):
self._id_attrs = (self.id, self.lyrics, self.videos, self.radio_is_available) self._id_attrs = (self.id, self.lyrics, self.videos, self.radio_is_available)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Supplement']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional, List
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -29,15 +34,15 @@ class VideoSupplement(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
cover, cover: str,
title, title: str,
provider, provider: str,
provider_video_id, provider_video_id: str,
url=None, url: Optional[str] = None,
embed_url=None, embed_url: Optional[str] = None,
embed=None, embed: Optional[str] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.cover = cover self.cover = cover
self.title = title self.title = title
self.provider = provider self.provider = provider
@ -51,7 +56,7 @@ class VideoSupplement(YandexMusicObject):
self._id_attrs = (self.cover, self.title, self.provider_video_id) self._id_attrs = (self.cover, self.title, self.provider_video_id)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['VideoSupplement']:
"""Десериализация объекта. """Десериализация объекта.
Args: Args:
@ -70,7 +75,7 @@ class VideoSupplement(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['VideoSupplement']:
"""Десериализация списка объектов. """Десериализация списка объектов.
Args: Args:
@ -79,7 +84,8 @@ class VideoSupplement(YandexMusicObject):
Music. Music.
Returns: Returns:
:obj:`list` из :obj:`yandex_music.VideoSupplement`: Список объектов класса :class:`yandex_music.VideoSupplement`. :obj:`list` из :obj:`yandex_music.VideoSupplement`: Список объектов класса
:class:`yandex_music.VideoSupplement`.
""" """
if not data: if not data:
return [] return []

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Major(YandexMusicObject): class Major(YandexMusicObject):
def __init__(self, def __init__(self,
id_, id_: int,
name, name: str,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.name = name self.name = name
@ -14,7 +19,7 @@ class Major(YandexMusicObject):
self._id_attrs = (self.id, self.name) self._id_attrs = (self.id, self.name)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Major']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,12 +1,17 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Normalization(YandexMusicObject): class Normalization(YandexMusicObject):
def __init__(self, def __init__(self,
gain, gain: float,
peak, peak: int,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.gain = gain self.gain = gain
self.peak = peak self.peak = peak
@ -14,7 +19,7 @@ class Normalization(YandexMusicObject):
self._id_attrs = (self.gain, self.peak) self._id_attrs = (self.gain, self.peak)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Normalization']:
if not data: if not data:
return None return None

ファイルの表示

@ -1,33 +1,38 @@
from typing import TYPE_CHECKING, Optional, List, Union
if TYPE_CHECKING:
from yandex_music import Client, Normalization, Major, Album, Artist, Supplement, DownloadInfo
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
class Track(YandexMusicObject): class Track(YandexMusicObject):
def __init__(self, def __init__(self,
id_, id_: Union[str, int],
title, title: str,
available, available: bool,
artists, artists: List['Artist'],
albums, albums: List['Album'],
available_for_premium_users=None, available_for_premium_users: Optional[bool] = None,
lyrics_available=None, lyrics_available: Optional[bool] = None,
real_id=None, real_id: Optional[Union[str, int]] = None,
og_image=None, og_image: Optional[str] = None,
type_=None, type_: Optional[str] = None,
cover_uri=None, cover_uri: Optional[str] = None,
major=None, major: Optional['Major'] = None,
duration_ms=None, duration_ms: Optional[int] = None,
storage_dir=None, storage_dir: Optional[str] = None,
file_size=None, file_size: Optional[int] = None,
normalization=None, normalization: Optional['Normalization'] = None,
error=None, error=None,
regions=None, regions=None,
available_as_rbt=None, available_as_rbt=None,
content_warning=None, content_warning=None,
explicit=None, explicit=None,
preview_duration_ms=None, preview_duration_ms: Optional[int] = None,
available_full_without_permission=None, available_full_without_permission: Optional[bool] = None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.id = id_ self.id = id_
self.title = title self.title = title
self.available = available self.available = available
@ -58,19 +63,19 @@ class Track(YandexMusicObject):
self.client = client self.client = client
self._id_attrs = (self.id, self.title, self.available, self.artists, self.albums) self._id_attrs = (self.id, self.title, self.available, self.artists, self.albums)
def get_download_info(self, get_direct_links=False): def get_download_info(self, get_direct_links=False) -> List['DownloadInfo']:
self.download_info = self.client.tracks_download_info(self.track_id, get_direct_links) self.download_info = self.client.tracks_download_info(self.track_id, get_direct_links)
return self.download_info return self.download_info
def get_supplement(self, *args, **kwargs): def get_supplement(self, *args, **kwargs) -> Optional['Supplement']:
"""Сокращение для:: """Сокращение для::
client.track_supplement(track.id, *args, **kwargs) client.track_supplement(track.id, *args, **kwargs)
""" """
return self.client.track_supplement(self.id, *args, **kwargs) return self.client.track_supplement(self.id, *args, **kwargs)
def download_cover(self, filename, size='200x200'): def download_cover(self, filename: str, size: str = '200x200') -> None:
"""Загрузка обложки. """Загрузка обложки.
Args: Args:
@ -80,7 +85,7 @@ class Track(YandexMusicObject):
self.client.request.download(f'https://{self.cover_uri.replace("%%", size)}', filename) 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(). Предпочтительнее использовать self.download_cover().
@ -92,7 +97,7 @@ class Track(YandexMusicObject):
self.client.request.download(f'https://{self.og_image.replace("%%", size)}', filename) self.client.request.download(f'https://{self.og_image.replace("%%", size)}', filename)
def download(self, filename, codec='mp3', bitrate_in_kbps=192): def download(self, filename: str, codec: str = 'mp3', bitrate_in_kbps: int = 192) -> None:
if self.download_info is None: if self.download_info is None:
self.get_download_info() self.get_download_info()
@ -100,14 +105,14 @@ class Track(YandexMusicObject):
if info.codec == codec and info.bitrate_in_kbps == bitrate_in_kbps: if info.codec == codec and info.bitrate_in_kbps == bitrate_in_kbps:
info.download(filename) info.download(filename)
def like(self, *args, **kwargs): def like(self, *args, **kwargs) -> bool:
"""Сокращение для:: """Сокращение для::
client.users_likes_tracks_add(track.id, user.id, *args, **kwargs) client.users_likes_tracks_add(track.id, user.id, *args, **kwargs)
""" """
return self.client.users_likes_tracks_add(self.track_id, self.client.me.account.uid, *args, **kwargs) return self.client.users_likes_tracks_add(self.track_id, self.client.me.account.uid, *args, **kwargs)
def dislike(self, *args, **kwargs): def dislike(self, *args, **kwargs) -> bool:
"""Сокращение для:: """Сокращение для::
client.users_likes_tracks_remove(track.id, user.id *args, **kwargs) client.users_likes_tracks_remove(track.id, user.id *args, **kwargs)
@ -115,11 +120,11 @@ class Track(YandexMusicObject):
return self.client.users_likes_tracks_remove(self.track_id, self.client.me.account.uid, *args, **kwargs) return self.client.users_likes_tracks_remove(self.track_id, self.client.me.account.uid, *args, **kwargs)
@property @property
def track_id(self): def track_id(self) -> str:
return f'{self.id}' return f'{self.id}'
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client') -> Optional['Track']:
if not data: if not data:
return None return None
@ -133,7 +138,7 @@ class Track(YandexMusicObject):
return cls(client=client, **data) return cls(client=client, **data)
@classmethod @classmethod
def de_list(cls, data, client): def de_list(cls, data: dict, client: 'Client') -> List['Track']:
if not data: if not data:
return [] return []

ファイルの表示

@ -1,4 +1,4 @@
from typing import TYPE_CHECKING, Optional, List from typing import TYPE_CHECKING, Optional, List, Union
if TYPE_CHECKING: if TYPE_CHECKING:
from yandex_music import Client, Track from yandex_music import Client, Track
@ -26,7 +26,7 @@ class TrackShort(YandexMusicObject):
""" """
def __init__(self, def __init__(self,
id_: str, id_: Union[str, int],
timestamp: str, timestamp: str,
album_id: Optional[str] = None, album_id: Optional[str] = None,
client: Optional['Client'] = None, client: Optional['Client'] = None,

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -27,8 +32,8 @@ class CaptchaResponse(YandexMusicObject):
x_captcha_key, x_captcha_key,
error_description, error_description,
error, error,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.x_captcha_url = x_captcha_url self.x_captcha_url = x_captcha_url
self.x_captcha_key = x_captcha_key self.x_captcha_key = x_captcha_key
self.error_description = error_description self.error_description = error_description
@ -51,7 +56,7 @@ class CaptchaResponse(YandexMusicObject):
self.client.request.download(self.x_captcha_url, filename) self.client.request.download(self.x_captcha_url, filename)
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client'):
"""Десериализация объекта. """Десериализация объекта.
Args: Args:

ファイルの表示

@ -1,3 +1,8 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject from yandex_music import YandexMusicObject
@ -8,8 +13,8 @@ class Response(YandexMusicObject):
result=None, result=None,
error=None, error=None,
error_description=None, error_description=None,
client=None, client: Optional['Client'] = None,
**kwargs): **kwargs) -> None:
self.data = data self.data = data
self.invocation_info = invocation_info self.invocation_info = invocation_info
self._result = result self._result = result
@ -27,7 +32,7 @@ class Response(YandexMusicObject):
return self.data if self._result is None else self._result return self.data if self._result is None else self._result
@classmethod @classmethod
def de_json(cls, data, client): def de_json(cls, data: dict, client: 'Client'):
if not data: if not data:
return None return None

ファイルの表示

@ -1,4 +1,4 @@
from typing import TYPE_CHECKING, Optional, List from typing import TYPE_CHECKING, Optional, List, Union
if TYPE_CHECKING: if TYPE_CHECKING:
from yandex_music import Client from yandex_music import Client
@ -8,13 +8,13 @@ from yandex_music import YandexMusicObject
class Video(YandexMusicObject): class Video(YandexMusicObject):
def __init__(self, def __init__(self,
title, title: str,
cover=None, cover: Optional[str] = None,
embed_url=None, embed_url: Optional[str] = None,
provider=None, provider: Optional['str'] = None,
provider_video_id=None, provider_video_id: Optional[Union[int, str]] = None,
youtube_url=None, youtube_url: Optional[str] = None,
thumbnail_url=None, thumbnail_url: Optional[str] = None,
duration=None, duration=None,
text=None, text=None,
html_auto_play_video_player=None, html_auto_play_video_player=None,