SkillAgentSearch skills...

Plexist

Plex+Playlist=Plexist, An application for recreating Apple Music, Deezer, Spotify, Tidal and QoBuz playlist with Plex (because Plex music playlist are a croc of tihs)

Install / Use

/learn @Gyarbij/Plexist

README

CodeQL DockerHub Docker Dev Image CI

🎵 Plexist

Plex + Playlist = Plexist — An application for recreating and syncing Deezer, Apple Music, Spotify, Qobuz, and Tidal playlists in Plex. (because Plex music playlist are a croc of tihs)

<p align="center"> <img src="./assets/plexist.png" width="802" alt="Plexist Logo" /> </p>

Features

| Feature | Description | |---------|-------------| | Playlist Sync | Recreates your streaming playlists in Plex using files from your library | | Multi-Service Sync | Sync playlists between any services (e.g., Spotify → Qobuz, Tidal → Plex) | | Auto Updates | Keeps playlists in sync with your streaming services | | New Playlists | Automatically creates Plex playlists when added to your streaming service | | Liked Tracks | Syncs favorited tracks to Plex as 5-star ratings (appears in "Liked Tracks" smart playlist) | | ISRC + MBID Matching | Uses ISRC codes and MusicBrainz MBID proxy matching, then falls back to fuzzy matching |

Supported Services

  • Spotify
  • Deezer
  • Apple Music
  • Tidal
  • Qobuz

Multi-Service Sync

Sync playlists between any two services — not just to Plex! Configure source → destination pairs to sync playlists directly between streaming services.

Supported Sync Directions

| Service | Read (Source) | Write (Destination) | |---------|:-------------:|:-------------------:| | Spotify | ✅ | ❌ | | Deezer | ✅ | ✅ | | Apple Music | ✅ | ✅* | | Tidal | ✅ | ✅ | | Qobuz | ✅ | ✅ | | Plex | ✅ | ✅ |

*Apple Music write has limitations: the API doesn't support clearing/deleting playlists, so tracks are appended to existing playlists rather than replaced.

Configuration

Set the SYNC_PAIRS environment variable with comma-separated source:destination pairs:

# Sync Spotify playlists to Qobuz
SYNC_PAIRS=spotify:qobuz

# Sync Tidal playlists to Plex
SYNC_PAIRS=tidal:plex

# Multiple sync pairs
SYNC_PAIRS=spotify:qobuz,tidal:plex,deezer:tidal

How It Works

  1. Fetches playlists from the source service
  2. Matches tracks in the destination using:
  • ISRC codes (International Standard Recording Code) for exact matching
  • MusicBrainz MBID proxy (ISRC → MusicBrainz → Plex MBID index)
  • Metadata fallback (title/artist/album) when ISRC/MBID unavailable
  1. Creates or updates playlists in the destination service
  2. Reports results including matched, missing, and failed tracks

💡 Note: When SYNC_PAIRS is configured, it replaces the default Plex-centric sync behavior. To sync to Plex, include it as a destination (e.g., spotify:plex).

What it will NOT do:

  • Steal Shit!

Prerequisites

Plex (Required)

| Variable | Description | |----------|-------------| | PLEX_URL | Your Plex server URL (e.g., http://192.168.0.69:32400) | | PLEX_TOKEN | Your Plex authentication token — How to find it |

Matching & Cache Options

| Variable | Default | Description | |----------|---------|-------------| | MUSICBRAINZ_ENABLED | 1 | Enable ISRC → MusicBrainz → MBID proxy matching | | MUSICBRAINZ_CACHE_TTL_DAYS | 90 | Cache duration for successful ISRC lookups | | MUSICBRAINZ_NEGATIVE_CACHE_TTL_DAYS | 7 | Cache duration for ISRCs not found in MusicBrainz | | MUSICBRAINZ_API_KEY | (optional) | Optional MusicBrainz API key (sent as a Bearer token) | | PLEX_EXTENDED_CACHE_ENABLED | 1 | Enable extended cache indexes for faster matching | | PLEX_DURATION_BUCKET_SECONDS | 5 | Duration bucket size used for matching heuristics |

Performance Tuning Recommendations

These settings control Plex API throughput and local CPU usage. Start with the tier that best matches your hardware and adjust if you see timeouts or rate-limit warnings.

| Hardware tier | Example devices | MAX_REQUESTS_PER_SECOND | MAX_CONCURRENT_REQUESTS | Notes | |---|---|---:|---:|---| | Low-power | Raspberry Pi 3/4, older mini PCs | 4–6 | 2–3 | Favor stability over speed; keep concurrency low. | | Entry NAS | Synology/QNAP (Celeron/Atom) | 6–8 | 3–4 | Increase only if CPU stays <70% and Plex remains responsive. | | Mid-range | Modern desktop CPU (4–8 cores) | 10–15 | 6–8 | Good default for most home servers. | | High-end | 12–24 core workstation/server | 15–25 | 8–12 | Watch Plex responsiveness during large syncs. | | Cloud VM | Azure T4 or similar | 12–18 | 6–10 | GPU doesn’t help this workload; tune based on CPU/RAM. | | Large server | 32+ cores, ample RAM | 20–30 | 12–16 | Use higher values only if Plex stays snappy. |

Tip: If you see Plex timeouts or slow UI response, reduce MAX_CONCURRENT_REQUESTS first, then lower MAX_REQUESTS_PER_SECOND.

Service Configuration

<details> <summary><strong>🟢 Spotify</strong></summary>

Requirements

Liked Tracks Sync (Optional)

To sync your Spotify liked/saved tracks to Plex ratings, set up OAuth authentication:

  1. Go to your Spotify Developer Dashboard
  2. Select your app → Edit Settings
  3. Add a Redirect URI (e.g., http://localhost:8888/callback)
  4. Set the SPOTIFY_REDIRECT_URI environment variable to match
  5. On first run, authorize the app (check container logs for the URL)
  6. Mount .spotify_cache as a volume to persist OAuth tokens

| Variable | Required | Description | |----------|----------|-------------| | SPOTIFY_CLIENT_ID | ✅ | Your Spotify app Client ID | | SPOTIFY_CLIENT_SECRET | ✅ | Your Spotify app Client Secret | | SPOTIFY_USER_ID | ✅ | Your Spotify user ID | | SPOTIFY_REDIRECT_URI | For liked tracks | OAuth redirect URI (e.g., http://localhost:8888/callback) | | SPOTIFY_CACHE_PATH | Optional | Path to cache OAuth tokens (e.g., /app/data/.spotify_cache) |

</details> <details> <summary><strong>🟣 Deezer</strong></summary>

Requirements

Get your Profile ID or Playlist IDs:

Profile ID:

  1. Login to deezer.com
  2. Click on your profile
  3. Grab the ID from the URL: https://www.deezer.com/profile/########

Playlist ID:

  • From URL: https://www.deezer.com/playlist/10484834882 → ID is 10484834882

Write Support (Sync TO Deezer)

To use Deezer as a sync destination (e.g., SYNC_PAIRS=spotify:deezer), you need an OAuth access token:

  1. Create an app at Deezer Developers
  2. Note your Application ID and Secret Key
  3. Install the deezer-python package: pip install deezer-python
  4. Run the OAuth helper:
    deezer-oauth YOUR_APP_ID YOUR_SECRET_KEY
    
  5. Open the URL in your browser and authorize the app
  6. Copy the access token from the callback URL

| Variable | Required | Description | |----------|----------|-------------| | DEEZER_USER_ID | One of these | Syncs all playlists for user | | DEEZER_PLAYLIST_ID | One of these | Space-separated playlist IDs | | DEEZER_ACCESS_TOKEN | For write operations | OAuth access token (see above) |

</details> <details> <summary><strong>🍎 Apple Music</strong></summary>

Requirements

Getting MusicKit Credentials

  1. Go to Certificates, Identifiers & Profiles
  2. Click + to create a new key
  3. Name it (e.g., "Plexist MusicKit") and enable MusicKit
  4. Download the .p8 private key file (one-time download only!)
  5. Note your Key ID and Team ID

Getting Your Music User Token

Option 1: Use Apple Music Token Generator
Option 2: Use MusicKit in a native iOS/macOS app

| Variable | Required | Description | |----------|----------|-------------| | APPLE_MUSIC_TEAM_ID | ✅ | Apple Developer Team ID | | APPLE_MUSIC_KEY_ID | ✅ | MusicKit Key ID | | APPLE_MUSIC_PRIVATE_KEY | ✅ | Key content or file path (e.g., /app/data/AuthKey.p8) | | APPLE_MUSIC_USER_TOKEN | For library access | Music User Token | | APPLE_MUSIC_PUBLIC_PLAYLIST_IDS | For public playlists | Space-separated playlist IDs | | APPLE_MUSIC_STOREFRONT | For public playlists | Storefront code (e.g., us, gb) | | APPLE_MUSIC_DEVELOPER_TOKEN_TTL_SECONDS | Optional | Token TTL (default: 43200) | | APPLE_MUSIC_REQUEST_TIMEOUT_SECONDS | Optional | Request timeout (default: 10) | | APPLE_MUSIC_MAX_RETRIES | Optional | Max retries (default: 3) | | APPLE_MUSIC_RETRY_BACKOFF_SECONDS | Optional | Retry backoff (default: 1.0) |

💡 Public Playlist Mode: Omit APPLE_MUSIC_USER_TOKEN and set APPLE_MUSIC_PUBLIC_PLAYLIST_IDS + APPLE_MUSIC_STOREFRONT to sync only public playlists.

</details> <details> <summary><strong>🔵 Tidal</strong></summary>

Requirements

Tidal uses OAuth device flow for authentication.

Getting OAuth Tokens

import tidalapi

session = tidalapi.Session()
session.login_oauth_simple()  # Follow the printed URL to authorize

# Save these values:
print(f"Access Token: {session.access_token}")
print(f"Refresh Token: {session.refresh_token}")
print(f"Token Expiry: {session.expiry_time.isoformat()}")

| Va

View on GitHub
GitHub Stars92
CategoryDevelopment
Updated1d ago
Forks5

Languages

Python

Security Score

100/100

Audited on Mar 21, 2026

No findings