| Crates.io | ytmusicapi |
| lib.rs | ytmusicapi |
| version | 0.2.0 |
| created_at | 2026-01-15 13:42:41.636476+00 |
| updated_at | 2026-01-22 08:46:30.266104+00 |
| description | Rust client for YouTube Music API - playlist reading focused |
| homepage | |
| repository | https://github.com/11philip22/ytmusicapi-rs |
| max_upload_size | |
| id | 2045578 |
| size | 137,428 |
A Rust library for the YouTube Music API.
[!NOTE] 🚧 Work in Progress: currently implementing only playlist reading features. Search, library management, and uploads are not yet supported.
Add to your Cargo.toml:
[dependencies]
ytmusicapi = { version = "0.1.0" }
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
music.youtube.comcookie and x-goog-authuser headersheaders.json:{
"cookie": "__Secure-3PAPISID=...; other_cookies...",
"x-goog-authuser": "0"
}
oauth.json token file:use ytmusicapi::{OAuthCredentials, OAuthToken};
# async fn setup_oauth() -> ytmusicapi::Result<()> {
let credentials = OAuthCredentials::new("CLIENT_ID", "CLIENT_SECRET")?;
let device = credentials.request_device_code().await?;
println!("Visit {} and enter {}", device.verification_url, device.user_code);
// Wait for the user to finish in the browser...
let token = credentials.exchange_device_code(&device.device_code).await?;
token.to_file("oauth.json")?;
# Ok(())
# }
You can reuse oauth.json later without repeating the flow.
use ytmusicapi::{BrowserAuth, OAuthCredentials, OAuthToken, YTMusicClient};
#[tokio::main]
async fn main() -> ytmusicapi::Result<()> {
// Browser cookies
let auth = BrowserAuth::from_file("headers.json")?;
let client = YTMusicClient::builder()
.with_browser_auth(auth)
.build()?;
// Or OAuth (uncomment to use)
// let token = OAuthToken::from_file("oauth.json")?;
// let creds = OAuthCredentials::new("CLIENT_ID", "CLIENT_SECRET")?;
// let client = YTMusicClient::builder()
// .with_oauth_token_and_credentials(token, creds)
// .build()?;
// List all playlists
let playlists = client.get_library_playlists(None).await?;
for pl in &playlists {
println!("{}: {}", pl.playlist_id, pl.title);
}
// Get a specific playlist with tracks
let playlist = client.get_playlist("PLxxxxxx", None).await?;
for track in &playlist.tracks {
println!("{} - {}",
track.artists.first().map(|a| a.name.as_str()).unwrap_or("Unknown"),
track.title.as_deref().unwrap_or("Unknown"));
}
// Get liked songs
let liked = client.get_liked_songs(Some(50)).await?;
println!("You have {} liked songs", liked.tracks.len());
Ok(())
}
YTMusicClient| Method | Description |
|---|---|
get_library_playlists(limit) |
Get all playlists from your library |
get_playlist(id, limit) |
Get a playlist with its tracks |
get_liked_songs(limit) |
Get your liked songs playlist |
Playlist - Full playlist with metadata and tracksPlaylistSummary - Brief playlist info (for library listing)PlaylistTrack - Track within a playlistArtist, Album, Thumbnail - Common typescargo run --example list_playlists
CLIENT_ID/CLIENT_SECRET env vars):
CLIENT_ID=... CLIENT_SECRET=... cargo run --example oauth_device_flow
get_watch_playlist)This library is a Rust port of ytmusicapi.
MIT License - see license for details.