Elixir client for the Discogs API.
Discogs is the world's largest crowdsourced music database. ExDisco provides a type-safe, ergonomic Elixir interface to query artists, releases, labels, and users, with support for both personal token and OAuth 1.0a authentication.
Getting Started
Start by configuring a user-agent (required by Discogs):
config :ex_disco, ExDisco,
user_agent: "my_app/1.0.0 (+https://github.com/me/my_app)"Then fetch data:
{:ok, artist} = ExDisco.Artists.get(1)
IO.inspect(artist.name)See the resource modules for specific data types:
ExDisco.Artists— Query artistsExDisco.Releases— Query releases (albums, EPs, etc.)ExDisco.Labels— Query record labelsExDisco.Users— Query user profilesExDisco.Search— Global search
Configuration
Required: User Agent
Discogs requires all applications identify themselves with a user agent:
config :ex_disco, ExDisco,
user_agent: "my_app/1.0.0 (+https://github.com/me/my_app)"Optional: Authentication
Choose one of two approaches:
Personal Token (Simple)
For personal scripts, CLIs, and single-user applications. Get a token at https://www.discogs.com/settings/developers, then configure it:
config :ex_disco, ExDisco,
user_token: "your_token"Use it in requests:
token = ExDisco.Auth.user_token("your_token")
Request.get("/users/me")
|> Request.put_auth(token)
|> Request.execute(&User.Identity.from_api/1)OAuth 1.0a (Multi-User)
For applications acting on behalf of multiple users. Register your app at https://www.discogs.com/settings/developers to obtain consumer credentials:
config :ex_disco, ExDisco,
consumer_key: "your_consumer_key",
consumer_secret: "your_consumer_secret"Each user goes through the OAuth flow to obtain their own access token and secret. Store these per-user and pass them to authenticated requests:
credentials = ExDisco.Auth.oauth_credentials(
consumer_key,
consumer_secret,
user.discogs_token,
user.discogs_token_secret
)
Request.get("/users/me")
|> Request.put_auth(credentials)
|> Request.execute(&User.Identity.from_api/1)See ExDisco.Auth for the complete OAuth flow documentation.
Examples
Fetch an artist:
{:ok, artist} = ExDisco.Artists.get(1)Fetch release information:
{:ok, release} = ExDisco.Releases.get_release(249504)Search the database:
{:ok, page} = ExDisco.Search.query([q: "Thriller", type: :release])
IO.inspect(page.items)Handle errors:
case ExDisco.Artists.get(9999999) do
{:ok, artist} -> IO.inspect(artist)
{:error, error} -> IO.inspect("Error: #{error.message}")
endSee the request builder for advanced usage:
{:ok, releases} = ExDisco.Request.get("/artists/1/releases")
|> ExDisco.Request.put_query(per_page: 25)
|> ExDisco.Request.execute_collection("releases", &ReleaseSummary.from_api/1)