track_lyrics.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from typing import TYPE_CHECKING, List, Optional
  2. from yandex_music import YandexMusicModel
  3. from yandex_music.utils import model
  4. if TYPE_CHECKING:
  5. from yandex_music import ClientType, JSONType, LyricsMajor
  6. @model
  7. class TrackLyrics(YandexMusicModel):
  8. """Класс, представляющий текст трека.
  9. Attributes:
  10. download_url (:obj:`str`): Ссылка на скачивание текста.
  11. lyric_id (:obj:`int`): Уникальный идентификатор текста.
  12. external_lyric_id (:obj:`str`): Уникальный идентификатор текста на сервисе предоставляющий текст.
  13. writers (:obj:`list` из :obj:`str`): Авторы текста.
  14. major (:obj:`yandex_music.LyricsMajor`): Сервис, откуда был получен текст.
  15. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  16. """
  17. download_url: str
  18. lyric_id: int
  19. external_lyric_id: str
  20. writers: List[str]
  21. major: 'LyricsMajor'
  22. client: Optional['ClientType'] = None
  23. def __post_init__(self) -> None:
  24. self._id_attrs = (
  25. self.lyric_id,
  26. self.external_lyric_id,
  27. )
  28. def fetch_lyrics(self) -> str:
  29. """Получает текст песни по ссылке :attr:`yandex_music.TrackLyrics.download_url`.
  30. Returns:
  31. :obj:`str`: Текст песни.
  32. """
  33. assert self.valid_client(self.client)
  34. return self.client.request.retrieve(self.download_url).decode('UTF-8')
  35. async def fetch_lyrics_async(self) -> str:
  36. """Получает текст песни по ссылке :attr:`yandex_music.TrackLyrics.download_url`.
  37. Returns:
  38. :obj:`str`: Текст песни.
  39. """
  40. assert self.valid_async_client(self.client)
  41. return (await self.client.request.retrieve(self.download_url)).decode('UTF-8')
  42. @classmethod
  43. def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['TrackLyrics']:
  44. """Десериализация объекта.
  45. Args:
  46. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  47. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  48. Returns:
  49. :obj:`yandex_music.TrackLyrics`: Текст трека.
  50. """
  51. if not cls.is_dict_model_data(data):
  52. return None
  53. cls_data = cls.cleanup_data(data, client)
  54. from yandex_music import LyricsMajor
  55. cls_data['major'] = LyricsMajor.de_json(data.get('major'), client)
  56. return cls(client=client, **cls_data) # type: ignore
  57. # camelCase псевдонимы
  58. #: Псевдоним для :attr:`fetch_lyrics`
  59. fetchLyrics = fetch_lyrics
  60. #: Псевдоним для :attr:`fetch_lyrics_async`
  61. fetchLyricsAsync = fetch_lyrics_async