rsshub
Version:
Make RSS Great Again!
321 lines (310 loc) • 8.23 kB
JavaScript
import "./esm-shims-CzJ_djXG.mjs";
import { t as config } from "./config-C37vj7VH.mjs";
import { t as ViewType } from "./types-D84BRIt4.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import "./ofetch-BIyrKU3Y.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import "./helpers-DxBp0Pty.mjs";
import { t as got_default } from "./got-KxxWdaxq.mjs";
//#region lib/routes/fantia/search.ts
const route = {
path: "/search/:type?/:caty?/:period?/:order?/:rating?/:keyword?",
categories: ["picture"],
view: ViewType.Pictures,
example: "/fantia/search/posts/all/daily",
parameters: {
type: {
description: "Type, see the table below, `posts` by default",
options: [
{
value: "fanclubs",
label: "クリエイター"
},
{
value: "posts",
label: "投稿"
},
{
value: "products",
label: "商品"
},
{
value: "commissions",
label: "コミッション"
}
],
default: "posts"
},
caty: {
description: "Category, see the table below, can also be found in search page URL, `すべてのクリエイター` by default",
options: [
{
value: "all",
label: "すべてのクリエイター"
},
{
value: "illust",
label: "イラスト"
},
{
value: "comic",
label: "漫画"
},
{
value: "cosplay",
label: "コスプレ"
},
{
value: "youtuber",
label: "YouTuber・配信者"
},
{
value: "vtuber",
label: "Vtuber"
},
{
value: "voice",
label: "音声作品・ASMR"
},
{
value: "voiceactor",
label: "声優・歌い手"
},
{
value: "idol",
label: "アイドル"
},
{
value: "anime",
label: "アニメ・映像・写真"
},
{
value: "3d",
label: "3D"
},
{
value: "game",
label: "ゲーム制作"
},
{
value: "music",
label: "音楽"
},
{
value: "novel",
label: "小説"
},
{
value: "doll",
label: "ドール"
},
{
value: "art",
label: "アート・デザイン"
},
{
value: "program",
label: "プログラム"
},
{
value: "handmade",
label: "創作・ハンドメイド"
},
{
value: "history",
label: "歴史・評論・情報"
},
{
value: "railroad",
label: "鉄道・旅行・ミリタリー"
},
{
value: "shop",
label: "ショップ"
},
{
value: "other",
label: "その他"
}
],
default: "all"
},
period: {
description: "Ranking period, see the table below, empty by default",
options: [
{
value: "daily",
label: "デイリー"
},
{
value: "weekly",
label: "ウィークリー"
},
{
value: "monthly",
label: "マンスリー"
},
{
value: "all",
label: "全期間"
}
],
default: ""
},
order: {
description: "Sorting, see the table below, `更新の新しい順` by default",
options: [
{
value: "updater",
label: "更新の新しい順"
},
{
value: "update_old",
label: "更新の古い順"
},
{
value: "newer",
label: "投稿の新しい順"
},
{
value: "create_old",
label: "投稿の古い順"
},
{
value: "popular",
label: "お気に入り数順"
}
],
default: "updater"
},
rating: {
description: "Rating, see the table below, `すべて` by default",
options: [
{
value: "all",
label: "すべて"
},
{
value: "general",
label: "一般のみ"
},
{
value: "adult",
label: "R18 のみ"
}
],
default: "all"
},
keyword: "Keyword, empty by default"
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
nsfw: true
},
name: "Search",
maintainers: ["nczitzk"],
handler,
description: `Type
| クリエイター | 投稿 | 商品 | コミッション |
| ------------ | ----- | -------- | ------------ |
| fanclubs | posts | products | commissions |
Category
| 分类 | 分类名 |
| ---------------------- | ---------- |
| イラスト | illust |
| 漫画 | comic |
| コスプレ | cosplay |
| YouTuber・配信者 | youtuber |
| Vtuber | vtuber |
| 音声作品・ASMR | voice |
| 声優・歌い手 | voiceactor |
| アイドル | idol |
| アニメ・映像・写真 | anime |
| 3D | 3d |
| ゲーム制作 | game |
| 音楽 | music |
| 小説 | novel |
| ドール | doll |
| アート・デザイン | art |
| プログラム | program |
| 創作・ハンドメイド | handmade |
| 歴史・評論・情報 | history |
| 鉄道・旅行・ミリタリー | railroad |
| ショップ | shop |
| その他 | other |
Ranking period
| デイリー | ウィークリー | マンスリー | 全期間 |
| -------- | ------------ | ---------- | ------ |
| daily | weekly | monthly | all |
Sorting
| 更新の新しい順 | 更新の古い順 | 投稿の新しい順 | 投稿の古い順 | お気に入り数順 |
| -------------- | ------------ | -------------- | ------------ | -------------- |
| updater | update\_old | newer | create\_old | popular |
Rating
| すべて | 一般のみ | R18 のみ |
| ------ | -------- | -------- |
| all | general | adult |`
};
async function handler(ctx) {
const type = ctx.req.param("type") || "posts";
const caty = ctx.req.param("caty") || "";
const order = ctx.req.param("order") || "updater";
const rating = ctx.req.param("rating") || "all";
const keyword = ctx.req.param("keyword") || "";
const period = ctx.req.param("period") || "";
const rootUrl = "https://fantia.jp";
const apiUrl = `${rootUrl}/api/v1/search/${type}?keyword=${keyword}&peroid=${period}&brand_type=0&category=${caty === "all" ? "" : caty}&order=${order}${rating === "all" ? "" : rating === "general" ? "&rating=general" : "&adult=1"}&per_page=30`;
const response = await got_default({
method: "get",
url: apiUrl,
headers: { Cookie: config.fantia.cookies ?? "" }
});
let items = {};
switch (type) {
case "fanclubs":
items = response.data.fanclubs.map((item) => ({
title: item.fanclub_name_with_creator_name,
link: `${rootUrl}/fanclubs/${item.id}`,
description: `${item.icon ? `<img src="${item.icon.main}">` : ""}"><p>${item.title}</p>`
}));
break;
case "posts":
items = response.data.posts.map((item) => ({
title: item.title,
link: `${rootUrl}/posts/${item.id}`,
pubDate: parseDate(item.posted_at),
author: item.fanclub.fanclub_name_with_creator_name,
description: `${item.comment ? `<p>${item.comment}</p>` : ""}<img src="${item.thumb ? item.thumb.main : item.thumb_micro}">`
}));
break;
case "products":
items = response.data.products.map((item) => ({
title: item.name,
link: `${rootUrl}/products/${item.id}`,
author: item.fanclub.fanclub_name_with_creator_name,
description: `${item.buyable_lowest_plan.description ? `<p>${item.buyable_lowest_plan.description}</p>` : ""}<img src="${item.thumb ? item.thumb.main : item.thumb_micro}">`
}));
break;
case "commissions":
items = response.data.commissions.map((item) => ({
title: item.name,
link: `${rootUrl}/commissions/${item.id}`,
author: item.fanclub.fanclub_name_with_creator_name,
description: `${item.buyable_lowest_plan.description ? `<p>${item.buyable_lowest_plan.description}</p>` : ""}<img src="${item.thumb ? item.thumb.main : item.thumb_micro}">`
}));
break;
}
return {
title: `Fantia - Search ${type}`,
link: apiUrl.replace("api/v1/search/", ""),
item: items
};
}
//#endregion
export { route };