bandcamp-fetch
Version:
Scrape Bandcamp content
64 lines • 2.64 kB
JavaScript
import { load as cheerioLoad } from 'cheerio';
import { decode } from 'html-entities';
import { ParseError } from '../utils/Parse.js';
import ObjectHelper from '../utils/ObjectHelper.js';
export default class FanInfoParser {
static parseInfo(html, opts) {
const $ = cheerioLoad(html);
const blob = decode($('#pagedata[data-blob]').attr('data-blob'));
let parsed;
try {
parsed = JSON.parse(blob);
}
catch (error) {
throw new ParseError('Failed to parse fan info: JSON error in data-blob.', html, error);
}
const fanData = parsed.fan_data || {};
const fanId = fanData.fan_id;
if (!fanId || !fanData.name || !fanData.username) {
throw new ParseError('Failed to parse fan info: invalid data.', html);
}
const result = {
type: 'fan',
name: fanData.name || null,
username: fanData.username || null,
url: fanData.trackpipe_url,
description: fanData.bio || null,
location: fanData.location || null,
websiteUrl: fanData.website_url || null,
imageUrl: '',
followingGenresCount: fanData.following_genres_count || 0,
followingArtistsAndLabelsCount: fanData.following_bands_count || 0,
collectionItemCount: parsed.collection_data?.item_count || 0,
wishlistItemCount: parsed.wishlist_data?.item_count || 0
};
if (fanData.photo && fanData.photo.image_id && opts.imageFormat?.id) {
result.imageUrl = `${opts.imageBaseUrl}/img/${fanData.photo.image_id}_${opts.imageFormat.id}.jpg`;
}
return result;
}
static parseLoggedInFanUsername(html) {
const $ = cheerioLoad(html);
const blob = decode($('#HomepageApp[data-blob]').attr('data-blob'));
let parsed;
try {
parsed = JSON.parse(blob);
}
catch (error) {
throw new ParseError('Failed to parse logged-in fan username: JSON error in data-blob.', html, error);
}
const username = ObjectHelper.getProperty(parsed, 'pageContext.identity.fanUsername');
if (!username || typeof username !== 'string') {
let reason;
if (username === null) {
reason = 'check if valid cookie is set';
}
else {
reason = 'invalid data';
}
throw new ParseError(`Failed to parse logged-in fan username: ${reason}.`, parsed);
}
return username;
}
}
//# sourceMappingURL=FanInfoParser.js.map