yandex_music 1.2.2
yandex_music: ^1.2.2 copied to clipboard
A powerlibrary for accessing Yandex Music API (api.music.yandex.net).
import 'package:yandex_music/yandex_music.dart';
final String token = 'token';
YandexMusic yandexMusic = YandexMusic(token: token);
void main() async {
try {
await yandexMusic.init();
SearchResult result = await yandexMusic.search.search('i want brek free'); // misspell
printSearchResultDetails(result);
} on YandexMusicException catch (e) {
switch (e.type) {
case YandexMusicExceptionType.network:
print('Network error: ${e.message}');
break;
case YandexMusicExceptionType.unauthorized:
print('Token invalid: ${e.code} ${e.message}');
break;
case YandexMusicExceptionType.wrongRevision:
print('Playlist revision mismatch');
break;
default:
print('Other error: ${e.message}');
}
}
}
void accountInfo(YandexMusic yandexMusic) async {
int accountID = await yandexMusic.account.getAccountID();
// OR another one
accountID = yandexMusic.accountID;
// Email
String email = await yandexMusic.account.getEmail();
// Account login
String login = await yandexMusic.account.getLogin();
// Full username
String fullName = await yandexMusic.account.getFullName();
// Account pseudonym
String displayName = await yandexMusic.account.getDisplayName();
// Checks if you have a PLUS subscription. False or Null if it doesn't exist.
bool? plusSubscription = await yandexMusic.account.hasPlusSubscription();
print('Email: $email');
print('Login: $login');
print('Full name: $fullName');
print('Account ID: $accountID');
print('Display name: $displayName');
print('Plus subscription state: $plusSubscription');
}
void trackExamples(YandexMusic yandexMusic) async {
// Getting track information
Track track = (await yandexMusic.tracks.getTracks(['330765']))[0];
print('Track: ${track.title} by ${track.artists.map((a) => a.title).join(', ')}');
// Downloading a track (MP3 320)
var bytes = await yandexMusic.tracks.download('330765');
print('Downloaded ${bytes.length} bytes');
// Downloading to lossless, medium or low quality
var losslessBytes = await yandexMusic.tracks.download('330765', quality: AudioQuality.lossless);
print('Lossless size: ${losslessBytes.length} bytes');
// Getting lyrics
Lyrics lyrics = await yandexMusic.tracks.getLyrics('330765');
print('Lyrics: ${lyrics.downloadUrl}');
// Similar tracks
List<Track> similar = await yandexMusic.tracks.getSimilar('330765');
print('Similar tracks: ${similar.length}');
}
void albumExamples(YandexMusic yandexMusic) async {
// Receiving the album
Album album = await yandexMusic.albums.getInformation(3389005);
print('Album: ${album.title} by ${album.artists.map((a) => a.title).join(', ')}');
// Several albums
List<Album> albums = await yandexMusic.albums.getAlbums([3389005]);
print('Fetched ${albums.length} albums');
}
void playlistExamples(YandexMusic yandexMusic) async {
// Getting all user playlists
List<Playlist> playlists = await yandexMusic.playlists.getUsersPlaylists();
print('User has ${playlists.length} playlists');
// Create a new playlist
Playlist newPlaylist = await yandexMusic.playlists.createPlaylist('My Cool Playlist', yandexMusic.playlists.publicPlaylist);
print('Created playlist: ${newPlaylist.title} (kind: ${newPlaylist.kind})');
// Adding a track
await yandexMusic.playlists.insertTrack(newPlaylist.kind, '1234567', '7654321');
print('Track added');
// Renaming
await yandexMusic.playlists.renamePlaylist(newPlaylist.kind, 'Even Cooler Playlist');
// Removal
await yandexMusic.playlists.deletePlaylist(newPlaylist.kind);
print('Playlist deleted');
}
void likeExamples(YandexMusic yandexMusic) async {
// Like the track
await yandexMusic.usertracks.like(['330765']);
print('Track liked');
// Getting liked tracks
// ! A list with ShortTrack will only return tracks with their ID.
// To get all the information, use the getTracks method from the tracks class
List<ShortTrack> liked = await yandexMusic.usertracks.getLiked();
print('Liked tracks: ${liked.length}');
// Dislike
await yandexMusic.usertracks.unlike(['330765']);
print('Track unliked');
// Disliked tracks (rarely used)
List<dynamic> disliked = await yandexMusic.usertracks.getDisliked();
print('Disliked tracks: ${disliked.length}');
}
void searchExamples(YandexMusic yandexMusic) async {
// Search tracks
List<Track> tracks = await yandexMusic.search.tracks('Pink Floyd');
print('Found ${tracks.length} tracks');
// Album Search
List<Album> albums = await yandexMusic.search.albums('Pink Floyd');
print('Found ${albums.length} albums');
// Search for performers
List<Artist> artists = await yandexMusic.search.artists('Pink Floyd');
print('Found ${artists.length} artists');
// Universal search
var all = await yandexMusic.search.search('Pink Floyd');
printSearchResultDetails(all);
}
void vibeExamples(YandexMusic yandexMusic) async {
// Available settings
List<VibeSetting> settings = await yandexMusic.myVibe.getWaves();
print('Available vibe settings: ${settings.length}');
// Creating a Wave
Wave wave = await yandexMusic.myVibe.createWave(settings.take(2).toList());
print('Wave created: ${wave.batchId}');
// Sending feedback
List<Track> queue = wave.tracks;
await yandexMusic.myVibe.sendFeedback(
wave,
SkipFeedback(
queue: queue,
track: wave.tracks[0],
totalPlayedSeconds: 10.5,
),
);
print('Skip feedback sent');
}
void uploadExamples(YandexMusic yandexMusic) async {
// Downloading the file
File file = File('my_track.mp3');
String trackId = await yandexMusic.usertracks.uploadUGCTrack(3, file); // 3 = kind of playlist "I like"
print('Uploaded track ID: $trackId');
// Renaming
bool renamed = await yandexMusic.usertracks.renameUGCTrack(trackId, 'My Track', 'Me');
print('Renamed: $renamed');
}
void printSearchResultDetails(SearchResult searchResult) {
print('š Query: ${searchResult.query}');
print('š¢ Total: ${searchResult.total}');
print('š Per Page: ${searchResult.perPage}');
print('š Last Page: ${searchResult.lastPage}');
print('š¤ Misspell Corrected: ${searchResult.misspellCorrected}');
if (searchResult.misspellResult != null) {
print('š¤ Suggested: ${searchResult.misspellResult}');
}
if (searchResult.bestTrack != null) {
final t = searchResult.bestTrack!;
print('\nā BEST TRACK:');
print(' Title: ${t.title}');
print(' ID: ${t.id}');
print(' Real ID: ${t.realId ?? 'N/A'}');
print(' Duration: ${t.durationMs != null ? '${t.durationMs}s' : 'N/A'}');
print(' Available: ${t.available ?? false}');
print(' Source: ${t.trackSource.name}');
if (t.coverUri != null) {
print(' Cover (500x500): https://${t.coverUri!.replaceAll('%%', '500x500')}');
}
if (t.ogImage != null) {
print(' OG Image: ${t.ogImage}');
}
if (t.artists.isNotEmpty) {
print(' Artists:');
for (final artist in t.artists) {
if (artist is OfficialArtist) {
print(' - ${artist.title} (ID: ${artist.id}, '
'various: ${artist.various}, composer: ${artist.composer}, '
'available: ${artist.available})');
if (artist.coverUri != null) {
print(' Cover: https://${artist.coverUri!.replaceAll('%%', '100x100')}');
}
}
}
}
if (t.albums.isNotEmpty) {
print(' Albums:');
for (final album in t.albums) {
print(' - ${album.title} (ID: ${album.id}, year: ${album.year}, '
'${album.trackCount} tracks)');
print(' Cover: https://${album.coverUri.replaceAll('%%', '300x300')}');
if (album.likesCount != null) {
print(' Likes: ${album.likesCount}');
}
}
}
if (t.matchedTrack != null) {
print(' ā ļø Matched Track (recognized UGC):');
print(' Title: ${t.matchedTrack!.title}, ID: ${t.matchedTrack!.id}');
}
} else {
print('\nā No best track.');
}
if (searchResult.bestArtist != null) {
final a = searchResult.bestArtist!;
print('\nā BEST ARTIST:');
print(' Name: ${a.name}');
print(' ID: ${a.id}');
print(' Likes: ${a.likesCount ?? 'N/A'}');
print(' Trailer Available: ${a.trailerAvailable ?? 'unknown'}');
print(' Cover: https://${a.coverUri.replaceAll('%%', '400x400')}');
print(' Cover Color: #${a.coverColor}');
} else {
print('\nā No best artist.');
}
if (searchResult.bestAlbum != null) {
final al = searchResult.bestAlbum!;
print('\nā BEST ALBUM:');
print(' Title: ${al.title}');
print(' ID: ${al.id}');
print(' Available: ${al.available ?? 'unknown'}');
print(' Cover: https://${al.coverUri.replaceAll('%%', '500x500')}');
print(' Cover Color: #${al.coverColor}');
if (al.contentWarning != null) {
print(' Content Warning: ${al.contentWarning}');
}
if (al.disclaimers != null && al.disclaimers!.isNotEmpty) {
print(' Disclaimers: ${al.disclaimers!.join(', ')}');
}
print(' Artists:');
for (final artist in al.artists) {
if (artist is OfficialArtist) {
print(' - ${artist.name} (ID: ${artist.id})');
}
}
} else {
print('\nā No best album.');
}
if (searchResult.bestConcert != null) {
final c = searchResult.bestConcert!;
print('\nā BEST CONCERT:');
print(' Title: ${c.concertTitle}');
print(' ID: ${c.id}');
print(' City: ${c.city}');
print(' Place: ${c.place}');
print(' Address: ${c.address}');
print(' Date & Time: ${c.dateTime}');
print(' Min Price: ${c.minPrice} ${c.priceCurrencySymbol} (${c.priceCurrency})');
print(' Afisha URL: ${c.afishaUrl}');
print(' Image: ${c.imageUrl}');
print(' Rating: ${c.contentRaiting}');
if (c.images.isNotEmpty) {
print(' Extra Images: ${c.images.length} items');
}
} else {
print('\nā No best concert.');
}
print('\nšµ TRACKS LIST (${searchResult.tracks.length}):');
if (searchResult.tracks.isEmpty) {
print(' (No tracks)');
} else {
for (Track tr in searchResult.tracks) {
print('${tr.title} ${tr.albums[0].title} ${tr.artists[0].title}');
}
}
}