bandcamp-fetch
Version:
Scrape Bandcamp content
122 lines • 3.8 kB
JavaScript
import { URLS } from './Constants.js';
/**
* @internal
*
* @param $
* @returns
*/
export function parseLabelFromBackToLabelLink($) {
const labelLink = $('.back-to-label-link');
if (labelLink.length) {
const linkText = labelLink.find('.back-link-text').html();
const labelName = linkText &&
(substrAfter(linkText, '<br/>') ||
substrAfter(linkText, '<br>') ||
substrBefore(linkText, ' に戻る') ||
substrBefore(linkText, ' のアイテムをもっと聴く'));
const linkHref = labelLink.attr('href');
const labelHref = linkHref && splitUrl(linkHref).base;
return labelName && labelHref ? {
type: 'label',
name: labelName,
url: labelHref
} : null;
}
return null;
}
export function parsePublisher(json, imageFormat) {
if (json.publisher) {
const imageUrl = reformatImageUrl(json.publisher.image, imageFormat);
const publisher = {
name: json.publisher.name,
url: json.publisher['@id'],
description: json.publisher.description
};
if (imageUrl) {
publisher.imageUrl = imageUrl;
}
return publisher;
}
return null;
}
export function normalizeUrl(url, baseUrl) {
if (!url) {
return null;
}
if (isAbsoluteUrl(url)) {
return url;
}
if (!baseUrl) {
baseUrl = URLS.SITE_URL;
}
return new URL(url, baseUrl).toString();
}
export function getAdditionalPropertyValue(o, propName) {
if (Array.isArray(o.additionalProperty)) {
const p = o.additionalProperty.find((prop) => prop.name === propName);
if (p?.value !== undefined) {
return p.value;
}
}
return undefined;
}
export function isAbsoluteUrl(url) {
const isAbsolute = new RegExp('^([a-z]+://|//)', 'i');
return isAbsolute.test(url);
}
export function substrAfter(str, after) {
const afterIndex = str.indexOf(after);
return afterIndex >= 0 ? str.substring(afterIndex + after.length) : null;
}
export function substrBefore(str, before) {
const beforeIndex = str.indexOf(before);
return beforeIndex >= 0 ? str.substring(0, beforeIndex) : null;
}
export function splitUrl(url) {
const urlObj = new URL(url);
return {
base: `${urlObj.protocol}//${urlObj.host}`,
path: urlObj.pathname,
query: urlObj.search,
hash: urlObj.hash,
searchParams: urlObj.searchParams
};
}
export function stripTags(str) {
// https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/
return str.replace(/(<([^>]+)>)/gi, '');
}
export function stripLineBreaks(str) {
return str.replace(/(\r\n|\n|\r)/gm, ' ');
}
export function stripMultipleWhitespaces(str) {
return str.replace(/\s+/g, ' ');
}
export function brToNewLine(str) {
// https://stackoverflow.com/questions/5959415/jquery-javascript-regex-replace-br-with-n
return str.replace(/<br\s*[/]?>/gi, '\n');
}
/**
* @internal
* Takes an image URL and returns one that corresponds to `imageFormat`.
* @param imageUrl
* @param imageFormat
* @returns
*/
export function reformatImageUrl(imageUrl, imageFormat) {
if (imageUrl) {
// Regex from: https://github.com/masterT/bandcamp-scraper/blob/master/lib/htmlParser.js
return imageFormat ? imageUrl.replace(/_\d{1,3}\./, `_${imageFormat.id}.`) : imageUrl;
}
return null;
}
export class ParseError extends Error {
constructor(message, parseTarget, cause) {
super(message);
this.parseTarget = parseTarget;
if (cause) {
this.cause = cause instanceof Error ? cause : Error(cause.toString());
}
}
}
//# sourceMappingURL=Parse.js.map