75 lines
2.6 KiB
TypeScript
75 lines
2.6 KiB
TypeScript
import { Route } from '@/types';
|
|
import { toTitleCase } from '@/utils/common-utils';
|
|
import ofetch from '@/utils/ofetch';
|
|
|
|
function parseTitle(smartlinkUrl: string): string {
|
|
try {
|
|
const url = new URL(smartlinkUrl);
|
|
const pathSegments = url.pathname.split('/').filter((segment) => segment.length > 0);
|
|
|
|
// Find the segment after the date (YYYY-MM-DD pattern)
|
|
const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
|
|
const dateIndex = pathSegments.findIndex((segment) => dateRegex.test(segment));
|
|
|
|
// Use the segment after the date if found, otherwise use the last path segment
|
|
const titleSlug = dateIndex !== -1 && dateIndex < pathSegments.length - 1 ? pathSegments[dateIndex + 1] : pathSegments.at(-1) || '';
|
|
|
|
// Convert hyphens to spaces and capitalize each word
|
|
return toTitleCase(titleSlug.replaceAll('-', ' '));
|
|
} catch {
|
|
// If URL parsing fails, return the URL without query parameters as fallback
|
|
return smartlinkUrl.split('?')[0];
|
|
}
|
|
}
|
|
|
|
function getTitle(item: any): string {
|
|
return item.type === 'video'
|
|
? item.smartlink.split('?')[0] // For video items, use the full YouTube URL (without query parameters)
|
|
: parseTitle(item.smartlink); // Use existing parseTitle for photo items
|
|
}
|
|
|
|
export const route: Route = {
|
|
path: '/:site',
|
|
categories: ['social-media'],
|
|
example: '/smartlink/bloombergpursuits',
|
|
parameters: { site: 'the site attached to smartlink.bio/' },
|
|
radar: [
|
|
{
|
|
source: ['smartlink.bio/'],
|
|
},
|
|
],
|
|
features: {
|
|
requireConfig: false,
|
|
requirePuppeteer: false,
|
|
antiCrawler: false,
|
|
supportBT: false,
|
|
supportPodcast: false,
|
|
supportScihub: false,
|
|
},
|
|
name: 'Posts',
|
|
maintainers: ['nickyfoto'],
|
|
handler,
|
|
description: 'smartlink.bio link in bio takes your audience from Instagram and TikTok to your website in one easy step.',
|
|
};
|
|
|
|
async function handler(ctx) {
|
|
const site = ctx.req.param('site');
|
|
const link = `https://smartlink.bio/api/instagram/${site}/posts`;
|
|
const data = await ofetch(link);
|
|
// the API returns text/plain as MIME type
|
|
// Parse the JSON string into an array
|
|
const parsedData = JSON.parse(data);
|
|
const items = parsedData.map((item) => ({
|
|
title: getTitle(item),
|
|
link: item.smartlink.split('?')[0],
|
|
description: `<p><img src="${item.imageUrl}"></p>`,
|
|
pubDate: item.created,
|
|
guid: item.id,
|
|
}));
|
|
return {
|
|
title: `@${site} SmartLink`,
|
|
link: `https://smartlink.bio/${site}`,
|
|
item: items,
|
|
};
|
|
}
|