ciderfy 1.0.3
dotnet tool install --global ciderfy --version 1.0.3
dotnet new tool-manifest
dotnet tool install --local ciderfy --version 1.0.3
#tool dotnet:?package=ciderfy&version=1.0.3
nuke :add-package ciderfy --version 1.0.3
<p align="center"> <img src="./docs/assets/banner.png" alt="Ciderfy terminal banner" width="600"> </p>
<p align="center"> <a href="https://github.com/thomas-fazzari/ciderfy/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/thomas-fazzari/ciderfy/ci.yml?branch=master&style=flat-square&labelColor=11111B&label=CI" alt="CI"></a> <a href="https://codecov.io/gh/thomas-fazzari/ciderfy"><img src="https://img.shields.io/codecov/c/github/thomas-fazzari/ciderfy?style=flat-square&labelColor=11111B" alt="Coverage"></a> <a href="https://www.nuget.org/packages/Ciderfy"><img src="https://img.shields.io/nuget/v/Ciderfy?style=flat-square&labelColor=11111B&color=313244" alt="NuGet"></a> <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-313244?style=flat-square&labelColor=11111B" alt="MIT License"></a> <img src="https://img.shields.io/badge/.NET-10.0-313244?style=flat-square&labelColor=11111B" alt=".NET 10"> </p>
A .NET 10 CLI tool to transfer Spotify playlists to Apple Music without any developer accounts required
Features
- Interactive modern CLI built with Spectre.Console
- Spotify playlist import from standard URLs, embed URLs, intl URLs, and
spotify:URIs - Playlist Merging: Queue multiple Spotify playlists with
/add <url>and merge them into a single deduplicated Apple Music playlist with/run - Two-stage matching pipeline:
- ISRC-based matching (resolved via the Deezer catalog, since Spotify does not expose ISRCs publicly)
- Optional fuzzy matching for remaining tracks
- Automatic Apple Music playlist creation and batched track insertion
- Token caching to avoid reauthentication
Installation
dotnet tool install -g Ciderfy
Requirements
- .NET SDK 10.0+
- Apple Music account
How It Works
Ciderfy fetches Spotify playlists without requiring an API key by using the web player's internal GraphQL endpoint with TOTP-based authentication
An Apple Music developer token is automatically extracted from the web player's JavaScript bundles, removing the need for a $99/year Apple Developer account
ISRCs (International Standard Recording Codes) are then resolved through the Deezer catalog and used to find exact matches in the Apple Music catalog
Tracks that weren't matched can then go through an optional fuzzy matching pass that scores title and artist similarity using Jaro-Winkler, then scales the result down based on track duration difference to reduce false positives
Transfer Flow
flowchart TD
A[Paste Spotify URL] --> B[Fetch Playlist]
B --> C[Resolve ISRCs via Deezer]
C --> D[Lookup ISRCs in Apple Catalog]
D --> E{Unmatched tracks?}
E -- No --> H[Create Apple Music Playlist]
E -- Yes --> F{Use fuzzy matching?}
F -- No --> H
F -- Yes --> G[Fuzzy match remaining tracks]
G --> H
H --> I[Transfer Complete]
Quick Start
ciderfy
From source
dotnet restore
dotnet run --project src/Ciderfy
First-Time Authentication
In the app, run:
/auth
Then follow the prompt:
Open
https://music.apple.comin your browser and sign inOpen your browser's DevTools Console
Run:
MusicKit.getInstance().musicUserToken;Paste the returned token into Ciderfy, it will then be cached
Ciderfy will also automatically fetch and cache a valid Apple Music developer token if it isn't already in cache
Usage
After startup, paste a Spotify playlist URL for a direct transfer:
https://open.spotify.com/playlist/<playlist-id>
Or queue multiple playlists to merge them into one:
/add https://open.spotify.com/playlist/<id-1>
/add https://open.spotify.com/playlist/<id-2>
/run
You can set storefront and playlist naming behavior before transfer using commands below.
Commands
/auth- authenticate with Apple Music/auth reset- clear cached tokens and re-authenticate/status- show tokens and storefront status/storefront <code>or/sf <code>- set Apple Music storefront (default:us)/add <url>- queue a Spotify playlist for merging/run- start the transfer and merge all queued playlists/name <name>- set name override for the next created playlist/name- clear name override/helpor/h- show command help/quit,/exit, or/q- exit
Notes and Limitations
- Tokens are cached locally in your application data directory under
Ciderfy/tokens.json - This project relies on third-party services and API behavior that may change
- Spotify playlist fetch currently allows up to 1000 tracks per call
- Apple Music developer token extraction is based on current web player assets
License
MIT. See LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.