| Crates.io | moosicbox_library |
| lib.rs | moosicbox_library |
| version | 0.1.4 |
| created_at | 2024-10-04 15:49:05.109872+00 |
| updated_at | 2025-07-21 19:26:18.740613+00 |
| description | MoosicBox Library Music API package |
| homepage | |
| repository | https://github.com/MoosicBox/MoosicBox |
| max_upload_size | |
| id | 1396723 |
| size | 196,145 |
Basic music library management providing database operations for artists, albums, and tracks with support for favorites, search, and pagination.
Add this to your Cargo.toml:
[dependencies]
moosicbox_library = "0.1.1"
# Enable additional features
moosicbox_library = { version = "0.1.1", features = ["api"] }
use moosicbox_library::{favorite_artists, add_favorite_artist, remove_favorite_artist};
use switchy_database::profiles::LibraryDatabase;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let db = LibraryDatabase::new().await?;
// Get favorite artists with pagination
let artists_result = favorite_artists(
&db,
Some(0), // offset
Some(20), // limit
None, // order
None, // order direction
).await?;
println!("Found {} artists", artists_result.page.total().unwrap_or(0));
for artist in artists_result.page.items() {
println!("Artist: {} (ID: {})", artist.title, artist.id);
}
Ok(())
}
use moosicbox_library::{favorite_albums, album, album_tracks, album_versions};
use moosicbox_music_api_models::AlbumsRequest;
use moosicbox_music_models::Id;
use switchy_database::profiles::LibraryDatabase;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let db = LibraryDatabase::new().await?;
// Get favorite albums
let request = AlbumsRequest::default();
let albums_result = favorite_albums(&db, &request).await?;
for album in albums_result.page.items() {
println!("Album: {} by {}", album.title, album.artist);
println!(" Date: {:?}, Duration: {}s", album.date_released, album.duration);
// Get album details
let album_id = Id::Number(album.id);
if let Some(album_detail) = album(&db, &album_id).await? {
println!(" Detailed info: {} tracks", album_detail.versions.len());
}
// Get album tracks
let tracks_result = album_tracks(&db, &album_id, Some(0), Some(10)).await?;
println!(" Tracks ({}):", tracks_result.page.items().len());
for track in tracks_result.page.items() {
println!(" {}: {} ({}s)", track.number, track.title, track.duration);
}
// Get album versions
let versions = album_versions(&db, &album_id).await?;
println!(" Available versions: {}", versions.len());
for version in versions {
println!(" Source: {:?}, Quality: {:?}", version.source, version.audio_format);
}
}
Ok(())
}
use moosicbox_library::{favorite_tracks, track, add_favorite_track, remove_favorite_track};
use moosicbox_music_models::Id;
use switchy_database::profiles::LibraryDatabase;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let db = LibraryDatabase::new().await?;
// Get favorite tracks
let tracks_result = favorite_tracks(
&db,
None, // track_ids filter
Some(0), // offset
Some(50), // limit
None, // order
None, // order direction
).await?;
println!("Favorite tracks: {}", tracks_result.page.items().len());
for track in tracks_result.page.items() {
println!("Track: {} - {} ({}s)", track.artist, track.title, track.duration);
// Get detailed track info
let track_id = Id::Number(track.id);
if let Some(track_detail) = track(&db, &track_id).await? {
println!(" Album: {}", track_detail.album);
println!(" Track #: {}", track_detail.number);
}
}
Ok(())
}
use moosicbox_library::{filter_albums, sort_albums};
use moosicbox_music_api_models::{AlbumsRequest, AlbumFilters, AlbumSort};
use moosicbox_music_models::{Id, ApiSource};
fn example_filtering() {
let albums = vec![]; // Your album collection
// Create filter request
let request = AlbumsRequest {
sources: Some(vec![ApiSource::Library]),
sort: Some(AlbumSort::Artist),
filters: Some(AlbumFilters {
name: Some("Dark Side".to_string()),
artist_id: Some(Id::Number(123)),
artist_api_id: None,
search: None,
}),
..Default::default()
};
// Filter albums
let filtered: Vec<_> = filter_albums(&albums, &request).collect();
println!("Filtered to {} albums", filtered.len());
// Sort albums
let sorted = sort_albums(filtered, &request);
for album in sorted {
println!(" {}: {}", album.artist, album.title);
}
}
use moosicbox_library::{search, SearchType, LibrarySearchType};
fn search_library() -> Result<(), Box<dyn std::error::Error>> {
let query = "Pink Floyd";
let search_types = vec![
LibrarySearchType::Artists,
LibrarySearchType::Albums,
LibrarySearchType::Tracks,
];
let results = search(
query,
Some(0), // offset
Some(20), // limit
Some(&search_types),
)?;
println!("Search results for '{}':", query);
if let Some(artists) = &results.artists {
println!(" Artists: {}", artists.len());
for artist in artists {
println!(" {}", artist.name);
}
}
if let Some(albums) = &results.albums {
println!(" Albums: {}", albums.len());
for album in albums {
println!(" {} - {}", album.artist_name, album.name);
}
}
if let Some(tracks) = &results.tracks {
println!(" Tracks: {}", tracks.len());
for track in tracks {
println!(" {} - {}", track.artist_name, track.name);
}
}
Ok(())
}
use moosicbox_library::artist_albums;
use moosicbox_library_models::LibraryAlbumType;
use moosicbox_music_models::Id;
use switchy_database::profiles::LibraryDatabase;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let db = LibraryDatabase::new().await?;
let artist_id = Id::Number(123);
// Get all albums by artist
let albums_result = artist_albums(
&db,
&artist_id,
Some(0), // offset
Some(10), // limit
None, // album type filter
).await?;
println!("Albums by artist: {}", albums_result.page.items().len());
for album in albums_result.page.items() {
println!(" {} ({})", album.title, album.date_released.unwrap_or_default());
}
// Get only studio albums
let studio_albums = artist_albums(
&db,
&artist_id,
Some(0),
Some(10),
Some(LibraryAlbumType::Studio),
).await?;
println!("Studio albums: {}", studio_albums.page.items().len());
Ok(())
}
use moosicbox_library::{track_file_url, LibraryAudioQuality};
use moosicbox_music_models::Id;
use switchy_database::profiles::LibraryDatabase;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let db = LibraryDatabase::new().await?;
let track_id = Id::Number(456);
// Get high quality track URL
let url = track_file_url(
&db,
LibraryAudioQuality::High,
&track_id,
).await?;
println!("Track URL: {}", url);
Ok(())
}
favorite_artists() - Get paginated favorite artistsfavorite_albums() - Get paginated favorite albums with filteringfavorite_tracks() - Get paginated favorite tracksartist() - Get artist by IDalbum() - Get album by IDtrack() - Get track by IDartist_albums() - Get albums by specific artistalbum_tracks() - Get tracks in specific albumalbum_versions() - Get available versions of an albumfilter_albums() - Filter albums by criteriasort_albums() - Sort albums by specified ordersearch() - Search across library contenttrack_file_url() - Get file URL for track playbackadd_favorite_artist() - Add artist to favorites (placeholder)remove_favorite_artist() - Remove artist from favorites (placeholder)add_favorite_album() - Add album to favorites (placeholder)remove_favorite_album() - Remove album from favorites (placeholder)add_favorite_track() - Add track to favorites (placeholder)remove_favorite_track() - Remove track from favorites (placeholder)The library provides specific error types for different operations:
LibraryFavoriteArtistsError - Errors when fetching favorite artistsLibraryFavoriteAlbumsError - Errors when fetching favorite albumsLibraryFavoriteTracksError - Errors when fetching favorite tracksLibraryArtistError - Errors when fetching artist informationLibraryAlbumError - Errors when fetching album informationLibraryTrackError - Errors when fetching track informationSearchError - Errors during search operationsLibraryArtistOrder, LibraryAlbumOrder, LibraryTrackOrderLibraryArtistOrderDirection, LibraryAlbumOrderDirection, LibraryTrackOrderDirectionLibrarySearchType - Artists, Albums, Tracks, Videos, Playlists, UserProfilesSearchType - Enum variants for search filteringLibraryAudioQuality - High, Lossless, HiResLosslessapi - Enable API integration featuresswitchy_database - Database connection and operationsmoosicbox_music_models - Core music data modelsmoosicbox_library_models - Library-specific data modelsmoosicbox_paging - Pagination utilitiesmoosicbox_search - Search functionality