1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import { INewsItem, IAggregator } from "./aggregator";
- import { getRepository } from "typeorm";
- import { AggroNewsItem } from "@shared/db/entity/AggroNewsItem";
- import cheerio from "cheerio";
- import { logger } from "src/logging";
- import got from "got";
- const urlPattern = /diary\.php\?no=(\d+)/i;
- const kissDiaryRoot = "http://www.kisskiss.tv/kiss";
- const FEED_NAME = "kisskisstv-diary";
- async function aggregate() {
- const repo = getRepository(AggroNewsItem);
- let lastPost = await repo.findOne({
- select: [ "newsId" ],
- where: { feedName: FEED_NAME },
- order: { newsId: "DESC" }
- });
- if(!lastPost)
- lastPost = repo.create({
- newsId: 0
- });
-
- try {
- const mainPageRes = await got.get(`${kissDiaryRoot}/diary.php`);
-
- if(mainPageRes.statusCode != 200) {
- logger.error("[KISS DIARY] Failed to load page. Got response code: %s", mainPageRes.statusCode);
- return [];
- }
- const rootNode = cheerio.load(mainPageRes.body);
- const diaryEntryNames = rootNode("table.blog_frame_top");
-
- if(diaryEntryNames.length == 0) {
- logger.error("[KISS DIARY] Failed to find listing!");
- return [];
- }
- const diaryTexts = rootNode("div.blog_frame_middle");
- const items = diaryEntryNames.toArray().map((e, i) => ({ table: e, content: diaryTexts[i]}));
- const result : INewsItem[] = [];
- let latestEntry = lastPost.newsId;
- for(const {table, content} of items) {
- const a = cheerio(table).find("a");
- const link = a.attr("href");
- const matches = link ? urlPattern.exec(link) : false;
- if(!matches)
- continue;
-
- const id = +matches[1];
- if(id <= lastPost.newsId)
- continue;
- if(id > latestEntry)
- latestEntry = id;
- const diaryLink = `${kissDiaryRoot}/${link}`;
- const contentCh = cheerio(content);
- const title = a.text();
-
- const bottomFrame = contentCh.find("div.blog_data");
- bottomFrame.remove();
- result.push({
- newsId: id,
- feedId: FEED_NAME,
- link: diaryLink,
- title: title,
- author: "KISS BLOG",
- contents: contentCh.html() ?? "",
- embedColor: 0xf4c100,
- needsTranslation: true
- });
- }
- return result;
- } catch(err) {
- logger.error("Failed to parse KISS Diary news: %s", err);
- return [];
- }
- }
- export default {
- aggregate: aggregate
- } as IAggregator;
|