Melodic is a Python client for fetching artist lyrical discographies. This library provides an asynchronous interface to retrieve complete artist discographies, including album and track metadata including lyrics, with built-in database storage, proxy support, and great error handling.
- Complete Discography Fetching: Retrieves full discography metadata and lyrics for any given artist.
- Asynchronous Interface: Built with modern
async withpatterns for efficient, safe I/O operations. - Database Storage: Optional built-in storage system for organizing artist, album, and track data.
- Proxy Support: Easily pass a list of
HTTPorSOCKSproxies to route requests through. - Robust Error Handling: Comprehensive error handling and logging for reliable operations.
- Modern Development Tools: Includes ruff, mypy, pre-commit, and commitizen for high-quality code.
pip install melodicYou can install melodic by cloning the repository directly or using pre-built wheel files.
Prerequisites: This project requires uv for dependency management.
-
Clone the repository:
git clone https://github.com/filming/melodic.git cd melodic -
Install the project and its dependencies:
uv sync
Pre-built wheel files are automatically generated and attached to each GitHub release. You can download and install them directly:
- Go to the GitHub releases page
- Download the
.whlfile from the latest release - Install using pip:
pip install path/to/downloaded/melodic-*.whl
Here's a basic example of how to use melodic to fetch the discography of an artist:
import asyncio
from melodic import Melodic
async def main():
async with Melodic(storage_path="lyrics.db") as melodic:
discography = await melodic.get_discography("Taylor Swift")
if __name__ == "__main__":
asyncio.run(main())This script will fetch the entire lyrical discography for Taylor Swift and will return it directly to the calling line in the form of a list of Track objects. It will also store the discography into a lyrics.db SQLite database if storage_path is provided.
Configuration is managed through the Melodic client during initialization.
-
storage_path:str | Path | None(Default:None)- The file path where the SQLite database will be stored. If
None, the database will be created in memory and will not be saved to disk.
- The file path where the SQLite database will be stored. If
-
proxies:list[str] | None(Default:None)- A list of proxy strings (e.g.,
["http://user:pass@host:port"]). If provided, all network requests will be rotated through these proxies.
- A list of proxy strings (e.g.,
-
max_concurrent_requests:int(Default:10)- The maximum number of concurrent
aiohttprequests to make at one time.
- The maximum number of concurrent
-
max_retry_attempts:int(Default: 10)- The maximum amount of times to retry a failed fetch.
-
request_delay:float(Default:3.5)- The cooldown period (in seconds) for a proxy after it has been used. This helps prevent rate-limiting.
-
user_agent:str | None(Default:None)- A custom User-Agent string for network requests. If
None, a defaultaiohttpUser-Agent is used.
- A custom User-Agent string for network requests. If
-
batch_save_size:int(Default:20)- The number of tracks to accumulate in memory before saving them to the database in a single transaction.
This project uses modern Python development tools:
- uv for dependency management
- ruff for linting and formatting
- mypy for type checking
- pre-commit for git hooks
- commitizen for conventional commits
-
Clone the repository:
git clone https://github.com/filming/melodic.git cd melodic -
Install dependencies (including dev tools):
uv sync --extra dev
-
Set up pre-commit hooks:
uv run pre-commit install
-
Start developing!
All project dependencies are managed via pyproject.toml and use Python 3.10+.
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions, bug reports, and feature requests are welcome! Please open an issue or submit a pull request on GitHub.