Skip to content

Commit db50754

Browse files
committed
Новая функция getSimilarArtists
1 parent f7e12b6 commit db50754

3 files changed

Lines changed: 71 additions & 15 deletions

File tree

docs/changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- Теперь [mineTracks](/func?id=minetracks) может искать ключевые слова в названиях альбомов и самих треках.
1313
- В `mineTracks` аргумент `playlistCount` переименован в `itemCount`.
1414
- Новая функция у Filter: [replaceWithSimilar](/func?id=replacewithsimilar).
15+
- Новая функция у Lastfm: [getSimilarArtists](/func?id=getsimilarartists-1)
1516

1617
## Версия 1.4.4
1718
- Новый фильтр [removeUnavailable](/func?id=removeunavailable).

docs/func.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1732,6 +1732,22 @@ Library.deleteFavoriteTracks(savedTracks);
17321732
let tracks = Lastfm.getLovedTracks('login', 200);
17331733
```
17341734

1735+
### getSimilarArtists
1736+
1737+
Возвращает массив исполнителей, которые похожи на входные элементы соглансо данным Lastfm.
1738+
1739+
Аргументы
1740+
- (массив) `items` - массив треков или исполнителей. Выбирается только `name` исполнителя.
1741+
- (число) `match` - минимальное значение похожести на оригинального исполнителя в границе от `0.0` до `1.0`.
1742+
- (число) `limit` - количество запрашиваемых похожих исполнителей на одного оригинального.
1743+
- (бул) `isFlat` - если `false` результат содержит исполнителей в отдельном массиве. Если `true` все исполнители в одном массиве. По умолчанию `true`.
1744+
1745+
Пример 1 - Получить исполнителей похожих на отслеживаемых
1746+
```js
1747+
let artists = Source.getArtists({ followed_include: true, });
1748+
let similarArtists = Lastfm.getSimilarArtists(artists, 0.65, 20);
1749+
```
1750+
17351751
### getSimilarTracks
17361752

17371753
Возвращает массив треков, которые похожи на входные треки согласно данным Lastfm.
@@ -1740,6 +1756,7 @@ let tracks = Lastfm.getLovedTracks('login', 200);
17401756
- (массив) `tracks` - треки, для которых нужно найти похожие.
17411757
- (число) `match` - минимальное значение похожести на оригинальный трек в границе от `0.0` до `1.0`.
17421758
- (число) `limit` - количество запрашиваемых похожих треков на один оригинальный трек.
1759+
- (бул) `isFlat` - если `false` результат содержит треки в отдельном массиве. Если `true` все треки в одном массиве. По умолчанию `true`.
17431760

17441761
Пример 1 - Получить треки, похожие на плейлист
17451762
```js

library.js

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1901,36 +1901,74 @@ const Lastfm = (function () {
19011901
getRecomStation: getRecomStation,
19021902
getNeighboursStation: getNeighboursStation,
19031903
getSimilarTracks: getSimilarTracks,
1904+
getSimilarArtists: getSimilarArtists,
19041905
getCustomTop: getCustomTop,
19051906
};
19061907

1907-
function getSimilarTracks(tracks, match, limit) {
1908+
function getSimilarTracks(tracks, match, limit, isFlat = true) {
1909+
return getSimilar({
1910+
searchMethod: Search.multisearchTracks,
1911+
formatMethod: formatTrackNameLastfm,
1912+
apiMethodStr: 'track.getsimilar',
1913+
items: tracks,
1914+
limit: limit,
1915+
match: match,
1916+
parentKey: 'similartracks',
1917+
childKey: 'track',
1918+
isFlat: isFlat,
1919+
});
1920+
}
1921+
1922+
function getSimilarArtists(items, match, limit, isFlat = true) {
1923+
return getSimilar({
1924+
searchMethod: Search.multisearchArtists,
1925+
formatMethod: formatArtistNameLastfm,
1926+
apiMethodStr: 'artist.getsimilar',
1927+
items: items,
1928+
limit: limit,
1929+
match: match,
1930+
parentKey: 'similarartists',
1931+
childKey: 'artist',
1932+
isFlat: isFlat,
1933+
});
1934+
}
1935+
1936+
function getSimilar(params) {
19081937
let requests = createRequests();
1909-
return Search.multisearchTracks(getAll(), formatTrackNameLastfm);
1938+
let items = getAll();
1939+
if (params.isFlat) {
1940+
return params.searchMethod(items, params.formatMethod);
1941+
}
1942+
return items.reduce((result, array) => {
1943+
result.push(params.searchMethod(array, params.formatMethod));
1944+
return result;
1945+
}, []);
19101946

19111947
function createRequests() {
1912-
return tracks.reduce((requests, track) => {
1913-
let queryStr = CustomUrlFetchApp.parseQuery({
1914-
method: 'track.getsimilar',
1948+
return params.items.reduce((requests, item) => {
1949+
let queryStr = {
1950+
method: params.apiMethodStr,
19151951
autocorrect: '1',
1916-
artist: track.artists[0].name,
1917-
track: track.name,
1918-
limit: limit || 50,
1952+
artist: item.artists ? item.artists[0].name : item.name,
1953+
limit: params.limit || 50,
19191954
format: 'json',
19201955
api_key: KeyValue.LASTFM_API_KEY,
1921-
});
1922-
requests.push({ url: LASTFM_API_BASE_URL + queryStr });
1956+
};
1957+
if (params.apiMethodStr.includes('track')) {
1958+
queryStr.track = item.name;
1959+
}
1960+
requests.push({ url: LASTFM_API_BASE_URL + CustomUrlFetchApp.parseQuery(queryStr) });
19231961
return requests;
19241962
}, []);
19251963
}
19261964

19271965
function getAll() {
1928-
return CustomUrlFetchApp.fetchAll(requests).reduce((similarTracks, response) => {
1929-
if (response.similartracks) {
1930-
let filteredTracks = response.similartracks.track.filter((track) => track.match >= match);
1931-
return Combiner.push(similarTracks, filteredTracks);
1966+
return CustomUrlFetchApp.fetchAll(requests).reduce((similarItems, response) => {
1967+
if (response[params.parentKey]) {
1968+
let filteredItems = response[params.parentKey][params.childKey].filter((item) => item.match >= params.match);
1969+
_ = params.isFlat ? Combiner.push(similarItems, filteredItems) : similarItems.push(filteredItems);
19321970
}
1933-
return similarTracks;
1971+
return similarItems;
19341972
}, []);
19351973
}
19361974
}

0 commit comments

Comments
 (0)