A modular, async Python client for the Shazam API
Project description
xazam
A modular, async Python client for the Shazam API, built on top of shazamio_core for robust audio fingerprinting.
Features
- Track identification — send audio bytes and get back track metadata.
- Artist metadata scraping — resolve artist pages and query the Apple Music catalog proxy.
- Modular transport —
ShazamTransporthandles headers and sessions;ShazamClientandShazamScraperbuild on top of it.
Install
pip install -e .
# or with dev dependencies
pip install -e ".[dev]"
Quick start
Identify a track (typed API — recommended)
import asyncio
from xazam import ShazamClient, ShazamTransport
async def main():
with open("song.mp3", "rb") as f:
audio = f.read()
async with ShazamTransport() as transport:
client = ShazamClient(transport)
result = await client.identify(audio)
if result.matched:
track = result.track
print(f"{track.title} — {track.subtitle}")
print(f"Cover art: {track.cover_art}")
print(f"Apple Music: {track.apple_music_url}")
print(f"Spotify: {track.spotify_uri}")
print(f"Lyrics: {track.lyrics[:200]}...")
else:
print("No match")
asyncio.run(main())
Fetch extra track metadata
After identification, query the track detail endpoint for lyrics, related videos, and extended metadata:
extra = await client.get_track_info(track.key)
print(extra.metadata_table) # {'Album': '…', 'Released': '…', 'Label': '…'}
print(extra.related_videos) # ['https://youtube.com/watch?v=…', ...]
Identify a track (legacy raw-dict API)
identify_track() still returns the raw Shazam JSON for backwards
compatibility:
result = await client.identify_track(audio)
print(result["track"]["title"], "—", result["track"]["subtitle"])
Scrape artist metadata
import asyncio
from xazam import ShazamScraper, ShazamTransport
async def main():
async with ShazamTransport() as transport:
scraper = ShazamScraper(transport)
data = await scraper.get_artist_metadata("3996865")
artist = data["results"]["artists"]["data"][0]
print(artist["attributes"]["name"])
asyncio.run(main())
CLI
# Identify a file
python -m xazam_cli identify --file song.mp3
# Scrape artist metadata
python -m xazam_cli scrape --artist-id 3996865
Tests
Live integration tests hit the real Shazam API. Set a custom audio file via the environment:
export SHAZAMPY_TEST_AUDIO="/path/to/track.mp3"
pytest tests/test_integration.py -v
Architecture
| Module | Purpose |
|---|---|
client.py |
ShazamClient — high-level track identification |
scraper.py |
ShazamScraper — artist name resolution + catalog search |
transport.py |
ShazamTransport — aiohttp sessions, headers, request helpers |
models.py |
Track, Artist dataclasses |
Status
- ✅ Artist metadata scraping (405 resolved via dedicated web-page session)
- ✅ Track identification (matches returned correctly via
shazamio_corefingerprinting)
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file xazam-0.1.2.tar.gz.
File metadata
- Download URL: xazam-0.1.2.tar.gz
- Upload date:
- Size: 9.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
819a09524339041c99b35689df36b0fa669b68dd8e1c0759f3498953e50e6b84
|
|
| MD5 |
dca1a514a5bad1f3ef91d3bb3290abd8
|
|
| BLAKE2b-256 |
35a121cc33f723b4e2e07b76177512aa5640667ef4c5c6f7ff2ff1db89000441
|
File details
Details for the file xazam-0.1.2-py3-none-any.whl.
File metadata
- Download URL: xazam-0.1.2-py3-none-any.whl
- Upload date:
- Size: 9.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1d19a732edcf38fbc43356927e64a983d02214cc6bf87f9302fe647c237348d
|
|
| MD5 |
88006f40c41cd8aa4e583085992857f0
|
|
| BLAKE2b-256 |
a59b1222e6ca80dcc2ed54b9c384dbc9ce57be86f8213a917fa521d7541b697e
|