@soundify/web-api
Advanced tools
Comparing version 1.0.0-rc7 to 1.0.0
@@ -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
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
157779
3387
0
314
9