UNPKG

rsshub

Version:
108 lines (89 loc) 3.64 kB
import ofetch from '@/utils/ofetch'; import { parseDate } from '@/utils/parse-date'; import { art } from '@/utils/render'; import path from 'node:path'; export default async function fetch(slug: string) { const url = `https://go-api.twreporter.org/v2/posts/${slug}?full=true`; const res = await ofetch(url); const post = res.data; const time = post.published_date; // For `writers` let authors = ''; if (post.writers) { authors = post.writers.map((writer) => (writer.job_title ? writer.job_title + ' / ' + writer.name : '文字 / ' + writer.name)).join(','); } // For `photography`, if it exists let photographers = ''; if (post.photographers) { photographers = post.photographers .map((photographer) => { let title = '攝影 / '; if (photographer.job_title) { title = photographer.job_title + ' / '; } return title + photographer.name; }) .join(','); authors += ';' + photographers; } const bannerImage = post.hero_image.resized_targets.desktop.url; const caption = post.leading_image_description; const bannerDescription = post.hero_image.description; const ogDescription = post.og_description; const banner = art(path.join(__dirname, 'templates/image.art'), { image: bannerImage, description: bannerDescription, caption }); function format(type, content) { let block = ''; if (content !== '' && type !== 'embeddedcode') { switch (type) { case 'image': case 'slideshow': block = content.map((image) => art(path.join(__dirname, 'templates/image.art'), { image: image.desktop.url, description: image.description, caption: image.description })).join('<br>'); break; case 'blockquote': block = `<blockquote>${content}</blockquote>`; break; case 'header-one': block = `<h1>${content}</h1>`; break; case 'header-two': block = `<h2>${content}</h2>`; break; case 'infobox': { const box = content[0]; block = `<h2>${box.title}</h2>${box.body}`; break; } case 'youtube': { const video = content[0].youtubeId; const id = video.split('?')[0]; block = art(path.join(__dirname, 'templates/youtube.art'), { video: id }); break; } case 'quoteby': { const quote = content[0]; block = `<blockquote>${quote.quote}</blockquote><p>${quote.quoteBy}</p>`; break; } default: block = `${content}<br>`; } } return block; } const text = post.content.api_data .map((item) => { const content = item.content; const type = item.type; return format(type, content); }) .filter(Boolean) .join('<br>'); const contents = [banner, ogDescription, text].filter(Boolean).join('<br><br>'); return { author: authors, description: contents, link: `https://www.twreporter.org/a/${slug}`, guid: `https://www.twreporter.org/a/${slug}`, pubDate: parseDate(time, 'YYYY-MM-DDTHH:mm:ssZ'), }; }