@@ -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