bandcamp-fetch
Version:
Scrape Bandcamp content
94 lines • 3.4 kB
JavaScript
import FanItemsBaseParser from './FanItemsBaseParser.js';
export default class FanWishlistParser extends FanItemsBaseParser {
static parseWishlistFromPage(html, opts) {
return this.parsePageItems(html, {
...opts,
dataKey: 'wishlist',
parseItemFn: this.parseWishlistItem
});
}
static parseWishlistFromContinuation(json, continuation, opts) {
return this.parseContinuationItems(json, continuation, {
...opts,
dataKey: 'items',
parseItemFn: this.parseWishlistItem
});
}
static parseWishlistItem(data, opts, tracklists) {
if (!data) {
return null;
}
const _findInTrackLists = (tracklists, id) => {
if (!tracklists || typeof tracklists !== 'object') {
return null;
}
for (const tracks of Object.values(tracklists)) {
if (Array.isArray(tracks)) {
const track = tracks.find((t) => t.id === id);
if (track) {
return track;
}
}
}
};
let mediaItemType;
switch (data.tralbum_type) {
case 'a':
mediaItemType = 'album';
break;
case 't':
mediaItemType = 'track';
break;
default:
mediaItemType = null;
}
if (!mediaItemType) {
return null;
}
const mediaItem = {
type: mediaItemType,
id: data.item_id,
name: data.item_title,
url: data.item_url,
imageUrl: '',
artist: {
name: data.band_name
}
};
if (data.item_art_id && opts.imageFormat?.id) {
mediaItem.imageUrl = `${opts.imageBaseUrl}/img/a${data.item_art_id}_${opts.imageFormat.id}.jpg`;
}
if (data.url_hints && data.url_hints.subdomain && mediaItem.artist) {
mediaItem.artist.url = `https://${data.url_hints.subdomain}.bandcamp.com`;
}
const featuredTrackData = data.featured_track !== undefined ? _findInTrackLists(tracklists, data.featured_track) : null;
if (featuredTrackData) {
const duration = featuredTrackData.duration;
const streamUrl = featuredTrackData.file?.['mp3-128'];
const streamUrlHQ = featuredTrackData.file?.['mp3-v0'];
if (mediaItemType === 'album') {
const featuredTrack = {
id: featuredTrackData.id,
position: featuredTrackData.track_number,
name: featuredTrackData.title,
artist: featuredTrackData.artist,
duration,
streamUrl
};
if (streamUrlHQ) {
featuredTrack.streamUrlHQ = streamUrlHQ;
}
mediaItem.featuredTrack = featuredTrack;
}
else {
mediaItem.duration = duration;
mediaItem.streamUrl = streamUrl;
if (streamUrlHQ) {
mediaItem.streamUrlHQ = streamUrlHQ;
}
}
}
return mediaItem;
}
}
//# sourceMappingURL=FanWishlistParser.js.map