diff --git a/.env.example b/.env.example index 68f86e4..145d783 100644 --- a/.env.example +++ b/.env.example @@ -16,3 +16,6 @@ PODCAST_LANGUAGE=ja PODCAST_AUTHOR=管理者 PODCAST_CATEGORIES=Technology PODCAST_TTL=60 + +# フィードURL一覧ファイルの設定 +FEED_URLS_FILE=feed_urls.txt diff --git a/scripts/fetch_and_generate.ts b/scripts/fetch_and_generate.ts index ae38509..8e4a3bd 100644 --- a/scripts/fetch_and_generate.ts +++ b/scripts/fetch_and_generate.ts @@ -12,9 +12,28 @@ interface FeedItem { contentSnippet?: string; } +import fs from "fs/promises"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + async function main() { const parser = new Parser(); - const feedUrls = ["https://example.com/feed1.rss"]; + const feedUrlsFile = process.env.FEED_URLS_FILE ?? "feed_urls.txt"; + const feedUrlsPath = path.resolve(__dirname, "..", feedUrlsFile); + let feedUrls: string[]; + try { + const data = await fs.readFile(feedUrlsPath, "utf-8"); + feedUrls = data + .split("\n") + .map((url) => url.trim()) + .filter((url) => url.length > 0); + } catch (err) { + console.warn(`フィードURLファイルの読み込みに失敗: ${feedUrlsFile}`); + feedUrls = []; + } for (const url of feedUrls) { const feed = await parser.parseURL(url); @@ -29,7 +48,7 @@ async function main() { pub.getMonth() === yesterday.getMonth() && pub.getDate() === yesterday.getDate() ) { - const already = await markAsProcessed(url, item['id'] as string); + const already = await markAsProcessed(url, item["id"] as string); if (already) continue; const scriptText = await openAI_GenerateScript({ @@ -37,10 +56,13 @@ async function main() { link: item.link ?? "", contentSnippet: item.contentSnippet ?? "", }); - const audioFilePath = await generateTTS(item['id'] as string, scriptText); + const audioFilePath = await generateTTS( + item["id"] as string, + scriptText, + ); await saveEpisode({ - id: item['id'] as string, + id: item["id"] as string, title: item.title ?? "", pubDate: pub.toISOString(), audioPath: audioFilePath,