Skip to content

Albums

The Albums service fetches album information from Spotify’s catalog.

Getting Albums

Get a single album

import { Effect } from "effect";
import { Albums, makeSpotifyLayer } from "@spotify-effect/core";
const program = Effect.gen(function* () {
const albums = yield* Albums;
const album = yield* albums.getAlbum("4aawyAB9vmqN3uQ7FjRGTy", {
market: "US",
});
console.log(`${album.name} by ${album.artists[0]?.name}`);
console.log(`Released: ${album.release_date}`);
console.log(`Tracks: ${album.total_tracks}`);
});

Get multiple albums

const program = Effect.gen(function* () {
const albums = yield* Albums;
const results = yield* albums.getAlbums(["4aawyAB9vmqN3uQ7FjRGTy", "6rqhFgbbKwnb9MLmUQDhG6"]);
for (const album of results) {
if (album) {
console.log(album.name);
}
}
});

Get album tracks

const program = Effect.gen(function* () {
const albums = yield* Albums;
const tracks = yield* albums.getAlbumTracks("4aawyAB9vmqN3uQ7FjRGTy", {
market: "US",
limit: 50,
});
for (const track of tracks.items) {
console.log(`${track.track_number}. ${track.name}`);
}
});

Options

OptionTypeDescription
marketstringISO country code for content availability

Examples

List album with all tracks

const getAlbumWithTracks = (albumId: string) =>
Effect.gen(function* () {
const albums = yield* Albums;
const album = yield* albums.getAlbum(albumId, { market: "US" });
const tracks = yield* albums.getAlbumTracks(albumId, {
market: "US",
limit: 50,
});
return {
...album,
trackList: tracks.items,
};
});

Search albums and fetch details

const searchAndGetAlbums = (query: string) =>
Effect.gen(function* () {
const search = yield* Search;
const albums = yield* Albums;
const results = yield* search.search(query, ["album"], { limit: 10 });
const albumIds = results.albums?.items.map((a) => a.id) ?? [];
const fullAlbums = yield* albums.getAlbums(albumIds);
return fullAlbums.filter((a): a is NonNullable<typeof a> => a !== null);
});

Get all tracks from a double album

import { paginateAll } from "@spotify-effect/core";
const getAllAlbumTracks = (albumId: string) =>
Effect.gen(function* () {
const albums = yield* Albums;
return yield* paginateAll(
(offset, limit) => albums.getAlbumTracks(albumId, { offset, limit }),
50,
);
});

Album Object

interface Album {
id: string;
name: string;
album_type: "album" | "single" | "compilation";
total_tracks: number;
available_markets: string[];
release_date: string;
release_date_precision: "year" | "month" | "day";
artists: SimplifiedArtist[];
tracks: Paging<SimplifiedTrack>;
genres: string[];
label: string;
popularity: number;
images: Image[];
}

Next steps