Skip to main content

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 transportShazamTransport handles headers and sessions; ShazamClient and ShazamScraper build 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_core fingerprinting)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xazam-0.1.2.tar.gz (9.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

xazam-0.1.2-py3-none-any.whl (9.0 kB view details)

Uploaded Python 3

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

Hashes for xazam-0.1.2.tar.gz
Algorithm Hash digest
SHA256 819a09524339041c99b35689df36b0fa669b68dd8e1c0759f3498953e50e6b84
MD5 dca1a514a5bad1f3ef91d3bb3290abd8
BLAKE2b-256 35a121cc33f723b4e2e07b76177512aa5640667ef4c5c6f7ff2ff1db89000441

See more details on using hashes here.

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

Hashes for xazam-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 a1d19a732edcf38fbc43356927e64a983d02214cc6bf87f9302fe647c237348d
MD5 88006f40c41cd8aa4e583085992857f0
BLAKE2b-256 a59b1222e6ca80dcc2ed54b9c384dbc9ce57be86f8213a917fa521d7541b697e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page