コミット
e22361c2eb
|
@ -519,9 +519,9 @@ def block_entity(request, results, types):
|
|||
|
||||
@pytest.fixture(scope='session')
|
||||
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)
|
||||
|
||||
|
||||
|
|
|
@ -43,8 +43,8 @@ class TestAccount:
|
|||
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,
|
||||
'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,
|
||||
'has_info_for_app_metrica': self.has_info_for_app_metrica}
|
||||
'birthday': self.birthday, 'passport_phones': [passport_phone.to_dict()],
|
||||
'registered_at': self.registered_at, 'has_info_for_app_metrica': self.has_info_for_app_metrica}
|
||||
account = Account.de_json(json_dict, client)
|
||||
|
||||
assert account.now == self.now
|
||||
|
|
|
@ -55,7 +55,7 @@ class TestBlock:
|
|||
|
||||
def test_equality(self, 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])
|
||||
|
||||
assert a != b
|
||||
|
|
|
@ -26,30 +26,30 @@ class TestBlockEntity:
|
|||
assert block_entity.data == data
|
||||
|
||||
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)
|
||||
|
||||
assert block_entity.id == self.id
|
||||
assert block_entity.type == type
|
||||
assert block_entity.type == type_
|
||||
assert block_entity.data == data
|
||||
|
||||
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)
|
||||
|
||||
assert block_entity.id == self.id
|
||||
assert block_entity.type == type
|
||||
assert block_entity.type == type_
|
||||
assert block_entity.data == data
|
||||
|
||||
def test_equality(self, block_entity_data_with_type):
|
||||
data, type = block_entity_data_with_type
|
||||
|
||||
a = BlockEntity(self.id, type, data)
|
||||
b = BlockEntity(self.id, None, data)
|
||||
b = BlockEntity(self.id, '', data)
|
||||
c = BlockEntity('', 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):
|
||||
a = BriefInfo(artist, [album], [album], self.last_release_ids, [track], [artist], [cover], self.concerts,
|
||||
[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])
|
||||
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])
|
||||
d = BriefInfo(artist, [album], [album], self.last_release_ids, [track], [artist], [cover], self.concerts,
|
||||
[video], [vinyl], self.has_promotions, [playlist_id])
|
||||
|
|
|
@ -11,7 +11,7 @@ def download_info():
|
|||
|
||||
class TestDownloadInfo:
|
||||
codec = 'mp3'
|
||||
bitrate_in_kbps = 'mp3'
|
||||
bitrate_in_kbps = 192
|
||||
gain = False
|
||||
preview = False
|
||||
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):
|
||||
a = Feed(self.can_get_more_events, self.pumpkin, self.is_wizard_passed, [generated_playlist], self.headlines,
|
||||
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,
|
||||
self.today, [day])
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ from yandex_music import InvocationInfo
|
|||
class TestInvocationInfo:
|
||||
hostname = 'myt1-0261-c2e-msk-myt-music-st-e72-18274.gencfg-c.yandex.net'
|
||||
req_id = '1573172241066040-16981638052883278246'
|
||||
exec_duration_millis = '0'
|
||||
exec_duration_millis = 0
|
||||
|
||||
def test_expected_values(self, invocation_info):
|
||||
assert invocation_info.hostname == self.hostname
|
||||
|
|
|
@ -36,7 +36,7 @@ class TestLanding:
|
|||
def test_equality(self, block):
|
||||
a = Landing(self.pumpkin, self.content_id, [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])
|
||||
|
||||
assert a != b != c
|
||||
|
|
|
@ -19,7 +19,7 @@ class TestPlayContextsData:
|
|||
|
||||
def test_equality(self, track_short_old):
|
||||
a = PlayContextsData([track_short_old])
|
||||
b = PlayContextsData(None)
|
||||
b = PlayContextsData([])
|
||||
|
||||
assert a != b != track_short_old
|
||||
assert hash(a) != hash(b) != hash(track_short_old)
|
||||
|
|
|
@ -8,9 +8,9 @@ class TestProduct:
|
|||
description = None
|
||||
duration = 30
|
||||
trial_duration = 0
|
||||
feature = ['basic-music']
|
||||
feature = 'basic-music'
|
||||
debug = False
|
||||
features = 'basic-music'
|
||||
features = ['basic-music']
|
||||
available = None
|
||||
trial_available = None
|
||||
vendor_trial_available = None
|
||||
|
@ -83,7 +83,7 @@ class TestProduct:
|
|||
def test_equality(self, price):
|
||||
a = Product(self.product_id, self.type, self.common_period_duration, self.duration, self.trial_duration, price,
|
||||
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)
|
||||
c = Product(self.product_id, self.type, self.common_period_duration, self.duration, self.trial_duration, price,
|
||||
self.feature, self.debug)
|
||||
|
|
|
@ -49,10 +49,10 @@ class TestStation:
|
|||
assert station.parent_id == id_
|
||||
|
||||
def test_equality(self, id_, icon, restrictions):
|
||||
a = Station(id_, icon, 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)
|
||||
c = Station(id_, icon, '', icon, icon, None, self.id_for_from, restrictions, restrictions)
|
||||
d = 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_, self.name, None, icon, icon, self.id_for_from, restrictions, restrictions)
|
||||
c = Station(id_, '', 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 hash(a) != hash(b) != hash(c)
|
||||
|
|
|
@ -40,7 +40,7 @@ class TestSuggestions:
|
|||
def test_equality(self, best):
|
||||
a = Suggestions(best, self.suggestions)
|
||||
b = Suggestions(None, self.suggestions)
|
||||
c = Suggestions(best, '')
|
||||
c = Suggestions(best, [])
|
||||
d = Suggestions(best, self.suggestions)
|
||||
|
||||
assert a != b != c
|
||||
|
|
|
@ -98,7 +98,7 @@ class TestTrack:
|
|||
|
||||
def test_equality(self, 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])
|
||||
|
||||
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
|
||||
|
||||
|
||||
class Album(YandexMusicObject):
|
||||
def __init__(self,
|
||||
id_,
|
||||
title,
|
||||
track_count,
|
||||
artists,
|
||||
labels,
|
||||
available,
|
||||
available_for_premium_users,
|
||||
cover_uri=None,
|
||||
id_: int,
|
||||
title: str,
|
||||
track_count: int,
|
||||
artists: List['Artist'],
|
||||
labels: List['Label'],
|
||||
available: bool,
|
||||
available_for_premium_users: bool,
|
||||
cover_uri: Optional[str] = None,
|
||||
content_warning=None,
|
||||
original_release_year=None,
|
||||
genre=None,
|
||||
og_image=None,
|
||||
buy=None,
|
||||
recent=None,
|
||||
very_important=None,
|
||||
available_for_mobile=None,
|
||||
available_partially=None,
|
||||
bests=None,
|
||||
prerolls=None,
|
||||
volumes=None,
|
||||
year=None,
|
||||
release_date=None,
|
||||
type_=None,
|
||||
track_position=None,
|
||||
genre: Optional[str] = None,
|
||||
og_image: Optional[str] = None,
|
||||
buy: Optional[list] = None,
|
||||
recent: Optional[bool] = None,
|
||||
very_important: Optional[bool] = None,
|
||||
available_for_mobile: Optional[bool] = None,
|
||||
available_partially: Optional[bool] = None,
|
||||
bests: Optional[List[int]] = None,
|
||||
prerolls: Optional[list] = None,
|
||||
volumes: List['Track'] = None,
|
||||
year: Optional[int] = None,
|
||||
release_date: Optional[str] = None,
|
||||
type_: Optional[str] = None,
|
||||
track_position: Optional['TrackPosition'] = None,
|
||||
regions=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.title = title
|
||||
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.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)
|
||||
|
@ -69,7 +74,7 @@ class Album(YandexMusicObject):
|
|||
|
||||
return self.client.albums_with_tracks(self.id, *args, **kwargs)
|
||||
|
||||
def download_cover(self, filename, size='200x200'):
|
||||
def download_cover(self, filename: str, size: str = '200x200') -> None:
|
||||
"""Загрузка обложки.
|
||||
|
||||
Args:
|
||||
|
@ -79,7 +84,7 @@ class Album(YandexMusicObject):
|
|||
|
||||
self.client.request.download(f'https://{self.cover_uri.replace("%%", size)}', filename)
|
||||
|
||||
def download_og_image(self, filename, size='200x200'):
|
||||
def download_og_image(self, filename: str, size: str = '200x200') -> None:
|
||||
"""Загрузка обложки.
|
||||
|
||||
Предпочтительнее использовать self.download_cover().
|
||||
|
@ -89,16 +94,16 @@ class Album(YandexMusicObject):
|
|||
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)
|
||||
"""
|
||||
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)
|
||||
|
@ -106,7 +111,7 @@ class Album(YandexMusicObject):
|
|||
return self.client.users_likes_albums_remove(self.id, self.client.me.account.uid, *args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Album']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -121,7 +126,7 @@ class Album(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Album']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
|
@ -12,15 +17,15 @@ class Label(YandexMusicObject):
|
|||
Args:
|
||||
id_ (:obj:`int`): Идентификатор альбома.
|
||||
name (:obj:`str`): Название альбома.
|
||||
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.
|
||||
"""
|
||||
def __init__(self,
|
||||
id_,
|
||||
name,
|
||||
client=None,
|
||||
**kwargs):
|
||||
id_: int,
|
||||
name: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.name = name
|
||||
|
||||
|
@ -28,7 +33,7 @@ class Label(YandexMusicObject):
|
|||
self._id_attrs = (self.id, self.name)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Label']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
@ -46,13 +51,13 @@ class Label(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Label']:
|
||||
"""Десериализация списка объектов.
|
||||
|
||||
Args:
|
||||
data (:obj:`list`): Список словарей с полями и значениями десериализуемого объекта.
|
||||
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex
|
||||
Music.
|
||||
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент
|
||||
Yandex Music.
|
||||
Returns:
|
||||
: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
|
||||
|
||||
|
||||
class TrackPosition(YandexMusicObject):
|
||||
def __init__(self,
|
||||
volume,
|
||||
index,
|
||||
client=None,
|
||||
**kwargs):
|
||||
volume: int,
|
||||
index: int,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.volume = volume
|
||||
self.index = index
|
||||
|
||||
|
@ -14,7 +19,7 @@ class TrackPosition(YandexMusicObject):
|
|||
self._id_attrs = (self.volume, self.index)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['TrackPosition']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Artist(YandexMusicObject):
|
||||
def __init__(self,
|
||||
id_,
|
||||
name,
|
||||
cover,
|
||||
various=None,
|
||||
id_: int,
|
||||
name: str,
|
||||
cover: Optional['Cover'],
|
||||
various: Optional[bool] = None,
|
||||
composer=None,
|
||||
genres=None,
|
||||
op_image=None,
|
||||
no_pictures_from_search=None,
|
||||
counts=None,
|
||||
available=None,
|
||||
ratings=None,
|
||||
links=None,
|
||||
tickets_available=None,
|
||||
likes_count=None,
|
||||
popular_tracks=None,
|
||||
counts: Optional['Counts'] = None,
|
||||
available: Optional[bool] = None,
|
||||
ratings: Optional['Ratings'] = None,
|
||||
links: List['Link'] = None,
|
||||
tickets_available: Optional[bool] = None,
|
||||
likes_count: Optional[int] = None,
|
||||
popular_tracks: List['Track'] = None,
|
||||
regions=None,
|
||||
decomposed=None,
|
||||
full_names=None,
|
||||
description=None,
|
||||
description: Optional['Description'] = None,
|
||||
countries=None,
|
||||
en_wikipedia_link=None,
|
||||
db_aliases=None,
|
||||
aliases=None,
|
||||
init_date=None,
|
||||
init_date: Optional[str] = None,
|
||||
end_date=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.name = name
|
||||
self.cover = cover
|
||||
|
@ -62,7 +67,7 @@ class Artist(YandexMusicObject):
|
|||
self.client = client
|
||||
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!
|
||||
|
@ -74,28 +79,28 @@ class Artist(YandexMusicObject):
|
|||
|
||||
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)
|
||||
"""
|
||||
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)
|
||||
"""
|
||||
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)
|
||||
"""
|
||||
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)
|
||||
|
@ -103,7 +108,7 @@ class Artist(YandexMusicObject):
|
|||
return self.client.artists_direct_albums(self.id, page, page_size, sort_by, *args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Artist']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -120,7 +125,7 @@ class Artist(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Artist']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
|
@ -19,10 +24,10 @@ class ArtistAlbums(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
albums,
|
||||
pager,
|
||||
client=None,
|
||||
**kwargs):
|
||||
albums: List['Album'],
|
||||
pager: Optional['Pager'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.albums = albums
|
||||
self.pager = pager
|
||||
|
||||
|
@ -30,7 +35,7 @@ class ArtistAlbums(YandexMusicObject):
|
|||
self._id_attrs = (self.pager, self.albums)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['ArtistAlbums']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -19,10 +24,10 @@ class ArtistTracks(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
tracks,
|
||||
pager,
|
||||
client=None,
|
||||
**kwargs):
|
||||
tracks: List['Track'],
|
||||
pager: Optional['Pager'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.tracks = tracks
|
||||
self.pager = pager
|
||||
|
||||
|
@ -30,7 +35,7 @@ class ArtistTracks(YandexMusicObject):
|
|||
self._id_attrs = (self.pager, self.tracks)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['ArtistTracks']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
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
|
||||
|
||||
|
||||
class BriefInfo(YandexMusicObject):
|
||||
def __init__(self,
|
||||
artist,
|
||||
albums,
|
||||
also_albums,
|
||||
last_release_ids,
|
||||
popular_tracks,
|
||||
similar_artists,
|
||||
all_covers,
|
||||
artist: Optional['Artist'],
|
||||
albums: List['Album'],
|
||||
also_albums: List['Album'],
|
||||
last_release_ids: List[int],
|
||||
popular_tracks: List['Track'],
|
||||
similar_artists: List['Artist'],
|
||||
all_covers: List['Cover'],
|
||||
concerts,
|
||||
videos,
|
||||
vinyls,
|
||||
has_promotions,
|
||||
playlist_ids,
|
||||
tracks_in_chart=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
videos: List['Video'],
|
||||
vinyls: List['Vinyl'],
|
||||
has_promotions: bool,
|
||||
playlist_ids: List['PlaylistId'],
|
||||
tracks_in_chart: List['Chart'] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.artist = artist
|
||||
self.albums = albums
|
||||
self.also_albums = also_albums
|
||||
|
@ -39,7 +44,7 @@ class BriefInfo(YandexMusicObject):
|
|||
self.has_promotions, self.playlist_ids)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['BriefInfo']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
|
|
@ -1,14 +1,19 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
||||
from yandex_music import YandexMusicObject
|
||||
|
||||
|
||||
class Counts(YandexMusicObject):
|
||||
def __init__(self,
|
||||
tracks,
|
||||
direct_albums,
|
||||
also_albums,
|
||||
also_tracks,
|
||||
client=None,
|
||||
**kwargs):
|
||||
tracks: int,
|
||||
direct_albums: int,
|
||||
also_albums: int,
|
||||
also_tracks: int,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.tracks = tracks
|
||||
self.direct_albums = direct_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)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Counts']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Description(YandexMusicObject):
|
||||
def __init__(self,
|
||||
text,
|
||||
url,
|
||||
client=None,
|
||||
**kwargs):
|
||||
text: str,
|
||||
url: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.text = text
|
||||
self.url = url
|
||||
|
||||
|
@ -14,7 +19,7 @@ class Description(YandexMusicObject):
|
|||
self._id_attrs = (self.text, self.url)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Description']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
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
|
||||
|
||||
|
||||
class Link(YandexMusicObject):
|
||||
def __init__(self,
|
||||
title,
|
||||
href,
|
||||
type_,
|
||||
social_network=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
title: str,
|
||||
href: str,
|
||||
type_: str,
|
||||
social_network: Optional[str] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.title = title
|
||||
self.href = href
|
||||
self.type = type_
|
||||
|
@ -19,7 +24,7 @@ class Link(YandexMusicObject):
|
|||
self._id_attrs = (self.title, self.href, self.type)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Link']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -28,7 +33,7 @@ class Link(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Link']:
|
||||
if not data:
|
||||
return []
|
||||
|
||||
|
|
|
@ -1,13 +1,18 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
||||
from yandex_music import YandexMusicObject
|
||||
|
||||
|
||||
class Ratings(YandexMusicObject):
|
||||
def __init__(self,
|
||||
week,
|
||||
month,
|
||||
day=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
week: int,
|
||||
month: int,
|
||||
day: Optional[int] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.week = week
|
||||
self.month = month
|
||||
|
||||
|
@ -17,7 +22,7 @@ class Ratings(YandexMusicObject):
|
|||
self._id_attrs = (self.week, self.month)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Ratings']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Vinyl(YandexMusicObject):
|
||||
def __init__(self,
|
||||
url,
|
||||
picture,
|
||||
title,
|
||||
year,
|
||||
price,
|
||||
media,
|
||||
client=None,
|
||||
**kwargs):
|
||||
url: str,
|
||||
picture: str,
|
||||
title: str,
|
||||
year: int,
|
||||
price: int,
|
||||
media: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.url = url
|
||||
self.picture = picture
|
||||
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)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Vinyl']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
@ -42,7 +47,7 @@ class Vinyl(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Vinyl']:
|
||||
"""Десериализация списка объектов.
|
||||
|
||||
Args:
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import logging
|
||||
import functools
|
||||
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, \
|
||||
TracksList, Track, AlbumsLikes, ArtistsLikes, PlaylistsLikes, Feed, PromoCodeStatus, DownloadInfo, Search, \
|
||||
|
@ -217,7 +217,7 @@ class Client(YandexMusicObject):
|
|||
return self._request
|
||||
|
||||
@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:
|
||||
|
@ -240,7 +240,7 @@ class Client(YandexMusicObject):
|
|||
return Status.de_json(result, self)
|
||||
|
||||
@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:
|
||||
|
@ -263,7 +263,7 @@ class Client(YandexMusicObject):
|
|||
return Settings.de_json(result, self)
|
||||
|
||||
@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:
|
||||
|
@ -286,7 +286,7 @@ class Client(YandexMusicObject):
|
|||
return PermissionAlerts.de_json(result, self)
|
||||
|
||||
@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:
|
||||
|
@ -310,7 +310,7 @@ class Client(YandexMusicObject):
|
|||
|
||||
@log
|
||||
def consume_promo_code(self, code: str, language: str = 'en', timeout: Union[int, float] = None,
|
||||
*args, **kwargs) -> PromoCodeStatus:
|
||||
*args, **kwargs) -> Optional[PromoCodeStatus]:
|
||||
"""Активация промо-кода.
|
||||
|
||||
Args:
|
||||
|
@ -335,7 +335,7 @@ class Client(YandexMusicObject):
|
|||
return PromoCodeStatus.de_json(result, self)
|
||||
|
||||
@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:
|
||||
|
@ -366,7 +366,8 @@ class Client(YandexMusicObject):
|
|||
return result.get('is_wizard_passed') or False
|
||||
|
||||
@log
|
||||
def landing(self, blocks: Union[str, List[str]], timeout: 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,
|
||||
|
@ -443,7 +444,7 @@ class Client(YandexMusicObject):
|
|||
|
||||
@log
|
||||
def track_supplement(self, track_id: Union[str, int], timeout: Union[int, float] = None,
|
||||
*args, **kwargs) -> Supplement:
|
||||
*args, **kwargs) -> Optional[Supplement]:
|
||||
"""Получение дополнительной информации о треке.
|
||||
|
||||
Args:
|
||||
|
@ -531,7 +532,7 @@ class Client(YandexMusicObject):
|
|||
return result == 'ok'
|
||||
|
||||
def albums_with_tracks(self, album_id: Union[str, int], timeout: Union[int, float] = None,
|
||||
*args, **kwargs) -> Album:
|
||||
*args, **kwargs) -> Optional[Album]:
|
||||
"""Получение альбома по его уникальному идентификатору вместе с треками.
|
||||
|
||||
Args:
|
||||
|
@ -562,7 +563,7 @@ class Client(YandexMusicObject):
|
|||
page: int = 0,
|
||||
playlist_in_best: bool = True,
|
||||
timeout: Union[int, float] = None,
|
||||
*args, **kwargs) -> Search:
|
||||
*args, **kwargs) -> Optional[Search]:
|
||||
"""Осуществление поиска по запросу и типу, получение результатов.
|
||||
|
||||
Args:
|
||||
|
@ -598,7 +599,8 @@ class Client(YandexMusicObject):
|
|||
return Search.de_json(result, self)
|
||||
|
||||
@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:
|
||||
|
@ -657,7 +659,7 @@ class Client(YandexMusicObject):
|
|||
|
||||
@log
|
||||
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:
|
||||
|
@ -720,7 +722,7 @@ class Client(YandexMusicObject):
|
|||
|
||||
@log
|
||||
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:
|
||||
|
@ -750,7 +752,7 @@ class Client(YandexMusicObject):
|
|||
|
||||
@log
|
||||
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`.
|
||||
|
@ -791,7 +793,7 @@ class Client(YandexMusicObject):
|
|||
@log
|
||||
def users_playlists_insert_track(self, kind: Union[str, int], track_id: Union[str, int], album_id: Union[str, int],
|
||||
at: 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).
|
||||
|
@ -825,7 +827,7 @@ class Client(YandexMusicObject):
|
|||
@log
|
||||
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,
|
||||
*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)
|
||||
|
||||
@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'
|
||||
|
||||
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
||||
|
@ -864,7 +866,8 @@ class Client(YandexMusicObject):
|
|||
return Status.de_json(result, self)
|
||||
|
||||
@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'
|
||||
|
||||
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
||||
|
@ -881,9 +884,10 @@ class Client(YandexMusicObject):
|
|||
return StationResult.de_list(result, self)
|
||||
|
||||
@log
|
||||
def rotor_station_genre_feedback(self, genre: str, type_: str, timestamp: int = None, from_: str = None,
|
||||
batch_id: Union[str, int] = None, track_id: str = None,
|
||||
timeout: Union[int, float] = None, *args, **kwargs) -> bool:
|
||||
def rotor_station_genre_feedback(self, genre: str, type_: str, timestamp: int = None,
|
||||
from_: str = None, batch_id: Union[str, int] = None,
|
||||
track_id: str = None, timeout: Union[int, float] = None,
|
||||
*args, **kwargs) -> bool:
|
||||
if timestamp is None:
|
||||
timestamp = datetime.now().timestamp()
|
||||
|
||||
|
@ -929,7 +933,7 @@ class Client(YandexMusicObject):
|
|||
|
||||
@log
|
||||
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'
|
||||
|
||||
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
||||
|
@ -938,7 +942,7 @@ class Client(YandexMusicObject):
|
|||
|
||||
@log
|
||||
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'
|
||||
|
||||
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
||||
|
@ -947,7 +951,7 @@ class Client(YandexMusicObject):
|
|||
|
||||
@log
|
||||
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:
|
||||
|
@ -980,7 +984,7 @@ class Client(YandexMusicObject):
|
|||
@log
|
||||
def artists_direct_albums(self, artist_id: Union[str, int], page: int = 0, page_size: int = 20,
|
||||
sort_by: str = 'year', timeout: Union[int, float] = None,
|
||||
*args, **kwargs) -> ArtistAlbums:
|
||||
*args, **kwargs) -> Optional[ArtistAlbums]:
|
||||
"""Получение альбомов артиста.
|
||||
|
||||
Известные значения для 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,
|
||||
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:
|
||||
user_id = self.me.account.uid
|
||||
|
||||
|
@ -1136,7 +1140,7 @@ class Client(YandexMusicObject):
|
|||
|
||||
@log
|
||||
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,
|
||||
*args, **kwargs)
|
||||
|
||||
|
@ -1157,7 +1161,7 @@ class Client(YandexMusicObject):
|
|||
|
||||
@log
|
||||
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:
|
||||
user_id = self.me.account.uid
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ class Cover(YandexMusicObject):
|
|||
prefix: Optional[str] = None,
|
||||
error: Optional[str] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs):
|
||||
**kwargs) -> None:
|
||||
self.type = type_
|
||||
self.uri = 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
|
||||
|
||||
|
||||
class AlbumEvent(YandexMusicObject):
|
||||
def __init__(self,
|
||||
album,
|
||||
tracks,
|
||||
client=None,
|
||||
**kwargs):
|
||||
album: Optional['Album'],
|
||||
tracks: List['Track'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.album = album
|
||||
self.tracks = tracks
|
||||
|
||||
|
@ -14,7 +19,7 @@ class AlbumEvent(YandexMusicObject):
|
|||
self._id_attrs = (self.album, self.tracks)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['AlbumEvent']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -26,7 +31,7 @@ class AlbumEvent(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['AlbumEvent']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class ArtistEvent(YandexMusicObject):
|
||||
def __init__(self,
|
||||
artist,
|
||||
tracks,
|
||||
similar_to_artists_from_history,
|
||||
client=None,
|
||||
**kwargs):
|
||||
artist: Optional['Artist'],
|
||||
tracks: List['Track'],
|
||||
similar_to_artists_from_history: List['Artist'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.artist = artist
|
||||
self.tracks = tracks
|
||||
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)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['ArtistEvent']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -29,7 +34,7 @@ class ArtistEvent(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['ArtistEvent']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Day(YandexMusicObject):
|
||||
def __init__(self,
|
||||
day,
|
||||
events,
|
||||
tracks_to_play_with_ads,
|
||||
tracks_to_play,
|
||||
client=None,
|
||||
**kwargs):
|
||||
day: str,
|
||||
events: List['Event'],
|
||||
tracks_to_play_with_ads: List['TrackWithAds'],
|
||||
tracks_to_play: List['Track'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.day = day
|
||||
self.events = events
|
||||
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)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Day']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -31,7 +36,7 @@ class Day(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Day']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Event(YandexMusicObject):
|
||||
def __init__(self,
|
||||
id_,
|
||||
type_,
|
||||
type_for_from=None,
|
||||
title=None,
|
||||
tracks=None,
|
||||
artists=None,
|
||||
albums=None,
|
||||
id_: str,
|
||||
type_: str,
|
||||
type_for_from: Optional[str] = None,
|
||||
title: Optional[str] = None,
|
||||
tracks: List['Track'] = None,
|
||||
artists: List['ArtistEvent'] = None,
|
||||
albums: List['AlbumEvent'] = None,
|
||||
message=None,
|
||||
device=None,
|
||||
tracks_count=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
tracks_count: Optional[int] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.type = type_
|
||||
|
||||
|
@ -31,7 +36,7 @@ class Event(YandexMusicObject):
|
|||
self._id_attrs = (self.id, self.type)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Event']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -44,7 +49,7 @@ class Event(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Event']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Feed(YandexMusicObject):
|
||||
def __init__(self,
|
||||
can_get_more_events,
|
||||
pumpkin,
|
||||
is_wizard_passed,
|
||||
generated_playlists,
|
||||
headlines,
|
||||
today,
|
||||
days,
|
||||
next_revision=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
can_get_more_events: bool,
|
||||
pumpkin: bool,
|
||||
is_wizard_passed: bool,
|
||||
generated_playlists: List['GeneratedPlaylist'],
|
||||
headlines: list,
|
||||
today: str,
|
||||
days: List['Day'],
|
||||
next_revision: Optional[str] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.can_get_more_events = can_get_more_events
|
||||
self.pumpkin = pumpkin
|
||||
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)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Feed']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class GeneratedPlaylist(YandexMusicObject):
|
||||
def __init__(self,
|
||||
type_,
|
||||
ready,
|
||||
notify,
|
||||
data,
|
||||
client=None,
|
||||
**kwargs):
|
||||
type_: str,
|
||||
ready: bool,
|
||||
notify: bool,
|
||||
data: Optional['Playlist'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.type = type_
|
||||
self.ready = ready
|
||||
self.notify = notify
|
||||
|
@ -18,7 +23,7 @@ class GeneratedPlaylist(YandexMusicObject):
|
|||
self._id_attrs = (self.type, self.ready, self.notify, self.data)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['GeneratedPlaylist']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -29,7 +34,7 @@ class GeneratedPlaylist(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['GeneratedPlaylist']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class TrackWithAds(YandexMusicObject):
|
||||
def __init__(self,
|
||||
type_,
|
||||
track,
|
||||
client=None,
|
||||
**kwargs):
|
||||
type_: str,
|
||||
track: Optional['Track'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.type = type_
|
||||
self.track = track
|
||||
|
||||
|
@ -14,7 +19,7 @@ class TrackWithAds(YandexMusicObject):
|
|||
self._id_attrs = (self.type, self.track)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['TrackWithAds']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -25,7 +30,7 @@ class TrackWithAds(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['TrackWithAds']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Genre(YandexMusicObject):
|
||||
def __init__(self,
|
||||
id_,
|
||||
weight,
|
||||
composer_top,
|
||||
title,
|
||||
titles,
|
||||
images,
|
||||
show_in_menu,
|
||||
full_title=None,
|
||||
url_part=None,
|
||||
color=None,
|
||||
radio_icon=None,
|
||||
sub_genres=None,
|
||||
id_: str,
|
||||
weight: int,
|
||||
composer_top: bool,
|
||||
title: str,
|
||||
titles: Dict[str, Optional['Title']],
|
||||
images: Optional['Images'],
|
||||
show_in_menu: bool,
|
||||
full_title: Optional[str] = None,
|
||||
url_part: Optional[str] = None,
|
||||
color: Optional[str] = None,
|
||||
radio_icon: Optional['Icon'] = None,
|
||||
sub_genres: List['Genre'] = None,
|
||||
hide_in_regions=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.weight = weight
|
||||
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)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Genre']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -51,7 +56,7 @@ class Genre(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Genre']:
|
||||
if not data:
|
||||
return []
|
||||
|
||||
|
|
|
@ -1,18 +1,23 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
||||
from yandex_music import YandexMusicObject
|
||||
|
||||
|
||||
class Images(YandexMusicObject):
|
||||
def __init__(self,
|
||||
_208x208=None,
|
||||
_300x300=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
_208x208: Optional[str] = None,
|
||||
_300x300: Optional[str] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self._208x208 = _208x208
|
||||
self._300x300 = _300x300
|
||||
|
||||
self.client = client
|
||||
|
||||
def download_208x208(self, filename):
|
||||
def download_208x208(self, filename: str) -> None:
|
||||
"""Загрузка изображения 208x208.
|
||||
|
||||
Args:
|
||||
|
@ -21,7 +26,7 @@ class Images(YandexMusicObject):
|
|||
|
||||
self.client.request.download(self._208x208, filename)
|
||||
|
||||
def download_300x300(self, filename):
|
||||
def download_300x300(self, filename: str) -> None:
|
||||
"""Загрузка изображения 300x300.
|
||||
|
||||
Args:
|
||||
|
@ -31,7 +36,7 @@ class Images(YandexMusicObject):
|
|||
self.client.request.download(self._300x300, filename)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Images']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Title(YandexMusicObject):
|
||||
def __init__(self,
|
||||
title,
|
||||
full_title=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
title: str,
|
||||
full_title: Optional[str] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.title = title
|
||||
self.full_title = full_title
|
||||
|
||||
|
@ -14,7 +19,7 @@ class Title(YandexMusicObject):
|
|||
self._id_attrs = (self.title, self.full_title)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Title']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -23,7 +28,7 @@ class Title(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_dict(cls, data, client):
|
||||
def de_dict(cls, data, client) -> Dict[str, Optional['Title']]:
|
||||
if not data:
|
||||
return {}
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ class Icon(YandexMusicObject):
|
|||
self.client = client
|
||||
self._id_attrs = (self.background_color, self.image_url)
|
||||
|
||||
def download(self, filename: str, size: str = '200x200'):
|
||||
def download(self, filename: str, size: str = '200x200') -> None:
|
||||
"""Загрузка иконки.
|
||||
|
||||
Args:
|
||||
|
|
|
@ -28,7 +28,7 @@ class InvocationInfo(YandexMusicObject):
|
|||
def __init__(self,
|
||||
hostname: str,
|
||||
req_id: str,
|
||||
exec_duration_millis: Optional[str] = None,
|
||||
exec_duration_millis: Optional[int] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs):
|
||||
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
|
||||
|
||||
|
||||
class Block(YandexMusicObject):
|
||||
def __init__(self,
|
||||
id_,
|
||||
type_,
|
||||
type_for_from,
|
||||
title,
|
||||
entities,
|
||||
description=None,
|
||||
data=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
id_: str,
|
||||
type_: str,
|
||||
type_for_from: str,
|
||||
title: str,
|
||||
entities: List['BlockEntity'],
|
||||
description: Optional[str] = None,
|
||||
data: Optional[Union['PersonalPlaylistsData', 'PlayContextsData']] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
|
||||
self.id = id_
|
||||
self.type = type_
|
||||
|
@ -25,11 +30,11 @@ class Block(YandexMusicObject):
|
|||
self.client = client
|
||||
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]
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Block']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -46,7 +51,7 @@ class Block(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Block']:
|
||||
if not data:
|
||||
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,\
|
||||
GeneratedPlaylist
|
||||
|
||||
|
@ -15,11 +20,12 @@ de_json = {
|
|||
|
||||
class BlockEntity(YandexMusicObject):
|
||||
def __init__(self,
|
||||
id_,
|
||||
type_,
|
||||
data,
|
||||
client=None,
|
||||
**kwargs):
|
||||
id_: str,
|
||||
type_: str,
|
||||
data: Optional[Union['GeneratedPlaylist', 'Promotion', 'Album',
|
||||
'Playlist', 'ChartItem', 'PlayContext', 'MixLink']],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
|
||||
self.id = id_
|
||||
self.type = type_
|
||||
|
@ -29,7 +35,7 @@ class BlockEntity(YandexMusicObject):
|
|||
self._id_attrs = (self.id, self.type, self.data)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['BlockEntity']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -39,7 +45,7 @@ class BlockEntity(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['BlockEntity']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Chart(YandexMusicObject):
|
||||
def __init__(self,
|
||||
position,
|
||||
progress,
|
||||
listeners,
|
||||
shift,
|
||||
track_id=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
position: int,
|
||||
progress: str,
|
||||
listeners: int,
|
||||
shift: int,
|
||||
track_id: Optional['TrackId'] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.position = position
|
||||
self.progress = progress
|
||||
self.listeners = listeners
|
||||
|
@ -21,7 +26,7 @@ class Chart(YandexMusicObject):
|
|||
self._id_attrs = (self.position, self.progress, self.listeners, self.shift, self.track_id)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Chart']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
@ -43,7 +48,7 @@ class Chart(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Chart']:
|
||||
"""Десериализация списка объектов.
|
||||
|
||||
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
|
||||
|
||||
|
||||
class ChartItem(YandexMusicObject):
|
||||
def __init__(self,
|
||||
track,
|
||||
chart,
|
||||
client=None,
|
||||
**kwargs):
|
||||
track: Optional['Track'],
|
||||
chart: Optional['Chart'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.track = track
|
||||
self.chart = chart
|
||||
|
||||
|
@ -14,7 +19,7 @@ class ChartItem(YandexMusicObject):
|
|||
self._id_attrs = (self.track, self.chart)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['ChartItem']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -26,7 +31,7 @@ class ChartItem(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['ChartItem']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Landing(YandexMusicObject):
|
||||
def __init__(self,
|
||||
pumpkin,
|
||||
content_id,
|
||||
blocks,
|
||||
client=None,
|
||||
**kwargs):
|
||||
pumpkin: bool,
|
||||
content_id: Union[str, int],
|
||||
blocks: List['Block'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
|
||||
self.pumpkin = pumpkin
|
||||
self.content_id = content_id
|
||||
|
@ -20,7 +25,7 @@ class Landing(YandexMusicObject):
|
|||
return self.blocks[item]
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Landing']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class MixLink(YandexMusicObject):
|
||||
def __init__(self,
|
||||
title,
|
||||
url,
|
||||
url_scheme,
|
||||
text_color,
|
||||
background_color,
|
||||
background_image_uri,
|
||||
cover_white,
|
||||
client=None,
|
||||
**kwargs):
|
||||
title: str,
|
||||
url: str,
|
||||
url_scheme: str,
|
||||
text_color: str,
|
||||
background_color: str,
|
||||
background_image_uri: str,
|
||||
cover_white: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.title = title
|
||||
self.url = url
|
||||
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.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:
|
||||
|
@ -35,7 +40,7 @@ class MixLink(YandexMusicObject):
|
|||
self.client.request.download(f'https://{self.background_image_uri.replace("%%", size)}', filename)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['MixLink']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -44,7 +49,7 @@ class MixLink(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['MixLink']:
|
||||
if not data:
|
||||
return []
|
||||
|
||||
|
|
|
@ -1,18 +1,23 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
||||
from yandex_music import YandexMusicObject
|
||||
|
||||
|
||||
class PersonalPlaylistsData(YandexMusicObject):
|
||||
def __init__(self,
|
||||
is_wizard_passed,
|
||||
client=None,
|
||||
**kwargs):
|
||||
is_wizard_passed: bool,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.is_wizard_passed = is_wizard_passed
|
||||
|
||||
self.client = client
|
||||
self._id_attrs = (self.is_wizard_passed,)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['PersonalPlaylistsData']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class PlayContext(YandexMusicObject):
|
||||
def __init__(self,
|
||||
client_,
|
||||
context,
|
||||
context_item,
|
||||
tracks,
|
||||
client=None,
|
||||
**kwargs):
|
||||
client_: str,
|
||||
context: str,
|
||||
context_item: str,
|
||||
tracks: List['TrackShortOld'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.client_ = client_
|
||||
self.context = context
|
||||
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)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['PlayContext']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class PlayContextsData(YandexMusicObject):
|
||||
def __init__(self,
|
||||
other_tracks,
|
||||
client=None,
|
||||
**kwargs):
|
||||
other_tracks: List['TrackShortOld'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.other_tracks = other_tracks
|
||||
|
||||
self.client = client
|
||||
self._id_attrs = (self.other_tracks,)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['PlayContextsData']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Promotion(YandexMusicObject):
|
||||
def __init__(self,
|
||||
promo_id,
|
||||
title,
|
||||
subtitle,
|
||||
heading,
|
||||
url,
|
||||
url_scheme,
|
||||
text_color,
|
||||
gradient,
|
||||
image,
|
||||
client=None,
|
||||
**kwargs):
|
||||
promo_id: str,
|
||||
title: str,
|
||||
subtitle: str,
|
||||
heading: str,
|
||||
url: str,
|
||||
url_scheme: str,
|
||||
text_color: str,
|
||||
gradient: str,
|
||||
image: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.promo_id = promo_id
|
||||
self.title = title
|
||||
self.subtitle = subtitle
|
||||
|
@ -29,7 +34,7 @@ class Promotion(YandexMusicObject):
|
|||
self.url, self.url_scheme, self.text_color, self.gradient, self.image)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Promotion']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -38,7 +43,7 @@ class Promotion(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Promotion']:
|
||||
if not data:
|
||||
return []
|
||||
|
||||
|
|
|
@ -1,12 +1,17 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
||||
from yandex_music import YandexMusicObject
|
||||
|
||||
|
||||
class TrackId(YandexMusicObject):
|
||||
def __init__(self,
|
||||
id_,
|
||||
album_id=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
id_: int,
|
||||
album_id: Optional[int] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
|
||||
self.album_id = album_id
|
||||
|
@ -14,7 +19,7 @@ class TrackId(YandexMusicObject):
|
|||
self._id_attrs = (self.id, self.album_id)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['TrackId']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class TrackShortOld(YandexMusicObject):
|
||||
def __init__(self,
|
||||
track_id,
|
||||
timestamp,
|
||||
client=None,
|
||||
**kwargs):
|
||||
track_id: Optional['TrackId'],
|
||||
timestamp: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.track_id = track_id
|
||||
self.timestamp = timestamp
|
||||
|
||||
|
@ -14,7 +19,7 @@ class TrackShortOld(YandexMusicObject):
|
|||
self._id_attrs = (self.track_id,)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['TrackShortOld']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -25,7 +30,7 @@ class TrackShortOld(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['TrackShortOld']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class AlbumsLikes(YandexMusicObject):
|
||||
def __init__(self,
|
||||
timestamp,
|
||||
id_=None,
|
||||
album=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
timestamp: str,
|
||||
id_: Optional[int] = None,
|
||||
album: Optional['Album'] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.album = album
|
||||
self.timestamp = timestamp
|
||||
|
@ -16,7 +21,7 @@ class AlbumsLikes(YandexMusicObject):
|
|||
self._id_attrs = (self.id, self.album)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['AlbumsLikes']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -27,7 +32,7 @@ class AlbumsLikes(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['AlbumsLikes']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class ArtistsLikes(YandexMusicObject):
|
||||
def __init__(self,
|
||||
id_=None,
|
||||
artist=None,
|
||||
timestamp=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
artist: Optional['Artist'] = None,
|
||||
timestamp: str = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.artist = artist
|
||||
self.timestamp = timestamp
|
||||
|
@ -16,7 +21,7 @@ class ArtistsLikes(YandexMusicObject):
|
|||
self._id_attrs = (self.id, self.artist)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['ArtistsLikes']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -32,7 +37,7 @@ class ArtistsLikes(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['ArtistsLikes']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class PlaylistsLikes(YandexMusicObject):
|
||||
def __init__(self,
|
||||
timestamp,
|
||||
timestamp: str,
|
||||
id_=None,
|
||||
playlist=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
playlist: Optional['Playlist'] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.playlist = playlist
|
||||
self.timestamp = timestamp
|
||||
|
@ -16,7 +21,7 @@ class PlaylistsLikes(YandexMusicObject):
|
|||
self._id_attrs = (self.id, self.playlist)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['PlaylistsLikes']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -27,7 +32,7 @@ class PlaylistsLikes(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['PlaylistsLikes']:
|
||||
if not data:
|
||||
return []
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
from typing import TYPE_CHECKING, Optional, List
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
@ -22,7 +22,7 @@ class PermissionAlerts(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
alerts,
|
||||
alerts: List[str],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs):
|
||||
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
|
||||
|
||||
|
||||
class CaseForms(YandexMusicObject):
|
||||
def __init__(self,
|
||||
nominative,
|
||||
genitive,
|
||||
dative,
|
||||
accusative,
|
||||
instrumental,
|
||||
prepositional,
|
||||
client=None,
|
||||
**kwargs):
|
||||
nominative: str,
|
||||
genitive: str,
|
||||
dative: str,
|
||||
accusative: str,
|
||||
instrumental: str,
|
||||
prepositional: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.nominative = nominative
|
||||
self.genitive = genitive
|
||||
self.dative = dative
|
||||
|
@ -23,7 +28,7 @@ class CaseForms(YandexMusicObject):
|
|||
self.accusative, self.instrumental, self.prepositional)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['CaseForms']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class MadeFor(YandexMusicObject):
|
||||
def __init__(self,
|
||||
user_info,
|
||||
case_forms,
|
||||
client=None,
|
||||
**kwargs):
|
||||
user_info: Optional['User'],
|
||||
case_forms: Optional['CaseForms'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.user_info = user_info
|
||||
self.case_forms = case_forms
|
||||
|
||||
|
@ -14,7 +19,7 @@ class MadeFor(YandexMusicObject):
|
|||
self._id_attrs = (self.user_info, self.case_forms)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['MadeFor']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class PlayCounter(YandexMusicObject):
|
||||
def __init__(self,
|
||||
value,
|
||||
description,
|
||||
updated,
|
||||
client=None,
|
||||
**kwargs):
|
||||
value: int,
|
||||
description: str,
|
||||
updated: bool,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.value = value
|
||||
self.description = description
|
||||
self.updated = updated
|
||||
|
@ -16,7 +21,7 @@ class PlayCounter(YandexMusicObject):
|
|||
self._id_attrs = (self.value, self.description, self.updated)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['PlayCounter']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Playlist(YandexMusicObject):
|
||||
def __init__(self,
|
||||
owner,
|
||||
cover,
|
||||
made_for,
|
||||
play_counter,
|
||||
playlist_absence,
|
||||
uid=None,
|
||||
kind=None,
|
||||
title=None,
|
||||
track_count=None,
|
||||
tags=None,
|
||||
revision=None,
|
||||
snapshot=None,
|
||||
visibility=None,
|
||||
collective=None,
|
||||
created=None,
|
||||
modified=None,
|
||||
available=None,
|
||||
is_banner=None,
|
||||
is_premiere=None,
|
||||
duration_ms=None,
|
||||
og_image=None,
|
||||
tracks=None,
|
||||
prerolls=None,
|
||||
likes_count=None,
|
||||
generated_playlist_type=None,
|
||||
animated_cover_uri=None,
|
||||
ever_played=None,
|
||||
description=None,
|
||||
description_formatted=None,
|
||||
owner: Optional['User'],
|
||||
cover: Optional['Cover'],
|
||||
made_for: Optional['MadeFor'],
|
||||
play_counter: Optional['PlayCounter'],
|
||||
playlist_absence: Optional['PlaylistAbsence'],
|
||||
uid: Optional[int] = None,
|
||||
kind: Optional[int] = None,
|
||||
title: Optional[str] = None,
|
||||
track_count: Optional[int] = None,
|
||||
tags: Optional[list] = None,
|
||||
revision: Optional[int] = None,
|
||||
snapshot: Optional[int] = None,
|
||||
visibility: Optional[str] = None,
|
||||
collective: Optional[bool] = None,
|
||||
created: Optional[str] = None,
|
||||
modified: Optional[str] = None,
|
||||
available: Optional[bool] = None,
|
||||
is_banner: Optional[bool] = None,
|
||||
is_premiere: Optional[bool] = None,
|
||||
duration_ms: Optional[int] = None,
|
||||
og_image: Optional[str] = None,
|
||||
tracks: List['TrackShort'] = None,
|
||||
prerolls: Optional[list] = None,
|
||||
likes_count: Optional[int] = None,
|
||||
generated_playlist_type: Optional[str] = None,
|
||||
animated_cover_uri: Optional[str] = None,
|
||||
ever_played: Optional[bool] = None,
|
||||
description: Optional[str] = None,
|
||||
description_formatted: Optional[str] = None,
|
||||
is_for_from=None,
|
||||
regions=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.owner = owner
|
||||
self.cover = cover
|
||||
self.made_for = made_for
|
||||
|
@ -73,14 +78,14 @@ class Playlist(YandexMusicObject):
|
|||
self._id_attrs = (self.uid, self.kind, self.title, self.playlist_absence)
|
||||
|
||||
@property
|
||||
def is_mine(self):
|
||||
def is_mine(self) -> bool:
|
||||
return self.owner.uid == self.client.me.account.uid
|
||||
|
||||
@property
|
||||
def playlist_id(self):
|
||||
def playlist_id(self) -> str:
|
||||
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:
|
||||
|
@ -90,7 +95,7 @@ class Playlist(YandexMusicObject):
|
|||
|
||||
self.client.request.download(f'https://{self.animated_cover_uri.replace("%%", size)}', filename)
|
||||
|
||||
def download_og_image(self, filename, size='200x200'):
|
||||
def download_og_image(self, filename: str, size: str = '200x200') -> None:
|
||||
"""Загрузка обложки.
|
||||
|
||||
Используйте это только когда нет self.cover!
|
||||
|
@ -102,20 +107,20 @@ class Playlist(YandexMusicObject):
|
|||
|
||||
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
|
||||
|
||||
self.__dict__.clear()
|
||||
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)
|
||||
"""
|
||||
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)
|
||||
|
@ -123,7 +128,7 @@ class Playlist(YandexMusicObject):
|
|||
return self.client.users_likes_playlists_remove(self.uid, self.client.me.account.uid, *args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Playlist']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -143,7 +148,7 @@ class Playlist(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Playlist']:
|
||||
if not data:
|
||||
return []
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
||||
from yandex_music import YandexMusicObject
|
||||
|
||||
|
||||
|
@ -19,10 +24,10 @@ class PlaylistAbsence(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
kind,
|
||||
reason,
|
||||
client=None,
|
||||
**kwargs):
|
||||
kind: int,
|
||||
reason: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.kind = kind
|
||||
self.reason = reason
|
||||
|
||||
|
@ -30,7 +35,7 @@ class PlaylistAbsence(YandexMusicObject):
|
|||
self._id_attrs = (self.kind, self.reason)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['PlaylistAbsence']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
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
|
||||
|
||||
|
||||
class PlaylistId(YandexMusicObject):
|
||||
def __init__(self,
|
||||
uid,
|
||||
kind,
|
||||
client=None,
|
||||
**kwargs):
|
||||
uid: int,
|
||||
kind: int,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.uid = uid
|
||||
self.kind = kind
|
||||
|
||||
|
@ -14,7 +19,7 @@ class PlaylistId(YandexMusicObject):
|
|||
self._id_attrs = (self.uid, self.kind)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['PlaylistId']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
@ -34,7 +39,7 @@ class PlaylistId(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['PlaylistId']:
|
||||
"""Десериализация списка объектов.
|
||||
|
||||
Args:
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
||||
from yandex_music import YandexMusicObject
|
||||
|
||||
|
||||
|
@ -10,7 +15,8 @@ class User(YandexMusicObject):
|
|||
name (:obj:`str`): Имя пользователя.
|
||||
sex (:obj:`str`): Пол пользователя.
|
||||
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:
|
||||
uid (:obj:`int`): Идентификатор пользователя.
|
||||
|
@ -18,18 +24,19 @@ class User(YandexMusicObject):
|
|||
name (:obj:`str`): Имя пользователя.
|
||||
sex (:obj:`str`): Пол пользователя.
|
||||
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.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
uid,
|
||||
login,
|
||||
name,
|
||||
sex,
|
||||
verified,
|
||||
client=None,
|
||||
**kwargs):
|
||||
uid: int,
|
||||
login: str,
|
||||
name: str,
|
||||
sex: str,
|
||||
verified: bool,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.uid = uid
|
||||
self.login = login
|
||||
self.name = name
|
||||
|
@ -39,7 +46,7 @@ class User(YandexMusicObject):
|
|||
self.client = client
|
||||
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:
|
||||
|
@ -50,7 +57,7 @@ class User(YandexMusicObject):
|
|||
self.client.request.download(f'https://upics.yandex.net/{self.uid}/{format_}', filename)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['User']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
|
|
@ -30,7 +30,7 @@ class PromoCodeStatus(YandexMusicObject):
|
|||
def __init__(self,
|
||||
status: str,
|
||||
status_desc: str,
|
||||
account_status: 'Status',
|
||||
account_status: Optional['Status'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs):
|
||||
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
|
||||
|
||||
|
||||
class AdParams(YandexMusicObject):
|
||||
def __init__(self,
|
||||
partner_id,
|
||||
category_id,
|
||||
page_ref,
|
||||
target_ref,
|
||||
other_params,
|
||||
ad_volume,
|
||||
partner_id: Union[str, int],
|
||||
category_id: Union[str, int],
|
||||
page_ref: str,
|
||||
target_ref: str,
|
||||
other_params: str,
|
||||
ad_volume: int,
|
||||
genre_id=None,
|
||||
genre_name=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.partner_id = partner_id
|
||||
self.category_id = category_id
|
||||
self.page_ref = page_ref
|
||||
|
@ -28,7 +33,7 @@ class AdParams(YandexMusicObject):
|
|||
self.target_ref, self.other_params, self.ad_volume)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['AdParams']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Dashboard(YandexMusicObject):
|
||||
def __init__(self,
|
||||
dashboard_id,
|
||||
stations,
|
||||
pumpkin,
|
||||
client=None,
|
||||
**kwargs):
|
||||
dashboard_id: str,
|
||||
stations: List['StationResult'],
|
||||
pumpkin: bool,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.dashboard_id = dashboard_id
|
||||
self.stations = stations
|
||||
self.pumpkin = pumpkin
|
||||
|
@ -16,7 +21,7 @@ class Dashboard(YandexMusicObject):
|
|||
self._id_attrs = (self.dashboard_id, self.stations, self.pumpkin)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Dashboard']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class DiscreteScale(YandexMusicObject):
|
||||
def __init__(self,
|
||||
type_,
|
||||
name,
|
||||
min_,
|
||||
max_,
|
||||
client=None,
|
||||
**kwargs):
|
||||
type_: str,
|
||||
name: str,
|
||||
min_: Optional['Value'],
|
||||
max_: Optional['Value'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.type = type_
|
||||
self.name = name
|
||||
self.min = min_
|
||||
|
@ -18,7 +23,7 @@ class DiscreteScale(YandexMusicObject):
|
|||
self._id_attrs = (self.type, self.name, self.min, self.max)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['DiscreteScale']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Enum(YandexMusicObject):
|
||||
def __init__(self,
|
||||
type_,
|
||||
name,
|
||||
possible_values,
|
||||
client=None,
|
||||
**kwargs):
|
||||
type_: str,
|
||||
name: str,
|
||||
possible_values: List['Value'],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.type = type_
|
||||
self.name = name
|
||||
self.possible_values = possible_values
|
||||
|
@ -16,7 +21,7 @@ class Enum(YandexMusicObject):
|
|||
self._id_attrs = (self.type, self.name, self.possible_values)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Enum']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Id(YandexMusicObject):
|
||||
def __init__(self,
|
||||
type_,
|
||||
tag,
|
||||
client=None,
|
||||
**kwargs):
|
||||
type_: str,
|
||||
tag: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.type = type_
|
||||
self.tag = tag
|
||||
|
||||
|
@ -14,7 +19,7 @@ class Id(YandexMusicObject):
|
|||
self._id_attrs = (self.type, self.tag)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Id']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
|
@ -9,13 +14,13 @@ de_json = {
|
|||
|
||||
class Restrictions(YandexMusicObject):
|
||||
def __init__(self,
|
||||
language,
|
||||
diversity,
|
||||
mood=None,
|
||||
energy=None,
|
||||
mood_energy=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
language: Optional[Union['Enum', 'DiscreteScale']],
|
||||
diversity: Optional[Union['Enum', 'DiscreteScale']],
|
||||
mood: Optional[Union['Enum', 'DiscreteScale']] = None,
|
||||
energy: Optional[Union['Enum', 'DiscreteScale']] = None,
|
||||
mood_energy: Optional[Union['Enum', 'DiscreteScale']] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.language = language
|
||||
self.diversity = diversity
|
||||
self.mood = mood
|
||||
|
@ -26,7 +31,7 @@ class Restrictions(YandexMusicObject):
|
|||
self._id_attrs = (self.language, self.diversity)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Restrictions']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class RotorSettings(YandexMusicObject):
|
||||
def __init__(self,
|
||||
language,
|
||||
diversity,
|
||||
mood=None,
|
||||
energy=None,
|
||||
language: str,
|
||||
diversity: str,
|
||||
mood: Optional[int] = None,
|
||||
energy: Optional[int] = None,
|
||||
mood_energy=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.language = language
|
||||
self.diversity = diversity
|
||||
|
||||
|
@ -21,7 +26,7 @@ class RotorSettings(YandexMusicObject):
|
|||
self._id_attrs = (self.language, self.diversity)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['RotorSettings']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Sequence(YandexMusicObject):
|
||||
def __init__(self,
|
||||
type_,
|
||||
track,
|
||||
liked,
|
||||
client=None,
|
||||
**kwargs):
|
||||
type_: str,
|
||||
track: Optional['Track'],
|
||||
liked: bool,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.type = type_
|
||||
self.track = track
|
||||
self.liked = liked
|
||||
|
@ -16,7 +21,7 @@ class Sequence(YandexMusicObject):
|
|||
self._id_attrs = (self.type, self.track, self.liked)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Sequence']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -27,7 +32,7 @@ class Sequence(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Sequence']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Station(YandexMusicObject):
|
||||
def __init__(self,
|
||||
id_,
|
||||
name,
|
||||
icon,
|
||||
mts_icon,
|
||||
geocell_icon,
|
||||
id_for_from,
|
||||
restrictions,
|
||||
restrictions2,
|
||||
parent_id=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
id_: Optional['Id'],
|
||||
name: str,
|
||||
icon: Optional['Icon'],
|
||||
mts_icon: Optional['Icon'],
|
||||
geocell_icon: Optional['Icon'],
|
||||
id_for_from: str,
|
||||
restrictions: Optional['Restrictions'],
|
||||
restrictions2: Optional['Restrictions'],
|
||||
parent_id: Optional['Id'] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.name = name
|
||||
self.icon = icon
|
||||
|
@ -30,7 +35,7 @@ class Station(YandexMusicObject):
|
|||
self.id_for_from, self.restrictions, self.restrictions2)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Station']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class StationResult(YandexMusicObject):
|
||||
def __init__(self,
|
||||
station,
|
||||
settings,
|
||||
settings2,
|
||||
ad_params,
|
||||
explanation=None,
|
||||
prerolls=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
station: Optional['Station'],
|
||||
settings: Optional['RotorSettings'],
|
||||
settings2: Optional['RotorSettings'],
|
||||
ad_params: Optional['AdParams'],
|
||||
explanation: Optional[str] = None,
|
||||
prerolls: Optional[list] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.station = station
|
||||
self.settings = settings
|
||||
self.settings2 = settings2
|
||||
|
@ -22,7 +27,7 @@ class StationResult(YandexMusicObject):
|
|||
self._id_attrs = (self.station, self.settings, self.settings2, self.ad_params)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['StationResult']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -36,7 +41,7 @@ class StationResult(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['StationResult']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class StationTracksResult(YandexMusicObject):
|
||||
def __init__(self,
|
||||
id_,
|
||||
sequence,
|
||||
batch_id,
|
||||
pumpkin,
|
||||
client=None,
|
||||
**kwargs):
|
||||
id_: Optional['Id'],
|
||||
sequence: List['Sequence'],
|
||||
batch_id: str,
|
||||
pumpkin: bool,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.sequence = sequence
|
||||
self.batch_id = batch_id
|
||||
|
@ -18,7 +23,7 @@ class StationTracksResult(YandexMusicObject):
|
|||
self._id_attrs = (self.id, self.sequence, self.batch_id, self.pumpkin)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data, client) -> Optional['StationTracksResult']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Value(YandexMusicObject):
|
||||
def __init__(self,
|
||||
value,
|
||||
name,
|
||||
client=None,
|
||||
**kwargs):
|
||||
value: str,
|
||||
name: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.value = value
|
||||
self.name = name
|
||||
|
||||
|
@ -14,7 +19,7 @@ class Value(YandexMusicObject):
|
|||
self._id_attrs = (self.value, self.name)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Value']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -23,7 +28,7 @@ class Value(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Value']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
|
@ -12,11 +17,11 @@ de_json_result = {
|
|||
|
||||
class Best(YandexMusicObject):
|
||||
def __init__(self,
|
||||
type_,
|
||||
result,
|
||||
text=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
type_: str,
|
||||
result: Optional[Union[Track, Artist, Album, Playlist, Video]],
|
||||
text: Optional[str] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.type = type_
|
||||
self.result = result
|
||||
|
||||
|
@ -26,7 +31,7 @@ class Best(YandexMusicObject):
|
|||
self._id_attrs = (self.type, self.result)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client'):
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
|
@ -8,11 +13,16 @@ class Search(YandexMusicObject):
|
|||
search_request_id (:obj:`str`): ID запроса.
|
||||
text (:obj:`str`): Текст запроса.
|
||||
best (:obj:`yandex_music.Best`): Объект класса :class:`yandex_music.Best` представляющий лучший результат.
|
||||
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` представляющий найденные плейлисты.
|
||||
tracks (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий найденные треки.
|
||||
videos (: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` представляющий
|
||||
найденные плейлисты.
|
||||
tracks (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
|
||||
найденные треки.
|
||||
videos (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
|
||||
найденные видео.
|
||||
misspell_corrected (:obj:`bool`): Был ли исправлен запрос.
|
||||
nocorrect (:obj:`bool`): Было ли отключено исправление результата.
|
||||
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex
|
||||
|
@ -22,31 +32,36 @@ class Search(YandexMusicObject):
|
|||
search_request_id (:obj:`str`): ID запроса.
|
||||
text (:obj:`str`): Текст запроса.
|
||||
best (:obj:`yandex_music.Best`): Объект класса :class:`yandex_music.Best` представляющий лучший результат.
|
||||
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` представляющий найденные плейлисты.
|
||||
tracks (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий найденные треки.
|
||||
videos (: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` представляющий
|
||||
найденные плейлисты.
|
||||
tracks (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
|
||||
найденные треки.
|
||||
videos (:obj:`yandex_music.SearchResult`): Объект класса :class:`yandex_music.SearchResult` представляющий
|
||||
найденные видео.
|
||||
misspell_corrected (:obj:`bool`, optional): Был ли исправлен запрос.
|
||||
nocorrect (:obj:`bool`, optional): Было ли отключено исправление результата.
|
||||
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.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
search_request_id,
|
||||
text,
|
||||
best,
|
||||
albums,
|
||||
artists,
|
||||
playlists,
|
||||
tracks,
|
||||
videos,
|
||||
misspell_corrected=None,
|
||||
nocorrect=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
search_request_id: str,
|
||||
text: str,
|
||||
best: Optional['Best'],
|
||||
albums: Optional['SearchResult'],
|
||||
artists: Optional['SearchResult'],
|
||||
playlists: Optional['SearchResult'],
|
||||
tracks: Optional['SearchResult'],
|
||||
videos: Optional['SearchResult'],
|
||||
misspell_corrected: Optional[bool] = None,
|
||||
nocorrect: Optional[bool] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.search_request_id = search_request_id
|
||||
self.text = text
|
||||
self.best = best
|
||||
|
@ -64,7 +79,7 @@ class Search(YandexMusicObject):
|
|||
self.artists, self.playlists, self.tracks, self.videos)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Search']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -12,12 +17,12 @@ de_json_result = {
|
|||
|
||||
class SearchResult(YandexMusicObject):
|
||||
def __init__(self,
|
||||
total,
|
||||
per_page,
|
||||
order,
|
||||
results,
|
||||
client=None,
|
||||
**kwargs):
|
||||
total: int,
|
||||
per_page: int,
|
||||
order: int,
|
||||
results: List[Union[Track, Artist, Album, Playlist, Video]],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.total = total
|
||||
self.per_page = per_page
|
||||
self.order = order
|
||||
|
@ -27,7 +32,7 @@ class SearchResult(YandexMusicObject):
|
|||
self._id_attrs = (self.total, self.per_page, self.order, self.results)
|
||||
|
||||
@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:
|
||||
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
|
||||
|
||||
|
||||
class Suggestions(YandexMusicObject):
|
||||
def __init__(self,
|
||||
best,
|
||||
suggestions,
|
||||
client=None,
|
||||
**kwargs):
|
||||
best: Optional['Best'],
|
||||
suggestions: List[str],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.best = best
|
||||
self.suggestions = suggestions
|
||||
|
||||
|
@ -20,7 +25,7 @@ class Suggestions(YandexMusicObject):
|
|||
return iter(self.suggestions)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Suggestions']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
|
@ -45,22 +50,22 @@ class Account(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
now,
|
||||
service_available,
|
||||
region=None,
|
||||
uid=None,
|
||||
login=None,
|
||||
full_name=None,
|
||||
second_name=None,
|
||||
first_name=None,
|
||||
display_name=None,
|
||||
hosted_user=None,
|
||||
birthday=None,
|
||||
passport_phones=None,
|
||||
registered_at=None,
|
||||
has_info_for_app_metrica=False,
|
||||
client=None,
|
||||
**kwargs):
|
||||
now: str,
|
||||
service_available: bool,
|
||||
region: Optional[int] = None,
|
||||
uid: Optional[int] = None,
|
||||
login: Optional[str] = None,
|
||||
full_name: Optional[str] = None,
|
||||
second_name: Optional[str] = None,
|
||||
first_name: Optional[str] = None,
|
||||
display_name: Optional[str] = None,
|
||||
hosted_user: Optional[bool] = None,
|
||||
birthday: Optional[str] = None,
|
||||
passport_phones: List['PassportPhone'] = None,
|
||||
registered_at: Optional[str] = None,
|
||||
has_info_for_app_metrica: bool = False,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.now = now
|
||||
self.service_available = service_available
|
||||
|
||||
|
@ -82,7 +87,7 @@ class Account(YandexMusicObject):
|
|||
if 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:
|
||||
|
@ -93,7 +98,7 @@ class Account(YandexMusicObject):
|
|||
self.client.request.download(f'https://upics.yandex.net/{self.uid}/{format_}', filename)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Account']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -29,15 +34,15 @@ class AutoRenewable(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
expires,
|
||||
vendor,
|
||||
vendor_help_url,
|
||||
product_id,
|
||||
product,
|
||||
finished,
|
||||
order_id=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
expires: str,
|
||||
vendor: str,
|
||||
vendor_help_url: str,
|
||||
product_id: str,
|
||||
product: Optional['Product'],
|
||||
finished: bool,
|
||||
order_id: Optional[int] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.expires = expires
|
||||
self.vendor = vendor
|
||||
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)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['AutoRenewable']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
@ -71,7 +76,7 @@ class AutoRenewable(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['AutoRenewable']:
|
||||
"""Десериализация списка объектов.
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -17,16 +22,16 @@ class PassportPhone(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
phone,
|
||||
client=None,
|
||||
**kwargs):
|
||||
phone: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.phone = phone
|
||||
|
||||
self.client = client
|
||||
self._id_attrs = (self.phone,)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['PassportPhone']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
@ -45,7 +50,7 @@ class PassportPhone(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['PassportPhone']:
|
||||
"""Десериализация списка объектов.
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -21,11 +26,11 @@ class Permissions(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
until,
|
||||
values,
|
||||
default,
|
||||
client=None,
|
||||
**kwargs):
|
||||
until: str,
|
||||
values: List[str],
|
||||
default: List[str],
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.until = until
|
||||
self.values = values
|
||||
self.default = default
|
||||
|
@ -34,7 +39,7 @@ class Permissions(YandexMusicObject):
|
|||
self._id_attrs = (self.until, self.values, self.default)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Permissions']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
||||
from yandex_music import YandexMusicObject
|
||||
|
||||
|
||||
|
@ -19,10 +24,10 @@ class Plus(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
has_plus,
|
||||
is_tutorial_completed,
|
||||
client=None,
|
||||
**kwargs):
|
||||
has_plus: bool,
|
||||
is_tutorial_completed: bool,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.has_plus = has_plus
|
||||
self.is_tutorial_completed = is_tutorial_completed
|
||||
|
||||
|
@ -30,7 +35,7 @@ class Plus(YandexMusicObject):
|
|||
self._id_attrs = (self.has_plus, self.is_tutorial_completed)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Plus']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
||||
from yandex_music import YandexMusicObject
|
||||
|
||||
|
||||
|
@ -19,10 +24,10 @@ class Price(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
amount,
|
||||
currency,
|
||||
client=None,
|
||||
**kwargs):
|
||||
amount: int,
|
||||
currency: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.amount = amount
|
||||
self.currency = currency
|
||||
|
||||
|
@ -30,7 +35,7 @@ class Price(YandexMusicObject):
|
|||
self._id_attrs = (self.amount, self.currency)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Price']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -47,24 +52,24 @@ class Product(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
product_id,
|
||||
type_,
|
||||
common_period_duration,
|
||||
duration,
|
||||
trial_duration,
|
||||
price,
|
||||
feature,
|
||||
debug,
|
||||
features=None,
|
||||
description=None,
|
||||
available=None,
|
||||
trial_available=None,
|
||||
vendor_trial_available=None,
|
||||
button_text=None,
|
||||
button_additional_text=None,
|
||||
payment_method_types=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
product_id: str,
|
||||
type_: str,
|
||||
common_period_duration: str,
|
||||
duration: int,
|
||||
trial_duration: int,
|
||||
price: Optional['Price'],
|
||||
feature: str,
|
||||
debug: bool,
|
||||
features: List[str] = None,
|
||||
description: Optional[str] = None,
|
||||
available: Optional[bool] = None,
|
||||
trial_available: Optional[bool] = None,
|
||||
vendor_trial_available: Optional[bool] = None,
|
||||
button_text: Optional[str] = None,
|
||||
button_additional_text: Optional[str] = None,
|
||||
payment_method_types: List[str] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.product_id = product_id
|
||||
self.type = type_
|
||||
self.common_period_duration = common_period_duration
|
||||
|
@ -88,7 +93,7 @@ class Product(YandexMusicObject):
|
|||
self.trial_duration, self.product_id, self.feature, self.debug)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Product']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
@ -108,7 +113,7 @@ class Product(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Product']:
|
||||
"""Десериализация списка объектов.
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -45,19 +50,19 @@ class Status(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
account,
|
||||
permissions,
|
||||
subscription=None,
|
||||
cache_limit=None,
|
||||
subeditor=None,
|
||||
subeditor_level=None,
|
||||
plus=None,
|
||||
default_email=None,
|
||||
skips_per_hour=None,
|
||||
station_exists=None,
|
||||
premium_region=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
account: Optional['Account'],
|
||||
permissions: Optional['Permissions'],
|
||||
subscription: Optional['Subscription'] = None,
|
||||
cache_limit: Optional[int] = None,
|
||||
subeditor: Optional[bool] = None,
|
||||
subeditor_level: Optional[int] = None,
|
||||
plus: Optional['Plus'] = None,
|
||||
default_email: Optional[str] = None,
|
||||
skips_per_hour: Optional[int] = None,
|
||||
station_exists: Optional[bool] = None,
|
||||
premium_region: Optional[int] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.account = account
|
||||
self.permissions = permissions
|
||||
|
||||
|
@ -75,7 +80,7 @@ class Status(YandexMusicObject):
|
|||
self._id_attrs = (self.account, self.permissions)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Status']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -25,12 +30,12 @@ class Subscription(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
auto_renewable=None,
|
||||
can_start_trial=None,
|
||||
mcdonalds=None,
|
||||
end=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
auto_renewable: List['AutoRenewable'] = None,
|
||||
can_start_trial: Optional[bool] = None,
|
||||
mcdonalds: Optional[bool] = None,
|
||||
end: Optional[str] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.auto_renewable = auto_renewable
|
||||
self.can_start_trial = can_start_trial
|
||||
self.mcdonalds = mcdonalds
|
||||
|
@ -40,7 +45,7 @@ class Subscription(YandexMusicObject):
|
|||
self._id_attrs = (self.auto_renewable,)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Subscription']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
||||
from yandex_music import YandexMusicObject
|
||||
|
||||
|
||||
|
@ -27,14 +32,14 @@ class Lyrics(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
id_,
|
||||
lyrics,
|
||||
full_lyrics,
|
||||
has_rights,
|
||||
text_language,
|
||||
show_translation,
|
||||
client=None,
|
||||
**kwargs):
|
||||
id_: int,
|
||||
lyrics: str,
|
||||
full_lyrics: str,
|
||||
has_rights: bool,
|
||||
text_language: str,
|
||||
show_translation: bool,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.lyrics = lyrics
|
||||
self.full_lyrics = full_lyrics
|
||||
|
@ -47,7 +52,7 @@ class Lyrics(YandexMusicObject):
|
|||
self.text_language, self.show_translation)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Lyrics']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -25,12 +30,12 @@ class Supplement(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
id_,
|
||||
lyrics,
|
||||
videos,
|
||||
radio_is_available,
|
||||
client=None,
|
||||
**kwargs):
|
||||
id_: int,
|
||||
lyrics: Optional['Lyrics'],
|
||||
videos: List['VideoSupplement'],
|
||||
radio_is_available: bool,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.lyrics = lyrics
|
||||
self.videos = videos
|
||||
|
@ -40,7 +45,7 @@ class Supplement(YandexMusicObject):
|
|||
self._id_attrs = (self.id, self.lyrics, self.videos, self.radio_is_available)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Supplement']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -29,15 +34,15 @@ class VideoSupplement(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
cover,
|
||||
title,
|
||||
provider,
|
||||
provider_video_id,
|
||||
url=None,
|
||||
embed_url=None,
|
||||
embed=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
cover: str,
|
||||
title: str,
|
||||
provider: str,
|
||||
provider_video_id: str,
|
||||
url: Optional[str] = None,
|
||||
embed_url: Optional[str] = None,
|
||||
embed: Optional[str] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.cover = cover
|
||||
self.title = title
|
||||
self.provider = provider
|
||||
|
@ -51,7 +56,7 @@ class VideoSupplement(YandexMusicObject):
|
|||
self._id_attrs = (self.cover, self.title, self.provider_video_id)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['VideoSupplement']:
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
@ -70,7 +75,7 @@ class VideoSupplement(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['VideoSupplement']:
|
||||
"""Десериализация списка объектов.
|
||||
|
||||
Args:
|
||||
|
@ -79,7 +84,8 @@ class VideoSupplement(YandexMusicObject):
|
|||
Music.
|
||||
|
||||
Returns:
|
||||
:obj:`list` из :obj:`yandex_music.VideoSupplement`: Список объектов класса :class:`yandex_music.VideoSupplement`.
|
||||
:obj:`list` из :obj:`yandex_music.VideoSupplement`: Список объектов класса
|
||||
:class:`yandex_music.VideoSupplement`.
|
||||
"""
|
||||
if not data:
|
||||
return []
|
||||
|
|
|
@ -1,12 +1,17 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
||||
from yandex_music import YandexMusicObject
|
||||
|
||||
|
||||
class Major(YandexMusicObject):
|
||||
def __init__(self,
|
||||
id_,
|
||||
name,
|
||||
client=None,
|
||||
**kwargs):
|
||||
id_: int,
|
||||
name: str,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.name = name
|
||||
|
||||
|
@ -14,7 +19,7 @@ class Major(YandexMusicObject):
|
|||
self._id_attrs = (self.id, self.name)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Major']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Normalization(YandexMusicObject):
|
||||
def __init__(self,
|
||||
gain,
|
||||
peak,
|
||||
client=None,
|
||||
**kwargs):
|
||||
gain: float,
|
||||
peak: int,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.gain = gain
|
||||
self.peak = peak
|
||||
|
||||
|
@ -14,7 +19,7 @@ class Normalization(YandexMusicObject):
|
|||
self._id_attrs = (self.gain, self.peak)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Normalization']:
|
||||
if not data:
|
||||
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
|
||||
|
||||
|
||||
class Track(YandexMusicObject):
|
||||
def __init__(self,
|
||||
id_,
|
||||
title,
|
||||
available,
|
||||
artists,
|
||||
albums,
|
||||
available_for_premium_users=None,
|
||||
lyrics_available=None,
|
||||
real_id=None,
|
||||
og_image=None,
|
||||
type_=None,
|
||||
cover_uri=None,
|
||||
major=None,
|
||||
duration_ms=None,
|
||||
storage_dir=None,
|
||||
file_size=None,
|
||||
normalization=None,
|
||||
id_: Union[str, int],
|
||||
title: str,
|
||||
available: bool,
|
||||
artists: List['Artist'],
|
||||
albums: List['Album'],
|
||||
available_for_premium_users: Optional[bool] = None,
|
||||
lyrics_available: Optional[bool] = None,
|
||||
real_id: Optional[Union[str, int]] = None,
|
||||
og_image: Optional[str] = None,
|
||||
type_: Optional[str] = None,
|
||||
cover_uri: Optional[str] = None,
|
||||
major: Optional['Major'] = None,
|
||||
duration_ms: Optional[int] = None,
|
||||
storage_dir: Optional[str] = None,
|
||||
file_size: Optional[int] = None,
|
||||
normalization: Optional['Normalization'] = None,
|
||||
error=None,
|
||||
regions=None,
|
||||
available_as_rbt=None,
|
||||
content_warning=None,
|
||||
explicit=None,
|
||||
preview_duration_ms=None,
|
||||
available_full_without_permission=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
preview_duration_ms: Optional[int] = None,
|
||||
available_full_without_permission: Optional[bool] = None,
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.id = id_
|
||||
self.title = title
|
||||
self.available = available
|
||||
|
@ -58,19 +63,19 @@ class Track(YandexMusicObject):
|
|||
self.client = client
|
||||
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)
|
||||
|
||||
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)
|
||||
"""
|
||||
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:
|
||||
|
@ -80,7 +85,7 @@ class Track(YandexMusicObject):
|
|||
|
||||
self.client.request.download(f'https://{self.cover_uri.replace("%%", size)}', filename)
|
||||
|
||||
def download_og_image(self, filename, size='200x200'):
|
||||
def download_og_image(self, filename: str, size: str = '200x200') -> None:
|
||||
"""Загрузка обложки.
|
||||
|
||||
Предпочтительнее использовать self.download_cover().
|
||||
|
@ -92,7 +97,7 @@ class Track(YandexMusicObject):
|
|||
|
||||
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:
|
||||
self.get_download_info()
|
||||
|
||||
|
@ -100,14 +105,14 @@ class Track(YandexMusicObject):
|
|||
if info.codec == codec and info.bitrate_in_kbps == bitrate_in_kbps:
|
||||
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)
|
||||
"""
|
||||
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)
|
||||
|
@ -115,11 +120,11 @@ class Track(YandexMusicObject):
|
|||
return self.client.users_likes_tracks_remove(self.track_id, self.client.me.account.uid, *args, **kwargs)
|
||||
|
||||
@property
|
||||
def track_id(self):
|
||||
def track_id(self) -> str:
|
||||
return f'{self.id}'
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client') -> Optional['Track']:
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
@ -133,7 +138,7 @@ class Track(YandexMusicObject):
|
|||
return cls(client=client, **data)
|
||||
|
||||
@classmethod
|
||||
def de_list(cls, data, client):
|
||||
def de_list(cls, data: dict, client: 'Client') -> List['Track']:
|
||||
if not data:
|
||||
return []
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from typing import TYPE_CHECKING, Optional, List
|
||||
from typing import TYPE_CHECKING, Optional, List, Union
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client, Track
|
||||
|
@ -26,7 +26,7 @@ class TrackShort(YandexMusicObject):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
id_: str,
|
||||
id_: Union[str, int],
|
||||
timestamp: str,
|
||||
album_id: Optional[str] = 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
|
||||
|
||||
|
||||
|
@ -27,8 +32,8 @@ class CaptchaResponse(YandexMusicObject):
|
|||
x_captcha_key,
|
||||
error_description,
|
||||
error,
|
||||
client=None,
|
||||
**kwargs):
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.x_captcha_url = x_captcha_url
|
||||
self.x_captcha_key = x_captcha_key
|
||||
self.error_description = error_description
|
||||
|
@ -51,7 +56,7 @@ class CaptchaResponse(YandexMusicObject):
|
|||
self.client.request.download(self.x_captcha_url, filename)
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client'):
|
||||
"""Десериализация объекта.
|
||||
|
||||
Args:
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
||||
from yandex_music import YandexMusicObject
|
||||
|
||||
|
||||
|
@ -8,8 +13,8 @@ class Response(YandexMusicObject):
|
|||
result=None,
|
||||
error=None,
|
||||
error_description=None,
|
||||
client=None,
|
||||
**kwargs):
|
||||
client: Optional['Client'] = None,
|
||||
**kwargs) -> None:
|
||||
self.data = data
|
||||
self.invocation_info = invocation_info
|
||||
self._result = result
|
||||
|
@ -27,7 +32,7 @@ class Response(YandexMusicObject):
|
|||
return self.data if self._result is None else self._result
|
||||
|
||||
@classmethod
|
||||
def de_json(cls, data, client):
|
||||
def de_json(cls, data: dict, client: 'Client'):
|
||||
if not data:
|
||||
return None
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from typing import TYPE_CHECKING, Optional, List
|
||||
from typing import TYPE_CHECKING, Optional, List, Union
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from yandex_music import Client
|
||||
|
@ -8,13 +8,13 @@ from yandex_music import YandexMusicObject
|
|||
|
||||
class Video(YandexMusicObject):
|
||||
def __init__(self,
|
||||
title,
|
||||
cover=None,
|
||||
embed_url=None,
|
||||
provider=None,
|
||||
provider_video_id=None,
|
||||
youtube_url=None,
|
||||
thumbnail_url=None,
|
||||
title: str,
|
||||
cover: Optional[str] = None,
|
||||
embed_url: Optional[str] = None,
|
||||
provider: Optional['str'] = None,
|
||||
provider_video_id: Optional[Union[int, str]] = None,
|
||||
youtube_url: Optional[str] = None,
|
||||
thumbnail_url: Optional[str] = None,
|
||||
duration=None,
|
||||
text=None,
|
||||
html_auto_play_video_player=None,
|
||||
|
|
読み込み中…
新しいイシューから参照