From f7e12b663ff3a2e2f8a7bca0eb580b5d664b4225 Mon Sep 17 00:00:00 2001 From: Chimildic <40138097+Chimildic@users.noreply.github.com> Date: Mon, 1 Mar 2021 00:38:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=20mineTracks=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=82=D1=80=D0=B5=D0=BA=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/changelog.md | 2 +- docs/func.md | 14 +++++++++++--- library.js | 37 ++++++++++++++++++++++++------------- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index b81eb72..c99a472 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -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). diff --git a/docs/func.md b/docs/func.md index 21cac6d..1d60478 100644 --- a/docs/func.md +++ b/docs/func.md @@ -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` - количество выбираемых элементов из всех найденных на одно ключевое слово. По умолчанию три. @@ -575,7 +575,7 @@ let tracks = Source.mineTracks({ ```js let tracks = Source.mineTracks({ keyword: ['indie'], - playlistCount: 10, + itemCount: 10, inRow: true, }); ``` @@ -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 для функции рекомендаций. diff --git a/library.js b/library.js index 03e2bf4..55e12f9 100644 --- a/library.js +++ b/library.js @@ -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(); @@ -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)); }, []); } @@ -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; }); @@ -2475,6 +2481,7 @@ const Search = (function () { multisearchAlbums: multisearchAlbums, findPlaylists: findPlaylists, findAlbums: findAlbums, + findTracks: findTracks, }; function multisearchTracks(items, parseNameMethod) { @@ -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 = [];