Перейти к основному контенту

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',
  });
}