New supported objects: Experiments, PermissionAlerts, Settings

Added optional fields to Product object
The following methods are wrapped: settings, permission-alerts, account/experiments
Fixed receiving optional parameters during deserialization
このコミットが含まれているのは:
Marshal 2019-05-10 23:01:32 +03:00
コミット b4d173faf9
11個のファイルの変更145行の追加13行の削除

ファイルの表示

@ -6,9 +6,12 @@ from .permissions import Permissions
from .plus import Plus
from .subscription import Subscription
from .status import Status
from .settings import Settings
from .permission_alerts import PermissionAlerts
from .experiments import Experiments
from .price import Price
from .product import Product
from .auto_renewable import AutoRenewable
__all__ = ['YandexMusicObject', 'Account', 'PassportPhone', 'InvocationInfo', 'Permissions', 'Plus', 'Subscription',
'Status', 'Price', 'Product', 'AutoRenewable']
'Status', 'Price', 'Product', 'AutoRenewable', 'Settings', 'PermissionAlerts', 'Experiments']

ファイルの表示

@ -45,6 +45,6 @@ class Account(YandexMusicObject):
return None
data = super(Account, cls).de_json(data, client)
data['passport_phones'] = PassportPhone.de_list(data['passport_phones'], client=client)
data['passport_phones'] = PassportPhone.de_list(data.get('passport_phones'), client)
return cls(client=client, **data)

ファイルの表示

@ -31,7 +31,7 @@ class AutoRenewable(YandexMusicObject):
return None
data = super(AutoRenewable, cls).de_json(data, client)
data['product'] = Product.de_json(data['product'], client=client)
data['product'] = Product.de_json(data.get('product'), client)
return cls(client=client, **data)

ファイルの表示

@ -1,6 +1,6 @@
import logging
from yandex_music import YandexMusicObject, Status
from yandex_music import YandexMusicObject, Status, Settings, PermissionAlerts, Experiments
from yandex_music.utils.request import Request
from yandex_music.error import InvalidToken
@ -38,3 +38,30 @@ class Client(YandexMusicObject):
status = Status.de_json(result, self)
return status
def settings(self, timeout=None, **kwargs):
url = f'{self.base_url}/settings'
result = self._request.get(url, timeout=timeout)
settings = Settings.de_json(result, self)
return settings
def permission_alerts(self, timeout=None, **kwargs):
url = f'{self.base_url}/permission-alerts'
result = self._request.get(url, timeout=timeout)
permission_alerts = PermissionAlerts.de_json(result, self)
return permission_alerts
def experiments(self, timeout=None, **kwargs):
url = f'{self.base_url}/account/experiments'
result = self._request.get(url, timeout=timeout)
experiments = Experiments.de_json(result, self)
return experiments

19
yandex_music/experiments.py ノーマルファイル
ファイルの表示

@ -0,0 +1,19 @@
from yandex_music import YandexMusicObject
class Experiments(YandexMusicObject):
def __init__(self,
client=None,
**kwargs):
self.__dict__.update(kwargs)
self.client = client
@classmethod
def de_json(cls, data, client):
if not data:
return None
data = super(Experiments, cls).de_json(data, client)
return cls(client=client, **data)

20
yandex_music/permission_alerts.py ノーマルファイル
ファイルの表示

@ -0,0 +1,20 @@
from yandex_music import YandexMusicObject
class PermissionAlerts(YandexMusicObject):
def __init__(self,
alerts,
client=None,
**kwargs):
self.alerts = alerts
self.client = client
@classmethod
def de_json(cls, data, client):
if not data:
return None
data = super(PermissionAlerts, cls).de_json(data, client)
return cls(client=client, **data)

ファイルの表示

@ -11,6 +11,14 @@ class Product(YandexMusicObject):
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):
self.product_id = product_id
@ -22,6 +30,15 @@ class Product(YandexMusicObject):
self.feature = feature
self.debug = bool(debug)
self.features = features
self.description = description
self.available = available
self.trial_available = trial_available
self.vendor_trial_available = vendor_trial_available
self.button_text = button_text
self.button_additional_text = button_additional_text
self.payment_method_types = payment_method_types
self.client = client
self._id_attrs = (self.product_id,)
@ -31,6 +48,17 @@ class Product(YandexMusicObject):
return None
data = super(Product, cls).de_json(data, client)
data['price'] = Price.de_json(data['price'], client=client)
data['price'] = Price.de_json(data.get('price'), client)
return cls(client=client, **data)
@classmethod
def de_list(cls, data, client):
if not data:
return []
products = list()
for product in data:
products.append(cls.de_json(product, client))
return products

33
yandex_music/settings.py ノーマルファイル
ファイルの表示

@ -0,0 +1,33 @@
from yandex_music import YandexMusicObject
class Settings(YandexMusicObject):
def __init__(self,
in_app_products,
native_products,
web_payment_url,
promo_codes_enabled,
web_payment_month_product_price=None,
client=None,
**kwargs):
self.in_app_products = in_app_products
self.native_products = native_products
self.web_payment_url = web_payment_url
self.web_payment_month_product_price = web_payment_month_product_price
self.promo_codes_enabled = bool(promo_codes_enabled)
self.client = client
@classmethod
def de_json(cls, data, client):
if not data:
return None
data = super(Settings, cls).de_json(data, client)
from yandex_music import Product, Price
data['in_app_products'] = Product.de_list(data.get('in_app_products'), client)
data['native_products'] = Product.de_list(data.get('native_products'), client)
data['web_payment_month_product_price'] = \
Price.de_json(data.get('web_payment_month_product_price'), client)
return cls(client=client, **data)

ファイルの表示

@ -31,9 +31,9 @@ class Status(YandexMusicObject):
return None
data = super(Status, cls).de_json(data, client)
data['account'] = Account.de_json(data['account'], client=client)
data['permissions'] = Permissions.de_json(data['permissions'], client=client)
data['subscription'] = Subscription.de_json(data['subscription'], client=client)
data['plus'] = Plus.de_json(data['plus'], client=client)
data['account'] = Account.de_json(data.get('account'), client)
data['permissions'] = Permissions.de_json(data.get('permissions'), client)
data['subscription'] = Subscription.de_json(data.get('subscription'), client)
data['plus'] = Plus.de_json(data.get('plus'), client)
return cls(client=client, **data)

ファイルの表示

@ -21,6 +21,6 @@ class Subscription(YandexMusicObject):
data = super(Subscription, cls).de_json(data, client)
from yandex_music import AutoRenewable
data['auto_renewable'] = AutoRenewable.de_list(data['auto_renewable'], client=client)
data['auto_renewable'] = AutoRenewable.de_list(data.get('auto_renewable'), client)
return cls(client=client, **data)

ファイルの表示

@ -8,8 +8,10 @@ from yandex_music.error import Unauthorized, BadRequest, NetworkError, YandexMus
USER_AGENT = 'Yandex-Music-API'
HEADERS = {
'X-Yandex-Music-Client': 'Yandex-Music-API',
'User-Agent': 'Yandex-Music-API',
'X-Yandex-Music-Client': 'WindowsPhone/3.17',
'User-Agent': 'Windows 10',
# 'X-Yandex-Music-Client': 'Yandex-Music-API',
# 'User-Agent': 'Yandex-Music-API',
'Connection': 'Keep-Alive'
}
@ -51,7 +53,7 @@ class Request(object):
except ValueError:
raise Exception('Invalid server response')
return data['result']
return data.get('result')
def _request_wrapper(self, *args, **kwargs):
if 'headers' not in kwargs: