Сделал скрипт
"РАДИО ПО АРТИСТУ" для всех.
Все скрипты на Google Script ;)
Плейлист настраивается по вкусу, все лимиты настраиваются вначале функции.
От главного исполнителя берутся новые треки, которые вы не слышали(не ТОП10)
У похожих исполнителей берутся треки с ТОПа
Удаляется миксы, история(3000), любимые.
Название и обложка делается по исполнителю.
Спасибо за внимание :thank_you:
function ART_RADIO() {
const ArtID = '2ye2Wgw4gimLv2eAKyk1NB'; //ID артиста
const MainArtLim = 5; //новых треков главного артиста
const TopTrackLim = 2; //кол-во треков из топа для каждого нового артиста
const SimArtLim = 3; //кол-во артистов 2 уровня(похожих на похожих)
const excludeArtists = [
// { id: '' },
// { id: '' }
]; //исключить артистов из плейлиста
let LoveTracks = Source.getSavedTracks();
let History = RecentTracks.get(3000);
let Artist = Source.getArtists({
include: [
{ id: ArtID },
],
});
let SimArtists = GetSimArtist(Artist, 10); //берем первых 10 похожих артистов
let SimArtists2 = GetSimArtist(Artist, SimArtLim, true);
Combiner.push(SimArtists, SimArtists2); //соединяем всех похожих аотистов
Filter.dedupArtists(SimArtists);
Filter.removeArtists(SimArtists, excludeArtists);
let MainArtistTrack = SearchTracks(Artist, MainArtLim);
let ArtistsTrack = GetTopTrack(SimArtists, TopTrackLim, true); //берем рандомные треки из топа артистов
Combiner.push(MainArtistTrack, ArtistsTrack);
Filter.dedupTracks(MainArtistTrack);
ClearTracks(MainArtistTrack);
MixArtists(MainArtistTrack, MainArtistTrack.length); //перемешиваем артистов
console.log('Треков всего найдено - ', MainArtistTrack.length);
Playlist.saveWithReplace({
name: `RADIO - ${Artist[0].name}`.substr(0,100),
tracks: MainArtistTrack,
public: false,
sourceCover: Artist[0].images[1].url,
});
//ДОП ФУНКЦИЯ
function GetTopTrack (source, limit, random = false){
let tempResult = Source.getArtistsTopTracks(source, false);
tempResult.forEach((tracks) => ClearTracks(tracks));
let result = [];
for (let i = 0; i < tempResult.length; i++){
if (random) {Selector.keepRandom(tempResult[i], limit);
} else {Selector.keepFirst(tempResult[i], limit);}
Combiner.push(result, tempResult[i]);
}
return result;
}
function GetSimArtist (source, limit, random = false){
let tempResult = Source.getRelatedArtists(source, false);
let result = [];
for (let i = 0; i < tempResult.length; i++){
if (random) {Selector.keepRandom(tempResult[i], limit);
} else {Selector.keepFirst(tempResult[i], limit);}
Combiner.push(result, tempResult[i]);
}
Filter.dedupArtists(result);
return result;
}
function SearchTracks(sourceArray, limit, clear = false) {
let CopyArt = Selector.sliceCopy(sourceArray);
sourceArray = sourceArray.map(a => a.name);
let result = [];
for (let i = 0; i < sourceArray.length; i++){
sourceArray[i] = String(sourceArray[i]);
let preResult = Source.mineTracks({
type: 'track',
keyword: ['artist:'+' "'+sourceArray[i]+'"'],
// requestCount: 2,
itemCount: 50,
inRow: true,
});
Filter.removeArtists(preResult, CopyArt, true);
if (clear) {
ClearTracks(preResult);
}
Selector.keepFirst(preResult, limit);
Combiner.push(result, preResult);
};
return result;
}
function MixArtists(sourceArray, limit) {
let result = [];
let Array = sourceArray;
let ArrayCopy = Selector.sliceCopy(Array);
while (result.length < limit && ArrayCopy.length > 0){
ArrayCopy = Selector.sliceCopy(Array);
Filter.removeTracks(ArrayCopy, result);
Filter.dedupArtists(ArrayCopy);
Selector.keepFirst(ArrayCopy, (limit-result.length));
Combiner.push(result, ArrayCopy);
}
Combiner.replace(sourceArray, result);
}
function ClearTracks(tracksArray){
Filter.dedupTracks(tracksArray);
Filter.matchExcept(tracksArray, 'mix|radio|edit|live|version|karaoke|skit|скит|версия');
Filter.removeTracks(tracksArray, LoveTracks);
Filter.removeTracks(tracksArray, History);
return tracksArray;
}
}
Сообщение отредактировал IceTan - 27.08.21, 15:10Причина редактирования: 27.08.21. Изменил код