social-link-parser
Version:
Extract usernames, IDs, and metadata from social media URLs across 100+ platforms
60 lines • 2.13 kB
JavaScript
import { Platforms } from '../../core/types.js';
import { normalize } from '../../utils/url.js';
import { QUERY_HASH } from '../../utils/constants.js';
export const bandcamp = {
id: Platforms.Bandcamp,
name: 'Bandcamp',
color: '#629aa9',
domains: ['bandcamp.com'],
patterns: {
profile: new RegExp(`^https?://(?:www\\.)?([a-z0-9-]{2,60})\\.bandcamp\\.com/?${QUERY_HASH}$`, 'i'),
handle: /^[a-z0-9-]{2,60}$/i,
content: {
album: new RegExp(`^https?://(?:www\\.)?([a-z0-9-]{2,60})\\.bandcamp\\.com/album/([a-z0-9-]+)/?${QUERY_HASH}$`, 'i'),
track: new RegExp(`^https?://(?:www\\.)?([a-z0-9-]{2,60})\\.bandcamp\\.com/track/([a-z0-9-]+)/?${QUERY_HASH}$`, 'i'),
},
},
detect(url) {
if (!url.includes('.bandcamp.com'))
return false;
return this.patterns.profile.test(url) ||
!!(this.patterns.content?.album?.test(url)) ||
!!(this.patterns.content?.track?.test(url));
},
extract(url, res) {
const prof = this.patterns.profile.exec(url);
if (prof) {
res.username = prof[1];
res.metadata.isProfile = true;
res.metadata.contentType = 'artist';
return;
}
const alb = this.patterns.content?.album?.exec(url);
if (alb) {
const artist = alb[1];
const slug = alb[2];
res.username = artist;
res.ids.albumSlug = slug;
res.metadata.isAlbum = true;
res.metadata.contentType = 'album';
return;
}
const tr = this.patterns.content?.track?.exec(url);
if (tr) {
res.username = tr[1];
res.ids.trackSlug = tr[2];
res.metadata.isSingle = true;
res.metadata.contentType = 'track';
}
},
validateHandle(handle) {
return this.patterns.handle.test(handle);
},
buildProfileUrl(handle) {
return `https://${handle}.bandcamp.com`;
},
normalizeUrl(url) {
return normalize(url);
},
};
//# sourceMappingURL=index.js.map