social-link-parser
Version:
Extract usernames, IDs, and metadata from social media URLs across 100+ platforms
59 lines • 2.34 kB
JavaScript
import { registry } from '../platforms/index.js';
export function parse(url) {
let processedUrl = url.trim();
if (!processedUrl.match(/^https?:\/\//i) &&
!processedUrl.startsWith('mailto:') &&
!processedUrl.startsWith('tel:')) {
const isEmail = /^[^@]+@[^@]+\.[^@]+$/.test(processedUrl);
if (processedUrl.includes('.') && !isEmail) {
processedUrl = `https://${processedUrl}`;
}
}
const result = {
isValid: false,
originalUrl: url,
normalizedUrl: processedUrl,
platform: null,
ids: {},
metadata: {},
};
for (const [, module] of registry) {
if (module.detect(processedUrl)) {
result.platform = module.id;
result.platformName = module.name;
const extractedData = module.extract(processedUrl);
if (extractedData) {
if (extractedData.username)
result.username = extractedData.username;
if (extractedData.userId)
result.userId = extractedData.userId;
if (extractedData.ids) {
result.ids = { ...result.ids, ...extractedData.ids };
}
if (extractedData.metadata) {
result.metadata = { ...result.metadata, ...extractedData.metadata };
}
result.normalizedUrl = module.normalizeUrl(processedUrl);
result.isValid = true;
if (module.getEmbedInfo) {
const embedInfo = module.getEmbedInfo(processedUrl);
if (embedInfo) {
result.embedData = {
platform: module.id,
type: embedInfo.type || 'iframe',
contentId: result.ids.videoId || result.ids.postId || result.ids.trackId || '',
embedUrl: embedInfo.embedUrl,
options: embedInfo.options,
};
if (embedInfo.isEmbedAlready) {
result.metadata.isEmbed = true;
}
}
}
}
break;
}
}
return result;
}
//# sourceMappingURL=parser.js.map