import type { JsonValue } from '@geo/shared-types' import { publishToutiaoArticle } from '../../../../../packages/publisher-platforms/src/toutiao' import type { PublishAdapter } from './base' import { fetchImageBlob, normalizeArticleHtml, sessionFetchJson, uploadHtmlImages } from './common' function buildResultPayload( articleId: string, mediaName: string, externalManageUrl: string, externalArticleUrl: string | null, ): Record { return { platform: 'toutiaohao', media_name: mediaName, external_article_id: articleId, external_manage_url: externalManageUrl, external_article_url: externalArticleUrl, publish_type: 'publish', } } export const toutiaoAdapter: PublishAdapter = { platform: 'toutiaohao', executionMode: 'session', async publish(context) { context.reportProgress('toutiao.normalize_html') const html = normalizeArticleHtml(context.article) const result = await publishToutiaoArticle( { title: context.article.title, html, coverAssetUrl: context.article.cover_asset_url, publishType: 'publish', }, { fetchJson: (input, init) => sessionFetchJson(context.session, input, init), fetchImageBlob, uploadHtmlImages, reportProgress(stage) { context.reportProgress(`toutiao.${stage}`) }, }, ) if (!result.success) { const summary = result.code === 'toutiaohao_not_logged_in' ? '头条号登录态失效,无法执行发布。' : result.code === 'article_content_empty' ? '文章内容为空,无法推送到头条号。' : result.message || '头条号发布失败。' return { status: 'failed', summary, error: { code: result.code, message: result.message, }, } } const payload = buildResultPayload( result.articleId, result.mediaName, result.externalManageUrl, result.externalArticleUrl, ) return { status: 'succeeded', payload, summary: '头条号发布成功。', } }, }