From b3c79b07d3b052418b9faa5e2ccb6d9bb016aa97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=AA=E6=9C=88?= <45122329+cokemine@users.noreply.github.com> Date: Sat, 8 Mar 2025 01:44:37 +0900 Subject: [PATCH] feat(route): Add Collabo Cafe (#18530) * feat: Add Collabo-cafe * Update lib/routes/collabo-cafe/namespace.ts Co-authored-by: Tony * refactor: remove page parameter --------- --- lib/routes/collabo-cafe/category.ts | 37 ++++++++++++++++++++++++++++ lib/routes/collabo-cafe/index.ts | 35 ++++++++++++++++++++++++++ lib/routes/collabo-cafe/namespace.ts | 9 +++++++ lib/routes/collabo-cafe/parser.ts | 29 ++++++++++++++++++++++ lib/routes/collabo-cafe/tag.ts | 37 ++++++++++++++++++++++++++++ 5 files changed, 147 insertions(+) create mode 100644 lib/routes/collabo-cafe/category.ts create mode 100644 lib/routes/collabo-cafe/index.ts create mode 100644 lib/routes/collabo-cafe/namespace.ts create mode 100644 lib/routes/collabo-cafe/parser.ts create mode 100644 lib/routes/collabo-cafe/tag.ts diff --git a/lib/routes/collabo-cafe/category.ts b/lib/routes/collabo-cafe/category.ts new file mode 100644 index 000000000..844de43fc --- /dev/null +++ b/lib/routes/collabo-cafe/category.ts @@ -0,0 +1,37 @@ +import { Data, Route } from '@/types'; +import ofetch from '@/utils/ofetch'; +import { load } from 'cheerio'; +import { Context } from 'hono'; +import { parseItems } from './parser'; + +export const handler = async (ctx: Context): Promise => { + const { category } = ctx.req.param(); + const baseUrl = `https://collabo-cafe.com/events/category/${category}`; + const res = await ofetch(baseUrl); + const $ = load(res); + const items = parseItems($); + + return { + title: '分类', + link: baseUrl, + item: items, + }; +}; + +export const route: Route = { + path: '/category/:category', + categories: ['anime'], + example: '/collabo-cafe/category/cafe', + parameters: { category: 'Category, refer to the original website (ジャンル別)' }, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + name: '分类', + maintainers: ['cokemine'], + handler, +}; diff --git a/lib/routes/collabo-cafe/index.ts b/lib/routes/collabo-cafe/index.ts new file mode 100644 index 000000000..bb511df12 --- /dev/null +++ b/lib/routes/collabo-cafe/index.ts @@ -0,0 +1,35 @@ +import { Data, Route } from '@/types'; +import ofetch from '@/utils/ofetch'; +import { load } from 'cheerio'; +import { parseItems } from './parser'; + +export const handler = async (): Promise => { + const baseUrl = 'https://collabo-cafe.com/'; + const res = await ofetch(baseUrl); + const $ = load(res); + const items = parseItems($); + + return { + title: '全部文章', + link: baseUrl, + item: items, + }; +}; + +export const route: Route = { + path: '/', + categories: ['anime'], + example: '/collabo-cafe/', + parameters: undefined, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + name: '全部文章', + maintainers: ['cokemine'], + handler, +}; diff --git a/lib/routes/collabo-cafe/namespace.ts b/lib/routes/collabo-cafe/namespace.ts new file mode 100644 index 000000000..02b5c98c8 --- /dev/null +++ b/lib/routes/collabo-cafe/namespace.ts @@ -0,0 +1,9 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'コラボカフェ', + url: 'collabo-cafe.com', + description: 'コラボカフェ - アニメ・漫画・ゲームのコラボ情報一覧まとめ', + lang: 'ja', + categories: ['anime'], +}; diff --git a/lib/routes/collabo-cafe/parser.ts b/lib/routes/collabo-cafe/parser.ts new file mode 100644 index 000000000..e7f894d69 --- /dev/null +++ b/lib/routes/collabo-cafe/parser.ts @@ -0,0 +1,29 @@ +import { type DataItem } from '@/types'; +import { parseDate } from '@/utils/parse-date'; +import { CheerioAPI } from 'cheerio'; + +export function parseItems($: CheerioAPI): DataItem[] { + return $('div.top-post-list article') + .toArray() + .map((el) => { + const $el = $(el); + const a = $el.find('a').first(); + const title = a.attr('title')!; + const link = a.attr('href'); + const pubDate = parseDate($el.find('span.date.gf.updated').text()); + const author = $el.find('span.author span.fn').text(); + const category = [$el.find('span.cat-name').text()]; + const description = $el.find('div.description p').text(); + const image = $el.find('img').attr('data-src'); + return { + title, + link, + pubDate, + author, + category, + description, + image, + banner: image, + }; + }); +} diff --git a/lib/routes/collabo-cafe/tag.ts b/lib/routes/collabo-cafe/tag.ts new file mode 100644 index 000000000..a47b6bc56 --- /dev/null +++ b/lib/routes/collabo-cafe/tag.ts @@ -0,0 +1,37 @@ +import { Data, Route } from '@/types'; +import ofetch from '@/utils/ofetch'; +import { load } from 'cheerio'; +import { Context } from 'hono'; +import { parseItems } from './parser'; + +export const handler = async (ctx: Context): Promise => { + const { tag } = ctx.req.param(); + const baseUrl = `https://collabo-cafe.com/events/tag/${tag}`; + const res = await ofetch(baseUrl); + const $ = load(res); + const items = parseItems($); + + return { + title: '标签', + link: baseUrl, + item: items, + }; +}; + +export const route: Route = { + path: '/tag/:tag', + categories: ['anime'], + example: '/collabo-cafe/tag/ikebukuro', + parameters: { tag: 'Tag, refer to the original website (開催地域別)' }, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + name: '标签', + maintainers: ['cokemine'], + handler, +};