Skip to content

Commit

Permalink
К mineTracks добавлен поиск по трекам
Browse files Browse the repository at this point in the history
  • Loading branch information
Chimildic committed Feb 28, 2021
1 parent a361813 commit f7e12b6
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 17 deletions.
2 changes: 1 addition & 1 deletion docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
[Перейти к обновленному коду](https://script.google.com/d/1DnC4H7yjqPV2unMZ_nmB-1bDSJT9wQUJ7Wq-ijF4Nc7Fl3qnbT0FkPSr/edit?usp=sharing).

## Версия 1.4.5
- Теперь [mineTracks](/func?id=minetracks) может искать ключевые слова в названиях альбомов.
- Теперь [mineTracks](/func?id=minetracks) может искать ключевые слова в названиях альбомов и самих треках.
- В `mineTracks` аргумент `playlistCount` переименован в `itemCount`.
- Новая функция у Filter: [replaceWithSimilar](/func?id=replacewithsimilar).

Expand Down
14 changes: 11 additions & 3 deletions docs/func.md
Original file line number Diff line number Diff line change
Expand Up @@ -541,13 +541,13 @@ let tracks = Source.getAlbumsTracks(albums);

### mineTracks

Возвращает массив треков, найденных при поиске плейлистов или альбомов по ключевым словам. Из результата удаляются дубликаты треков.
Возвращает массив треков, найденных при поиске плейлистов, альбомов или треков по ключевым словам. Из результата удаляются дубликаты.

Аргументы
- (объект) `params` - параметры поиска.

Описание `params`
- (строка) `type` - тип поиска. Допустимо: `playlist`, `album`. По умолчанию `playlist`.
- (строка) `type` - тип поиска. Допустимо: `playlist`, `album`, `track`. По умолчанию `playlist`. При `track` можно использовать [расширенный поиск](https://support.spotify.com/by-ru/article/search/).
- (массив) `keyword` - перечень ключевых слов для поиска элементов.
- (число) `requestCount` - количество запросов на одно ключевое слово. С одного запроса 50 элементов, если они есть. Максимум 40 запросов. По умолчанию один.
- (число) `itemCount` - количество выбираемых элементов из всех найденных на одно ключевое слово. По умолчанию три.
Expand Down Expand Up @@ -575,7 +575,7 @@ let tracks = Source.mineTracks({
```js
let tracks = Source.mineTracks({
keyword: ['indie'],
playlistCount: 10,
itemCount: 10,
inRow: true,
});
```
Expand All @@ -588,6 +588,14 @@ let tracks = Source.mineTracks({
});
```

Пример 4 - Выбор треков в жанре инди за 2020 год
```js
let tracks = Source.mineTracks({
type: 'track',
keyword: ['genre:indie + year:2020'],
});
```

### craftTracks

Возвращает массив треков, полученный от [getRecomTracks](/func?id=getrecomtracks) для каждой пятерки элементов исходных треков. Дубликаты исходных треков игнорируются, в рекомендованных удаляются. Ограничение в пять элементов продиктовано Spotify API для функции рекомендаций.
Expand Down
37 changes: 24 additions & 13 deletions library.js
Original file line number Diff line number Diff line change
Expand Up @@ -357,13 +357,17 @@ const Source = (function () {
if (params.type == 'album') {
findMethod = Search.findAlbums;
getTracksMethod = getAlbumsTracks;
} else if (params.type == 'track') {
findMethod = Search.findTracks;
// getTracksMethod - не нужно, треки уже в результате поиска
} else {
params.type = 'playlist';
findMethod = Search.findPlaylists;
getTracksMethod = getTracks;
}

let result = findMethod(params.keyword, params.requestCount);
if (params.type == 'playlist' && params.hasOwnProperty('followers') && typeof params.followers == 'object') {
if (params.type == 'playlist' && params.hasOwnProperty('followers')) {
filterByFollowers();
}
let tracks = reduceResult();
Expand All @@ -373,8 +377,8 @@ const Source = (function () {
function reduceResult() {
return result.reduce((tracks, array) => {
selectMethod(array, params.itemCount || 3);
let playlistTracks = filterPopularity(getTracksMethod(array));
return Combiner.push(tracks, playlistTracks);
let trackItems = getTracksMethod ? getTracksMethod(array) : array;
return Combiner.push(tracks, filterPopularity(trackItems));
}, []);
}

Expand Down Expand Up @@ -1044,25 +1048,27 @@ const Filter = (function () {
let copyTracks = Selector.sliceCopy(originTracks);
Filter.removeTracks(copyTracks, replacementTracks, true);
let features = getCachedTracks(copyTracks, { features: {} }).features;

let urls = [];
copyTracks.forEach((t) => {
if (!features[t.id] || !features[t.id].danceability) {
console.log(`У трека ${t.artists[0].name} ${t.name} нет features`);
return;
}
urls.push(Source.createUrlForRecomTracks({
seed_tracks: t.id,
seed_artists: t.artists[0].id,
target_danceability: features[t.id].danceability,
target_energy: features[t.id].energy,
target_acousticness: features[t.id].acousticness,
target_valence: features[t.id].valence,
}));
urls.push(
Source.createUrlForRecomTracks({
seed_tracks: t.id,
seed_artists: t.artists[0].id,
target_danceability: features[t.id].danceability,
target_energy: features[t.id].energy,
target_acousticness: features[t.id].acousticness,
target_valence: features[t.id].valence,
})
);
});

let similarTracks = {};
SpotifyRequest.getAll(urls).forEach(r => {
SpotifyRequest.getAll(urls).forEach((r) => {
let item = r.seeds.find((s) => s.type.toLowerCase() == 'track');
similarTracks[item.id] = r.tracks;
});
Expand Down Expand Up @@ -2475,6 +2481,7 @@ const Search = (function () {
multisearchAlbums: multisearchAlbums,
findPlaylists: findPlaylists,
findAlbums: findAlbums,
findTracks: findTracks,
};

function multisearchTracks(items, parseNameMethod) {
Expand Down Expand Up @@ -2549,6 +2556,10 @@ const Search = (function () {
return find(keywords, 'album', requestCount);
}

function findTracks(keywords, requestCount) {
return find(keywords, 'track', requestCount);
}

function find(keywords, type, requestCount = 1) {
const limit = 50;
let resultForKeyword = [];
Expand Down

0 comments on commit f7e12b6

Please sign in to comment.