2019-05-07 06:02:21 +09:00
|
|
|
import logging
|
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
from yandex_music import YandexMusicObject, Status, Settings, PermissionAlerts, Experiments, Artist, Album, Playlist, \
|
|
|
|
Library, Track
|
2019-05-07 06:02:21 +09:00
|
|
|
from yandex_music.utils.request import Request
|
|
|
|
from yandex_music.error import InvalidToken
|
|
|
|
|
|
|
|
|
|
|
|
class Client(YandexMusicObject):
|
|
|
|
def __init__(self, token, base_url=None, request=None):
|
|
|
|
self.token = token
|
|
|
|
self._request = request or Request(token)
|
|
|
|
self.logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
if base_url is None:
|
|
|
|
base_url = 'https://api.music.yandex.net'
|
|
|
|
|
|
|
|
self.base_url = base_url
|
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
self.account = self.account_status().account
|
|
|
|
|
2019-05-07 06:02:21 +09:00
|
|
|
@staticmethod
|
|
|
|
def _validate_token(token):
|
|
|
|
if any(x.isspace() for x in token):
|
|
|
|
raise InvalidToken()
|
|
|
|
|
|
|
|
if len(token) != 39:
|
|
|
|
raise InvalidToken()
|
|
|
|
|
|
|
|
return token
|
|
|
|
|
|
|
|
@property
|
|
|
|
def request(self):
|
|
|
|
return self._request
|
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
def account_status(self, timeout=None, *args, **kwargs):
|
2019-05-07 06:02:21 +09:00
|
|
|
url = f'{self.base_url}/account/status'
|
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
2019-05-07 06:02:21 +09:00
|
|
|
|
2019-05-10 00:28:46 +09:00
|
|
|
status = Status.de_json(result, self)
|
2019-05-07 06:02:21 +09:00
|
|
|
|
2019-05-10 00:28:46 +09:00
|
|
|
return status
|
2019-05-11 05:01:32 +09:00
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
def settings(self, timeout=None, *args, **kwargs):
|
2019-05-11 05:01:32 +09:00
|
|
|
url = f'{self.base_url}/settings'
|
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
2019-05-11 05:01:32 +09:00
|
|
|
|
|
|
|
settings = Settings.de_json(result, self)
|
|
|
|
|
|
|
|
return settings
|
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
def permission_alerts(self, timeout=None, *args, **kwargs):
|
2019-05-11 05:01:32 +09:00
|
|
|
url = f'{self.base_url}/permission-alerts'
|
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
2019-05-11 05:01:32 +09:00
|
|
|
|
|
|
|
permission_alerts = PermissionAlerts.de_json(result, self)
|
|
|
|
|
|
|
|
return permission_alerts
|
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
def account_experiments(self, timeout=None, *args, **kwargs):
|
2019-05-11 05:01:32 +09:00
|
|
|
url = f'{self.base_url}/account/experiments'
|
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
2019-05-11 05:01:32 +09:00
|
|
|
|
|
|
|
experiments = Experiments.de_json(result, self)
|
|
|
|
|
|
|
|
return experiments
|
2019-05-11 17:37:47 +09:00
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
def artists(self, artist_ids: list or int or str, timeout=None, *args, **kwargs):
|
2019-05-11 17:37:47 +09:00
|
|
|
url = f'{self.base_url}/artists'
|
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
result = self._request.post(url, {'artist-ids': artist_ids}, timeout=timeout, *args, **kwargs)
|
2019-05-11 17:37:47 +09:00
|
|
|
|
|
|
|
artists = Artist.de_list(result, self)
|
|
|
|
|
|
|
|
return artists
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
|
|
def albums(self, album_ids: list or int or str, timeout=None, *args, **kwargs):
|
|
|
|
url = f'{self.base_url}/albums'
|
|
|
|
|
|
|
|
result = self._request.post(url, {'album-ids': album_ids}, timeout=timeout, *args, **kwargs)
|
|
|
|
|
|
|
|
albums = Album.de_list(result, self)
|
|
|
|
|
|
|
|
return albums
|
|
|
|
|
|
|
|
def playlists_list(self, playlist_ids: list or int or str, timeout=None, *args, **kwargs):
|
|
|
|
url = f'{self.base_url}/playlists/list'
|
|
|
|
|
|
|
|
result = self._request.post(url, {'playlistIds': playlist_ids}, timeout=timeout, *args, **kwargs)
|
|
|
|
|
|
|
|
playlists = Playlist.de_list(result, self)
|
|
|
|
|
|
|
|
return playlists
|
|
|
|
|
|
|
|
def users_playlists_list(self, user_id: int or str=None, timeout=None, *args, **kwargs):
|
|
|
|
if user_id is None:
|
|
|
|
user_id = self.account.uid
|
|
|
|
|
|
|
|
url = f'{self.base_url}/users/{user_id}/playlists/list'
|
|
|
|
|
|
|
|
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
|
|
|
|
|
|
|
playlists = Playlist.de_list(result, self)
|
|
|
|
|
|
|
|
return playlists
|
|
|
|
|
|
|
|
def users_likes_tracks(self, user_id: int or str=None, timeout=None, *args, **kwargs):
|
|
|
|
if user_id is None:
|
|
|
|
user_id = self.account.uid
|
|
|
|
|
|
|
|
url = f'{self.base_url}/users/{user_id}/likes/tracks'
|
|
|
|
|
|
|
|
result = self._request.get(url, timeout=timeout, *args, **kwargs).get('library')
|
|
|
|
|
|
|
|
tracks = Library.de_json(result, self)
|
|
|
|
|
|
|
|
return tracks
|
|
|
|
|
|
|
|
def tracks(self, track_ids: int or str, with_positions=True, timeout=None, *args, **kwargs):
|
|
|
|
url = f'{self.base_url}/tracks'
|
|
|
|
|
|
|
|
result = self._request.post(url, {'track-ids': track_ids, 'with-positions': with_positions},
|
|
|
|
timeout=timeout, *args, **kwargs)
|
|
|
|
|
|
|
|
tracks = Track.de_list(result, self)
|
|
|
|
|
|
|
|
return tracks
|