Skip to main content

Bandcamp Async API

Project description

Stand With Ukraine Made in Ukraine Stand With Ukraine Russian Warship Go Fuck Yourself

Bandcamp Async API

A modern, asynchronous Python client for the Bandcamp API.

This project was created to implement a Bandcamp music provider for Music Assistant, enabling seamless integration of Bandcamp's music catalog into home audio systems.

Features

  • Search: Search for artists, albums, and tracks across Bandcamp
  • Albums: Retrieve detailed album information including track listings
  • Tracks: Get individual track details and streaming information
  • Artists: Access artist profiles, discographies, and metadata
  • Collections: Browse user collections (requires authentication)
  • Async: Fully asynchronous API using aiohttp
  • Type-safe: Complete type hints for all models and methods
  • Well-tested: Comprehensive test suite with real API data

Installation

Install from PyPI:

pip install bandcamp-async-api

Or using uv:

uv add bandcamp-async-api

Quick Start

import asyncio
from bandcamp_async_api import BandcampAPIClient

async def main():
    async with BandcampAPIClient(identity_token='7%09optional_identity_token%7D') as client:
        # Search for music
        results = await client.search("radiohead")
        print(f"Found {len(results)} results")

        # Get album details
        if results:
            album_result = next(r for r in results if r.type == "album")
            album = await client.get_album(album_result.artist_id, album_result.id)
            print(f"Album: {album.title} by {album.artist.name}")

        # Get artist information
        artist_result = next(r for r in results if r.type == "artist")
        artist = await client.get_artist(artist_result.id)
        print(f"Artist: {artist.name} - {artist.bio}")

if __name__ == '__main__':
    asyncio.run(main())

Authentication

For accessing user collections, you need to obtain an identity token from Bandcamp cookies:

from bandcamp_async_api import BandcampAPIClient

client = BandcampAPIClient(identity_token="your_identity_token")

API Reference

Core Client

  • BandcampAPIClient() - Main API client
  • search(query: str) - Search Bandcamp
  • get_album(artist_id, album_id) - Get album details
  • get_track(artist_id, track_id) - Get track details
  • get_artist(artist_id) - Get artist details
  • get_collection_summary() - Get collection overview
  • get_collection_items() - Get collection items with pagination
  • get_artist_discography(artist_id) - Get artist's complete discography

Data Models

  • SearchResultItem - Base search result
  • BCAlbum - Album with tracks and metadata
  • BCTrack - Individual track information
  • BCArtist - Artist/band profile
  • CollectionSummary - User's collection data
  • CollectionItem - Individual collection item

Exceptions

  • BandcampAPIError - Base API error
  • BandcampNotFoundError - Resource not found
  • BandcampBadQueryError - Invalid search query

Error Handling

The client provides specific exception types for different error conditions:

from bandcamp_async_api import (
    BandcampAPIClient,
    BandcampNotFoundError,
    BandcampAPIError
)

async def safe_get_album(client, artist_id, album_id):
    try:
        return await client.get_album(artist_id, album_id)
    except BandcampNotFoundError:
        print("Album not found")
        return None
    except BandcampAPIError as e:
        print(f"API error: {e}")
        return None

Development

Setup

# Clone the repository
git clone https://github.com/ALERTua/bandcamp_async_api.git
cd bandcamp_async_api

# Install dependencies
uv sync --dev

# Run tests
uv run pytest

# Run linting
uv run ruff check

Testing

The project includes comprehensive tests:

# Run all tests
uv run pytest

# Run integration tests (requires real API access)
echo "BANDCAMP_IDENTITY_TOKEN=7%09identity_token%7D" > .env
uv run pytest tests/real_data/

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Add tests for new functionality
  4. Ensure all tests pass
  5. Submit a pull request

This project is built based on data from:

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

bandcamp_async_api-0.0.3.tar.gz (8.6 kB view details)

Uploaded Source

Built Distribution

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

bandcamp_async_api-0.0.3-py3-none-any.whl (10.1 kB view details)

Uploaded Python 3

File details

Details for the file bandcamp_async_api-0.0.3.tar.gz.

File metadata

  • Download URL: bandcamp_async_api-0.0.3.tar.gz
  • Upload date:
  • Size: 8.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for bandcamp_async_api-0.0.3.tar.gz
Algorithm Hash digest
SHA256 dbe04b1c3beb1634a6ec59432c8c4cb095467cb0b08886c2d6d6df8eac6fd2e1
MD5 aa0d5606d077137d43f241299a9a09f1
BLAKE2b-256 3e7c93801e5eef0d6fbe00c2ff1f5bf4ac69f0e5b0f9a3b2766363dcc03cf187

See more details on using hashes here.

File details

Details for the file bandcamp_async_api-0.0.3-py3-none-any.whl.

File metadata

  • Download URL: bandcamp_async_api-0.0.3-py3-none-any.whl
  • Upload date:
  • Size: 10.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for bandcamp_async_api-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 84e00c0537af1db9f0e0963d2b831eecce77aca92b245e71aef3692c31262992
MD5 08d19b23c8a85e8b6f4a8be3cf7b3a65
BLAKE2b-256 00873c14251858bd7c350b1f3746615ed5ef2947f1b77a3b42fd0e1ef7622f5b

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