graphql-spotify
Advanced tools
Comparing version 0.4.15 to 0.4.21
152
dist/lib.js
@@ -85,3 +85,3 @@ module.exports = | ||
var _resolvers = __webpack_require__(16); | ||
var _resolvers = __webpack_require__(19); | ||
@@ -164,4 +164,16 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
var _RootQuery = __webpack_require__(15); | ||
var _RecommendationParameters = __webpack_require__(15); | ||
var _RecommendationParameters2 = _interopRequireDefault(_RecommendationParameters); | ||
var _RecommendationsResponse = __webpack_require__(16); | ||
var _RecommendationsResponse2 = _interopRequireDefault(_RecommendationsResponse); | ||
var _RecommendationsSeedObject = __webpack_require__(17); | ||
var _RecommendationsSeedObject2 = _interopRequireDefault(_RecommendationsSeedObject); | ||
var _RootQuery = __webpack_require__(18); | ||
var _RootQuery2 = _interopRequireDefault(_RootQuery); | ||
@@ -178,3 +190,3 @@ | ||
const typeDefs = [SchemaDefinition, _RootQuery2.default, _Playlist2.default, _Image2.default, _User2.default, _PlaylistTrack2.default, _Track2.default, _Album2.default, _Artist2.default, _Paging2.default, _AudioFeatures2.default, _PlayHistory2.default, _Category2.default, _ExternalUrls2.default]; | ||
const typeDefs = [SchemaDefinition, _RootQuery2.default, _Playlist2.default, _Image2.default, _User2.default, _PlaylistTrack2.default, _Track2.default, _Album2.default, _Artist2.default, _Paging2.default, _AudioFeatures2.default, _PlayHistory2.default, _Category2.default, _RecommendationParameters2.default, _RecommendationsResponse2.default, _RecommendationsSeedObject2.default, _ExternalUrls2.default]; | ||
@@ -571,2 +583,87 @@ exports.default = typeDefs; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
// TODO after all parameters on targting attributes from https://beta.developer.spotify.com/documentation/web-api/reference/browse/get-recommendations/ | ||
const RecommendationParameters = ` | ||
input RecommendationParameters { | ||
limit: Int | ||
seed_artists: [String] | ||
seed_genres: [String] | ||
seed_tracks: [String] | ||
} | ||
`; | ||
exports.default = RecommendationParameters; | ||
/***/ }), | ||
/* 16 */ | ||
/***/ (function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
const RecommendationsResponse = ` | ||
type RecommendationsResponse { | ||
seeds: [RecommendationsSeedObject] | ||
""" | ||
An array of track object (simplified) ordered according to the parameters supplied | ||
""" | ||
tracks: [Track] | ||
} | ||
`; | ||
exports.default = RecommendationsResponse; | ||
/***/ }), | ||
/* 17 */ | ||
/***/ (function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
const RecommendationsSeedObject = ` | ||
type RecommendationsSeedObject { | ||
""" | ||
The number of tracks available after min_* and max_* filters have been applied | ||
""" | ||
afterFilteringSize: Int | ||
""" | ||
The number of tracks available after relinking for regional availability. | ||
""" | ||
afterRelinkingSize: Int | ||
""" | ||
A link to the full track or artist data for this seed. For tracks this will be a link to a Track Object. For artists a link to an Artist Object. For genre seeds, this value will be null. | ||
""" | ||
href: String | ||
""" | ||
The id used to select this seed. This will be the same as the string used in the seed_artists , seed_tracks or seed_genres parameter | ||
""" | ||
id: String | ||
""" | ||
The number of recommended tracks available for this seed. | ||
""" | ||
initialPoolSize: Int | ||
""" | ||
The entity type of this seed. One of artist , track or genre | ||
""" | ||
type: String | ||
} | ||
`; | ||
exports.default = RecommendationsSeedObject; | ||
/***/ }), | ||
/* 18 */ | ||
/***/ (function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
@@ -602,2 +699,5 @@ }); | ||
categories(limit: Int, offset: Int): Paging | ||
""" | ||
""" | ||
recommendations(parameters: RecommendationParameters): RecommendationsResponse | ||
@@ -615,3 +715,3 @@ } | ||
/***/ }), | ||
/* 16 */ | ||
/* 19 */ | ||
/***/ (function(module, exports, __webpack_require__) { | ||
@@ -627,3 +727,3 @@ | ||
var _SpotifyWebApi = __webpack_require__(17); | ||
var _SpotifyWebApi = __webpack_require__(20); | ||
@@ -633,3 +733,3 @@ function makeResolvers(token) { | ||
PlaylistLoader, PlaylistTracksLoader, AlbumsLoader, UserLoader, ArtistsLoader, | ||
AudioFeaturesLoader, SavedContainsLoader, TracksLoader, CategoriesLoader | ||
AudioFeaturesLoader, SavedContainsLoader, TracksLoader, CategoriesLoader, RecommendationsLoader | ||
} = (0, _SpotifyWebApi.makeLoaders)(token); | ||
@@ -662,2 +762,5 @@ | ||
return res.categories; | ||
}, | ||
recommendations: async (obj, args) => { | ||
return await RecommendationsLoader.load(args.parameters); | ||
} | ||
@@ -776,3 +879,3 @@ }, | ||
/***/ }), | ||
/* 17 */ | ||
/* 20 */ | ||
/***/ (function(module, exports, __webpack_require__) { | ||
@@ -789,2 +892,3 @@ | ||
exports.getFeaturedPlaylists = getFeaturedPlaylists; | ||
exports.getRecommendations = getRecommendations; | ||
exports.getCategories = getCategories; | ||
@@ -809,6 +913,7 @@ exports.getRecentlyPlayed = getRecentlyPlayed; | ||
exports.makeCategoriesLoader = makeCategoriesLoader; | ||
exports.makeRecommendationsLoader = makeRecommendationsLoader; | ||
__webpack_require__(18); | ||
__webpack_require__(21); | ||
var _dataloader = __webpack_require__(19); | ||
var _dataloader = __webpack_require__(22); | ||
@@ -827,2 +932,6 @@ var _dataloader2 = _interopRequireDefault(_dataloader); | ||
function cacheKeyFnForQueryKeys(key) { | ||
return JSON.stringify(key); | ||
} | ||
function serializeToURLParameters(obj) { | ||
@@ -859,2 +968,11 @@ return Object.entries(obj).map(([key, val]) => `${key}=${val}`).join('&'); | ||
async function getRecommendations(token, queryParams) { | ||
let res = await fetch(`https://api.spotify.com/v1/recommendations?${serializeToURLParameters(queryParams)}`, { | ||
method: 'GET', | ||
headers: makeHeaders(token) | ||
}); | ||
res = await res.json(); | ||
return res; | ||
} | ||
async function getCategories(token, queryParams = {}) { | ||
@@ -952,3 +1070,4 @@ let res = await fetch(`https://api.spotify.com/v1/browse/categories?${serializeToURLParameters(queryParams)}`, { | ||
AudioFeaturesLoader: makeAudioFeaturesLoader(token), | ||
CategoriesLoader: makeCategoriesLoader(token) | ||
CategoriesLoader: makeCategoriesLoader(token), | ||
RecommendationsLoader: makeRecommendationsLoader(token) | ||
}; | ||
@@ -1026,7 +1145,14 @@ } | ||
}; | ||
return new _dataloader2.default(batchLoadFn, { batch: false }); | ||
return new _dataloader2.default(batchLoadFn, { batch: false, cacheKeyFn: cacheKeyFnForQueryKeys }); | ||
} | ||
function makeRecommendationsLoader(token) { | ||
const batchLoadFn = async ([key]) => { | ||
return [await getRecommendations(token, key)]; | ||
}; | ||
return new _dataloader2.default(batchLoadFn, { batch: false, cacheKeyFn: cacheKeyFnForQueryKeys }); | ||
} | ||
/***/ }), | ||
/* 18 */ | ||
/* 21 */ | ||
/***/ (function(module, exports) { | ||
@@ -1037,3 +1163,3 @@ | ||
/***/ }), | ||
/* 19 */ | ||
/* 22 */ | ||
/***/ (function(module, exports) { | ||
@@ -1040,0 +1166,0 @@ |
{ | ||
"name": "graphql-spotify", | ||
"version": "0.4.15", | ||
"version": "0.4.21", | ||
"description": "GraphQL Schema And Resolvers For Spotify Web API", | ||
@@ -5,0 +5,0 @@ "main": "dist/lib.js", |
import { | ||
getCategories, | ||
getFeaturedPlaylists, getRecentlyPlayed, makeLoaders, saveTrackToLib | ||
@@ -9,3 +8,4 @@ } from './SpotifyWebApi' | ||
PlaylistLoader, PlaylistTracksLoader, AlbumsLoader, UserLoader, ArtistsLoader, | ||
AudioFeaturesLoader, SavedContainsLoader, TracksLoader, CategoriesLoader | ||
AudioFeaturesLoader, SavedContainsLoader, TracksLoader, CategoriesLoader, RecommendationsLoader, | ||
CategoryPlaylistLoader | ||
} = makeLoaders(token); | ||
@@ -38,2 +38,5 @@ | ||
return res.categories | ||
}, | ||
recommendations: async (obj, args) => { | ||
return await RecommendationsLoader.load(args.parameters) | ||
} | ||
@@ -63,3 +66,5 @@ }, | ||
// otherwise always fetch all of the tracks | ||
let currentOffset = items.length; | ||
// when resolving a full playlist there are already items | ||
let allItems = items || [] | ||
let currentOffset = allItems.length | ||
let fetches = [] | ||
@@ -71,3 +76,2 @@ while (currentOffset < total ) { | ||
const fetchResults = await Promise.all(fetches); | ||
let allItems = items | ||
fetchResults.forEach((result) => { | ||
@@ -134,2 +138,8 @@ allItems = allItems.concat(result.items) | ||
}, | ||
Category: { | ||
playlists: async(category, args) => { | ||
const { playlists } = await CategoryPlaylistLoader.load({ id: category.id, queryParams: args }) | ||
return playlists | ||
} | ||
}, | ||
Item: { | ||
@@ -136,0 +146,0 @@ __resolveType(object, context, info){ |
@@ -10,2 +10,6 @@ const Category = ` | ||
name: String | ||
""" | ||
Get a list of Spotify playlists tagged with a particular category | ||
""" | ||
playlists(country: String, limit: Int, offset: Int): Paging | ||
} | ||
@@ -12,0 +16,0 @@ ` |
@@ -13,2 +13,6 @@ import Playlist from './Playlist' | ||
import Category from './Category' | ||
import RecommendationParameters from './RecommendationParameters' | ||
import RecommendationsResponse from './RecommendationsResponse' | ||
import RecommendationsSeedObject from './RecommendationsSeedObject' | ||
import RootQuery from './RootQuery' | ||
@@ -24,4 +28,4 @@ | ||
const typeDefs = [SchemaDefinition, RootQuery, Playlist, Image, User, PlaylistTrack, Track, Album, Artist, Paging, | ||
AudioFeatures, PlayHistory, Category, ExternalUrls]; | ||
AudioFeatures, PlayHistory, Category, RecommendationParameters, RecommendationsResponse, RecommendationsSeedObject, ExternalUrls]; | ||
export default typeDefs |
@@ -29,2 +29,5 @@ const RootQuery = ` | ||
categories(limit: Int, offset: Int): Paging | ||
""" | ||
""" | ||
recommendations(parameters: RecommendationParameters): RecommendationsResponse | ||
@@ -31,0 +34,0 @@ } |
@@ -12,2 +12,6 @@ import 'isomorphic-fetch' | ||
function cacheKeyFnForQueryKeys(key) { | ||
return JSON.stringify(key) | ||
} | ||
function serializeToURLParameters(obj) { | ||
@@ -46,2 +50,22 @@ return Object.entries(obj).map(([key, val]) => `${key}=${val}`).join('&') | ||
export async function getCategoryPlaylists(token, id, queryParams = {}) | ||
{ | ||
let res = await fetch(`https://api.spotify.com/v1/browse/categories/${id}/playlists?${serializeToURLParameters(queryParams)}`, { | ||
method: 'GET', | ||
headers: makeHeaders(token) | ||
}); | ||
res = await res.json(); | ||
return res; | ||
} | ||
export async function getRecommendations(token, queryParams) | ||
{ | ||
let res = await fetch(`https://api.spotify.com/v1/recommendations?${serializeToURLParameters(queryParams)}`, { | ||
method: 'GET', | ||
headers: makeHeaders(token) | ||
}); | ||
res = await res.json(); | ||
return res; | ||
} | ||
export async function getCategories(token, queryParams = {}) | ||
@@ -137,16 +161,2 @@ { | ||
export function makeLoaders(token) { | ||
return { | ||
UserLoader : makeUserLoader(token), | ||
PlaylistLoader : makePlaylistLoader(token), | ||
PlaylistTracksLoader: makePlaylistTracksLoader(token), | ||
AlbumsLoader: makeAlbumsLoader(token), | ||
ArtistsLoader: makeArtistsLoader(token), | ||
TracksLoader: makeTracksLoader(token), | ||
SavedContainsLoader: makeSavedContainsLoader(token), | ||
AudioFeaturesLoader: makeAudioFeaturesLoader(token), | ||
CategoriesLoader : makeCategoriesLoader(token), | ||
} | ||
} | ||
export function makeUserLoader(token) { | ||
@@ -221,3 +231,32 @@ const batchLoadFn = async ([key]) => { | ||
} | ||
return new Dataloader(batchLoadFn, { batch: false }) | ||
return new Dataloader(batchLoadFn, { batch: false, cacheKeyFn: cacheKeyFnForQueryKeys }) | ||
} | ||
export function makeCategoriesPlaylistsLoader(token) { | ||
const batchLoadFn = async ([{ id, queryParams }]) => { | ||
return [await getCategoryPlaylists(token, id, queryParams)] | ||
} | ||
return new Dataloader(batchLoadFn, { batch: false, cacheKeyFn: cacheKeyFnForQueryKeys }) | ||
} | ||
export function makeRecommendationsLoader(token) { | ||
const batchLoadFn = async ([key]) => { | ||
return [await getRecommendations(token, key)] | ||
} | ||
return new Dataloader(batchLoadFn, { batch: false, cacheKeyFn: cacheKeyFnForQueryKeys }) | ||
} | ||
export function makeLoaders(token) { | ||
return { | ||
UserLoader : makeUserLoader(token), | ||
PlaylistLoader : makePlaylistLoader(token), | ||
PlaylistTracksLoader: makePlaylistTracksLoader(token), | ||
AlbumsLoader: makeAlbumsLoader(token), | ||
ArtistsLoader: makeArtistsLoader(token), | ||
TracksLoader: makeTracksLoader(token), | ||
SavedContainsLoader: makeSavedContainsLoader(token), | ||
AudioFeaturesLoader: makeAudioFeaturesLoader(token), | ||
CategoriesLoader : makeCategoriesLoader(token), | ||
RecommendationsLoader: makeRecommendationsLoader(token), | ||
CategoryPlaylistLoader: makeCategoriesPlaylistsLoader(token) | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
198842
26
1705
27