diff --git a/src/index.ts b/src/index.ts index 7539ce0..b9f97da 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,6 @@ import { getAllChapters, getLatestChapter } from './mangadex/chapters'; import { getManga } from './mangadex/manga'; +import { getCover } from './mangadex/cover'; import { lazyKv } from './db/lazyKv'; import { sendWebhook } from './utils/webhook'; import { ChapterId } from './types'; @@ -21,37 +22,34 @@ void (async () => { await getMangaToFetch(config); for (const mangaId of uniqueMangaIds) { - try { - const lastChapterId = await mangaHistory.get(mangaId); + const lastChapterId = await mangaHistory.get(mangaId); - const manga = await getManga(mangaId, userAgent); - const chapters = await getAllChapters(mangaId, userAgent); - const latestChapter = getLatestChapter(chapters); - const title = getMangaTitle(manga); + const manga = await getManga(mangaId, userAgent); + const chapters = await getAllChapters(mangaId, userAgent); + const latestChapter = getLatestChapter(chapters); + const cover = await getCover(manga, userAgent); + const title = getMangaTitle(manga); - if (lastChapterId !== latestChapter.id) { - console.log('Update found for manga:', title); + if (lastChapterId !== latestChapter.id) { + console.log('Update found for manga:', title); - const webhooksForManga = mangaIdsToWebhooks[mangaId]; + const webhooksForManga = mangaIdsToWebhooks[mangaId]; - await Promise.all( - webhooksForManga.map( - async (webhookUrl) => - await sendWebhook({ - webhookUrl, - manga, - latestChapter, - }), - ), - ); + await Promise.all( + webhooksForManga.map( + async (webhookUrl) => + await sendWebhook({ + webhookUrl, + manga, + latestChapter, + cover, + }), + ), + ); - await mangaHistory.set(mangaId, latestChapter.id); - } else { - console.log('No Updates found for manga:', title); - } - } catch (err) { - console.error(`Failed to fetch ${mangaId}!`); - console.error(err); + await mangaHistory.set(mangaId, latestChapter.id); + } else { + console.log('No Updates found for manga:', title); } } }; diff --git a/src/mangadex/cover.ts b/src/mangadex/cover.ts new file mode 100644 index 0000000..0011834 --- /dev/null +++ b/src/mangadex/cover.ts @@ -0,0 +1,25 @@ +import axios from 'axios'; +import { Manga } from '../types'; + +export const getCover = async ( + manga: Manga, + userAgent: string, +): Promise => { + const coverId = Object.values(manga.relationships).find( + (relationship) => relationship.type === 'cover_art', + )?.id; + + if (!coverId) { + return ''; + } + + const response = await axios.get<{ + data: { attributes: { fileName: string } }; + }>(`https://api.mangadex.org/cover/${coverId}`, { + headers: { + 'User-Agent': userAgent, + }, + }); + + return `https://mangadex.org/covers/${manga.id}/${response.data.data.attributes.fileName}`; +}; diff --git a/src/utils/webhook.ts b/src/utils/webhook.ts index 5723fa7..bd6dbcd 100644 --- a/src/utils/webhook.ts +++ b/src/utils/webhook.ts @@ -7,21 +7,25 @@ export const sendWebhook = async (args: { webhookUrl: string; manga: Manga; latestChapter: Chapter; + cover: string; }) => { - const { webhookUrl, manga, latestChapter } = args; + const { webhookUrl, manga, latestChapter, cover } = args; const title = getMangaTitle(manga); await axios.post(webhookUrl, { username: 'Manga Updates', - avatar_url: 'https://mangadex.org/pwa/icons/icon-180.png', + avatar_url: 'https://assets.pfy.ch/icons/manga.png', + content: `[New chapter for ${title}](https://mangadex.org/chapter/${latestChapter.id})`, embeds: [ { - url: `https://mangadex.org/chapter/${latestChapter.id}`, - image: { - url: `https://og.mangadex.org/og-image/chapter/${latestChapter.id}`, + author: { + icon_url: 'https://assets.pfy.ch/icons/manga.png', + name: title, }, - title: `${title}`, - description: ` Ch. ${latestChapter.attributes.chapter} - ${latestChapter.attributes.title} `, + thumbnail: { + url: cover, + }, + description: `Chapter ${latestChapter.attributes.chapter}: "${latestChapter.attributes.title}"`, }, ], });