Spotify: кастомные плейлисты
Три кастомных плейлиста, которые я использую в Spotify.
Настраивал всё с помощью гайда Goofy.
Ultimate Daily Mix
Совмещенные в один плейлист дейли миксы, по факту создание своего радио/Волны. Зависит от качества самих дейли миксов, а это очень плащающее значение в контексте спотифая.
Показать код
function updateUltimateDailyMix() {
// 1 - собираем
let mixTracks = Source.getTracks([
{ name: 'Daily Mix 1', id: '37i9dQZF1E36IB3m1EvdUB' },
{ name: 'Daily Mix 2', id: '37i9dQZF1E38okXXcLiPqb' },
{ name: 'Daily Mix 3', id: '37i9dQZF1E37Jg382I4YCj' },
{ name: 'Daily Mix 4', id: '37i9dQZF1E38EJUs3eDaO7' },
{ name: 'Daily Mix 5', id: '37i9dQZF1E36LMguGqPuIP' },
{ name: 'Daily Mix 6', id: '37i9dQZF1E35RZ6V8lOEwo' },
]);
let recomTracks = Source.craftTracks(mixTracks);
let savedTracks = Source.getSavedTracks();
// 2 - обрабатываем
Combiner.push(mixTracks, recomTracks);
Filter.removeTracks(mixTracks, savedTracks);
Selector.keepRandom(mixTracks, 50);
// 3 - создаем плейлист
Playlist.saveWithReplace({
id: '7EvrqKmCY4ZqUcj01cxD3e',
name: 'Ultimate Daily Mix',
tracks: mixTracks,
randomCover: 'update',
});
}Curator Feed
Совмещенные интересные мне кураторские плейлисты (жанровые), которые обновляются раз в неделю. Главное — следить за тем, чтобы плейлисты действительно обновлялись регулярно, иначе в ротации будут одни и те же треки.
Показать код
function updateCuratorFeed() {
let recentTracks = RecentTracks.get(2000);
let savedTracks = Source.getSavedTracks();
let newReleaseTracks = Source.getTracks([
// Популярные редакции
{ name: 'New MetalCore', id: '6qJY8owgtBHN5fOP1jpeii' },
{ name: 'Nu-Blue', id: '37i9dQZF1DXb3MZdETGqKB' },
{ name: 'New Blues/Blues-Rock/Americana', id: '6arDWpKzLtGAiBBpwTxN7v' },
{ name: 'All New Metal', id: '37i9dQZF1DX5J7FIl4q56G' },
{ name: 'Post/Wave', id: '61pt0QQDbm3mtEjcSPhpgF' },
]);
Filter.dedupTracks(newReleaseTracks);
Filter.rangeDateRel(newReleaseTracks, 7, 1);
Filter.removeTracks(newReleaseTracks, recentTracks);
Filter.removeTracks(newReleaseTracks, savedTracks);
Order.sort(newReleaseTracks, 'meta.popularity', 'desc');
Selector.keepFirst(newReleaseTracks, 60);
Playlist.saveWithReplace({
id: '7M3amwWP7KDS39Bja3gtQd',
name: 'Curator Feed',
tracks: newReleaseTracks,
randomCover: 'update',
});
}Discoveries from Albums
Треки с альбомов, где есть лайки, но сами треки без него и не проигрывались недавно.
Показать код
function updateDiscoveryAlbums() {
const LIMIT_TRACKS = 20;
const LIMIT_ALB_TRACK = 1;
let recentTracks = RecentTracks.get(3000);
let savedTracks = Source.getSavedTracks();
let banTracks = Combiner.push([], recentTracks, savedTracks);
let banArtists = Selector.sliceCopy(recentTracks);
Filter.rangeDateRel(banArtists, 2, 0);
let tracks = savedTracks;
Order.shuffle(tracks);
let recomTracks = [];
for (let i = 0; i < tracks.length; i++) {
if (tracks[i].album.album_type == 'compilation'
|| tracks[i].album.total_tracks == 1) {
continue;
}
let albumTracks = Source.getAlbumTracks(tracks[i].album);
Filter.matchOriginalOnly(albumTracks);
Filter.removeArtists(albumTracks, banArtists);
Filter.removeTracks(albumTracks, banTracks);
if (albumTracks.length == 0) {
continue;
}
Order.sort(albumTracks, 'meta.popularity', 'desc');
Selector.keepFirst(albumTracks, LIMIT_ALB_TRACK);
Combiner.push(recomTracks, albumTracks);
Filter.dedupTracks(recomTracks);
if (recomTracks.length >= LIMIT_TRACKS) {
break;
}
}
Playlist.saveWithReplace({
id: '4kArfn8VTrirV7iphuE4L1',
name: 'Discoveries From Albums',
tracks: Selector.sliceFirst(recomTracks, LIMIT_TRACKS),
randomCover: 'update',
});
}