ymdantic 0.2.2__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. {ymdantic-0.2.2 → ymdantic-0.2.4}/.pre-commit-config.yaml +1 -1
  2. {ymdantic-0.2.2 → ymdantic-0.2.4}/PKG-INFO +2 -3
  3. {ymdantic-0.2.2 → ymdantic-0.2.4}/pyproject.toml +1 -2
  4. ymdantic-0.2.4/tests/albums/test_get_album_with_tracks.py +64 -0
  5. {ymdantic-0.2.2 → ymdantic-0.2.4}/uv.lock +23 -34
  6. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/tracks/album.py +1 -1
  7. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/tracks/file_info.py +2 -2
  8. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/tracks/track.py +2 -0
  9. ymdantic-0.2.4/ymdantic/py.typed +0 -0
  10. {ymdantic-0.2.2 → ymdantic-0.2.4}/.editorconfig +0 -0
  11. {ymdantic-0.2.2 → ymdantic-0.2.4}/.github/workflows/pypi-release.yml +0 -0
  12. {ymdantic-0.2.2 → ymdantic-0.2.4}/.github/workflows/tests.yml +0 -0
  13. {ymdantic-0.2.2 → ymdantic-0.2.4}/.gitignore +0 -0
  14. {ymdantic-0.2.2 → ymdantic-0.2.4}/LICENSE +0 -0
  15. {ymdantic-0.2.2 → ymdantic-0.2.4}/README.md +0 -0
  16. {ymdantic-0.2.2 → ymdantic-0.2.4}/examples/chart.py +0 -0
  17. {ymdantic-0.2.2 → ymdantic-0.2.4}/tests/__init__.py +0 -0
  18. {ymdantic-0.2.2 → ymdantic-0.2.4}/tests/account/__init__.py +0 -0
  19. {ymdantic-0.2.2 → ymdantic-0.2.4}/tests/account/test_settings.py +0 -0
  20. {ymdantic-0.2.2/tests/search → ymdantic-0.2.4/tests/albums}/__init__.py +0 -0
  21. {ymdantic-0.2.2 → ymdantic-0.2.4}/tests/conftest.py +0 -0
  22. {ymdantic-0.2.2/tests/tracks → ymdantic-0.2.4/tests/search}/__init__.py +0 -0
  23. {ymdantic-0.2.2 → ymdantic-0.2.4}/tests/search/test_search_instant_mixed.py +0 -0
  24. {ymdantic-0.2.2/ymdantic/models/clips → ymdantic-0.2.4/tests/tracks}/__init__.py +0 -0
  25. {ymdantic-0.2.2 → ymdantic-0.2.4}/tests/tracks/test_get_track.py +0 -0
  26. {ymdantic-0.2.2 → ymdantic-0.2.4}/tests/tracks/test_get_track_download_info.py +0 -0
  27. {ymdantic-0.2.2 → ymdantic-0.2.4}/tests/tracks/test_get_track_file_info.py +0 -0
  28. {ymdantic-0.2.2 → ymdantic-0.2.4}/tests/tracks/test_get_tracks.py +0 -0
  29. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/__init__.py +0 -0
  30. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/adapters/__init__.py +0 -0
  31. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/adapters/pydantic_factory.py +0 -0
  32. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/adapters/to_camel.py +0 -0
  33. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/adapters/to_query_params.py +0 -0
  34. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/client/__init__.py +0 -0
  35. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/client/session/__init__.py +0 -0
  36. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/client/session/aiohttp_client.py +0 -0
  37. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/client/session/aiohttp_method.py +0 -0
  38. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/client/yandex_music.py +0 -0
  39. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/enums/__init__.py +0 -0
  40. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/enums/editorial_artists.py +0 -0
  41. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/enums/editorial_compilation.py +0 -0
  42. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/enums/editorial_new_releases.py +0 -0
  43. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/enums/editorial_promotion.py +0 -0
  44. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/enums/language.py +0 -0
  45. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/enums/open_playlist.py +0 -0
  46. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/enums/special.py +0 -0
  47. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/exceptions/__init__.py +0 -0
  48. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/exceptions/custom_exceptions.py +0 -0
  49. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/mixins.py +0 -0
  50. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/__init__.py +0 -0
  51. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/account/__init__.py +0 -0
  52. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/account/settings.py +0 -0
  53. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/action_button.py +0 -0
  54. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/agent.py +0 -0
  55. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/albums/__init__.py +0 -0
  56. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/albums/album.py +0 -0
  57. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/albums/label.py +0 -0
  58. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/artists/__init__.py +0 -0
  59. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/artists/artist.py +0 -0
  60. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/artists/artist_data.py +0 -0
  61. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/artists/artist_track_chart_position.py +0 -0
  62. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/artists/band_link_scanner_link.py +0 -0
  63. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/artists/concert.py +0 -0
  64. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/artists/counts.py +0 -0
  65. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/artists/description.py +0 -0
  66. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/artists/extra_action.py +0 -0
  67. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/artists/ratings.py +0 -0
  68. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/artists/social_link.py +0 -0
  69. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/artists/video.py +0 -0
  70. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/base.py +0 -0
  71. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/chart_position.py +0 -0
  72. {ymdantic-0.2.2/ymdantic/models/concerts → ymdantic-0.2.4/ymdantic/models/clips}/__init__.py +0 -0
  73. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/clips/clip.py +0 -0
  74. /ymdantic-0.2.2/ymdantic/py.typed → /ymdantic-0.2.4/ymdantic/models/concerts/__init__.py +0 -0
  75. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/concerts/city_case_forms.py +0 -0
  76. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/concerts/concert.py +0 -0
  77. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/content_restrictions.py +0 -0
  78. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/cover.py +0 -0
  79. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/custom_wave.py +0 -0
  80. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/derived_colors.py +0 -0
  81. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/error.py +0 -0
  82. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/__init__.py +0 -0
  83. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/album.py +0 -0
  84. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/artist.py +0 -0
  85. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/chart.py +0 -0
  86. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/chart_block.py +0 -0
  87. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/cover.py +0 -0
  88. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/editorial/__init__.py +0 -0
  89. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/editorial/new_releases.py +0 -0
  90. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/editorial/response.py +0 -0
  91. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/in_style.py +0 -0
  92. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/liked_playlist.py +0 -0
  93. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/open_playlist.py +0 -0
  94. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/personal_playlist.py +0 -0
  95. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/playlist.py +0 -0
  96. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/promotion.py +0 -0
  97. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/skeleton/__init__.py +0 -0
  98. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/skeleton/skeleton_response.py +0 -0
  99. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/skeleton/tab_block.py +0 -0
  100. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/skeleton/tab_data.py +0 -0
  101. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/skeleton/tab_source.py +0 -0
  102. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/skeleton/tabs_block.py +0 -0
  103. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/skeleton/tabs_source.py +0 -0
  104. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/special.py +0 -0
  105. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/view_all_action.py +0 -0
  106. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing/waves.py +0 -0
  107. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing3/__init__.py +0 -0
  108. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing3/block.py +0 -0
  109. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing3/chart.py +0 -0
  110. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/landing3/menu.py +0 -0
  111. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/pager.py +0 -0
  112. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/playlists/__init__.py +0 -0
  113. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/playlists/cover.py +0 -0
  114. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/playlists/owner.py +0 -0
  115. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/playlists/playlist.py +0 -0
  116. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/playlists/tag.py +0 -0
  117. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/playlists/track.py +0 -0
  118. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/response.py +0 -0
  119. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/s3.py +0 -0
  120. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/search/__init__.py +0 -0
  121. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/search/base.py +0 -0
  122. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/search/results.py +0 -0
  123. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/theme.py +0 -0
  124. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/tracks/__init__.py +0 -0
  125. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/tracks/download_info.py +0 -0
  126. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/tracks/fade.py +0 -0
  127. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/tracks/lyrics_info.py +0 -0
  128. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/tracks/major.py +0 -0
  129. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/tracks/podcast.py +0 -0
  130. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/tracks/position.py +0 -0
  131. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/tracks/r128.py +0 -0
  132. {ymdantic-0.2.2 → ymdantic-0.2.4}/ymdantic/models/trailer.py +0 -0
@@ -17,7 +17,7 @@ repos:
17
17
  - id: "check-toml"
18
18
 
19
19
  - repo: https://github.com/astral-sh/ruff-pre-commit
20
- rev: 'v0.14.9'
20
+ rev: 'v0.15.9'
21
21
  hooks:
22
22
  - id: ruff-check
23
23
  args: ["--fix"]
@@ -1,12 +1,11 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: ymdantic
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Фреймворк предоставляющий доступ к API Яндекс Музыки (с Pydantic валидацией)
5
5
  Author-email: KatantDev <vlad26@mail.ru>
6
6
  License-File: LICENSE
7
7
  Requires-Python: <3.15,>=3.12
8
8
  Requires-Dist: aiohttp<4,>=3.9.0
9
- Requires-Dist: certifi<2026,>=2025
10
9
  Requires-Dist: dataclass-rest>=0.5.0
11
10
  Requires-Dist: pydantic<3,>=2.4
12
11
  Requires-Dist: strenum<0.5,>=0.4.15
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ymdantic"
3
- version = "0.2.2"
3
+ version = "0.2.4"
4
4
  description = "Фреймворк предоставляющий доступ к API Яндекс Музыки (с Pydantic валидацией)"
5
5
  authors = [{ name = "KatantDev", email = "vlad26@mail.ru" }]
6
6
  requires-python = ">=3.12,<3.15"
@@ -8,7 +8,6 @@ readme = "README.md"
8
8
  dependencies = [
9
9
  "aiohttp>=3.9.0,<4",
10
10
  "pydantic>=2.4,<3",
11
- "certifi>=2025,<2026",
12
11
  "strenum>=0.4.15,<0.5",
13
12
  "dataclass-rest>=0.5.0",
14
13
  ]
@@ -0,0 +1,64 @@
1
+ import asyncio
2
+ import secrets
3
+
4
+ import pytest
5
+ from ymdantic import YMClient
6
+ from ymdantic.exceptions import YMError
7
+ from ymdantic.models import Album
8
+
9
+
10
+ @pytest.mark.anyio
11
+ async def test_get_available_album_with_tracks(client: YMClient) -> None:
12
+ album_id = 1814060
13
+
14
+ result = await client.get_album_with_tracks(album_id=album_id)
15
+
16
+ assert result is not None
17
+ assert isinstance(result, Album)
18
+ assert result.meta_type == "music"
19
+ assert result.id == album_id
20
+ assert result.title is not None
21
+ assert result.artists is not None
22
+ assert len(result.artists) > 0
23
+ assert result.track_count > 0
24
+ assert result.volumes is not None
25
+ assert len(result.volumes) > 0
26
+ assert len(result.volumes[0]) > 0
27
+
28
+
29
+ @pytest.mark.anyio
30
+ async def test_get_not_found_album_with_tracks(client: YMClient) -> None:
31
+ with pytest.raises(YMError):
32
+ await client.get_album_with_tracks(album_id=181406011111)
33
+
34
+
35
+ async def test_get_available_album_with_podcast(client: YMClient) -> None:
36
+ album_id = 10141723
37
+
38
+ result = await client.get_album_with_tracks(album_id=album_id)
39
+
40
+ assert result is not None
41
+ assert isinstance(result, Album)
42
+ assert result.meta_type == "podcast"
43
+ assert result.id == album_id
44
+ assert result.title is not None
45
+ assert result.artists is not None
46
+ assert result.track_count > 0
47
+ assert result.volumes is not None
48
+ assert len(result.volumes) > 0
49
+ assert len(result.volumes[0]) > 0
50
+
51
+
52
+ @pytest.mark.anyio
53
+ async def test_get_random_album(client: YMClient) -> None:
54
+ album_ids = [secrets.randbelow(140_000_000) for _ in range(50)]
55
+ results = await asyncio.gather(
56
+ *[client.get_album_with_tracks(album_id=album_id) for album_id in album_ids],
57
+ return_exceptions=True,
58
+ )
59
+ error_results = [
60
+ result
61
+ for result in results
62
+ if isinstance(result, BaseException) and not isinstance(result, YMError)
63
+ ]
64
+ assert len(error_results) == 0
@@ -4,11 +4,11 @@ requires-python = ">=3.12, <3.15"
4
4
 
5
5
  [[package]]
6
6
  name = "adaptix"
7
- version = "3.0.0b11"
7
+ version = "3.0.0b12"
8
8
  source = { registry = "https://pypi.org/simple" }
9
- sdist = { url = "https://files.pythonhosted.org/packages/58/ea/f55d4de521cb237b1dd9c4a21c6ae3885d21b4f90130d15fd88020d6d1ca/adaptix-3.0.0b11.tar.gz", hash = "sha256:3d3d660d97d9e1a85d133b181fdac8a200ff3185422fdf686601bc9ed0017162", size = 134021, upload-time = "2025-05-09T14:51:09.977Z" }
9
+ sdist = { url = "https://files.pythonhosted.org/packages/5d/82/aa17eb2968cf7c78caf4915ca62397214f196dc1bef07e4d81bfb4c4abc5/adaptix-3.0.0b12.tar.gz", hash = "sha256:906053a39ff509f0aa4ca9faa07dffa205bd90fa41d9774cd849d3454565b0ea", size = 128634, upload-time = "2026-04-04T17:31:01.084Z" }
10
10
  wheels = [
11
- { url = "https://files.pythonhosted.org/packages/76/70/b087e09db584c2718cfff4a354c98dfac1844e7e7d0c75dc38685823eec1/adaptix-3.0.0b11-py3-none-any.whl", hash = "sha256:5afa7197d1a084fc93da852bf58194de4a1c506caa3f5889c9953a27ce515bda", size = 179291, upload-time = "2025-05-09T14:51:08.288Z" },
11
+ { url = "https://files.pythonhosted.org/packages/11/66/abcca849b17e4a3adf5116e58c51471f37264a190cee2c67f1ba57782a7f/adaptix-3.0.0b12-py3-none-any.whl", hash = "sha256:8156f0549b96fcd193d13efca7bfbda39b3d6389085556d930e204c09f9ae6ed", size = 188651, upload-time = "2026-04-04T17:30:59.17Z" },
12
12
  ]
13
13
 
14
14
  [[package]]
@@ -149,15 +149,6 @@ wheels = [
149
149
  { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" },
150
150
  ]
151
151
 
152
- [[package]]
153
- name = "certifi"
154
- version = "2025.11.12"
155
- source = { registry = "https://pypi.org/simple" }
156
- sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" }
157
- wheels = [
158
- { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" },
159
- ]
160
-
161
152
  [[package]]
162
153
  name = "cfgv"
163
154
  version = "3.5.0"
@@ -948,27 +939,27 @@ wheels = [
948
939
 
949
940
  [[package]]
950
941
  name = "ruff"
951
- version = "0.15.8"
942
+ version = "0.15.9"
952
943
  source = { registry = "https://pypi.org/simple" }
953
- sdist = { url = "https://files.pythonhosted.org/packages/14/b0/73cf7550861e2b4824950b8b52eebdcc5adc792a00c514406556c5b80817/ruff-0.15.8.tar.gz", hash = "sha256:995f11f63597ee362130d1d5a327a87cb6f3f5eae3094c620bcc632329a4d26e", size = 4610921, upload-time = "2026-03-26T18:39:38.675Z" }
944
+ sdist = { url = "https://files.pythonhosted.org/packages/e6/97/e9f1ca355108ef7194e38c812ef40ba98c7208f47b13ad78d023caa583da/ruff-0.15.9.tar.gz", hash = "sha256:29cbb1255a9797903f6dde5ba0188c707907ff44a9006eb273b5a17bfa0739a2", size = 4617361, upload-time = "2026-04-02T18:17:20.829Z" }
954
945
  wheels = [
955
- { url = "https://files.pythonhosted.org/packages/4a/92/c445b0cd6da6e7ae51e954939cb69f97e008dbe750cfca89b8cedc081be7/ruff-0.15.8-py3-none-linux_armv6l.whl", hash = "sha256:cbe05adeba76d58162762d6b239c9056f1a15a55bd4b346cfd21e26cd6ad7bc7", size = 10527394, upload-time = "2026-03-26T18:39:41.566Z" },
956
- { url = "https://files.pythonhosted.org/packages/eb/92/f1c662784d149ad1414cae450b082cf736430c12ca78367f20f5ed569d65/ruff-0.15.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d3e3d0b6ba8dca1b7ef9ab80a28e840a20070c4b62e56d675c24f366ef330570", size = 10905693, upload-time = "2026-03-26T18:39:30.364Z" },
957
- { url = "https://files.pythonhosted.org/packages/ca/f2/7a631a8af6d88bcef997eb1bf87cc3da158294c57044aafd3e17030613de/ruff-0.15.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ee3ae5c65a42f273f126686353f2e08ff29927b7b7e203b711514370d500de3", size = 10323044, upload-time = "2026-03-26T18:39:33.37Z" },
958
- { url = "https://files.pythonhosted.org/packages/67/18/1bf38e20914a05e72ef3b9569b1d5c70a7ef26cd188d69e9ca8ef588d5bf/ruff-0.15.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdce027ada77baa448077ccc6ebb2fa9c3c62fd110d8659d601cf2f475858d94", size = 10629135, upload-time = "2026-03-26T18:39:44.142Z" },
959
- { url = "https://files.pythonhosted.org/packages/d2/e9/138c150ff9af60556121623d41aba18b7b57d95ac032e177b6a53789d279/ruff-0.15.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12e617fc01a95e5821648a6df341d80456bd627bfab8a829f7cfc26a14a4b4a3", size = 10348041, upload-time = "2026-03-26T18:39:52.178Z" },
960
- { url = "https://files.pythonhosted.org/packages/02/f1/5bfb9298d9c323f842c5ddeb85f1f10ef51516ac7a34ba446c9347d898df/ruff-0.15.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:432701303b26416d22ba696c39f2c6f12499b89093b61360abc34bcc9bf07762", size = 11121987, upload-time = "2026-03-26T18:39:55.195Z" },
961
- { url = "https://files.pythonhosted.org/packages/10/11/6da2e538704e753c04e8d86b1fc55712fdbdcc266af1a1ece7a51fff0d10/ruff-0.15.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d910ae974b7a06a33a057cb87d2a10792a3b2b3b35e33d2699fdf63ec8f6b17a", size = 11951057, upload-time = "2026-03-26T18:39:19.18Z" },
962
- { url = "https://files.pythonhosted.org/packages/83/f0/c9208c5fd5101bf87002fed774ff25a96eea313d305f1e5d5744698dc314/ruff-0.15.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2033f963c43949d51e6fdccd3946633c6b37c484f5f98c3035f49c27395a8ab8", size = 11464613, upload-time = "2026-03-26T18:40:06.301Z" },
963
- { url = "https://files.pythonhosted.org/packages/f8/22/d7f2fabdba4fae9f3b570e5605d5eb4500dcb7b770d3217dca4428484b17/ruff-0.15.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f29b989a55572fb885b77464cf24af05500806ab4edf9a0fd8977f9759d85b1", size = 11257557, upload-time = "2026-03-26T18:39:57.972Z" },
964
- { url = "https://files.pythonhosted.org/packages/71/8c/382a9620038cf6906446b23ce8632ab8c0811b8f9d3e764f58bedd0c9a6f/ruff-0.15.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:ac51d486bf457cdc985a412fb1801b2dfd1bd8838372fc55de64b1510eff4bec", size = 11169440, upload-time = "2026-03-26T18:39:22.205Z" },
965
- { url = "https://files.pythonhosted.org/packages/4d/0d/0994c802a7eaaf99380085e4e40c845f8e32a562e20a38ec06174b52ef24/ruff-0.15.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c9861eb959edab053c10ad62c278835ee69ca527b6dcd72b47d5c1e5648964f6", size = 10605963, upload-time = "2026-03-26T18:39:46.682Z" },
966
- { url = "https://files.pythonhosted.org/packages/19/aa/d624b86f5b0aad7cef6bbf9cd47a6a02dfdc4f72c92a337d724e39c9d14b/ruff-0.15.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8d9a5b8ea13f26ae90838afc33f91b547e61b794865374f114f349e9036835fb", size = 10357484, upload-time = "2026-03-26T18:39:49.176Z" },
967
- { url = "https://files.pythonhosted.org/packages/35/c3/e0b7835d23001f7d999f3895c6b569927c4d39912286897f625736e1fd04/ruff-0.15.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c2a33a529fb3cbc23a7124b5c6ff121e4d6228029cba374777bd7649cc8598b8", size = 10830426, upload-time = "2026-03-26T18:40:03.702Z" },
968
- { url = "https://files.pythonhosted.org/packages/f0/51/ab20b322f637b369383adc341d761eaaa0f0203d6b9a7421cd6e783d81b9/ruff-0.15.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:75e5cd06b1cf3f47a3996cfc999226b19aa92e7cce682dcd62f80d7035f98f49", size = 11345125, upload-time = "2026-03-26T18:39:27.799Z" },
969
- { url = "https://files.pythonhosted.org/packages/37/e6/90b2b33419f59d0f2c4c8a48a4b74b460709a557e8e0064cf33ad894f983/ruff-0.15.8-py3-none-win32.whl", hash = "sha256:bc1f0a51254ba21767bfa9a8b5013ca8149dcf38092e6a9eb704d876de94dc34", size = 10571959, upload-time = "2026-03-26T18:39:36.117Z" },
970
- { url = "https://files.pythonhosted.org/packages/1f/a2/ef467cb77099062317154c63f234b8a7baf7cb690b99af760c5b68b9ee7f/ruff-0.15.8-py3-none-win_amd64.whl", hash = "sha256:04f79eff02a72db209d47d665ba7ebcad609d8918a134f86cb13dd132159fc89", size = 11743893, upload-time = "2026-03-26T18:39:25.01Z" },
971
- { url = "https://files.pythonhosted.org/packages/15/e2/77be4fff062fa78d9b2a4dea85d14785dac5f1d0c1fb58ed52331f0ebe28/ruff-0.15.8-py3-none-win_arm64.whl", hash = "sha256:cf891fa8e3bb430c0e7fac93851a5978fc99c8fa2c053b57b118972866f8e5f2", size = 11048175, upload-time = "2026-03-26T18:40:01.06Z" },
946
+ { url = "https://files.pythonhosted.org/packages/0b/1f/9cdfd0ac4b9d1e5a6cf09bedabdf0b56306ab5e333c85c87281273e7b041/ruff-0.15.9-py3-none-linux_armv6l.whl", hash = "sha256:6efbe303983441c51975c243e26dff328aca11f94b70992f35b093c2e71801e1", size = 10511206, upload-time = "2026-04-02T18:16:41.574Z" },
947
+ { url = "https://files.pythonhosted.org/packages/3d/f6/32bfe3e9c136b35f02e489778d94384118bb80fd92c6d92e7ccd97db12ce/ruff-0.15.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4965bac6ac9ea86772f4e23587746f0b7a395eccabb823eb8bfacc3fa06069f7", size = 10923307, upload-time = "2026-04-02T18:17:08.645Z" },
948
+ { url = "https://files.pythonhosted.org/packages/ca/25/de55f52ab5535d12e7aaba1de37a84be6179fb20bddcbe71ec091b4a3243/ruff-0.15.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf05aad70ca5b5a0a4b0e080df3a6b699803916d88f006efd1f5b46302daab8", size = 10316722, upload-time = "2026-04-02T18:16:44.206Z" },
949
+ { url = "https://files.pythonhosted.org/packages/48/11/690d75f3fd6278fe55fff7c9eb429c92d207e14b25d1cae4064a32677029/ruff-0.15.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9439a342adb8725f32f92732e2bafb6d5246bd7a5021101166b223d312e8fc59", size = 10623674, upload-time = "2026-04-02T18:16:50.951Z" },
950
+ { url = "https://files.pythonhosted.org/packages/bd/ec/176f6987be248fc5404199255522f57af1b4a5a1b57727e942479fec98ad/ruff-0.15.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c5e6faf9d97c8edc43877c3f406f47446fc48c40e1442d58cfcdaba2acea745", size = 10351516, upload-time = "2026-04-02T18:16:57.206Z" },
951
+ { url = "https://files.pythonhosted.org/packages/b2/fc/51cffbd2b3f240accc380171d51446a32aa2ea43a40d4a45ada67368fbd2/ruff-0.15.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b34a9766aeec27a222373d0b055722900fbc0582b24f39661aa96f3fe6ad901", size = 11150202, upload-time = "2026-04-02T18:17:06.452Z" },
952
+ { url = "https://files.pythonhosted.org/packages/d6/d4/25292a6dfc125f6b6528fe6af31f5e996e19bf73ca8e3ce6eb7fa5b95885/ruff-0.15.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89dd695bc72ae76ff484ae54b7e8b0f6b50f49046e198355e44ea656e521fef9", size = 11988891, upload-time = "2026-04-02T18:17:18.575Z" },
953
+ { url = "https://files.pythonhosted.org/packages/13/e1/1eebcb885c10e19f969dcb93d8413dfee8172578709d7ee933640f5e7147/ruff-0.15.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce187224ef1de1bd225bc9a152ac7102a6171107f026e81f317e4257052916d5", size = 11480576, upload-time = "2026-04-02T18:16:52.986Z" },
954
+ { url = "https://files.pythonhosted.org/packages/ff/6b/a1548ac378a78332a4c3dcf4a134c2475a36d2a22ddfa272acd574140b50/ruff-0.15.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b0c7c341f68adb01c488c3b7d4b49aa8ea97409eae6462d860a79cf55f431b6", size = 11254525, upload-time = "2026-04-02T18:17:02.041Z" },
955
+ { url = "https://files.pythonhosted.org/packages/42/aa/4bb3af8e61acd9b1281db2ab77e8b2c3c5e5599bf2a29d4a942f1c62b8d6/ruff-0.15.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:55cc15eee27dc0eebdfcb0d185a6153420efbedc15eb1d38fe5e685657b0f840", size = 11204072, upload-time = "2026-04-02T18:17:13.581Z" },
956
+ { url = "https://files.pythonhosted.org/packages/69/48/d550dc2aa6e423ea0bcc1d0ff0699325ffe8a811e2dba156bd80750b86dc/ruff-0.15.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a6537f6eed5cda688c81073d46ffdfb962a5f29ecb6f7e770b2dc920598997ed", size = 10594998, upload-time = "2026-04-02T18:16:46.369Z" },
957
+ { url = "https://files.pythonhosted.org/packages/63/47/321167e17f5344ed5ec6b0aa2cff64efef5f9e985af8f5622cfa6536043f/ruff-0.15.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6d3fcbca7388b066139c523bda744c822258ebdcfbba7d24410c3f454cc9af71", size = 10359769, upload-time = "2026-04-02T18:17:10.994Z" },
958
+ { url = "https://files.pythonhosted.org/packages/67/5e/074f00b9785d1d2c6f8c22a21e023d0c2c1817838cfca4c8243200a1fa87/ruff-0.15.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:058d8e99e1bfe79d8a0def0b481c56059ee6716214f7e425d8e737e412d69677", size = 10850236, upload-time = "2026-04-02T18:16:48.749Z" },
959
+ { url = "https://files.pythonhosted.org/packages/76/37/804c4135a2a2caf042925d30d5f68181bdbd4461fd0d7739da28305df593/ruff-0.15.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8e1ddb11dbd61d5983fa2d7d6370ef3eb210951e443cace19594c01c72abab4c", size = 11358343, upload-time = "2026-04-02T18:16:55.068Z" },
960
+ { url = "https://files.pythonhosted.org/packages/88/3d/1364fcde8656962782aa9ea93c92d98682b1ecec2f184e625a965ad3b4a6/ruff-0.15.9-py3-none-win32.whl", hash = "sha256:bde6ff36eaf72b700f32b7196088970bf8fdb2b917b7accd8c371bfc0fd573ec", size = 10583382, upload-time = "2026-04-02T18:17:04.261Z" },
961
+ { url = "https://files.pythonhosted.org/packages/4c/56/5c7084299bd2cacaa07ae63a91c6f4ba66edc08bf28f356b24f6b717c799/ruff-0.15.9-py3-none-win_amd64.whl", hash = "sha256:45a70921b80e1c10cf0b734ef09421f71b5aa11d27404edc89d7e8a69505e43d", size = 11744969, upload-time = "2026-04-02T18:16:59.611Z" },
962
+ { url = "https://files.pythonhosted.org/packages/03/36/76704c4f312257d6dbaae3c959add2a622f63fcca9d864659ce6d8d97d3d/ruff-0.15.9-py3-none-win_arm64.whl", hash = "sha256:0694e601c028fd97dc5c6ee244675bc241aeefced7ef80cd9c6935a871078f53", size = 11005870, upload-time = "2026-04-02T18:17:15.773Z" },
972
963
  ]
973
964
 
974
965
  [[package]]
@@ -1122,11 +1113,10 @@ wheels = [
1122
1113
 
1123
1114
  [[package]]
1124
1115
  name = "ymdantic"
1125
- version = "0.2.2"
1116
+ version = "0.2.4"
1126
1117
  source = { editable = "." }
1127
1118
  dependencies = [
1128
1119
  { name = "aiohttp" },
1129
- { name = "certifi" },
1130
1120
  { name = "dataclass-rest" },
1131
1121
  { name = "pydantic" },
1132
1122
  { name = "strenum" },
@@ -1145,7 +1135,6 @@ dev = [
1145
1135
  [package.metadata]
1146
1136
  requires-dist = [
1147
1137
  { name = "aiohttp", specifier = ">=3.9.0,<4" },
1148
- { name = "certifi", specifier = ">=2025,<2026" },
1149
1138
  { name = "dataclass-rest", specifier = ">=0.5.0" },
1150
1139
  { name = "pydantic", specifier = ">=2.4,<3" },
1151
1140
  { name = "strenum", specifier = ">=0.4.15,<0.5" },
@@ -12,4 +12,4 @@ class TrackAlbum(BaseAlbum):
12
12
  # Дата начала альбома.
13
13
  track_position: Optional[TrackPosition] = None
14
14
  # Позиция трека в альбоме (если есть).
15
- listening_finished: bool
15
+ listening_finished: bool | None = None
@@ -61,8 +61,8 @@ class FileInfo(YMBaseModel):
61
61
  # Транспорт файла.
62
62
  key: str | None = None
63
63
  # Ключ файла. При использовании шифрования.
64
- size: int
65
- # Размер файла.
64
+ size: int | None = None
65
+ # Размер файла. Яндекс перестал его присылать.
66
66
  gain: bool
67
67
  # Флаг для нормализации громкости трека (видимо).
68
68
  urls: list[HttpUrl]
@@ -81,6 +81,8 @@ class BaseTrack(YMBaseModel, DeprecatedMixin):
81
81
  best: bool | None = None
82
82
  # Является ли трек лучшим (поле доступно при получении альбома с треками
83
83
  # `get_album_with_tracks`).
84
+ listening_finished: bool | None = None
85
+ # Флаг, указывающий, завершено ли прослушивание альбома.
84
86
 
85
87
  @property
86
88
  def artists_names(self) -> str | None:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes