Merge pull request #172 from MarshalX/issue-120

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

ファイルの表示

@ -519,9 +519,9 @@ def block_entity(request, results, types):
@pytest.fixture(scope='session')
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,