mirror of
https://github.com/BradNut/graphbrainz
synced 2025-09-08 17:40:32 +00:00
63 lines
1.7 KiB
JavaScript
63 lines
1.7 KiB
JavaScript
import DataLoader from 'dataloader'
|
|
import LRUCache from 'lru-cache'
|
|
|
|
const debug = require('debug')('graphbrainz:extensions/fanart-tv')
|
|
|
|
export default function createLoader(options) {
|
|
const { client } = options
|
|
const cache = LRUCache({
|
|
max: options.cacheSize,
|
|
maxAge: options.cacheTTL,
|
|
dispose(key) {
|
|
debug(`Removed from cache. key=${key}`)
|
|
}
|
|
})
|
|
// Make the cache Map-like.
|
|
cache.delete = cache.del
|
|
cache.clear = cache.reset
|
|
|
|
const loader = new DataLoader(
|
|
keys => {
|
|
return Promise.all(
|
|
keys.map(key => {
|
|
const [entityType, id] = key
|
|
return client
|
|
.musicEntity(entityType, id)
|
|
.catch(err => {
|
|
if (err.statusCode === 404) {
|
|
// 404s are OK, just return empty data.
|
|
return {
|
|
artistbackground: [],
|
|
artistthumb: [],
|
|
musiclogo: [],
|
|
hdmusiclogo: [],
|
|
musicbanner: [],
|
|
musiclabel: [],
|
|
albums: {}
|
|
}
|
|
}
|
|
throw err
|
|
})
|
|
.then(body => {
|
|
if (entityType === 'artist') {
|
|
const releaseGroupIDs = Object.keys(body.albums)
|
|
debug(
|
|
`Priming album cache with ${releaseGroupIDs.length} album(s).`
|
|
)
|
|
releaseGroupIDs.forEach(key =>
|
|
loader.prime(['release-group', key], body)
|
|
)
|
|
}
|
|
return body
|
|
})
|
|
})
|
|
)
|
|
},
|
|
{
|
|
cacheKeyFn: ([entityType, id]) => `${entityType}/${id}`,
|
|
cacheMap: cache
|
|
}
|
|
)
|
|
|
|
return loader
|
|
}
|