Skip to main content
Glama
04-playlists.md8.85 kB
# Playlist API ## Overview Complete playlist management including creation, modification, track management, and import/export. ## Playlist Endpoints ### Base URL: `/api/playlist` ### GET /api/playlist List all playlists accessible to the user. **Query Parameters:** - `_start` (number): Starting index - `_end` (number): Ending index - `_sort` (string): Sort field - `_order` (string): ASC/DESC - `filter` (string): JSON filter criteria **Response (200 OK):** ```json [ { "id": "string", "name": "string", "comment": "string", "duration": number, // Total duration in seconds "owner": "string", // Owner display name "ownerId": "string", // Owner user ID "public": boolean, // Public visibility "songCount": number, // Number of tracks "createdAt": "ISO-8601", "updatedAt": "ISO-8601", "tracks": [], // Optional: included if requested "rules": {} // Smart playlist rules (if applicable) } ] ``` ### GET /api/playlist/{id} Get a specific playlist by ID. ### POST /api/playlist Create a new playlist. **Request Body (JSON):** ```json { "name": "string (required)", "comment": "string", "public": boolean, "rules": {} // Optional: for smart playlists } ``` **Request Body (M3U file):** - Content-Type: `audio/x-mpegurl` or `application/x-mpegurl` - Body: M3U/M3U8 playlist file content **Response (201 Created):** Created playlist object or M3U content (if uploaded) ### PUT /api/playlist/{id} Update playlist metadata. **Request Body:** ```json { "name": "string", "comment": "string", "public": boolean, "rules": {} } ``` ### DELETE /api/playlist/{id} Delete a playlist (owner or admin only). ## Playlist Track Management ### GET /api/playlist/{playlistId}/tracks Get all tracks in a playlist. **Query Parameters:** - `_start` (number): Starting index - `_end` (number): Ending index **Response Headers:** - Content-Type: `application/json` or `audio/x-mpegurl` (based on Accept header) **Response (200 OK) - JSON:** ```json [ { "id": number, // Track position ID in playlist "mediaFileId": "string", // Song ID "playlistId": "string", "title": "string", "album": "string", "artist": "string", "albumArtist": "string", "duration": number, "bitRate": number, "path": "string", // ... all song fields } ] ``` **Response (200 OK) - M3U:** When Accept header is `audio/x-mpegurl`, returns M3U8 playlist file for export. ### GET /api/playlist/{playlistId}/tracks/{id} Get a specific track in a playlist by position. ### POST /api/playlist/{playlistId}/tracks Add tracks to a playlist. **Request Body:** ```json { "ids": ["songId1", "songId2"], // Song IDs to add "albumIds": ["albumId1"], // Album IDs to add (all tracks) "artistIds": ["artistId1"], // Artist IDs to add (all tracks) "discs": [ // Specific discs to add { "albumId": "string", "discNumber": number } ] } ``` **Response (200 OK):** ```json { "added": number // Number of tracks added } ``` ### DELETE /api/playlist/{playlistId}/tracks Remove tracks from a playlist. **Query Parameters:** - `id` (string/array): Track position ID(s) to remove **Response (200 OK):** ```json { "ids": ["id1", "id2"] // Removed track IDs } ``` ### DELETE /api/playlist/{playlistId}/tracks/{id} Remove a specific track by position. ### PUT /api/playlist/{playlistId}/tracks/{id} Reorder a track in the playlist. **Request Body:** ```json { "insert_before": "number" // New position (0-based index) } ``` **Response (200 OK):** ```json { "id": "number" // Track position ID } ``` ## Playlist Import/Export ### Import M3U/M3U8 POST to `/api/playlist` with Content-Type `audio/x-mpegurl`: - Automatically matches tracks by path or search - Creates playlist with matched tracks - Returns created playlist in M3U format ### Export M3U/M3U8 GET `/api/playlist/{playlistId}/tracks` with Accept header `audio/x-mpegurl`: - Returns playlist in M3U8 format - Includes #EXTM3U header - Includes #EXTINF metadata for each track - Uses absolute paths or streaming URLs ## Permissions | Action | Own Playlists | Public Playlists | Private Playlists | Admin | |--------|---------------|------------------|-------------------|-------| | View | Yes | Yes | Owner only | All | | Create | Yes | - | - | Yes | | Update | Yes | No | No | All | | Delete | Yes | No | No | All | | Add tracks | Yes | No | No | Owner | | Remove tracks | Yes | No | No | Owner | | Reorder tracks | Yes | No | No | Owner | ## Smart Playlists Smart playlists in Navidrome are dynamic playlists that automatically update based on specified criteria. They are created using `.nsp` (Navidrome Smart Playlist) files and follow a specific JSON structure. ### Creating Smart Playlists Smart playlists are created by placing `.nsp` files in your music library or playlist folder. These files contain JSON objects with rules that define which tracks should be included. ### Basic Structure ```json { "name": "My Smart Playlist", "comment": "Description of the playlist", "all": [ // Rules that ALL must be true ], "any": [ // Rules where ANY can be true ], "sort": "field_name", "order": "asc|desc", "limit": number, "offset": number } ``` ### Available Fields **Media Information:** - `title`, `album`, `artist`, `albumartist` - `year`, `originalyear`, `releaseyear` - `date`, `originaldate`, `releasedate` (format: "YYYY-MM-DD") - `tracknumber`, `discnumber`, `discsubtitle` - `genre`, `comment`, `lyrics` - `compilation` (boolean) - `albumtype`, `albumcomment`, `catalognumber` **File Properties:** - `filepath` (relative to music library) - `filetype` (file extension) - `duration` (seconds) - `bitrate`, `bitdepth`, `bpm`, `channels` - `size` (bytes) - `dateadded`, `datemodified` **User Data:** - `loved` (boolean) - `dateloved` - `lastplayed` - `playcount` - `rating` (0-5) **MusicBrainz IDs:** - `mbz_album_id`, `mbz_artist_id`, `mbz_recording_id` - `mbz_album_artist_id`, `mbz_release_track_id`, `mbz_release_group_id` **System:** - `library_id` ### Operators **Equality/Comparison:** - `is`: Exact match - `isNot`: Not equal - `gt`: Greater than - `lt`: Less than - `gte`: Greater than or equal - `lte`: Less than or equal **Text Matching:** - `contains`: Contains substring - `notContains`: Does not contain - `startsWith`: Starts with - `endsWith`: Ends with **Range/Date:** - `inTheRange`: Within range [min, max] - `notInTheRange`: Outside range - `inTheLast`: Within last N days - `notInTheLast`: Not in last N days - `before`: Before date - `after`: After date - `today`: Today - `yesterday`: Yesterday - `thisWeek`: This week - `lastWeek`: Last week - `thisMonth`: This month - `lastMonth`: Last month - `thisYear`: This year - `lastYear`: Last year **Playlist References:** - `inPlaylist`: Track is in specified playlist - `notInPlaylist`: Track is not in specified playlist ### Example Smart Playlists **Recently Played:** ```json { "name": "Recently Played", "comment": "Tracks played in the last 30 days", "all": [ {"inTheLast": {"lastplayed": 30}} ], "sort": "lastplayed", "order": "desc", "limit": 100 } ``` **High Rated 80s Music:** ```json { "name": "80s Favorites", "all": [ {"inTheRange": {"year": [1980, 1989]}}, {"gte": {"rating": 4}} ], "sort": "rating,year", "order": "desc", "limit": 50 } ``` **Complex Multi-Condition:** ```json { "name": "Discovery Mix", "all": [ { "any": [ {"is": {"loved": true}}, {"gte": {"rating": 4}} ] }, {"lte": {"playcount": 2}}, {"inTheLast": {"dateadded": 90}} ], "sort": "random", "limit": 25 } ``` ### File Management 1. **Location**: Place `.nsp` files in your music library or the path specified by `PlaylistsPath` configuration 2. **Import**: Smart playlists are imported during library scans 3. **Updates**: Edit the `.nsp` file and rescan to update rules 4. **Permissions**: Set `public: true` to make accessible to all users ### API Integration Smart playlists appear in regular playlist API endpoints with: - `rules` field contains the criteria object - `evaluatedAt` timestamp shows last refresh - Tracks are read-only (cannot be manually modified) - Use `refreshSmartPlaylist=true` parameter to force re-evaluation ### Important Notes - Dates must use "YYYY-MM-DD" format - Boolean values must not be in quotes: `{"is": {"loved": true}}` - File paths are relative to music library root - Smart playlists refresh automatically based on `SmartPlaylistRefreshDelay` config - Only publicly visible smart playlists can be referenced by other smart playlists - Currently requires manual `.nsp` file creation (UI planned for future releases)

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Blakeem/Navidrome-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server