Socket
Socket
Sign inDemoInstall

@soundify/web-api

Package Overview
Dependencies
0
Maintainers
1
Versions
12
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.0.0-rc7 to 1.0.0

2

dist/mod.js

@@ -1,1 +0,1 @@

var K="https://accounts.spotify.com/",J={UGC_IMAGE_UPLOAD:"ugc-image-upload",USER_READ_PLAYBACK_STATE:"user-read-playback-state",USER_MODIFY_PLAYBACK_STATE:"user-modify-playback-state",USER_READ_CURRENTLY_PLAYING:"user-read-currently-playing",STREAMING:"streaming",PLAYLIST_READ_PRIVATE:"playlist-read-private",PLAYLIST_READ_COLLABORATIVE:"playlist-read-collaborative",PLAYLIST_MODIFY_PRIVATE:"playlist-modify-private",PLAYLIST_MODIFY_PUBLIC:"playlist-modify-public",USER_FOLLOW_MODIFY:"user-follow-modify",USER_FOLLOW_READ:"user-follow-read",USER_READ_PLAYBACK_POSITION:"user-read-playback-position",USER_TOP_READ:"user-top-read",USER_READ_RECENTLY_PLAYED:"user-read-recently-played",USER_LIBRARY_MODIFY:"user-library-modify",USER_LIBRARY_READ:"user-library-read",USER_READ_EMAIL:"user-read-email",USER_READ_PRIVATE:"user-read-private"};var m=class extends Error{constructor(s,r,i,n){super(s,n);this.response=r;this.body=i}name="SpotifyError";get url(){return this.response.url}get status(){return this.response.status}},l="application/json",g="Content-Type",f=t=>t===null?null:typeof t=="string"?t:t.error.message+(t.error.reason?` (${t.error.reason})`:""),h=async(t,e)=>{let s=t.statusText?`${t.status} ${t.statusText}`:t.status.toString(),r=t.url.split("?")[0];r&&(s+=` (${r})`);let i=null;if(t.body&&t.type!=="opaque"){try{i=await t.text();let a=t.headers.get(g);a&&(a===l||a.split(";")[0]===l)&&(i=JSON.parse(i))}catch{}let n=f(i);n&&(s+=" : "+n)}return new m(s,t,i,e)},b=t=>typeof t=="object"&&t!==null&&Object.prototype.toString.call(t)==="[object Object]",u=class{constructor(e,s={}){this.accessToken=e;this.options=s;this.baseUrl=s.baseUrl?s.baseUrl:"https://api.spotify.com/"}baseUrl;fetch(e,s={}){let r=new URL(e,this.baseUrl);if(s.query)for(let o in s.query){let p=s.query[o];typeof p<"u"&&r.searchParams.set(o,p.toString())}let i=new Headers(s.headers);i.set("Accept",l);let n=!!s.body&&(b(s.body)||Array.isArray(s.body));n&&i.set(g,l);let a=n?JSON.stringify(s.body):s.body,c=!1,d=(this.options.middlewares||[]).reduceRight((o,p)=>p(o),this.options.fetch||globalThis.fetch),y=async()=>{i.set("Authorization","Bearer "+this.accessToken);let o=await d(r,{...s,body:a,headers:i});if(o.ok)return o;if(o.status===401&&this.options.refresher&&!c)return this.accessToken=await this.options.refresher(),c=!0,y();if(o.status===429){let p=Number(o.headers.get("Retry-After"))||void 0;if(p)return(typeof this.options.waitForRateLimit=="function"?this.options.waitForRateLimit(p):this.options.waitForRateLimit)&&await new Promise(P=>setTimeout(P,p*1e3)),y()}throw await h(o)};return y()}};var z=async t=>(await t.fetch("/v1/me")).json(),T=async(t,e,s)=>(await t.fetch("/v1/me/top/"+e,{query:s})).json(),X=async(t,e)=>await T(t,"artists",e),Z=async(t,e)=>await T(t,"tracks",e),tt=async(t,e)=>(await t.fetch("/v1/users/"+e)).json(),et=async(t,e,s)=>{await t.fetch(`/v1/playlists/${e}/followers`,{method:"PUT",body:{public:s}})},st=async(t,e)=>{await t.fetch(`/v1/playlists/${e}/followers`,{method:"DELETE"})},rt=async(t,e)=>(await(await t.fetch("/v1/me/following",{query:{...e,type:"artist"}})).json()).artists,w=(t,e)=>t.fetch("/v1/me/following",{method:"PUT",query:{type:"artist",ids:e}}),it=(t,e)=>w(t,[e]),k=(t,e)=>t.fetch("/v1/me/following",{method:"PUT",query:{type:"user",ids:e}}),ot=(t,e)=>k(t,[e]),v=(t,e)=>t.fetch("/v1/me/following",{method:"DELETE",query:{type:"artist",ids:e}}),nt=(t,e)=>v(t,[e]),C=(t,e)=>t.fetch("/v1/me/following",{method:"DELETE",query:{type:"user",ids:e}}),at=(t,e)=>C(t,[e]),x=async(t,e)=>(await t.fetch("/v1/me/following/contains",{query:{type:"artist",ids:e}})).json(),pt=async(t,e)=>(await x(t,[e]))[0],O=async(t,e)=>(await t.fetch("/v1/me/following/contains",{query:{type:"user",ids:e}})).json(),ct=async(t,e)=>(await O(t,[e]))[0],S=async(t,e,s)=>(await t.fetch(`/v1/playlists/${s}/followers/contains`,{query:{ids:e}})).json(),lt=async(t,e,s)=>(await S(t,[e],s))[0];var mt=async(t,e,s)=>(await t.fetch("/v1/tracks/"+e,{query:{market:s}})).json(),ut=async(t,e,s)=>(await(await t.fetch("/v1/tracks",{query:{ids:e,market:s}})).json()).tracks,gt=async(t,e)=>(await t.fetch("/v1/me/tracks",{query:e})).json(),A=(t,e)=>t.fetch("/v1/me/tracks",{method:"PUT",query:{ids:e}}),Tt=(t,e)=>A(t,[e]),H=(t,e)=>t.fetch("/v1/me/tracks",{method:"DELETE",query:{ids:e}}),dt=(t,e)=>H(t,[e]),j=async(t,e)=>(await t.fetch("/v1/me/tracks/contains",{query:{ids:e}})).json(),Pt=async(t,e)=>(await j(t,[e]))[0],ft=async(t,e)=>(await(await t.fetch("/v1/audio-features",{query:{ids:e}})).json()).audio_features,ht=async(t,e)=>(await t.fetch("/v1/audio-features/"+e)).json(),bt=async(t,e)=>(await t.fetch("/v1/audio-analysis/"+e)).json(),wt=async(t,e)=>(await t.fetch("/v1/recommendations",{query:e})).json();var vt=async(t,e,s)=>(await t.fetch("/v1/shows/"+e,{query:{market:s}})).json(),Ct=async(t,e,s)=>(await(await t.fetch("/v1/shows",{query:{market:s,ids:e}})).json()).shows,xt=async(t,e,s)=>(await t.fetch(`/v1/shows/${e}/episodes`,{query:s})).json(),Ot=async(t,e)=>(await t.fetch("/v1/me/shows",{query:e})).json(),R=(t,e)=>t.fetch("/v1/me/shows",{method:"PUT",query:{ids:e}}),St=(t,e)=>R(t,[e]),E=(t,e)=>t.fetch("/v1/me/shows",{method:"DELETE",query:{ids:e}}),At=(t,e)=>E(t,[e]),q=async(t,e)=>(await t.fetch("/v1/me/shows/contains",{query:{ids:e}})).json(),Ht=async(t,e)=>(await q(t,[e]))[0];var Rt=async(t,e,s,r)=>{let i=typeof s=="string"?s:Object.entries(s).map(([a,c])=>a==="q"?c:`${a}:${c}`).join(" ");return(await t.fetch("/v1/search",{query:{q:i,type:e,...r}})).json()};var qt=async(t,e,s)=>(await t.fetch("/v1/playlists/"+e,{query:s})).json(),It=(t,e,s)=>t.fetch("/v1/playlist/"+e,{method:"PUT",body:s}),Ut=async(t,e,s)=>(await t.fetch(`/v1/playlists/${e}/tracks`,{query:s})).json(),I=async(t,e,s,r)=>(await t.fetch(`/v1/playlists/${e}/tracks`,{method:"POST",query:{uris:s,position:r}})).json(),_t=(t,e,s,r)=>I(t,e,[s],r),Lt=async(t,e,s)=>(await t.fetch(`/v1/playlists/${e}/tracks`,{method:"PUT",body:s})).json(),Gt=async(t,e,s)=>(await t.fetch(`/v1/playlists/${e}/tracks`,{method:"PUT",body:{uris:s}})).json(),U=async(t,e,s,r)=>(await t.fetch(`/v1/playlists/${e}/tracks`,{method:"DELETE",body:{tracks:s.map(n=>({uri:n})),snapshot_id:r}})).json(),Ft=(t,e,s,r)=>U(t,e,[s],r),Dt=async(t,e)=>(await t.fetch("/v1/me/playlists",{query:e})).json(),Bt=async(t,e,s)=>(await t.fetch(`/v1/users/${e}/playlists`,{query:s})).json(),$t=async(t,e,s)=>(await t.fetch(`/v1/users/${e}/playlists`,{method:"POST",body:s})).json(),Nt=async(t,e)=>(await t.fetch("/v1/browse/featured-playlists",{query:e})).json(),Yt=async(t,e,s)=>(await t.fetch(`/v1/browse/categories/${e}/playlists`,{query:s})).json(),Mt=async(t,e)=>(await t.fetch(`/v1/playlists/${e}/images`)).json(),Qt=(t,e,s)=>t.fetch(`/v1/playlists/${e}/images`,{method:"PUT",headers:{"Content-Type":"image/jpeg"},body:s});var Jt=async(t,e={})=>{let s=await t.fetch("/v1/me/player",{query:{market:e.market,additional_types:e.additional_types?.join(",")}});return s.status===204?null:s.json()},Vt=(t,e)=>t.fetch("/v1/me/player",{method:"PUT",body:e}),Wt=async t=>(await(await t.fetch("/v1/me/player/devices")).json()).devices,zt=async(t,e)=>{let s=await t.fetch("/v1/me/player/currently-playing",{query:e});return s.status===204?null:s.json()},_=(t,e={})=>{let{device_id:s,...r}=e;return t.fetch("/v1/me/player/play",{method:"PUT",body:r,query:{device_id:s}})},Xt=_,Zt=(t,e)=>t.fetch("/v1/me/player/pause",{method:"PUT",query:{device_id:e}}),te=(t,e)=>t.fetch("/v1/me/player/next",{method:"POST",query:{device_id:e}}),ee=(t,e)=>t.fetch("/v1/me/player/previous",{method:"POST",query:{device_id:e}}),se=(t,e,s)=>t.fetch("/v1/me/player/seek",{method:"PUT",query:{position_ms:e,device_id:s}}),re=(t,e,s)=>t.fetch("/v1/me/player/repeat",{method:"PUT",query:{state:e,device_id:s}}),ie=(t,e,s)=>t.fetch("/v1/me/player/shuffle",{method:"PUT",query:{state:e,device_id:s}}),oe=async(t,e)=>(await t.fetch("/v1/me/player/recently-played",{query:e})).json(),ne=async t=>(await t.fetch("/v1/me/player/queue")).json(),ae=(t,e,s)=>t.fetch("/v1/me/player/queue",{method:"POST",query:{uri:e,device_id:s}});var ce=async t=>(await(await t.fetch("/v1/markets")).json()).markets;var ye=async t=>(await(await t.fetch("/v1/recommendations/available-genre-seeds")).json()).genres;var ue=async(t,e,s)=>(await t.fetch("/v1/episodes/"+e,{query:{market:s}})).json(),ge=async(t,e,s)=>(await(await t.fetch("/v1/episodes",{query:{market:s,ids:e}})).json()).episodes,Te=async(t,e)=>(await t.fetch("/v1/me/episodes",{query:e})).json(),L=(t,e)=>t.fetch("/v1/me/episodes",{method:"PUT",query:{ids:e}}),de=(t,e)=>L(t,[e]),G=(t,e)=>t.fetch("/v1/me/episodes",{query:{ids:e}}),Pe=(t,e)=>G(t,[e]),F=async(t,e)=>(await t.fetch("/v1/me/episodes/contains",{query:{ids:e}})).json(),fe=async(t,e)=>(await F(t,[e]))[0];var be=async(t,e,s)=>(await t.fetch("/v1/chapters/"+e,{query:{market:s}})).json(),we=async(t,e,s)=>(await(await t.fetch("/v1/chapters",{query:{market:s,ids:e}})).json()).chapters;var ve=async(t,e)=>(await(await t.fetch("/v1/browse/categories",{query:e})).json()).categories,Ce=async(t,e,s)=>(await t.fetch("/v1/browse/categories/"+e,{query:s})).json();var Oe=async(t,e,s)=>(await t.fetch("/v1/audiobooks/"+e,{query:{market:s}})).json(),Se=async(t,e,s)=>(await(await t.fetch("/v1/audiobooks",{query:{market:s,ids:e}})).json()).audiobooks,Ae=async(t,e,s)=>(await t.fetch(`/v1/audiobooks/${e}/chapters`,{query:s})).json(),He=async(t,e)=>(await t.fetch("/v1/me/audiobooks",{query:e})).json(),D=(t,e)=>t.fetch("/v1/me/audiobooks",{method:"PUT",query:{ids:e}}),je=(t,e)=>D(t,[e]),B=(t,e)=>t.fetch("/v1/me/audiobooks",{method:"DELETE",query:{ids:e}}),Re=(t,e)=>B(t,[e]),$=async(t,e)=>(await t.fetch("/v1/me/audiobooks/contains",{query:{ids:e}})).json(),Ee=async(t,e)=>(await $(t,[e]))[0];var Ie=async(t,e)=>(await t.fetch("/v1/artists/"+e)).json(),Ue=async(t,e)=>(await(await t.fetch("/v1/artists",{query:{ids:e}})).json()).artists,_e=async(t,e,s)=>(await t.fetch(`/v1/artists/${e}/albums`,{query:s})).json(),Le=async(t,e,s)=>(await(await t.fetch(`/v1/artists/${e}/top-tracks`,{query:{market:s}})).json()).tracks,Ge=async(t,e)=>(await(await t.fetch(`/v1/artists/${e}/related-artists`)).json()).artists;var De=async(t,e,s)=>(await t.fetch("/v1/albums/"+e,{query:{market:s}})).json(),Be=async(t,e,s)=>(await(await t.fetch("/v1/albums",{query:{market:s,ids:e}})).json()).albums,$e=async(t,e,s)=>(await t.fetch(`/v1/albums/${e}/tracks`,{query:s})).json(),Ne=async(t,e)=>(await t.fetch("/v1/me/albums",{query:e})).json(),N=(t,e)=>t.fetch("/v1/me/albums",{method:"PUT",query:{ids:e}}),Ye=(t,e)=>N(t,[e]),Y=(t,e)=>t.fetch("/v1/me/albums",{method:"DELETE",query:{ids:e}}),Me=(t,e)=>Y(t,[e]),M=async(t,e)=>(await t.fetch("/v1/me/albums/contains",{query:{ids:e}})).json(),Qe=async(t,e)=>(await M(t,[e]))[0],Ke=async(t,e)=>(await(await t.fetch("/v1/browse/new-releases",{query:e})).json()).albums;export{J as OAUTH_SCOPES,K as SPOTIFY_AUTH_URL,u as SpotifyClient,m as SpotifyError,ae as addItemToPlaybackQueue,_t as addItemToPlaylist,I as addItemsToPlaylist,It as changePlaylistDetails,Qe as checkIfAlbumSaved,M as checkIfAlbumsSaved,Ee as checkIfAudiobookSaved,$ as checkIfAudiobooksSaved,fe as checkIfEpisodeSaved,F as checkIfEpisodesSaved,Ht as checkIfShowSaved,q as checkIfShowsSaved,Pt as checkIfTrackSaved,j as checkIfTracksSaved,pt as checkIfUserFollowsArtist,x as checkIfUserFollowsArtists,lt as checkIfUserFollowsPlaylist,ct as checkIfUserFollowsUser,O as checkIfUserFollowsUsers,S as checkIfUsersFollowPlaylist,$t as createPlaylist,it as followArtist,w as followArtists,et as followPlaylist,ot as followUser,k as followUsers,De as getAlbum,$e as getAlbumTracks,Be as getAlbums,Ie as getArtist,_e as getArtistAlbums,Ge as getArtistRelatedArtists,Le as getArtistTopTracks,Ue as getArtists,Oe as getAudiobook,Ae as getAudiobookChapters,Se as getAudiobooks,Wt as getAvailableDevices,ye as getAvailableGenreSeeds,ce as getAvailableMarkets,ve as getBrowseCategories,Ce as getBrowseCategory,Yt as getCategoryPlaylists,be as getChapter,we as getChapters,zt as getCurrentPlayingTrack,z as getCurrentUser,Dt as getCurrentUsersPlaylists,ue as getEpisode,ge as getEpisodes,Nt as getFeaturedPlaylists,rt as getFollowedArtists,Ke as getNewReleases,Jt as getPlaybackState,qt as getPlaylist,Mt as getPlaylistCoverImage,Ut as getPlaylistTracks,oe as getRecentPlayedTracks,wt as getRecommendations,Ne as getSavedAlbums,He as getSavedAudiobooks,Te as getSavedEpisodes,Ot as getSavedShows,gt as getSavedTracks,vt as getShow,xt as getShowEpisodes,Ct as getShows,mt as getTrack,ht as getTrackAudioFeatures,ut as getTracks,bt as getTracksAudioAnalysis,ft as getTracksAudioFeatures,tt as getUser,ne as getUserQueue,X as getUserTopArtists,T as getUserTopItems,Z as getUserTopTracks,Bt as getUsersPlaylists,Zt as pausePlayback,Ft as removePlaylistItem,U as removePlaylistItems,Me as removeSavedAlbum,Y as removeSavedAlbums,Re as removeSavedAudiobook,B as removeSavedAudiobooks,Pe as removeSavedEpisode,G as removeSavedEpisodes,At as removeSavedShow,E as removeSavedShows,dt as removeSavedTrack,H as removeSavedTracks,Lt as reorderPlaylistItems,Gt as replacePlaylistItems,Xt as resumePlayback,Ye as saveAlbum,N as saveAlbums,je as saveAudiobook,D as saveAudiobooks,de as saveEpisode,L as saveEpisodes,St as saveShow,R as saveShows,Tt as saveTrack,A as saveTracks,Rt as search,se as seekToPosition,re as setRepeatMode,te as skipToNext,ee as skipToPrevious,_ as startPlayback,ie as togglePlaybackShuffle,Vt as transferPlayback,nt as unfollowArtist,v as unfollowArtists,st as unfollowPlaylist,at as unfollowUser,C as unfollowUsers,Qt as uploadPlaylistCoverImage};
var K="https://accounts.spotify.com/",J={UGC_IMAGE_UPLOAD:"ugc-image-upload",USER_READ_PLAYBACK_STATE:"user-read-playback-state",USER_MODIFY_PLAYBACK_STATE:"user-modify-playback-state",USER_READ_CURRENTLY_PLAYING:"user-read-currently-playing",STREAMING:"streaming",PLAYLIST_READ_PRIVATE:"playlist-read-private",PLAYLIST_READ_COLLABORATIVE:"playlist-read-collaborative",PLAYLIST_MODIFY_PRIVATE:"playlist-modify-private",PLAYLIST_MODIFY_PUBLIC:"playlist-modify-public",USER_FOLLOW_MODIFY:"user-follow-modify",USER_FOLLOW_READ:"user-follow-read",USER_READ_PLAYBACK_POSITION:"user-read-playback-position",USER_TOP_READ:"user-top-read",USER_READ_RECENTLY_PLAYED:"user-read-recently-played",USER_LIBRARY_MODIFY:"user-library-modify",USER_LIBRARY_READ:"user-library-read",USER_READ_EMAIL:"user-read-email",USER_READ_PRIVATE:"user-read-private"};var y=class extends Error{constructor(s,r,o,n){super(s,n);this.response=r;this.body=o}name="SpotifyError";get url(){return this.response.url}get status(){return this.response.status}},l="application/json",u="Content-Type",f=e=>e===null?null:typeof e=="string"?e:e.error.message+(e.error.reason?` (${e.error.reason})`:""),b=async(e,t)=>{let s=e.statusText?`${e.status} ${e.statusText}`:e.status.toString(),r=e.url.split("?")[0];r&&(s+=` (${r})`);let o=null;if(e.body&&e.type!=="opaque"){try{o=await e.text();let a=e.headers.get(u);a&&(a===l||a.split(";")[0]===l)&&(o=JSON.parse(o))}catch{}let n=f(o);n&&(s+=" : "+n)}return new y(s,e,o,t)},h=e=>typeof e=="object"&&e!==null&&Object.prototype.toString.call(e)==="[object Object]",P=class{constructor(t,s={}){this.accessToken=t;this.options=s;this.baseUrl=s.baseUrl?s.baseUrl:"https://api.spotify.com/"}baseUrl;fetch(t,s={}){let r=new URL(t,this.baseUrl);if(s.query)for(let i in s.query){let p=s.query[i];typeof p<"u"&&r.searchParams.set(i,p.toString())}let o=new Headers(s.headers);o.set("Accept",l);let n=!!s.body&&(h(s.body)||Array.isArray(s.body));n&&o.set(u,l);let a=n?JSON.stringify(s.body):s.body,c=!1,T=(this.options.middlewares||[]).reduceRight((i,p)=>p(i),this.options.fetch||globalThis.fetch),m=async()=>{o.set("Authorization","Bearer "+this.accessToken);let i=await T(r,{...s,body:a,headers:o});if(i.ok)return i;if(i.status===401&&this.options.refresher&&!c)return this.accessToken=await this.options.refresher(),c=!0,m();if(i.status===429){let p=Number(i.headers.get("Retry-After"))||void 0;if(p)return(typeof this.options.waitForRateLimit=="function"?this.options.waitForRateLimit(p):this.options.waitForRateLimit)&&await new Promise(d=>setTimeout(d,p*1e3)),m()}throw await b(i)};return m()}};var z=async e=>(await e.fetch("/v1/me")).json(),g=async(e,t,s)=>(await e.fetch("/v1/me/top/"+t,{query:s})).json(),X=async(e,t)=>await g(e,"artists",t),Z=async(e,t)=>await g(e,"tracks",t),ee=async(e,t)=>(await e.fetch("/v1/users/"+t)).json(),te=(e,t,s)=>e.fetch(`/v1/playlists/${t}/followers`,{method:"PUT",body:{public:s}}),se=(e,t)=>e.fetch(`/v1/playlists/${t}/followers`,{method:"DELETE"}),re=async(e,t)=>(await(await e.fetch("/v1/me/following",{query:{...t,type:"artist"}})).json()).artists,k=(e,t)=>e.fetch("/v1/me/following",{method:"PUT",query:{type:"artist",ids:t}}),oe=(e,t)=>k(e,[t]),w=(e,t)=>e.fetch("/v1/me/following",{method:"PUT",query:{type:"user",ids:t}}),ie=(e,t)=>w(e,[t]),v=(e,t)=>e.fetch("/v1/me/following",{method:"DELETE",query:{type:"artist",ids:t}}),ne=(e,t)=>v(e,[t]),C=(e,t)=>e.fetch("/v1/me/following",{method:"DELETE",query:{type:"user",ids:t}}),ae=(e,t)=>C(e,[t]),O=async(e,t)=>(await e.fetch("/v1/me/following/contains",{query:{type:"artist",ids:t}})).json(),pe=async(e,t)=>(await O(e,[t]))[0],S=async(e,t)=>(await e.fetch("/v1/me/following/contains",{query:{type:"user",ids:t}})).json(),ce=async(e,t)=>(await S(e,[t]))[0],x=async(e,t,s)=>(await e.fetch(`/v1/playlists/${s}/followers/contains`,{query:{ids:t}})).json(),le=async(e,t,s)=>(await x(e,[t],s))[0];var ye=async(e,t,s)=>(await e.fetch("/v1/tracks/"+t,{query:{market:s}})).json(),Pe=async(e,t,s)=>(await(await e.fetch("/v1/tracks",{query:{ids:t,market:s}})).json()).tracks,ue=async(e,t)=>(await e.fetch("/v1/me/tracks",{query:t})).json(),A=(e,t)=>e.fetch("/v1/me/tracks",{method:"PUT",query:{ids:t}}),ge=(e,t)=>A(e,[t]),R=(e,t)=>e.fetch("/v1/me/tracks",{method:"DELETE",query:{ids:t}}),Te=(e,t)=>R(e,[t]),H=async(e,t)=>(await e.fetch("/v1/me/tracks/contains",{query:{ids:t}})).json(),de=async(e,t)=>(await H(e,[t]))[0],fe=async(e,t)=>(await(await e.fetch("/v1/audio-features",{query:{ids:t}})).json()).audio_features,be=async(e,t)=>(await e.fetch("/v1/audio-features/"+t)).json(),he=async(e,t)=>(await e.fetch("/v1/audio-analysis/"+t)).json(),ke=async(e,t)=>(await e.fetch("/v1/recommendations",{query:t})).json();var ve=async(e,t,s)=>(await e.fetch("/v1/shows/"+t,{query:{market:s}})).json(),Ce=async(e,t,s)=>(await(await e.fetch("/v1/shows",{query:{market:s,ids:t}})).json()).shows,Oe=async(e,t,s)=>(await e.fetch(`/v1/shows/${t}/episodes`,{query:s})).json(),Se=async(e,t)=>(await e.fetch("/v1/me/shows",{query:t})).json(),j=(e,t)=>e.fetch("/v1/me/shows",{method:"PUT",query:{ids:t}}),xe=(e,t)=>j(e,[t]),E=(e,t)=>e.fetch("/v1/me/shows",{method:"DELETE",query:{ids:t}}),Ae=(e,t)=>E(e,[t]),I=async(e,t)=>(await e.fetch("/v1/me/shows/contains",{query:{ids:t}})).json(),Re=async(e,t)=>(await I(e,[t]))[0];var je=async(e,t,s,r)=>{let o=typeof s=="string"?s:Object.entries(s).map(([a,c])=>a==="q"?c:`${a}:${c}`).join(" ");return(await e.fetch("/v1/search",{query:{q:o,type:t,...r}})).json()};var Ie=async(e,t,s)=>(await e.fetch("/v1/playlists/"+t,{query:s})).json(),qe=(e,t,s)=>e.fetch("/v1/playlist/"+t,{method:"PUT",body:s}),Ue=async(e,t,s)=>(await e.fetch(`/v1/playlists/${t}/tracks`,{query:s})).json(),q=async(e,t,s,r)=>(await e.fetch(`/v1/playlists/${t}/tracks`,{method:"POST",query:{uris:s,position:r}})).json(),_e=(e,t,s,r)=>q(e,t,[s],r),Fe=async(e,t,s)=>(await e.fetch(`/v1/playlists/${t}/tracks`,{method:"PUT",body:s})).json(),Le=async(e,t,s)=>(await e.fetch(`/v1/playlists/${t}/tracks`,{method:"PUT",body:{uris:s}})).json(),U=async(e,t,s,r)=>(await e.fetch(`/v1/playlists/${t}/tracks`,{method:"DELETE",body:{tracks:s.map(n=>({uri:n})),snapshot_id:r}})).json(),Ge=(e,t,s,r)=>U(e,t,[s],r),De=async(e,t)=>(await e.fetch("/v1/me/playlists",{query:t})).json(),Be=async(e,t,s)=>(await e.fetch(`/v1/users/${t}/playlists`,{query:s})).json(),$e=async(e,t,s)=>(await e.fetch(`/v1/users/${t}/playlists`,{method:"POST",body:s})).json(),Ne=async(e,t)=>(await e.fetch("/v1/browse/featured-playlists",{query:t})).json(),Ye=async(e,t,s)=>(await e.fetch(`/v1/browse/categories/${t}/playlists`,{query:s})).json(),Me=async(e,t)=>(await e.fetch(`/v1/playlists/${t}/images`)).json(),Qe=(e,t,s)=>e.fetch(`/v1/playlists/${t}/images`,{method:"PUT",headers:{"Content-Type":"image/jpeg"},body:s});var Je=async(e,t={})=>{let s=await e.fetch("/v1/me/player",{query:{market:t.market,additional_types:t.additional_types?.join(",")}});return s.status===204?null:s.json()},Ve=(e,t)=>e.fetch("/v1/me/player",{method:"PUT",body:t}),We=async e=>(await(await e.fetch("/v1/me/player/devices")).json()).devices,ze=async(e,t)=>{let s=await e.fetch("/v1/me/player/currently-playing",{query:t});return s.status===204?null:s.json()},_=(e,t={})=>{let{device_id:s,...r}=t;return e.fetch("/v1/me/player/play",{method:"PUT",body:r,query:{device_id:s}})},Xe=_,Ze=(e,t)=>e.fetch("/v1/me/player/pause",{method:"PUT",query:{device_id:t}}),et=(e,t)=>e.fetch("/v1/me/player/next",{method:"POST",query:{device_id:t}}),tt=(e,t)=>e.fetch("/v1/me/player/previous",{method:"POST",query:{device_id:t}}),st=(e,t,s)=>e.fetch("/v1/me/player/seek",{method:"PUT",query:{position_ms:t,device_id:s}}),rt=(e,t,s)=>e.fetch("/v1/me/player/repeat",{method:"PUT",query:{state:t,device_id:s}}),ot=(e,t,s)=>e.fetch("/v1/me/player/shuffle",{method:"PUT",query:{state:t,device_id:s}}),it=async(e,t)=>(await e.fetch("/v1/me/player/recently-played",{query:t})).json(),nt=async e=>(await e.fetch("/v1/me/player/queue")).json(),at=(e,t,s)=>e.fetch("/v1/me/player/queue",{method:"POST",query:{uri:t,device_id:s}});var ct=async e=>(await(await e.fetch("/v1/markets")).json()).markets;var mt=async e=>(await(await e.fetch("/v1/recommendations/available-genre-seeds")).json()).genres;var Pt=async(e,t,s)=>(await e.fetch("/v1/episodes/"+t,{query:{market:s}})).json(),ut=async(e,t,s)=>(await(await e.fetch("/v1/episodes",{query:{market:s,ids:t}})).json()).episodes,gt=async(e,t)=>(await e.fetch("/v1/me/episodes",{query:t})).json(),F=(e,t)=>e.fetch("/v1/me/episodes",{method:"PUT",query:{ids:t}}),Tt=(e,t)=>F(e,[t]),L=(e,t)=>e.fetch("/v1/me/episodes",{query:{ids:t}}),dt=(e,t)=>L(e,[t]),G=async(e,t)=>(await e.fetch("/v1/me/episodes/contains",{query:{ids:t}})).json(),ft=async(e,t)=>(await G(e,[t]))[0];var ht=async(e,t,s)=>(await e.fetch("/v1/chapters/"+t,{query:{market:s}})).json(),kt=async(e,t,s)=>(await(await e.fetch("/v1/chapters",{query:{market:s,ids:t}})).json()).chapters;var vt=async(e,t)=>(await(await e.fetch("/v1/browse/categories",{query:t})).json()).categories,Ct=async(e,t,s)=>(await e.fetch("/v1/browse/categories/"+t,{query:s})).json();var St=async(e,t,s)=>(await e.fetch("/v1/audiobooks/"+t,{query:{market:s}})).json(),xt=async(e,t,s)=>(await(await e.fetch("/v1/audiobooks",{query:{market:s,ids:t}})).json()).audiobooks,At=async(e,t,s)=>(await e.fetch(`/v1/audiobooks/${t}/chapters`,{query:s})).json(),Rt=async(e,t)=>(await e.fetch("/v1/me/audiobooks",{query:t})).json(),D=(e,t)=>e.fetch("/v1/me/audiobooks",{method:"PUT",query:{ids:t}}),Ht=(e,t)=>D(e,[t]),B=(e,t)=>e.fetch("/v1/me/audiobooks",{method:"DELETE",query:{ids:t}}),jt=(e,t)=>B(e,[t]),$=async(e,t)=>(await e.fetch("/v1/me/audiobooks/contains",{query:{ids:t}})).json(),Et=async(e,t)=>(await $(e,[t]))[0];var qt=async(e,t)=>(await e.fetch("/v1/artists/"+t)).json(),Ut=async(e,t)=>(await(await e.fetch("/v1/artists",{query:{ids:t}})).json()).artists,_t=async(e,t,s)=>(await e.fetch(`/v1/artists/${t}/albums`,{query:s})).json(),Ft=async(e,t,s)=>(await(await e.fetch(`/v1/artists/${t}/top-tracks`,{query:{market:s}})).json()).tracks,Lt=async(e,t)=>(await(await e.fetch(`/v1/artists/${t}/related-artists`)).json()).artists;var Dt=async(e,t,s)=>(await e.fetch("/v1/albums/"+t,{query:{market:s}})).json(),Bt=async(e,t,s)=>(await(await e.fetch("/v1/albums",{query:{market:s,ids:t}})).json()).albums,$t=async(e,t,s)=>(await e.fetch(`/v1/albums/${t}/tracks`,{query:s})).json(),Nt=async(e,t)=>(await e.fetch("/v1/me/albums",{query:t})).json(),N=(e,t)=>e.fetch("/v1/me/albums",{method:"PUT",query:{ids:t}}),Yt=(e,t)=>N(e,[t]),Y=(e,t)=>e.fetch("/v1/me/albums",{method:"DELETE",query:{ids:t}}),Mt=(e,t)=>Y(e,[t]),M=async(e,t)=>(await e.fetch("/v1/me/albums/contains",{query:{ids:t}})).json(),Qt=async(e,t)=>(await M(e,[t]))[0],Kt=async(e,t)=>(await(await e.fetch("/v1/browse/new-releases",{query:t})).json()).albums;export{J as OAUTH_SCOPES,K as SPOTIFY_AUTH_URL,P as SpotifyClient,y as SpotifyError,at as addItemToPlaybackQueue,_e as addItemToPlaylist,q as addItemsToPlaylist,qe as changePlaylistDetails,Qt as checkIfAlbumSaved,M as checkIfAlbumsSaved,Et as checkIfAudiobookSaved,$ as checkIfAudiobooksSaved,ft as checkIfEpisodeSaved,G as checkIfEpisodesSaved,Re as checkIfShowSaved,I as checkIfShowsSaved,de as checkIfTrackSaved,H as checkIfTracksSaved,pe as checkIfUserFollowsArtist,O as checkIfUserFollowsArtists,le as checkIfUserFollowsPlaylist,ce as checkIfUserFollowsUser,S as checkIfUserFollowsUsers,x as checkIfUsersFollowPlaylist,$e as createPlaylist,oe as followArtist,k as followArtists,te as followPlaylist,ie as followUser,w as followUsers,Dt as getAlbum,$t as getAlbumTracks,Bt as getAlbums,qt as getArtist,_t as getArtistAlbums,Lt as getArtistRelatedArtists,Ft as getArtistTopTracks,Ut as getArtists,St as getAudiobook,At as getAudiobookChapters,xt as getAudiobooks,We as getAvailableDevices,mt as getAvailableGenreSeeds,ct as getAvailableMarkets,vt as getBrowseCategories,Ct as getBrowseCategory,Ye as getCategoryPlaylists,ht as getChapter,kt as getChapters,ze as getCurrentPlayingTrack,z as getCurrentUser,De as getCurrentUsersPlaylists,Pt as getEpisode,ut as getEpisodes,Ne as getFeaturedPlaylists,re as getFollowedArtists,Kt as getNewReleases,Je as getPlaybackState,Ie as getPlaylist,Me as getPlaylistCoverImage,Ue as getPlaylistTracks,it as getRecentPlayedTracks,ke as getRecommendations,Nt as getSavedAlbums,Rt as getSavedAudiobooks,gt as getSavedEpisodes,Se as getSavedShows,ue as getSavedTracks,ve as getShow,Oe as getShowEpisodes,Ce as getShows,ye as getTrack,be as getTrackAudioFeatures,Pe as getTracks,he as getTracksAudioAnalysis,fe as getTracksAudioFeatures,ee as getUser,nt as getUserQueue,X as getUserTopArtists,g as getUserTopItems,Z as getUserTopTracks,Be as getUsersPlaylists,Ze as pausePlayback,Ge as removePlaylistItem,U as removePlaylistItems,Mt as removeSavedAlbum,Y as removeSavedAlbums,jt as removeSavedAudiobook,B as removeSavedAudiobooks,dt as removeSavedEpisode,L as removeSavedEpisodes,Ae as removeSavedShow,E as removeSavedShows,Te as removeSavedTrack,R as removeSavedTracks,Fe as reorderPlaylistItems,Le as replacePlaylistItems,Xe as resumePlayback,Yt as saveAlbum,N as saveAlbums,Ht as saveAudiobook,D as saveAudiobooks,Tt as saveEpisode,F as saveEpisodes,xe as saveShow,j as saveShows,ge as saveTrack,A as saveTracks,je as search,st as seekToPosition,rt as setRepeatMode,et as skipToNext,tt as skipToPrevious,_ as startPlayback,ot as togglePlaybackShuffle,Ve as transferPlayback,ne as unfollowArtist,v as unfollowArtists,se as unfollowPlaylist,ae as unfollowUser,C as unfollowUsers,Qe as uploadPlaylistCoverImage};

@@ -1,30 +0,92 @@

import { e as PagingOptions, P as PagingObject, d as Prettify } from './general.types-jCvPSk43.js';
type PageIteratorOptions = {
/**
* The Spotify API does not allow you to use a negative offset, but you can do so with this property. This will be useful when, for example, you want to get the last 100 elements.
*
* Under the hood, it will first get the total number of items by fetching with an offset of `0` and then calculate the starting offset.
*
* @default 0
*/
initialOffset?: number;
};
/**
* Represents the possible directions a paginator can take, where the values of "next" and "prev" indicate whether the iterator is navigating forward or backward.
* A helper class which allows you to iterate over items in a paginated API response with javascript async iterators.
*
* @example
* ```ts
* const playlistIter = new PageIterator((offset) =>
* getPlaylistTracks(client, "SOME_PLAYLITS_ID", { offset, limit: 50 })
* );
*
* // Iterate over the playlist tracks
* for await (const track of playlistIter) {
* console.log(track);
* }
*
* // Collect all the tracks
* const tracks = await playlistIter.collect();
*
* // Collect the last 100 tracks in playlist
* const lastHundredTracks = new PageIterator(
* (offset) =>
* getPlaylistTracks(client, "SOME_PLAYLITS_ID", { offset, limit: 50 }),
* { initialOffset: -100 },
* ).collect();
* ```
*/
type PaginatorDirection = "next" | "prev";
type NextPageOptions = {
limit?: number;
setOffset?: (offset: number) => number;
};
type PageIterOptions = Prettify<PagingOptions & {
direction?: PaginatorDirection;
}>;
declare class ChunkIterator<TItem> {
private fetcher;
private defaults;
constructor(fetcher: (opts: PagingOptions) => Promise<PagingObject<TItem>>, defaults?: PageIterOptions);
asyncIterator(): AsyncIterator<TItem[], TItem[], NextPageOptions | undefined>;
[Symbol.asyncIterator](): AsyncIterator<TItem[], TItem[], NextPageOptions | undefined>;
}
declare class PageIterator<TItem> {
private fetcher;
private defaults;
constructor(fetcher: (opts: PagingOptions) => Promise<PagingObject<TItem>>, defaults?: PageIterOptions);
asyncIterator(): AsyncGenerator<TItem, TItem, unknown>;
[Symbol.asyncIterator](): AsyncGenerator<TItem, TItem>;
collect(): Promise<TItem[]>;
private readonly fetcher;
private options;
constructor(fetcher: (offset: number) => Promise<{
limit: number;
next: string | null;
total: number;
items: TItem[];
}>, options?: PageIteratorOptions);
[Symbol.asyncIterator](initialOffset?: number): AsyncGenerator<TItem, null, void>;
/**
* @param limit The maximum number of items to collect. By default it set to `Infinity`, which means it will collect all items.
*/
collect(limit?: number): Promise<TItem[]>;
}
type Direction = "backward" | "forward";
type CursorPageIteratorOptions<TDirection extends Direction> = {
direction?: TDirection;
} & (TDirection extends "forward" ? {
initialAfter?: string;
} : {
initialBefore?: string;
});
/**
* A helper class which allows you to iterate over items in a cursor paginated API response with javascript async iterators.
*
* @example
* ```ts
* // get the first 100 followed artists
* const artists = await new CursorPageIterator(
* opts => getFollowedArtists(client, { limit: 50, after: opts.after })
* ).collect(100);
* ```
*/
declare class CursorPageIterator<TItem, TDirection extends "backward" | "forward" = "forward"> {
private readonly fetcher;
private options;
constructor(fetcher: (options: TDirection extends "forward" ? {
after?: string;
} : {
before?: string;
}) => Promise<{
next: string | null;
cursors: {
after?: string;
before?: string;
} | null;
items: TItem[];
}>, options?: CursorPageIteratorOptions<TDirection>);
[Symbol.asyncIterator](): AsyncGenerator<TItem, null, void>;
/**
* @param limit The maximum number of items to collect. By default it set to `Infinity`, which means it will collect all items.
*/
collect(limit?: number): Promise<TItem[]>;
}
export { ChunkIterator, PageIterator };
export { CursorPageIterator, type CursorPageIteratorOptions, PageIterator, type PageIteratorOptions };

@@ -1,1 +0,1 @@

var c={direction:"next",limit:20,offset:0},o=class{constructor(t,e={}){this.fetcher=t;this.defaults={...c,...e}}defaults;asyncIterator(){return this[Symbol.asyncIterator]()}[Symbol.asyncIterator](){let t=!1,{direction:e,limit:s,offset:i}=this.defaults;return{next:async(r={})=>{if(t)return{done:t,value:[]};s=r.limit??this.defaults.limit,i=r.setOffset?r.setOffset(i):i;let n=await this.fetcher({limit:s,offset:i});return e==="next"&&!n.next||e==="prev"&&!n.previous?(t=!0,{value:n.items,done:!1}):(i=e==="next"?i+s:i-s,{value:n.items,done:t})}}}},a=class{constructor(t,e={}){this.fetcher=t;this.defaults={...c,...e}}defaults;asyncIterator(){return this[Symbol.asyncIterator]()}async*[Symbol.asyncIterator](){let{direction:t,limit:e,offset:s}=this.defaults;for(;;){let i=await this.fetcher({limit:e,offset:s});if(t==="next"&&!i.next||t==="prev"&&!i.previous){let r=i.items.pop();for(let n of i.items)yield n;return r}for(let r of i.items)yield r;s=t==="next"?s+e:s-e}}async collect(){let t=[];for await(let e of this)t.push(e);return t}};export{o as ChunkIterator,a as PageIterator};
var o=class{constructor(i,t={}){this.fetcher=i;this.options={initialOffset:0,...t}}options;async*[Symbol.asyncIterator](i){let t=typeof i=="number"?i:this.options.initialOffset;if(t<0){let e=await this.fetcher(0);if(e.total===0)return null;t=e.total+t}for(;;){let e=await this.fetcher(t);for(let r=0;r<e.items.length;r++)yield e.items[r];if(!e.next)return null;t=t+e.limit}}async collect(i=1/0){if(i<0)throw new RangeError(`The limit must be a positive number, got ${i}`);let t=[];for await(let e of this)if(t.push(e),t.length>=i)break;return t}},n=class{constructor(i,t={}){this.fetcher=i;this.options={direction:"forward",...t}}options;async*[Symbol.asyncIterator](){let i=this.options.direction,t=i==="forward"?"initialAfter"in this.options?this.options.initialAfter:void 0:"initialBefore"in this.options?this.options.initialBefore:void 0;for(;;){let e=await this.fetcher(i==="forward"?{after:t}:{before:t});if(i==="forward")for(let r=0;r<e.items.length;r++)yield e.items[r];else for(let r=e.items.length-1;r>=0;r--)yield e.items[r];if(!e.next)return null;t=i==="forward"?e.cursors?.after:e.cursors?.before}}async collect(i=1/0){if(i<0)throw new RangeError(`The limit must be a positive number, got ${i}`);let t=[];for await(let e of this)if(t.push(e),t.length>=i)break;return t}};export{n as CursorPageIterator,o as PageIterator};
{
"name": "@soundify/web-api",
"version": "1.0.0-rc7",
"version": "1.0.0",
"description": "🎧 Spotify Web API client for js/ts runtime environments",

@@ -5,0 +5,0 @@ "type": "module",

@@ -208,3 +208,3 @@ <div align="center">

To simplify the process of paginating through the results, we provide a
`PageIterator` class.
`PageIterator` and `CursorPageIterator` classes.

@@ -215,8 +215,11 @@ ```ts

const client = new SpotifyClient("YOUR_ACCESS_TOKEN", {
waitForRateLimit: true,
});
const client = new SpotifyClient("YOUR_ACCESS_TOKEN");
const playlistIter = new PageIterator(
(opts) => getPlaylistTracks(client, "37i9dQZEVXbMDoHDwVN2tF", opts),
(offset) => getPlaylistTracks(client, "37i9dQZEVXbMDoHDwVN2tF", {
// you can find the max limit for specific endpoint
// in spotify docs or in the jsdoc comments of this property
limit: 50,
offset,
}),
);

@@ -232,4 +235,39 @@

console.log(allTracks.length);
// Want to get the last 100 items? No problem
const lastHundredTracks = new PageIterator(
(offset) => getPlaylistTracks(
client,
"37i9dQZEVXbMDoHDwVN2tF",
{ limit: 50, offset }
),
{ initialOffset: -100 }, // this will work just as `Array.slice(-100)`
).collect();
```
```ts
import { getFollowedArtists, SpotifyClient } from "@soundify/web-api";
import { CursorPageIterator } from "@soundify/web-api/pagination";
const client = new SpotifyClient("YOUR_ACCESS_TOKEN");
// loop over all followed artists
for await (const artist of new CursorPageIterator(
opts => getFollowedArtists(client, { limit: 50, after: opts.after })
)) {
console.log(artist.name);
}
// or collect all followed artists into an array
const artists = await new CursorPageIterator(
opts => getFollowedArtists(client, { limit: 50, after: opts.after })
).collect();
// get all followed artists starting from Radiohead
const artists = await new CursorPageIterator(
opts => getFollowedArtists(client, { limit: 50, after: opts.after }),
{ initialAfter: "4Z8W4fKeB5YxbusRsdQVPb" } // let's start from Radiohead
).collect();
```
## Other customizations

@@ -236,0 +274,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc