Repository: shazamio/ShazamIO (language: python)

Issue:
Update version to 0.6.0



Discussion / hints:

Fix patch:
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 0000000..905a2b5
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,12 @@
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the
+// README at: https://github.com/devcontainers/templates/tree/main/src/python
+{
+	"name": "Python 3",
+	"image": "mcr.microsoft.com/devcontainers/python:3.8",
+	"features": {
+		"ghcr.io/devcontainers-contrib/features/poetry:2": {},
+    "ghcr.io/rocker-org/devcontainer-features/apt-packages:1": {
+      "packages": "ffmpeg"
+    }
+	}
+}
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..f33a02c
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,12 @@
+# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for more information:
+# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+# https://containers.dev/guide/dependabot
+
+version: 2
+updates:
+ - package-ecosystem: "devcontainers"
+   directory: "/"
+   schedule:
+     interval: weekly
diff --git a/examples/about_track.py b/examples/about_track.py
index 8c3cedf..cd9c447 100644
--- a/examples/about_track.py
+++ b/examples/about_track.py
@@ -4,7 +4,7 @@
 
 async def main():
     shazam = Shazam()
-    track_id = 552406075
+    track_id = 53982678
     about_track = await shazam.track_about(track_id=track_id)
     serialized = Serialize.track(data=about_track)
 
diff --git a/examples/album_info.py b/examples/album_info.py
new file mode 100644
index 0000000..29908de
--- /dev/null
+++ b/examples/album_info.py
@@ -0,0 +1,18 @@
+import asyncio
+from shazamio import Shazam, Serialize
+
+
+async def main():
+    shazam = Shazam()
+    albums = await shazam.search_album(album_id=1544741796)
+    serialized = Serialize.album_info(data=albums)
+
+    for i in serialized.data[0].relationships.tracks.data:
+        msg = (
+            f"{i.id} | {i.attributes.album_name} | {i.attributes.artist_name} [{i.attributes.name}]"
+        )
+        print(msg)
+
+
+loop = asyncio.get_event_loop_policy().get_event_loop()
+loop.run_until_complete(main())
diff --git a/examples/artist_albums.py b/examples/artist_albums.py
index 6d21ab9..6338a32 100644
--- a/examples/artist_albums.py
+++ b/examples/artist_albums.py
@@ -4,12 +4,13 @@
 
 async def main():
     shazam = Shazam()
-    artist_id = 1202214602
+    artist_id = 1300793014
     albums = await shazam.artist_albums(artist_id=artist_id)
     serialized = Serialize.artist_albums(data=albums)
-
     for i in serialized.data:
-        print(f"{i.attributes.name} - {i.attributes.track_count} {i.attributes.release_date}")
+        print(
+            f"{i.id} | {i.attributes.artist_name} ->>>>>>>> {i.attributes.name} - {i.attributes.track_count} {i.attributes.release_date}"
+        )
 
 
 loop = asyncio.get_event_loop_policy().get_event_loop()
diff --git a/examples/recognize_and_get_album.py b/examples/recognize_and_get_album.py
new file mode 100644
index 0000000..76b7a54
--- /dev/null
+++ b/examples/recognize_and_get_album.py
@@ -0,0 +1,41 @@
+import asyncio
+import logging
+
+from aiohttp_retry import ExponentialRetry
+
+from shazamio import Shazam, Serialize, HTTPClient
+
+logger = logging.getLogger(__name__)
+logging.basicConfig(
+    level=logging.DEBUG,
+    format="%(asctime)s - %(name)s - [%(filename)s:%(lineno)d - %(funcName)s()] - %(levelname)s - %(message)s",
+    datefmt="%Y-%m-%d %H:%M:%S",
+)
+
+
+async def main():
+    shazam = Shazam(
+        http_client=HTTPClient(
+            retry_options=ExponentialRetry(
+                attempts=12, max_timeout=204.8, statuses={500, 502, 503, 504, 429}
+            ),
+        ),
+    )
+
+    new_version_path = await shazam.recognize("data/Gloria.ogg")
+
+    album_info = await shazam.search_album(album_id=new_version_path["track"]["albumadamid"])
+    album_serialized = Serialize.album_info(data=album_info)
+    # Get album name
+    print(album_serialized.data[0].attributes.name)
+
+    # And get all tracks in album
+    for i in album_serialized.data[0].relationships.tracks.data:
+        msg = (
+            f"{i.id} | {i.attributes.album_name} | {i.attributes.artist_name} [{i.attributes.name}]"
+        )
+        print(msg)
+
+
+loop = asyncio.get_event_loop_policy().get_event_loop()
+loop.run_until_complete(main())
diff --git a/examples/recognize_song.py b/examples/recognize_song.py
index ef37d21..eecc1cf 100644
--- a/examples/recognize_song.py
+++ b/examples/recognize_song.py
@@ -1,7 +1,8 @@
 import asyncio
 import logging
 
-from shazamio import Shazam, Serialize
+from aiohttp_retry import ExponentialRetry
+from shazamio import Shazam, Serialize, HTTPClient
 
 logger = logging.getLogger(__name__)
 logging.basicConfig(
@@ -12,27 +13,26 @@
 
 
 async def main():
-    # shazam = Shazam(
-    #     http_client=HTTPClient(
-    #         retry_options=ExponentialRetry(attempts=12, max_timeout=204.8, statuses={500, 502, 503, 504, 429}),
-    #     ),
-    # )
-    # if u need override retry option...
-
-    shazam = Shazam()
+    shazam = Shazam(
+        http_client=HTTPClient(
+            retry_options=ExponentialRetry(
+                attempts=12, max_timeout=204.8, statuses={500, 502, 503, 504, 429}
+            ),
+        ),
+    )
 
     # pass path (deprecated)
-    old_version = await shazam.recognize_song(data="data/dora.ogg")  # deprecated
-    serialized_old = Serialize.full_track(old_version)
-    print(serialized_old)
+    # old_version = await shazam.recognize_song(data="data/dora.ogg")  # deprecated
+    # serialized_old = Serialize.full_track(old_version)
+    # print(serialized_old)
 
     # pass path
-    new_version_path = await shazam.recognize("data/dora.ogg")
+    new_version_path = await shazam.recognize("data/Gloria.ogg")
     serialized_new_path = Serialize.full_track(new_version_path)
     print(serialized_new_path)
 
     # pass bytes
-    with open("data/dora.ogg", "rb") as file:
+    with open("data/Gloria.ogg", "rb") as file:
         new_version_path = await shazam.recognize(file.read())
         serialized_new_path = Serialize.full_track(new_version_path)
         print(serialized_new_path)
diff --git a/examples/top_tracks_city.py b/examples/top_tracks_city.py
index 3fcbd93..5fe481c 100644
--- a/examples/top_tracks_city.py
+++ b/examples/top_tracks_city.py
@@ -3,17 +3,17 @@
 
 
 async def main():
-    shazam = Shazam(language="GB")
+    shazam = Shazam(language="EN")
     top_ten_moscow_tracks = await shazam.top_city_tracks(
         country_code="RU",
         city_name="Moscow",
         limit=10,
     )
-    print(top_ten_moscow_tracks)
-    # ALL TRACKS DICT
-    for track in top_ten_moscow_tracks["tracks"]:
-        serialized = Serialize.track(data=track)
-        # SERIALIZE FROM DATACLASS FACTORY
+    serialized = Serialize.playlists(top_ten_moscow_tracks)
+    print(serialized)
+
+    for element in top_ten_moscow_tracks["data"]:
+        serialized = Serialize.playlist(data=element)
         print(serialized)
 
 
diff --git a/examples/top_tracks_country.py b/examples/top_tracks_country.py
index 67dbdf5..b7c6377 100644
--- a/examples/top_tracks_country.py
+++ b/examples/top_tracks_country.py
@@ -4,9 +4,12 @@
 
 async def main():
     shazam = Shazam()
-    top_five_track_from_amsterdam = await shazam.top_country_tracks("NL", 5)
-    for track in top_five_track_from_amsterdam["tracks"]:
-        serialized = Serialize.track(data=track)
+    top_five_track_from_amsterdam = await shazam.top_country_tracks("NL", 100)
+    tracks = Serialize.playlists(top_five_track_from_amsterdam)
+    print(tracks)
+
+    for track in top_five_track_from_amsterdam["data"]:
+        serialized = Serialize.playlist(data=track)
         print(serialized)
 
 
diff --git a/examples/top_tracks_genre_country.py b/examples/top_tracks_genre_country.py
index 84010d5..d036f5b 100644
--- a/examples/top_tracks_genre_country.py
+++ b/examples/top_tracks_genre_country.py
@@ -1,13 +1,20 @@
 import asyncio
-from shazamio import Shazam, GenreMusic
+from shazamio import Shazam, GenreMusic, Serialize
 
 
 async def main():
     shazam = Shazam()
     top_spain_rap = await shazam.top_country_genre_tracks(
-        country_code="ES", genre=GenreMusic.HIP_HOP_RAP, limit=4
+        country_code="ES",
+        genre=GenreMusic.HIP_HOP_RAP,
+        limit=4,
     )
-    print(top_spain_rap)
+    serialized = Serialize.playlists(top_spain_rap)
+    print(serialized)
+
+    for playlist in top_spain_rap["data"]:
+        serialized = Serialize.playlist(data=playlist)
+        print(serialized)
 
 
 loop = asyncio.get_event_loop_policy().get_event_loop()
diff --git a/examples/top_tracks_genre_world.py b/examples/top_tracks_genre_world.py
index aa82565..29823a2 100644
--- a/examples/top_tracks_genre_world.py
+++ b/examples/top_tracks_genre_world.py
@@ -6,9 +6,12 @@ async def main():
     shazam = Shazam()
     top_rock_in_the_world = await shazam.top_world_genre_tracks(genre=GenreMusic.ROCK, limit=10)
 
-    for track in top_rock_in_the_world["tracks"]:
-        serialized_track = Serialize.track(data=track)
-        print(serialized_track)
+    serialized = Serialize.playlists(top_rock_in_the_world)
+    print(serialized)
+
+    for playlist in top_rock_in_the_world["data"]:
+        serialized = Serialize.playlist(data=playlist)
+        print(serialized)
 
 
 loop = asyncio.get_event_loop_policy().get_event_loop()
diff --git a/examples/top_world_tracks.py b/examples/top_world_tracks.py
index 222a974..df41aab 100644
--- a/examples/top_world_tracks.py
+++ b/examples/top_world_tracks.py
@@ -5,9 +5,11 @@
 async def main():
     shazam = Shazam()
     top_world_tracks = await shazam.top_world_tracks(limit=10)
-    print(top_world_tracks)
-    for track in top_world_tracks["tracks"]:
-        serialized = Serialize.track(track)
+    serialized = Serialize.playlists(top_world_tracks)
+    print(serialized)
+
+    for playlist in top_world_tracks["data"]:
+        serialized = Serialize.playlist(data=playlist)
         print(serialized)
 
 
diff --git a/poetry.lock b/poetry.lock
index d6bc412..7ece729 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,99 +1,99 @@
-# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
 
 [[package]]
 name = "aiofiles"
-version = "22.1.0"
+version = "23.2.1"
 description = "File support for asyncio."
 optional = false
-python-versions = ">=3.7,<4.0"
+python-versions = ">=3.7"
 files = [
-    {file = "aiofiles-22.1.0-py3-none-any.whl", hash = "sha256:1142fa8e80dbae46bb6339573ad4c8c0841358f79c6eb50a493dceca14621bad"},
-    {file = "aiofiles-22.1.0.tar.gz", hash = "sha256:9107f1ca0b2a5553987a94a3c9959fe5b491fdf731389aa5b7b1bd0733e32de6"},
+    {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"},
+    {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"},
 ]
 
 [[package]]
 name = "aiohttp"
-version = "3.9.3"
+version = "3.9.5"
 description = "Async http client/server framework (asyncio)"
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54"},
-    {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc"},
-    {file = "aiohttp-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5"},
-    {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b"},
-    {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768"},
-    {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5"},
-    {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29"},
-    {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec"},
-    {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747"},
-    {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6"},
-    {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c"},
-    {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf"},
-    {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52"},
-    {file = "aiohttp-3.9.3-cp310-cp310-win32.whl", hash = "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b"},
-    {file = "aiohttp-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5"},
-    {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d"},
-    {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2"},
-    {file = "aiohttp-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc"},
-    {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266"},
-    {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce"},
-    {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb"},
-    {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b"},
-    {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4"},
-    {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae"},
-    {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3"},
-    {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283"},
-    {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e"},
-    {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4"},
-    {file = "aiohttp-3.9.3-cp311-cp311-win32.whl", hash = "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5"},
-    {file = "aiohttp-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8"},
-    {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60"},
-    {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869"},
-    {file = "aiohttp-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679"},
-    {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96"},
-    {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d"},
-    {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11"},
-    {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53"},
-    {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5"},
-    {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca"},
-    {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1"},
-    {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5"},
-    {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6"},
-    {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f"},
-    {file = "aiohttp-3.9.3-cp312-cp312-win32.whl", hash = "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38"},
-    {file = "aiohttp-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5"},
-    {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c"},
-    {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528"},
-    {file = "aiohttp-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542"},
-    {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511"},
-    {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672"},
-    {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d"},
-    {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168"},
-    {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b"},
-    {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194"},
-    {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8"},
-    {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4"},
-    {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321"},
-    {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2"},
-    {file = "aiohttp-3.9.3-cp38-cp38-win32.whl", hash = "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63"},
-    {file = "aiohttp-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c"},
-    {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29"},
-    {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1"},
-    {file = "aiohttp-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f"},
-    {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3"},
-    {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa"},
-    {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e"},
-    {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58"},
-    {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533"},
-    {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb"},
-    {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3"},
-    {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d"},
-    {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a"},
-    {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d"},
-    {file = "aiohttp-3.9.3-cp39-cp39-win32.whl", hash = "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051"},
-    {file = "aiohttp-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc"},
-    {file = "aiohttp-3.9.3.tar.gz", hash = "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7"},
+    {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"},
+    {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"},
+    {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"},
+    {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"},
+    {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"},
+    {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"},
+    {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"},
+    {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"},
+    {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"},
+    {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"},
+    {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"},
+    {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"},
+    {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"},
+    {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"},
+    {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"},
+    {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"},
+    {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"},
+    {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"},
+    {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"},
+    {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"},
+    {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"},
+    {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"},
+    {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"},
+    {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"},
+    {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"},
+    {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"},
+    {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"},
+    {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"},
+    {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"},
+    {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"},
+    {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"},
+    {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"},
+    {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"},
+    {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"},
+    {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"},
+    {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"},
+    {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"},
+    {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"},
+    {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"},
+    {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"},
+    {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"},
+    {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"},
+    {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"},
+    {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"},
+    {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"},
+    {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"},
+    {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"},
+    {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"},
+    {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"},
+    {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"},
+    {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"},
+    {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"},
+    {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"},
+    {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"},
+    {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"},
+    {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"},
+    {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"},
+    {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"},
+    {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"},
+    {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"},
+    {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"},
+    {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"},
+    {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"},
+    {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"},
+    {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"},
+    {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"},
+    {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"},
+    {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"},
+    {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"},
+    {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"},
+    {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"},
+    {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"},
+    {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"},
+    {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"},
+    {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"},
+    {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"},
 ]
 
 [package.dependencies]
@@ -137,24 +137,25 @@ frozenlist = ">=1.1.0"
 
 [[package]]
 name = "anyio"
-version = "3.7.1"
+version = "4.3.0"
 description = "High level compatibility layer for multiple asynchronous event loop implementations"
 optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
 files = [
-    {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"},
-    {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"},
+    {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"},
+    {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"},
 ]
 
 [package.dependencies]
-exceptiongroup = {version = "*", markers = "python_version < \"3.11\""}
+exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""}
 idna = ">=2.8"
 sniffio = ">=1.1"
+typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""}
 
 [package.extras]
-doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"]
-test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
-trio = ["trio (<0.22)"]
+doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"]
+test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
+trio = ["trio (>=0.23)"]
 
 [[package]]
 name = "async-timeout"
@@ -188,33 +189,33 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p
 
 [[package]]
 name = "black"
-version = "24.2.0"
+version = "24.4.2"
 description = "The uncompromising code formatter."
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "black-24.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6981eae48b3b33399c8757036c7f5d48a535b962a7c2310d19361edeef64ce29"},
-    {file = "black-24.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d533d5e3259720fdbc1b37444491b024003e012c5173f7d06825a77508085430"},
-    {file = "black-24.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61a0391772490ddfb8a693c067df1ef5227257e72b0e4108482b8d41b5aee13f"},
-    {file = "black-24.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:992e451b04667116680cb88f63449267c13e1ad134f30087dec8527242e9862a"},
-    {file = "black-24.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:163baf4ef40e6897a2a9b83890e59141cc8c2a98f2dda5080dc15c00ee1e62cd"},
-    {file = "black-24.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e37c99f89929af50ffaf912454b3e3b47fd64109659026b678c091a4cd450fb2"},
-    {file = "black-24.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9de21bafcba9683853f6c96c2d515e364aee631b178eaa5145fc1c61a3cc92"},
-    {file = "black-24.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:9db528bccb9e8e20c08e716b3b09c6bdd64da0dd129b11e160bf082d4642ac23"},
-    {file = "black-24.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d84f29eb3ee44859052073b7636533ec995bd0f64e2fb43aeceefc70090e752b"},
-    {file = "black-24.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e08fb9a15c914b81dd734ddd7fb10513016e5ce7e6704bdd5e1251ceee51ac9"},
-    {file = "black-24.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810d445ae6069ce64030c78ff6127cd9cd178a9ac3361435708b907d8a04c693"},
-    {file = "black-24.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982"},
-    {file = "black-24.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e53a8c630f71db01b28cd9602a1ada68c937cbf2c333e6ed041390d6968faf4"},
-    {file = "black-24.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93601c2deb321b4bad8f95df408e3fb3943d85012dddb6121336b8e24a0d1218"},
-    {file = "black-24.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0057f800de6acc4407fe75bb147b0c2b5cbb7c3ed110d3e5999cd01184d53b0"},
-    {file = "black-24.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:faf2ee02e6612577ba0181f4347bcbcf591eb122f7841ae5ba233d12c39dcb4d"},
-    {file = "black-24.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:057c3dc602eaa6fdc451069bd027a1b2635028b575a6c3acfd63193ced20d9c8"},
-    {file = "black-24.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08654d0797e65f2423f850fc8e16a0ce50925f9337fb4a4a176a7aa4026e63f8"},
-    {file = "black-24.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca610d29415ee1a30a3f30fab7a8f4144e9d34c89a235d81292a1edb2b55f540"},
-    {file = "black-24.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:4dd76e9468d5536abd40ffbc7a247f83b2324f0c050556d9c371c2b9a9a95e31"},
-    {file = "black-24.2.0-py3-none-any.whl", hash = "sha256:e8a6ae970537e67830776488bca52000eaa37fa63b9988e8c487458d9cd5ace6"},
-    {file = "black-24.2.0.tar.gz", hash = "sha256:bce4f25c27c3435e4dace4815bcb2008b87e167e3bf4ee47ccdc5ce906eb4894"},
+    {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"},
+    {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"},
+    {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"},
+    {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"},
+    {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"},
+    {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"},
+    {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"},
+    {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"},
+    {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"},
+    {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"},
+    {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"},
+    {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"},
+    {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"},
+    {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"},
+    {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"},
+    {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"},
+    {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"},
+    {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"},
+    {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"},
+    {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"},
+    {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"},
+    {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"},
 ]
 
 [package.dependencies]
@@ -269,13 +270,13 @@ files = [
 
 [[package]]
 name = "exceptiongroup"
-version = "1.2.0"
+version = "1.2.1"
 description = "Backport of PEP 654 (exception groups)"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"},
-    {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"},
+    {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"},
+    {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"},
 ]
 
 [package.extras]
@@ -369,13 +370,13 @@ files = [
 
 [[package]]
 name = "idna"
-version = "3.6"
+version = "3.7"
 description = "Internationalized Domain Names in Applications (IDNA)"
 optional = false
 python-versions = ">=3.5"
 files = [
-    {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"},
-    {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"},
+    {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"},
+    {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"},
 ]
 
 [[package]]
@@ -538,13 +539,13 @@ files = [
 
 [[package]]
 name = "packaging"
-version = "23.2"
+version = "24.0"
 description = "Core utilities for Python packages"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"},
-    {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"},
+    {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"},
+    {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"},
 ]
 
 [[package]]
@@ -560,28 +561,29 @@ files = [
 
 [[package]]
 name = "platformdirs"
-version = "4.2.0"
-description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+version = "4.2.1"
+description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"},
-    {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"},
+    {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"},
+    {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"},
 ]
 
 [package.extras]
 docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
 test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"]
+type = ["mypy (>=1.8)"]
 
 [[package]]
 name = "pluggy"
-version = "1.4.0"
+version = "1.5.0"
 description = "plugin and hook calling mechanisms for python"
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"},
-    {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"},
+    {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
+    {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
 ]
 
 [package.extras]
@@ -590,47 +592,47 @@ testing = ["pytest", "pytest-benchmark"]
 
 [[package]]
 name = "pydantic"
-version = "1.10.14"
+version = "1.10.15"
 description = "Data validation and settings management using python type hints"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"},
-    {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"},
-    {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"},
-    {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"},
-    {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"},
-    {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"},
-    {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"},
-    {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"},
-    {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"},
-    {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"},
-    {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"},
-    {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"},
-    {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"},
-    {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"},
-    {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"},
-    {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"},
-    {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"},
-    {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"},
-    {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"},
-    {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"},
-    {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"},
-    {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"},
-    {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"},
-    {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"},
-    {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"},
-    {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"},
-    {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"},
-    {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"},
-    {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"},
-    {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"},
-    {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"},
-    {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"},
-    {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"},
-    {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"},
-    {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"},
-    {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"},
+    {file = "pydantic-1.10.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22ed12ee588b1df028a2aa5d66f07bf8f8b4c8579c2e96d5a9c1f96b77f3bb55"},
+    {file = "pydantic-1.10.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:75279d3cac98186b6ebc2597b06bcbc7244744f6b0b44a23e4ef01e5683cc0d2"},
+    {file = "pydantic-1.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50f1666a9940d3d68683c9d96e39640f709d7a72ff8702987dab1761036206bb"},
+    {file = "pydantic-1.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82790d4753ee5d00739d6cb5cf56bceb186d9d6ce134aca3ba7befb1eedbc2c8"},
+    {file = "pydantic-1.10.15-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d207d5b87f6cbefbdb1198154292faee8017d7495a54ae58db06762004500d00"},
+    {file = "pydantic-1.10.15-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e49db944fad339b2ccb80128ffd3f8af076f9f287197a480bf1e4ca053a866f0"},
+    {file = "pydantic-1.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:d3b5c4cbd0c9cb61bbbb19ce335e1f8ab87a811f6d589ed52b0254cf585d709c"},
+    {file = "pydantic-1.10.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c3d5731a120752248844676bf92f25a12f6e45425e63ce22e0849297a093b5b0"},
+    {file = "pydantic-1.10.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c365ad9c394f9eeffcb30a82f4246c0006417f03a7c0f8315d6211f25f7cb654"},
+    {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3287e1614393119c67bd4404f46e33ae3be3ed4cd10360b48d0a4459f420c6a3"},
+    {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be51dd2c8596b25fe43c0a4a59c2bee4f18d88efb8031188f9e7ddc6b469cf44"},
+    {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6a51a1dd4aa7b3f1317f65493a182d3cff708385327c1c82c81e4a9d6d65b2e4"},
+    {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4e316e54b5775d1eb59187f9290aeb38acf620e10f7fd2f776d97bb788199e53"},
+    {file = "pydantic-1.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:0d142fa1b8f2f0ae11ddd5e3e317dcac060b951d605fda26ca9b234b92214986"},
+    {file = "pydantic-1.10.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7ea210336b891f5ea334f8fc9f8f862b87acd5d4a0cbc9e3e208e7aa1775dabf"},
+    {file = "pydantic-1.10.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3453685ccd7140715e05f2193d64030101eaad26076fad4e246c1cc97e1bb30d"},
+    {file = "pydantic-1.10.15-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bea1f03b8d4e8e86702c918ccfd5d947ac268f0f0cc6ed71782e4b09353b26f"},
+    {file = "pydantic-1.10.15-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:005655cabc29081de8243126e036f2065bd7ea5b9dff95fde6d2c642d39755de"},
+    {file = "pydantic-1.10.15-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:af9850d98fc21e5bc24ea9e35dd80a29faf6462c608728a110c0a30b595e58b7"},
+    {file = "pydantic-1.10.15-cp37-cp37m-win_amd64.whl", hash = "sha256:d31ee5b14a82c9afe2bd26aaa405293d4237d0591527d9129ce36e58f19f95c1"},
+    {file = "pydantic-1.10.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5e09c19df304b8123938dc3c53d3d3be6ec74b9d7d0d80f4f4b5432ae16c2022"},
+    {file = "pydantic-1.10.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7ac9237cd62947db00a0d16acf2f3e00d1ae9d3bd602b9c415f93e7a9fc10528"},
+    {file = "pydantic-1.10.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:584f2d4c98ffec420e02305cf675857bae03c9d617fcfdc34946b1160213a948"},
+    {file = "pydantic-1.10.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbc6989fad0c030bd70a0b6f626f98a862224bc2b1e36bfc531ea2facc0a340c"},
+    {file = "pydantic-1.10.15-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d573082c6ef99336f2cb5b667b781d2f776d4af311574fb53d908517ba523c22"},
+    {file = "pydantic-1.10.15-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6bd7030c9abc80134087d8b6e7aa957e43d35714daa116aced57269a445b8f7b"},
+    {file = "pydantic-1.10.15-cp38-cp38-win_amd64.whl", hash = "sha256:3350f527bb04138f8aff932dc828f154847fbdc7a1a44c240fbfff1b57f49a12"},
+    {file = "pydantic-1.10.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:51d405b42f1b86703555797270e4970a9f9bd7953f3990142e69d1037f9d9e51"},
+    {file = "pydantic-1.10.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a980a77c52723b0dc56640ced396b73a024d4b74f02bcb2d21dbbac1debbe9d0"},
+    {file = "pydantic-1.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f1a1fb467d3f49e1708a3f632b11c69fccb4e748a325d5a491ddc7b5d22383"},
+    {file = "pydantic-1.10.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:676ed48f2c5bbad835f1a8ed8a6d44c1cd5a21121116d2ac40bd1cd3619746ed"},
+    {file = "pydantic-1.10.15-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:92229f73400b80c13afcd050687f4d7e88de9234d74b27e6728aa689abcf58cc"},
+    {file = "pydantic-1.10.15-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2746189100c646682eff0bce95efa7d2e203420d8e1c613dc0c6b4c1d9c1fde4"},
+    {file = "pydantic-1.10.15-cp39-cp39-win_amd64.whl", hash = "sha256:394f08750bd8eaad714718812e7fab615f873b3cdd0b9d84e76e51ef3b50b6b7"},
+    {file = "pydantic-1.10.15-py3-none-any.whl", hash = "sha256:28e552a060ba2740d0d2aabe35162652c1459a0b9069fe0db7f4ee0e18e74d58"},
+    {file = "pydantic-1.10.15.tar.gz", hash = "sha256:ca832e124eda231a60a041da4f013e3ff24949d94a01154b137fc2f2a43c3ffb"},
 ]
 
 [package.dependencies]
@@ -653,13 +655,13 @@ files = [
 
 [[package]]
 name = "pytest"
-version = "7.4.4"
+version = "8.1.2"
 description = "pytest: simple powerful testing with Python"
 optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
 files = [
-    {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"},
-    {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"},
+    {file = "pytest-8.1.2-py3-none-any.whl", hash = "sha256:6c06dc309ff46a05721e6fd48e492a775ed8165d2ecdf57f156a80c7e95bb142"},
+    {file = "pytest-8.1.2.tar.gz", hash = "sha256:f3c45d1d5eed96b01a2aea70dee6a4a366d51d38f9957768083e4fecfc77f3ef"},
 ]
 
 [package.dependencies]
@@ -667,29 +669,29 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""}
 exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
 iniconfig = "*"
 packaging = "*"
-pluggy = ">=0.12,<2.0"
-tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
+pluggy = ">=1.4,<2.0"
+tomli = {version = ">=1", markers = "python_version < \"3.11\""}
 
 [package.extras]
-testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
 
 [[package]]
 name = "pytest-asyncio"
-version = "0.20.3"
+version = "0.23.6"
 description = "Pytest support for asyncio"
 optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
 files = [
-    {file = "pytest-asyncio-0.20.3.tar.gz", hash = "sha256:83cbf01169ce3e8eb71c6c278ccb0574d1a7a3bb8eaaf5e50e0ad342afb33b36"},
-    {file = "pytest_asyncio-0.20.3-py3-none-any.whl", hash = "sha256:f129998b209d04fcc65c96fc85c11e5316738358909a8399e93be553d7656442"},
+    {file = "pytest-asyncio-0.23.6.tar.gz", hash = "sha256:ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f"},
+    {file = "pytest_asyncio-0.23.6-py3-none-any.whl", hash = "sha256:68516fdd1018ac57b846c9846b954f0393b26f094764a28c955eabb0536a4e8a"},
 ]
 
 [package.dependencies]
-pytest = ">=6.1.0"
+pytest = ">=7.0.0,<9"
 
 [package.extras]
 docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"]
-testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"]
+testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"]
 
 [[package]]
 name = "shazamio-core"
@@ -699,34 +701,42 @@ optional = false
 python-versions = ">=3.8"
 files = [
     {file = "shazamio_core-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:98f7968299e5fe34a340273164d4c5c620b2b074d91eff3355f0b55377e1ea7e"},
+    {file = "shazamio_core-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f06950639205b712299289424e3509e3b3826a7d0ab208e4f9a4f83c67ceb623"},
     {file = "shazamio_core-1.0.7-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:a3651833d4e6d95464abcbcefefeca53c386446261878c56cbcfb419da4b5115"},
     {file = "shazamio_core-1.0.7-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:f2f9081ab12a31af4fc1b9523d56a049a04ec236699705c70f22ee18858842c1"},
     {file = "shazamio_core-1.0.7-cp310-none-win32.whl", hash = "sha256:7b88fdb2425716744fa3667b2c71634027dc5b06a05528f604ba55b5eedb8deb"},
     {file = "shazamio_core-1.0.7-cp310-none-win_amd64.whl", hash = "sha256:fae00a5bc273a1f4a47c0bc33c46030ed96b9bb8a3cfc93858c8354b6a420115"},
     {file = "shazamio_core-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:76ec784a546333ea30e7ff235699d68022d27ff13a0725bebb5a35d0c0b3db5a"},
+    {file = "shazamio_core-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a292de58b1b043ac9d0d249b8c66ddb6b9046e143f521bfd06391e3498051734"},
     {file = "shazamio_core-1.0.7-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:ef9d8626fb5e7f0c0c9fb1a9346494a78661ff99985e7c826c79b880228ff83a"},
     {file = "shazamio_core-1.0.7-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a7582f749da55119eebc5a18ca859aa603e6db936347b7c17ae2cdb3e8e27750"},
     {file = "shazamio_core-1.0.7-cp311-none-win32.whl", hash = "sha256:1ffa240eb6899f6aff68565cb6056e2bb773919b18f4c70b75f7d33b8c864625"},
     {file = "shazamio_core-1.0.7-cp311-none-win_amd64.whl", hash = "sha256:b224d5149cadc67d6383590e60dbd2221a533e52abb1f47e6e8ef724a24b1890"},
     {file = "shazamio_core-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62152bfebf5c9a297cb6497bd46cc4014d79f54dc805f3dddae93df297e9aa70"},
+    {file = "shazamio_core-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c992cb29a0f9c675fe10abc680c9ed0e9a7b12ab089ff2c90b84e87f52e6fb"},
     {file = "shazamio_core-1.0.7-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:89ad2e837b237671c629783da8e23012f1ea2b2200edb89afc37f6bfc49beaf2"},
     {file = "shazamio_core-1.0.7-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6bf9b7d40b2f3776883b2c484fe2831bb88ef3ec235ed8ec1bfb22c890b2a506"},
     {file = "shazamio_core-1.0.7-cp312-none-win32.whl", hash = "sha256:89746e018042514c0812fe3d4e23a2a91f47a76bea9af473a01b0cda34dd4195"},
     {file = "shazamio_core-1.0.7-cp312-none-win_amd64.whl", hash = "sha256:39f47e664a10a619755723fb5a15514d84b2f563646a2ac3acc629f479586cd1"},
     {file = "shazamio_core-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87e1511a7bb361061bd6520a6bd4b62c8ceb7b6bd7f730182bfb3060b58d97ab"},
+    {file = "shazamio_core-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c76bf55c89ed99ff614707c6fafba37ec0a2f462206b3089afd82db2e5bea40"},
     {file = "shazamio_core-1.0.7-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:d32fa44c109f38cba3c1e86ce79dcfdc9bd7378614650a161fa62a0e434b68a5"},
     {file = "shazamio_core-1.0.7-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d76fd0f68f49cb853165b6f9301a5bb58a6f76e70b24c87f1e5072024f71a882"},
     {file = "shazamio_core-1.0.7-cp38-none-win32.whl", hash = "sha256:a85dc4bb42a91f93ee60b8b73a53cc1b91b45b2843a7f41080d357d43973ad75"},
     {file = "shazamio_core-1.0.7-cp38-none-win_amd64.whl", hash = "sha256:11bcfd545e4f0e9c6729ab66da056e5ad9a0d273c37e309c5d6ddd5e44850fcc"},
     {file = "shazamio_core-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1dddcb22068c7c54db2c7fe3beb1d9883c7ec4436b5649e98bb4297496114bc1"},
+    {file = "shazamio_core-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e354362d5d75daf04bbb5e5b8b681d81521c3afa509f7d61491cee121832e29d"},
     {file = "shazamio_core-1.0.7-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:9ac98bf38e8b79118038aeea14481c54ca24ece8d74cce517c463ea425da919d"},
     {file = "shazamio_core-1.0.7-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:7195b8e9edfa2752009ba2499d216f71bfcf8b1bb8314fd50052a587eca4aade"},
     {file = "shazamio_core-1.0.7-cp39-none-win32.whl", hash = "sha256:0f0bbb7bba48eeb4662ee9f4b61b0a3969c6d9cf2f1954986b2328e00c4e30d1"},
     {file = "shazamio_core-1.0.7-cp39-none-win_amd64.whl", hash = "sha256:9ab97d5150ba37f350c5163baa8bd40e608716a08a85043bf6fbdbfc2e1c11e8"},
+    {file = "shazamio_core-1.0.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb6b63d9aef6c23899d3a0929dc173868d0807cc71481c1051914a7f0d789f05"},
     {file = "shazamio_core-1.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a3b31435537a5be9adca7ec7939948544c027633f3b1b9b2f850eece23a31ace"},
     {file = "shazamio_core-1.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:88c637a901e71a22bfb4faf4344273c2cf1a2cc25d603effd19bb976bba6eced"},
+    {file = "shazamio_core-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ac61a42ebe9717a8f9ea37446a191d7a25a47d5c38d7e746bbd2cb60e2be672"},
     {file = "shazamio_core-1.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:698dcc169d123cb2a702dc6e46bebfa9e80c871d41e71ca766dd868ecb9b01e0"},
     {file = "shazamio_core-1.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1af0557506d67a781c311a57603e16e0f168fb078626fe7901a5502f154d74fe"},
+    {file = "shazamio_core-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36238efd4fdcd467142997cb1ca56cbc25c2112c6b6d021c3d84244407ed8ba5"},
     {file = "shazamio_core-1.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9c9100f1d235ad2d55f9adc0aadab24bee1702486a57f9ceea3f9f6dcfb8aa9d"},
     {file = "shazamio_core-1.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d18ab8e6ac552ade5c777d8413a15f637240d3a0657a312fb03cdb9f1878c7b0"},
     {file = "shazamio_core-1.0.7.tar.gz", hash = "sha256:da879322a8a43aac3c636e5d298832eda2098e6a578a451472c4337924e4b5b2"},
@@ -734,13 +744,13 @@ files = [
 
 [[package]]
 name = "sniffio"
-version = "1.3.0"
+version = "1.3.1"
 description = "Sniff out which async library your code is running under"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"},
-    {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"},
+    {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
+    {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
 ]
 
 [[package]]
@@ -756,13 +766,13 @@ files = [
 
 [[package]]
 name = "typing-extensions"
-version = "4.9.0"
+version = "4.11.0"
 description = "Backported and Experimental Type Hints for Python 3.8+"
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"},
-    {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"},
+    {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"},
+    {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"},
 ]
 
 [[package]]
@@ -871,4 +881,4 @@ multidict = ">=4.0"
 [metadata]
 lock-version = "2.0"
 python-versions = "^3.8"
-content-hash = "fc9d8f02564a9761a29caf1c80fac43cf9f6e679c6e18d4076afbbe57da2e2cf"
+content-hash = "4af8cbfb134ffd206405e2806efe573b4d0af5162e35074af36f89499eb25836"
diff --git a/pyproject.toml b/pyproject.toml
index 1fbb22f..60a322c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "shazamio"
-version = "0.5.1"
+version = "0.6.0"
 description = "Is a asynchronous framework from reverse engineered Shazam API written in Python 3.8+ with asyncio and aiohttp."
 authors = ["dotX12"]
 license = "MIT License"
@@ -19,16 +19,16 @@ numpy = "^1.24.0"
 aiohttp = "^3.8.3"
 pydub = "^0.25.1"
 dataclass-factory = "2.16"
-aiofiles = "^22.1.0"
-pytest = "^7.2.0"
-pytest-asyncio = "^0.20.3"
-anyio = "^3.6.2"
+aiofiles = "23.2.1"
+anyio = "4.3.0"
 pydantic = "^1.10.2"
 shazamio-core = "^1.0.7"
 aiohttp-retry = "^2.8.3"
 
-[tool.poetry.group.dev.dependencies]
+[tool.poetry.dev-dependencies]
 black = {version = "^24.2.0", allow-prereleases = true}
+pytest = "8.1.2"
+pytest-asyncio = "^0.23.6"
 
 [build-system]
 requires = ["poetry-core>=1.0.0", "wheel>=0.36,<1.0"]
diff --git a/shazamio/api.py b/shazamio/api.py
index d31b811..8d06a92 100644
--- a/shazamio/api.py
+++ b/shazamio/api.py
@@ -40,7 +40,9 @@ def __init__(
 
         self.http_client = http_client or HTTPClient(
             retry_options=ExponentialRetry(
-                attempts=20, max_timeout=60, statuses={500, 502, 503, 504, 429}
+                attempts=20,
+                max_timeout=60,
+                statuses={500, 502, 503, 504, 429},
             ),
         )
         self.geo_service = GeoService(self.http_client)
@@ -62,9 +64,12 @@ async def top_world_tracks(
             :param proxy: Proxy server
             :return: dict tracks
         """
+
+        top_playlist_id = await self.geo_service.get_top()
         return await self.http_client.request(
             "GET",
-            ShazamUrl.TOP_TRACKS_WORLD.format(
+            ShazamUrl.TOP_TRACKS_PLAYLIST.format(
+                playlist_id=top_playlist_id,
                 language=self.language,
                 endpoint_country=self.endpoint_country,
                 limit=limit,
@@ -133,7 +138,7 @@ async def track_about(
 
     async def top_country_tracks(
         self,
-        country_code: Union[CountryCode, str],
+        country_code: str,
         limit: int = 200,
         offset: int = 0,
         proxy: Optional[str] = None,
@@ -151,9 +156,14 @@ async def top_country_tracks(
             :param proxy: Proxy server
             :return: dict songs
         """
+        country_playlist_id = await self.geo_service.get_country_playlist(
+            country=CountryCode(country_code),
+        )
+
         return await self.http_client.request(
             "GET",
-            ShazamUrl.TOP_TRACKS_COUNTRY.format(
+            ShazamUrl.TOP_TRACKS_PLAYLIST.format(
+                playlist_id=country_playlist_id,
                 language=self.language,
                 endpoint_country=self.endpoint_country,
                 country_code=country_code,
@@ -166,7 +176,7 @@ async def top_country_tracks(
 
     async def top_city_tracks(
         self,
-        country_code: Union[CountryCode, str],
+        country_code: str,
         city_name: str,
         limit: int = 200,
         offset: int = 0,
@@ -188,15 +198,20 @@ async def top_city_tracks(
 
             :return: dict songs
         """
-        city_id = await self.geo_service.city_id_from(country=country_code, city=city_name)
+        city_playlist_id = await self.geo_service.get_city_playlist(
+            country=CountryCode(country_code),
+            city=city_name,
+        )
+
         return await self.http_client.request(
             "GET",
-            ShazamUrl.TOP_TRACKS_CITY.format(
+            ShazamUrl.TOP_TRACKS_PLAYLIST.format(
+                playlist_id=city_playlist_id,
                 language=self.language,
                 endpoint_country=self.endpoint_country,
+                country_code=country_code,
                 limit=limit,
                 offset=offset,
-                city_id=city_id,
             ),
             headers=self.headers(),
             proxy=proxy,
@@ -204,7 +219,7 @@ async def top_city_tracks(
 
     async def top_world_genre_tracks(
         self,
-        genre: Union[GenreMusic, int],
+        genre: Union[GenreMusic, str],
         limit: int = 100,
         offset: int = 0,
         proxy: Optional[str] = None,
@@ -213,14 +228,7 @@ async def top_world_genre_tracks(
         Get world tracks by certain genre
         https://www.shazam.com/charts/genre/world/rock
 
-            :param genre: Genre name or ID:
-                POP = 1, HIP_HOP_RAP = 2, DANCE = 3, ELECTRONIC = 4, RNB_SOUL = 5, ALTERNATIVE =
-                6, ROCK = 7
-                LATIN = 8, FILM_TV_STAGE = 9, COUNTRY = 10, AFRO_BEATS = 11, WORLDWIDE = 12,
-                REGGAE_DANCE_HALL = 13
-                HOUSE = 14, K_POP = 15, FRENCH_POP = 16, SINGER_SONGWRITER = 17,
-                REGIONAL_MEXICANO = 18
-
+            :param genre: Genre urlName from https://www.shazam.com/services/charts/locations
             :param limit: Determines how many songs the maximum can be in the request.
                     Example: If 5 is specified, the query will return no more than 5 songs.
             :param offset: A parameter that determines with which song to display the request.
@@ -229,14 +237,19 @@ async def top_world_genre_tracks(
             :param proxy: Proxy server
             :return: dict songs
         """
+
+        if isinstance(genre, str):
+            genre = GenreMusic(genre)
+
+        genre_playlist_id = await self.geo_service.get_genre(genre=genre)
         return await self.http_client.request(
             "GET",
-            ShazamUrl.GENRE_WORLD.format(
+            ShazamUrl.TOP_TRACKS_PLAYLIST.format(
+                playlist_id=genre_playlist_id,
                 language=self.language,
                 endpoint_country=self.endpoint_country,
                 limit=limit,
                 offset=offset,
-                genre=genre,
             ),
             headers=self.headers(),
             proxy=proxy,
@@ -245,7 +258,7 @@ async def top_world_genre_tracks(
     async def top_country_genre_tracks(
         self,
         country_code: str,
-        genre: Union[GenreMusic, int],
+        genre: Union[GenreMusic, str],
         limit: int = 200,
         offset: int = 0,
         proxy: Optional[str] = None,
@@ -269,15 +282,23 @@ async def top_country_genre_tracks(
             :param proxy: Proxy server
             :return: dict songs
         """
+        if isinstance(genre, str):
+            genre = GenreMusic(genre)
+
+        genre_playlist_id = await self.geo_service.get_genre_from_country(
+            country=CountryCode(country_code),
+            genre=genre,
+        )
+
         return await self.http_client.request(
             "GET",
-            ShazamUrl.GENRE_COUNTRY.format(
+            ShazamUrl.TOP_TRACKS_PLAYLIST.format(
+                playlist_id=genre_playlist_id,
                 language=self.language,
                 endpoint_country=self.endpoint_country,
+                country_code=country_code,
                 limit=limit,
                 offset=offset,
-                country=country_code,
-                genre=genre,
             ),
             headers=self.headers(),
             proxy=proxy,
@@ -453,6 +474,29 @@ async def artist_albums(
             proxy=proxy,
         )
 
+    async def search_album(
+        self,
+        album_id: int,
+        proxy: Optional[str] = None,
+    ):
+        """
+        Get album info by id
+
+          :param album_id: Album number. Example (203347991)
+          :param proxy: Proxy server
+          :return: dict albums
+        """
+
+        return await self.http_client.request(
+            "GET",
+            ShazamUrl.ARTIST_ALBUM_INFO.format(
+                endpoint_country=self.endpoint_country,
+                album_id=album_id,
+            ),
+            headers=self.headers(),
+            proxy=proxy,
+        )
+
     async def get_youtube_data(
         self,
         link: str,
@@ -518,7 +562,7 @@ async def send_recognize_request(
 
     async def recognize(
         self,
-        data: Union[str, pathlib.Path, bytes, bytearray],
+        data: Union[str, bytes, bytearray],
         proxy: Optional[str] = None,
     ) -> Dict[str, Any]:
         """
diff --git a/shazamio/converter.py b/shazamio/converter.py
index a748de3..769a704 100644
--- a/shazamio/converter.py
+++ b/shazamio/converter.py
@@ -1,11 +1,12 @@
 from typing import Any, Dict
 
 from pydub import AudioSegment
+
+from shazamio.enums import GenreMusic
 from shazamio.algorithm import SignatureGenerator
-from shazamio.exceptions import BadCityName, BadCountryName
+from shazamio.exceptions import BadCityName, BadCountryName, BadParseData
 from shazamio.interfaces.client import HTTPClientInterface
 from shazamio.misc import ShazamUrl
-from shazamio.schemas.models import *
 from shazamio.typehints import CountryCode
 
 
@@ -13,9 +14,22 @@ class GeoService:
     def __init__(self, client: HTTPClientInterface):
         self.client = client
 
-    async def city_id_from(self, country: Union[CountryCode, str], city: str) -> int:
+    async def get_country_playlist(self, country: CountryCode) -> str:
+        """
+        Return Country playlistID from country name
+            :param country: - Country code, format: ISO 3166-3 alpha-2 code. Example: RU,NL,UA
+            :return: City ID
+        """
+
+        data = await self.client.request("GET", ShazamUrl.LOCATIONS, "application/json")
+        for response_country in data["countries"]:
+            if country == response_country["id"]:
+                return response_country["listid"]
+        raise BadCountryName("Country not found, check city name")
+
+    async def get_city_playlist(self, country: CountryCode, city: str) -> str:
         """
-        Return City ID from country name and city name.
+        Return playlistID from country name and city name.
             :param country: - Country name
             :param city: - City name
             :return: City ID
@@ -26,18 +40,62 @@ async def city_id_from(self, country: Union[CountryCode, str], city: str) -> int
             if country == response_country["id"]:
                 for response_city in response_country["cities"]:
                     if city == response_city["name"]:
-                        return response_city["id"]
+                        return response_city["listid"]
         raise BadCityName("City not found, check city name")
 
-    async def all_cities_from_country(self, country: Union[CountryCode, str]) -> List[str]:
-        cities = []
+    async def get_genre(self, genre: GenreMusic) -> str:
+        """
+        Return Global Genre playlistID from country name and city name.
+            :param genre: - Genre urlName from https://www.shazam.com/services/charts/locations
+            :return: City ID
+        """
+
+        data = await self.client.request("GET", ShazamUrl.LOCATIONS, "application/json")
+        global_data = data.get("global")
+        if not global_data:
+            raise BadParseData("Global key not found in shazam locations")
+
+        global_genres = global_data.get("genres")
+        if not global_genres:
+            raise BadParseData("Genres key not found in shazam locations")
+
+        for response_genre in global_genres:
+            if genre.value == response_genre["urlName"]:
+                return response_genre["listid"]
+
+        raise BadCityName("Genre not found, check genre name")
+
+    async def get_top(self) -> str:
+        data = await self.client.request("GET", ShazamUrl.LOCATIONS, "application/json")
+        global_data = data.get("global")
+        if not global_data:
+            raise BadParseData("Global key not found in shazam locations")
+
+        top = global_data.get("top")
+        if not top:
+            raise BadParseData("Top key not found in shazam locations")
+        return top["listid"]
+
+    async def get_genre_from_country(self, country: CountryCode, genre: GenreMusic) -> str:
+        """
+        Return Global Genre playlistID from country name and genre urlName from https://www.shazam.com/services/charts/locations
+            :param country: - Country code, format: ISO 3166-3 alpha-2 code. Example: RU,NL,UA
+            :param genre: - Genre urlName from https://www.shazam.com/services/charts/locations
+            :return: City ID
+        """
+
         data = await self.client.request("GET", ShazamUrl.LOCATIONS, "application/json")
         for response_country in data["countries"]:
             if country == response_country["id"]:
-                for city in response_country["cities"]:
-                    cities.append(city["name"])
-                return cities
-        raise BadCountryName("Country not found, check country name")
+                global_genres = response_country.get("genres")
+                if not global_genres:
+                    raise BadParseData("Genres key not found in shazam locations")
+
+                for response_genre in global_genres:
+                    if genre.value == response_genre["urlName"]:
+                        return response_genre["listid"]
+
+        raise BadCityName("Genre not found, check genre name")
 
 
 class Converter:
diff --git a/shazamio/enums.py b/shazamio/enums.py
index 415be9c..6dabff6 100644
--- a/shazamio/enums.py
+++ b/shazamio/enums.py
@@ -1,25 +1,25 @@
-from enum import IntEnum
+from enum import IntEnum, Enum
 
 
-class GenreMusic(IntEnum):
-    POP = 1
-    HIP_HOP_RAP = 2
-    DANCE = 3
-    ELECTRONIC = 4
-    RNB_SOUL = 5
-    ALTERNATIVE = 6
-    ROCK = 7
-    LATIN = 8
-    FILM_TV_STAGE = 9
-    COUNTRY = 10
-    AFRO_BEATS = 11
-    WORLDWIDE = 12
-    REGGAE_DANCE_HALL = 13
-    HOUSE = 14
-    K_POP = 15
-    FRENCH_POP = 16
-    SINGER_SONGWRITER = 17
-    REGIONAL_MEXICANO = 18
+class GenreMusic(Enum):
+    POP = "pop"
+    HIP_HOP_RAP = "hip-hop-rap"
+    DANCE = "dance"
+    ELECTRONIC = "electronic"
+    RNB_SOUL = "randb-soul"
+    ALTERNATIVE = "alternative"
+    ROCK = "rock"
+    LATIN = "latin"
+    FILM_TV_STAGE = "film-tv-and-stage"
+    COUNTRY = "country"
+    AFRO_BEATS = "afrobeats"
+    WORLDWIDE = "worldwide"
+    REGGAE_DANCE_HALL = "reggae-dancehall"
+    HOUSE = "house"
+    K_POP = "k-pop"
+    FRENCH_POP = "french-pop"
+    SINGER_SONGWRITER = "singer-songwriter"
+    REGIONAL_MEXICANO = "regional-mexicano"
 
 
 class SampleRate(IntEnum):
diff --git a/shazamio/exceptions.py b/shazamio/exceptions.py
index a564994..2b93a32 100644
--- a/shazamio/exceptions.py
+++ b/shazamio/exceptions.py
@@ -10,5 +10,13 @@ class BadCountryName(Exception):
     pass
 
 
+class BadRegionName(Exception):
+    pass
+
+
 class BadMethod(Exception):
     pass
+
+
+class BadParseData(Exception):
+    pass
diff --git a/shazamio/misc.py b/shazamio/misc.py
index d275ecc..3164d19 100644
--- a/shazamio/misc.py
+++ b/shazamio/misc.py
@@ -9,31 +9,16 @@ class ShazamUrl:
         "/{uuid_1}/{uuid_2}?sync=true&webv3=true&sampling=true"
         "&connected=&shazamapiversion=v3&sharehub=true&hubv5minorversion=v5.1&hidelb=true&video=v3"
     )
-    TOP_TRACKS_WORLD = (
-        "https://www.shazam.com/shazam/v3/{language}/{endpoint_country}/web/-/tracks"
-        "/ip-global-chart?pageSize={limit}&startFrom={offset}"
-    )
     ABOUT_TRACK = (
         "https://www.shazam.com/discovery/v5/{language}/{endpoint_country}/web/-/track"
         "/{track_id}?shazamapiversion=v3&video=v3 "
     )
-    TOP_TRACKS_COUNTRY = (
-        "https://www.shazam.com/shazam/v3/{language}/{endpoint_country}/web/-/tracks"
-        "/ip-country-chart-{country_code}?pageSize={limit}&startFrom={offset}"
-    )
-    TOP_TRACKS_CITY = (
-        "https://www.shazam.com/shazam/v3/{language}/{endpoint_country}/web/-/tracks"
-        "/ip-city-chart-{city_id}?pageSize={limit}&startFrom={offset}"
+    TOP_TRACKS_PLAYLIST = (
+        "https://www.shazam.com/services/amapi/v1/catalog/{endpoint_country}"
+        "/playlists/{playlist_id}/tracks?limit={limit}&offset={offset}&"
+        "l={language}&relate[songs]=artists,music-videos"
     )
     LOCATIONS = "https://www.shazam.com/services/charts/locations"
-    GENRE_WORLD = (
-        "https://www.shazam.com/shazam/v3/{language}/{endpoint_country}/web/-/tracks"
-        "/genre-global-chart-{genre}?pageSize={limit}&startFrom={offset}"
-    )
-    GENRE_COUNTRY = (
-        "https://www.shazam.com/shazam/v3/{language}/{endpoint_country}/web/-/tracks"
-        "/genre-country-chart-{country}-{genre}?pageSize={limit}&startFrom={offset}"
-    )
     RELATED_SONGS = (
         "https://cdn.shazam.com/shazam/v3/{language}/{endpoint_country}/web/-/tracks"
         "/track-similarities-id-{track_id}?startFrom={offset}&pageSize={limit}&connected=&channel="
@@ -56,6 +41,9 @@ class ShazamUrl:
         "https://www.shazam.com/services/amapi/v1/catalog/{endpoint_country}"
         "/artists/{artist_id}/albums?limit={limit}&offset={offset}"
     )
+    ARTIST_ALBUM_INFO = (
+        "https://www.shazam.com/services/amapi/v1/catalog/{endpoint_country}/albums/{album_id}"
+    )
 
 
 class Request:
diff --git a/shazamio/schemas/album.py b/shazamio/schemas/album.py
new file mode 100644
index 0000000..a4695b0
--- /dev/null
+++ b/shazamio/schemas/album.py
@@ -0,0 +1,34 @@
+from typing import Optional, List
+
+from pydantic import BaseModel, Field
+
+from shazamio.schemas.artist.views.full_albums import AttributesFullAlbums
+from shazamio.schemas.artist.views.top_song import AttributesTopSong
+from shazamio.schemas.base import BaseHref, BaseIdTypeHref
+
+
+class TrackInfoDTO(AttributesTopSong):
+    has_credits: Optional[bool] = Field(None, alias="hasCredits")
+
+
+class TrackInfoWithHref(BaseIdTypeHref):
+    attributes: TrackInfoDTO
+
+
+class TrackModel(BaseHref):
+    href: str
+    data: List[TrackInfoWithHref] = Field([])
+
+
+class ArtistModel(BaseHref):
+    data: List[BaseIdTypeHref] = Field([])
+
+
+class AlbumRelationships(BaseModel):
+    artists: ArtistModel
+    tracks: TrackModel
+
+
+class AlbumModel(BaseIdTypeHref):
+    attributes: AttributesFullAlbums
+    relationships: AlbumRelationships
diff --git a/shazamio/schemas/artist/views/full_albums.py b/shazamio/schemas/artist/views/full_albums.py
index 4b3a7b0..b8d30e4 100644
--- a/shazamio/schemas/artist/views/full_albums.py
+++ b/shazamio/schemas/artist/views/full_albums.py
@@ -4,16 +4,12 @@
 
 from pydantic import BaseModel, Field
 
+from shazamio.schemas.play_params import PlayParams
 from shazamio.schemas.attributes import AttributeName
-from shazamio.schemas.base import BaseDataModel
+from shazamio.schemas.base import BaseIdTypeHrefAttributesModel
 from shazamio.schemas.photos import ImageModel
 
 
-class PlayParams(BaseModel):
-    id: str
-    kind: str
-
-
 class EditorialArtwork(BaseModel):
     subscription_hero: Optional[ImageModel] = Field(None, alias="subscriptionHero")
     store_flow_case: Optional[ImageModel] = Field(None, alias="storeFlowcase")
@@ -50,4 +46,10 @@ class AttributesFullAlbums(BaseModel):
 class FullAlbumsModel(BaseModel):
     href: Optional[str] = None
     attributes: Optional[AttributeName] = None
-    data: Optional[List[BaseDataModel[AttributesFullAlbums]]] = None
+    data: List[BaseIdTypeHrefAttributesModel[AttributesFullAlbums]] = Field([])
+
+
+class SmallAlbumsModel(BaseModel):
+    href: Optional[str] = None
+    attributes: Optional[AttributeName] = None
+    data: List[BaseIdTypeHrefAttributesModel[AttributesFullAlbums]] = Field([])
diff --git a/shazamio/schemas/artist/views/last_release.py b/shazamio/schemas/artist/views/last_release.py
index ce9518e..4a7414e 100644
--- a/shazamio/schemas/artist/views/last_release.py
+++ b/shazamio/schemas/artist/views/last_release.py
@@ -4,16 +4,12 @@
 
 from pydantic import BaseModel, Field
 
+from shazamio.schemas.play_params import PlayParams
 from shazamio.schemas.attributes import AttributeName
-from shazamio.schemas.base import BaseDataModel
+from shazamio.schemas.base import BaseAttributesModel
 from shazamio.schemas.photos import ImageModel
 
 
-class PlayParams(BaseModel):
-    id: str
-    kind: str
-
-
 class AttributeLastRelease(BaseModel):
     copyright: str
     genre_names: List[str] = Field(..., alias="genreNames")
@@ -39,4 +35,4 @@ class AttributeLastRelease(BaseModel):
 class LastReleaseModel(BaseModel):
     href: Optional[str] = None
     attributes: Optional[AttributeName] = None
-    data: Optional[List[BaseDataModel[AttributeLastRelease]]] = None
+    data: Optional[List[BaseAttributesModel[AttributeLastRelease]]] = None
diff --git a/shazamio/schemas/artist/views/simular_artists.py b/shazamio/schemas/artist/views/simular_artists.py
index 5147835..8ea7e6e 100644
--- a/shazamio/schemas/artist/views/simular_artists.py
+++ b/shazamio/schemas/artist/views/simular_artists.py
@@ -32,10 +32,7 @@ class Relationships(BaseModel):
     albums: BaseHrefNextData[List[BaseIdTypeHref]]
 
 
-class Datum(BaseModel):
-    id: str
-    type: str
-    href: str
+class Datum(BaseIdTypeHref):
     attributes: Attributes
     relationships: Relationships
 
diff --git a/shazamio/schemas/artist/views/top_music.py b/shazamio/schemas/artist/views/top_music.py
index 8886311..2829437 100644
--- a/shazamio/schemas/artist/views/top_music.py
+++ b/shazamio/schemas/artist/views/top_music.py
@@ -4,16 +4,12 @@
 
 from pydantic import BaseModel, Field
 
+from shazamio.schemas.play_params import PlayParams
 from shazamio.schemas.attributes import AttributeName
-from shazamio.schemas.base import BaseDataModel
+from shazamio.schemas.base import BaseAttributesModel
 from shazamio.schemas.photos import ImageModel
 
 
-class PlayParams(BaseModel):
-    id: str
-    kind: str
-
-
 class Preview(BaseModel):
     url: str
     hls_url: str = Field(..., alias="hlsUrl")
@@ -42,4 +38,4 @@ class Attributes(BaseModel):
 class TopMusicVideosView(BaseModel):
     href: Optional[str] = None
     attributes: Optional[AttributeName] = None
-    data: Optional[List[BaseDataModel[Attributes]]] = None
+    data: Optional[List[BaseAttributesModel[Attributes]]] = None
diff --git a/shazamio/schemas/artist/views/top_song.py b/shazamio/schemas/artist/views/top_song.py
index 8b0e135..894b6ae 100644
--- a/shazamio/schemas/artist/views/top_song.py
+++ b/shazamio/schemas/artist/views/top_song.py
@@ -6,7 +6,7 @@
 
 from shazamio.schemas.artist.views.top_music import PlayParams
 from shazamio.schemas.attributes import AttributeName
-from shazamio.schemas.base import BaseDataModel
+from shazamio.schemas.base import BaseAttributesModel, BaseIdTypeHref
 from shazamio.schemas.photos import ImageModel
 from shazamio.schemas.urls import UrlDTO
 
@@ -36,9 +36,6 @@ class AttributesTopSong(BaseModel):
     content_rating: Optional[str] = Field(None, alias="contentRating")
 
 
-class TopSong(BaseModel):
-    id: Optional[str] = None
-    type: Optional[str] = None
-    href: Optional[str] = None
+class TopSong(BaseIdTypeHref):
     attributes: Optional[AttributeName] = None
-    data: Optional[List[BaseDataModel[AttributesTopSong]]] = None
+    data: Optional[List[BaseAttributesModel[AttributesTopSong]]] = None
diff --git a/shazamio/schemas/artists.py b/shazamio/schemas/artists.py
index 9105998..31b40fd 100644
--- a/shazamio/schemas/artists.py
+++ b/shazamio/schemas/artists.py
@@ -7,6 +7,7 @@
 from pydantic import BaseModel
 from pydantic import Field
 
+from shazamio.schemas.base import BaseIdTypeHref
 from shazamio.schemas.artist.views.full_albums import FullAlbumsModel
 from shazamio.schemas.artist.views.last_release import LastReleaseModel
 from shazamio.schemas.artist.views.simular_artists import SimularArtist
@@ -63,16 +64,10 @@ def url_with_size(cls, height: int, width: int) -> str:
         return cls.url.format(w=width, h=height)
 
 
-class AlbumRelationshipElement(BaseModel):
-    id: str
-    type: str
-    href: str
-
-
 class AlbumRelationship(BaseModel):
     href: str
     next: Optional[str] = None
-    data: List[AlbumRelationshipElement]
+    data: List[BaseIdTypeHref]
 
 
 class ArtistRelationships(BaseModel):
diff --git a/shazamio/schemas/base.py b/shazamio/schemas/base.py
index 7347a2b..98a184c 100644
--- a/shazamio/schemas/base.py
+++ b/shazamio/schemas/base.py
@@ -5,21 +5,34 @@
 from pydantic import BaseModel
 from pydantic.generics import GenericModel
 
-
 T = TypeVar("T", bound=BaseModel)
 
 
-class BaseIdTypeHref(BaseModel):
+class BaseHref(BaseModel):
+    href: str
+
+
+class BaseIdTypeHref(BaseHref):
     id: str
     type: str
-    href: str
 
 
-class BaseDataModel(GenericModel, BaseModel, Generic[T]):
+class BaseIdTypeHrefAttributesModel(GenericModel, BaseIdTypeHref, Generic[T]):
     attributes: T
 
 
-class BaseHrefNextData(GenericModel, Generic[T]):
-    href: str
+class BaseAttributesModel(GenericModel, BaseModel, Generic[T]):
+    attributes: T
+
+
+class BaseDataModel(GenericModel, BaseModel, Generic[T]):
+    data: T
+
+
+class BaseHrefNextData(GenericModel, BaseHref, Generic[T]):
     next: Optional[str] = None
     data: T
+
+
+class BaseHrefData(GenericModel, BaseHref, Generic[T]):
+    data: T
diff --git a/shazamio/schemas/content_version.py b/shazamio/schemas/content_version.py
new file mode 100644
index 0000000..31ed6ec
--- /dev/null
+++ b/shazamio/schemas/content_version.py
@@ -0,0 +1,10 @@
+from pydantic import BaseModel, Field
+
+
+class ContentVersion(BaseModel):
+    rtci: int = Field(..., alias="RTCI")
+    mz_indexer: int = Field(..., alias="MZ_INDEXER")
+
+
+class MetaContentVersion(BaseModel):
+    content_version: ContentVersion = Field(..., alias="contentVersion")
diff --git a/shazamio/schemas/play_params.py b/shazamio/schemas/play_params.py
new file mode 100644
index 0000000..241f106
--- /dev/null
+++ b/shazamio/schemas/play_params.py
@@ -0,0 +1,6 @@
+from pydantic import BaseModel
+
+
+class PlayParams(BaseModel):
+    id: str
+    kind: str
diff --git a/shazamio/schemas/playlist/__init__.py b/shazamio/schemas/playlist/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/shazamio/schemas/playlist/playlist.py b/shazamio/schemas/playlist/playlist.py
new file mode 100644
index 0000000..94ca77f
--- /dev/null
+++ b/shazamio/schemas/playlist/playlist.py
@@ -0,0 +1,45 @@
+from typing import List, Optional
+
+from pydantic import BaseModel, Field
+
+from shazamio.schemas.base import BaseHrefData, BaseIdTypeHref
+from shazamio.schemas.content_version import MetaContentVersion
+from shazamio.schemas.photos import ImageModel
+from shazamio.schemas.play_params import PlayParams
+from shazamio.schemas.urls import UrlDTO
+
+
+class PlayListRelationshipDTO(BaseModel):
+    music_videos: BaseHrefData[List[BaseIdTypeHref]] = Field([], alias="music-videos")
+    artists: BaseHrefData[List[BaseIdTypeHref]] = Field([], alias="artists")
+
+
+class PlayListAttributes(BaseModel):
+    has_time_synced_lyrics: bool = Field(..., alias="hasTimeSyncedLyrics")
+    album_name: str = Field(..., alias="albumName")
+    genre_names: List[str] = Field(..., alias="genreNames")
+    track_number: int = Field(..., alias="trackNumber")
+    release_date: Optional[str] = Field(None, alias="releaseDate")
+    duration_in_millis: Optional[int] = Field(None, alias="durationInMillis")
+    is_vocal_attenuation_allowed: bool = Field(..., alias="isVocalAttenuationAllowed")
+    is_mastered_for_itunes: bool = Field(..., alias="isMasteredForItunes")
+    isrc: str
+    artwork: ImageModel
+    audio_locale: str = Field(..., alias="audioLocale")
+    url: str
+    play_params: Optional[PlayParams] = Field(None, alias="playParams")
+    disc_number: int = Field(..., alias="discNumber")
+    has_credits: bool = Field(..., alias="hasCredits")
+    is_apple_digital_master: bool = Field(..., alias="isAppleDigitalMaster")
+    has_lyrics: bool = Field(..., alias="hasLyrics")
+    audio_traits: List[str] = Field(..., alias="audioTraits")
+    name: str
+    previews: List[UrlDTO]
+    content_rating: Optional[str] = Field(None, alias="contentRating")
+    artist_name: str = Field(..., alias="artistName")
+
+
+class PlayList(BaseIdTypeHref):
+    attributes: PlayListAttributes
+    relationships: PlayListRelationshipDTO
+    meta: MetaContentVersion
diff --git a/shazamio/serializers.py b/shazamio/serializers.py
index 9244d38..7a4bbed 100644
--- a/shazamio/serializers.py
+++ b/shazamio/serializers.py
@@ -1,5 +1,6 @@
-from typing import Union
+from typing import Union, List
 
+from shazamio.schemas.base import BaseDataModel
 from shazamio.factory_misc import FACTORY_ARTIST
 from shazamio.factory_misc import FACTORY_TRACK
 from shazamio.schemas.artist.views.full_albums import FullAlbumsModel
@@ -9,6 +10,8 @@
 from shazamio.schemas.models import ResponseTrack
 from shazamio.schemas.models import TrackInfo
 from shazamio.schemas.models import YoutubeData
+from shazamio.schemas.album import AlbumModel
+from shazamio.schemas.playlist.playlist import PlayList
 
 
 class Serialize:
@@ -16,6 +19,14 @@ class Serialize:
     def track(cls, data):
         return FACTORY_TRACK.load(data, TrackInfo)
 
+    @classmethod
+    def playlist(cls, data) -> PlayList:
+        return PlayList.parse_obj(data)
+
+    @classmethod
+    def playlists(cls, data) -> List[PlayList]:
+        return [cls.playlist(pl) for pl in data.get("data", [])]
+
     @classmethod
     def youtube(cls, data):
         return FACTORY_TRACK.load(data, YoutubeData)
@@ -35,3 +46,7 @@ def artist(cls, data):
     @classmethod
     def full_track(cls, data):
         return FACTORY_TRACK.load(data, ResponseTrack)
+
+    @classmethod
+    def album_info(cls, data) -> BaseDataModel[List[AlbumModel]]:
+        return BaseDataModel[List[AlbumModel]].parse_obj(data)
diff --git a/shazamio/typehints.py b/shazamio/typehints.py
index 90cc5bc..7c4d1eb 100644
--- a/shazamio/typehints.py
+++ b/shazamio/typehints.py
@@ -1,8 +1,6 @@
-class CountryCode:
+class CountryCode(str):
     """ISO 3166-3 alpha-2 code. Example: RU,NL,UA"""
 
-    pass
-
 
 class ShazamResponse:
     """Dictionary with found data on request"""


Test patch:
diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml
index 82c11dc..899b306 100644
--- a/.github/workflows/pytest.yml
+++ b/.github/workflows/pytest.yml
@@ -46,12 +46,12 @@ jobs:
 
       - name: Install dependencies
         if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'
-        run: poetry install --no-interaction --no-root
+        run: poetry install --only=dev --no-interaction --no-root
       #----------------------------------------------
       # install your root project, if required
       #----------------------------------------------
       - name: Install library
-        run: poetry install --no-interaction
+        run: poetry install --only=dev  --no-interaction
       #----------------------------------------------
       #              run test suite
       #----------------------------------------------
diff --git a/tests/conftest.py b/tests/conftest.py
index c264e92..e69de29 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,11 +0,0 @@
-import asyncio
-
-import pytest_asyncio
-
-
-@pytest_asyncio.fixture(scope="session", autouse=True)
-def event_loop():
-    loop = asyncio.get_event_loop_policy().get_event_loop()
-    yield loop
-    loop.run_until_complete(asyncio.sleep(0.025))
-    loop.close()
diff --git a/tests/test_recognize.py b/tests/test_recognize.py
index b115136..ced6a12 100644
--- a/tests/test_recognize.py
+++ b/tests/test_recognize.py
@@ -9,25 +9,24 @@
 
 @pytest_asyncio.fixture(scope="session")
 async def song_bytes():
-    yield await get_file_bytes(file="examples/data/dora.ogg")
+    bytes_data = await get_file_bytes(file="examples/data/Gloria.ogg")
+    yield bytes_data
 
 
 @pytest.mark.asyncio
 async def test_recognize_song_file():
     shazam = Shazam()
-    out = await shazam.recognize(data="examples/data/dora.ogg")
-
+    out = await shazam.recognize(data="examples/data/Gloria.ogg")
     assert out.get("matches") != []
-    assert out["track"]["key"] == "549679333"
+    assert out["track"]["key"] == "53982678"
 
 
 @pytest.mark.asyncio
 async def test_recognize_song_bytes(song_bytes: bytes):
     shazam = Shazam()
     out = await shazam.recognize(data=song_bytes)
-
     assert out.get("matches") != []
-    assert out["track"]["key"] == "549679333"
+    assert out["track"]["key"] == "53982678"
 
 
 @pytest.mark.asyncio