mirror of
https://github.com/DIYgod/RSSHub.git
synced 2026-08-30 16:55:08 +08:00
feat: remove notOperational routes - multimedia
This commit is contained in:
@@ -119,15 +119,6 @@
|
||||
'govopendata.com': { _name: '新闻联播文字版', cn: [{ title: '新闻联播文字版', docs: 'https://docs.rsshub.app/routes/traditional-media#xin-wen-lian-bo-wen-zi-ban', source: '/xinwenlianbo', target: '/xinwenlianbo/index' }] },
|
||||
'steampowered.com': { _name: 'Steam', store: [{ title: 'search', docs: 'https://docs.rsshub.app/routes/game#steam', source: '/search/', target: (params, url) => `/steam/search/${new URL(url).searchParams}` }] },
|
||||
'suzhou.gov.cn': { _name: '苏州市政府', www: [{ title: '政府新闻', docs: 'https://docs.rsshub.app/routes/government#su-zhou-shi-ren-min-zheng-fu', source: '/szsrmzf/:uid/nav_list.', target: '/gov/suzhou/news/:uid' }] },
|
||||
'mqube.net': {
|
||||
_name: 'MQube',
|
||||
www: [
|
||||
{ title: '全站最近更新', docs: 'https://docs.rsshub.app/routes/multimedia#mqube', source: '/', target: '/mqube/latest' },
|
||||
{ title: '全站每日排行', docs: 'https://docs.rsshub.app/routes/multimedia#mqube', source: '/', target: '/mqube/top' },
|
||||
{ title: '个人最近更新', docs: 'https://docs.rsshub.app/routes/multimedia#mqube', source: '/user/:user', target: '/mqube/user/:user' },
|
||||
{ title: '标签最近更新', docs: 'https://docs.rsshub.app/routes/multimedia#mqube', source: '/search/tag/:tag', target: '/mqube/tag/:tag' },
|
||||
],
|
||||
},
|
||||
'last.fm': {
|
||||
_name: 'Last.fm',
|
||||
www: [
|
||||
@@ -136,24 +127,6 @@
|
||||
{ title: '站内 Top 榜单', docs: 'https://docs.rsshub.app/routes/multimedia#last-fm', source: '/charts', target: '/lastfm/top' },
|
||||
],
|
||||
},
|
||||
'ddrk.me': {
|
||||
_name: '低端影视',
|
||||
www: [
|
||||
{ title: '首页', docs: 'https://docs.rsshub.app/routes/multimedia#di-duan-ying-shi', source: '/', target: '/ddrk/index' },
|
||||
{ title: '标签', docs: 'https://docs.rsshub.app/routes/multimedia#di-duan-ying-shi', source: '/tag/:tag', target: '/ddrk/tag/:tag' },
|
||||
{ title: '分类', docs: 'https://docs.rsshub.app/routes/multimedia#di-duan-ying-shi', source: ['/category/:category', '/category/:uplevel/:category'], target: '/ddrk/category/:category' },
|
||||
{
|
||||
title: '影视剧集更新',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#di-duan-ying-shi',
|
||||
source: ['/:name', '/:name/:season'],
|
||||
target: (params) => {
|
||||
if (params.name !== 'category' && params.name !== 'tag' && params.name !== 'ddrklogin' && params.name !== 'about' && params.name !== 'deleted') {
|
||||
return `/ddrk/update/${params.name}${params.season ? '/' + params.season : ''}`;
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
'hackerone.com': { _name: 'HackerOne', '.': [{ title: 'HackerOne Hacker Activity', docs: 'https://docs.rsshub.app/routes/other#hackerone-hacker-activity', source: '/hacktivity', target: '/hackerone/hacktivity' }] },
|
||||
'cowlevel.net': { _name: '奶牛关', '.': [{ title: '元素文章', docs: 'https://docs.rsshub.app/routes/game#nai-niu-guan', source: ['/element/:id', '/element/:id/article'], target: '/cowlevel/element/:id' }] },
|
||||
'beijing.gov.cn': { wjw: [{ title: '北京卫生健康委员会', docs: 'https://docs.rsshub.app/routes/government#bei-jing-shi-wei-sheng-jian-kang-wei-yuan-hui', source: '/xwzx_20031/:caty', target: '/gov/beijing/mhc/:caty' }] },
|
||||
|
||||
@@ -310,35 +310,6 @@ module.exports = {
|
||||
},
|
||||
],
|
||||
},
|
||||
'mqube.net': {
|
||||
_name: 'MQube',
|
||||
www: [
|
||||
{
|
||||
title: '全站最近更新',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#mqube',
|
||||
source: '/',
|
||||
target: '/mqube/latest',
|
||||
},
|
||||
{
|
||||
title: '全站每日排行',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#mqube',
|
||||
source: '/',
|
||||
target: '/mqube/top',
|
||||
},
|
||||
{
|
||||
title: '个人最近更新',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#mqube',
|
||||
source: '/user/:user',
|
||||
target: '/mqube/user/:user',
|
||||
},
|
||||
{
|
||||
title: '标签最近更新',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#mqube',
|
||||
source: '/search/tag/:tag',
|
||||
target: '/mqube/tag/:tag',
|
||||
},
|
||||
],
|
||||
},
|
||||
'last.fm': {
|
||||
_name: 'Last.fm',
|
||||
www: [
|
||||
@@ -362,39 +333,6 @@ module.exports = {
|
||||
},
|
||||
],
|
||||
},
|
||||
'ddrk.me': {
|
||||
_name: '低端影视',
|
||||
www: [
|
||||
{
|
||||
title: '首页',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#di-duan-ying-shi',
|
||||
source: '/',
|
||||
target: '/ddrk/index',
|
||||
},
|
||||
{
|
||||
title: '标签',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#di-duan-ying-shi',
|
||||
source: '/tag/:tag',
|
||||
target: '/ddrk/tag/:tag',
|
||||
},
|
||||
{
|
||||
title: '分类',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#di-duan-ying-shi',
|
||||
source: ['/category/:category', '/category/:uplevel/:category'],
|
||||
target: '/ddrk/category/:category',
|
||||
},
|
||||
{
|
||||
title: '影视剧集更新',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#di-duan-ying-shi',
|
||||
source: ['/:name', '/:name/:season'],
|
||||
target: (params) => {
|
||||
if (params.name !== 'category' && params.name !== 'tag' && params.name !== 'ddrklogin' && params.name !== 'about' && params.name !== 'deleted') {
|
||||
return `/ddrk/update/${params.name}${params.season ? '/' + params.season : ''}`;
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
'hackerone.com': {
|
||||
_name: 'HackerOne',
|
||||
'.': [
|
||||
|
||||
@@ -381,10 +381,6 @@ router.get('/iplay/home', lazyloadRouteHandler('./routes/iplay/home'));
|
||||
// xclient.info
|
||||
router.get('/xclient/app/:name', lazyloadRouteHandler('./routes/xclient/app'));
|
||||
|
||||
// 电影首发站
|
||||
router.get('/dysfz', lazyloadRouteHandler('./routes/dysfz/index'));
|
||||
router.get('/dysfz/index', lazyloadRouteHandler('./routes/dysfz/index')); // 废弃
|
||||
|
||||
// きららファンタジア
|
||||
router.get('/kirara/news', lazyloadRouteHandler('./routes/kirara/news'));
|
||||
|
||||
@@ -392,9 +388,6 @@ router.get('/kirara/news', lazyloadRouteHandler('./routes/kirara/news'));
|
||||
router.get('/dytt', lazyloadRouteHandler('./routes/dytt/index'));
|
||||
router.get('/dytt/index', lazyloadRouteHandler('./routes/dytt/index')); // 废弃
|
||||
|
||||
// 人生05电影网
|
||||
router.get('/rs05/rs05', lazyloadRouteHandler('./routes/rs05/rs05'));
|
||||
|
||||
// 趣头条
|
||||
router.get('/qutoutiao/category/:cid', lazyloadRouteHandler('./routes/qutoutiao/category'));
|
||||
|
||||
@@ -454,9 +447,6 @@ router.get('/sogou/doodles', lazyloadRouteHandler('./routes/sogou/doodles'));
|
||||
// 香港天文台
|
||||
router.get('/hko/weather', lazyloadRouteHandler('./routes/hko/weather'));
|
||||
|
||||
// sankakucomplex
|
||||
router.get('/sankakucomplex/post', lazyloadRouteHandler('./routes/sankakucomplex/post'));
|
||||
|
||||
// 技术头条
|
||||
router.get('/blogread/newest', lazyloadRouteHandler('./routes/blogread/newest'));
|
||||
|
||||
@@ -477,9 +467,6 @@ router.get('/xiachufang/popular/:timeframe?', lazyloadRouteHandler('./routes/xia
|
||||
// 经济观察报
|
||||
router.get('/eeo/:column?/:category?', lazyloadRouteHandler('./routes/eeo/index'));
|
||||
|
||||
// 腾讯视频
|
||||
router.get('/tencentvideo/playlist/:id', lazyloadRouteHandler('./routes/tencent/video/playlist'));
|
||||
|
||||
// Vol
|
||||
router.get('/vol/:mode?', lazyloadRouteHandler('./routes/vol/lastupdate'));
|
||||
// 咚漫
|
||||
@@ -523,10 +510,6 @@ router.get('/cpu/home', lazyloadRouteHandler('./routes/universities/cpu/home'));
|
||||
router.get('/cpu/jwc', lazyloadRouteHandler('./routes/universities/cpu/jwc'));
|
||||
router.get('/cpu/yjsy', lazyloadRouteHandler('./routes/universities/cpu/yjsy'));
|
||||
|
||||
// 字幕组
|
||||
router.get('/zimuzu/resource/:id?', lazyloadRouteHandler('./routes/zimuzu/resource'));
|
||||
router.get('/zimuzu/top/:range/:type', lazyloadRouteHandler('./routes/zimuzu/top'));
|
||||
|
||||
// 字幕库
|
||||
router.get('/zimuku/:type?', lazyloadRouteHandler('./routes/zimuku/index'));
|
||||
|
||||
@@ -684,9 +667,6 @@ router.get('/vgtime/news', lazyloadRouteHandler('./routes/vgtime/news.js'));
|
||||
router.get('/vgtime/release', lazyloadRouteHandler('./routes/vgtime/release'));
|
||||
router.get('/vgtime/keyword/:keyword', lazyloadRouteHandler('./routes/vgtime/keyword'));
|
||||
|
||||
// MP4吧
|
||||
router.get('/mp4ba/:param', lazyloadRouteHandler('./routes/mp4ba'));
|
||||
|
||||
// anitama
|
||||
router.get('/anitama/:channel?', lazyloadRouteHandler('./routes/anitama/channel'));
|
||||
|
||||
@@ -753,9 +733,6 @@ router.get('/bupt/funbox', lazyloadRouteHandler('./routes/universities/bupt/funb
|
||||
// 广东海洋大学
|
||||
router.get('/gdoujwc', lazyloadRouteHandler('./routes/universities/gdou/jwc/jwtz'));
|
||||
|
||||
// 中国高清网
|
||||
router.get('/gaoqingla/:tag?', lazyloadRouteHandler('./routes/gaoqingla/latest'));
|
||||
|
||||
// 马良行
|
||||
router.get('/mlhang', lazyloadRouteHandler('./routes/mlhang/latest'));
|
||||
|
||||
@@ -840,9 +817,6 @@ router.get('/bing', lazyloadRouteHandler('./routes/bing/index'));
|
||||
// Maxjia News - DotA 2
|
||||
router.get('/maxnews/dota2', lazyloadRouteHandler('./routes/maxnews/dota2'));
|
||||
|
||||
// 柠檬 - 私房歌
|
||||
router.get('/ningmeng/song', lazyloadRouteHandler('./routes/ningmeng/song'));
|
||||
|
||||
// AlgoCasts
|
||||
router.get('/algocasts', lazyloadRouteHandler('./routes/algocasts/all'));
|
||||
|
||||
@@ -1064,9 +1038,6 @@ router.get('/nciae/xsxx', lazyloadRouteHandler('./routes/universities/nciae/xsxx
|
||||
// cfan
|
||||
router.get('/cfan/news', lazyloadRouteHandler('./routes/cfan/news'));
|
||||
|
||||
// 奈菲影视
|
||||
router.get('/nfmovies/:id?', lazyloadRouteHandler('./routes/nfmovies/index'));
|
||||
|
||||
// engadget
|
||||
router.get('/engadget/:lang?', lazyloadRouteHandler('./routes/engadget/home'));
|
||||
|
||||
@@ -1216,9 +1187,6 @@ router.get('/chrome/webstore/extensions/:id', lazyloadRouteHandler('./routes/chr
|
||||
// RTHK
|
||||
router.get('/rthk-news/:lang/:category', lazyloadRouteHandler('./routes/rthk-news/index'));
|
||||
|
||||
// Yahoo!テレビ
|
||||
router.get('/yahoo-jp-tv/:query', lazyloadRouteHandler('./routes/yahoo-jp-tv/index'));
|
||||
|
||||
// Yahoo! by Author
|
||||
router.get('/yahoo-author/:author', lazyloadRouteHandler('./routes/yahoo-author/index'));
|
||||
|
||||
@@ -1281,12 +1249,6 @@ router.get('/coronavirus/yahoo-japan/:tdfk?', lazyloadRouteHandler('./routes/cor
|
||||
// 南京林业大学教务处
|
||||
router.get('/njfu/jwc/:category?', lazyloadRouteHandler('./routes/universities/njfu/jwc'));
|
||||
|
||||
// MQube
|
||||
router.get('/mqube/user/:user', lazyloadRouteHandler('./routes/mqube/user'));
|
||||
router.get('/mqube/tag/:tag', lazyloadRouteHandler('./routes/mqube/tag'));
|
||||
router.get('/mqube/latest', lazyloadRouteHandler('./routes/mqube/latest'));
|
||||
router.get('/mqube/top', lazyloadRouteHandler('./routes/mqube/top'));
|
||||
|
||||
// Letterboxd
|
||||
router.get('/letterboxd/user/diary/:username', lazyloadRouteHandler('./routes/letterboxd/userdiary'));
|
||||
router.get('/letterboxd/user/followingdiary/:username', lazyloadRouteHandler('./routes/letterboxd/followingdiary'));
|
||||
@@ -1490,9 +1452,6 @@ router.get('/umass/amherst/csnews', lazyloadRouteHandler('./routes/umass/amherst
|
||||
router.get('/umass/amherst/ipoevents', lazyloadRouteHandler('./routes/umass/amherst/ipoevents'));
|
||||
router.get('/umass/amherst/ipostories', lazyloadRouteHandler('./routes/umass/amherst/ipostories'));
|
||||
|
||||
// 飘花电影网
|
||||
router.get('/piaohua/hot', lazyloadRouteHandler('./routes/piaohua/hot'));
|
||||
|
||||
// 快媒体
|
||||
router.get('/kuai', lazyloadRouteHandler('./routes/kuai/index'));
|
||||
router.get('/kuai/:id', lazyloadRouteHandler('./routes/kuai/id'));
|
||||
@@ -1582,10 +1541,6 @@ router.get('/dcinside/board/:id', lazyloadRouteHandler('./routes/dcinside/board'
|
||||
// 荔枝FM
|
||||
router.get('/lizhi/user/:id', lazyloadRouteHandler('./routes/lizhi/user'));
|
||||
|
||||
// 场库
|
||||
router.get('/changku', lazyloadRouteHandler('./routes/changku/index'));
|
||||
router.get('/changku/cate/:postid', lazyloadRouteHandler('./routes/changku/index'));
|
||||
|
||||
// 上海市生态环境局
|
||||
router.get('/gov/shanghai/sthj', lazyloadRouteHandler('./routes/gov/shanghai/sthj'));
|
||||
|
||||
@@ -2047,12 +2002,6 @@ router.get('/tingshen', lazyloadRouteHandler('./routes/tingshen/tingshen'));
|
||||
// 中华人民共和国人力资源和社会保障部
|
||||
router.get('/gov/mohrss/sbjm/:category?', lazyloadRouteHandler('./routes/gov/mohrss/sbjm'));
|
||||
|
||||
// 深影译站
|
||||
router.get('/shinybbs/latest', lazyloadRouteHandler('./routes/shinybbs/latest'));
|
||||
router.get('/shinybbs/p/:id', lazyloadRouteHandler('./routes/shinybbs/p'));
|
||||
router.get('/shinybbs/page/:id?', lazyloadRouteHandler('./routes/shinybbs/index'));
|
||||
router.get('/shinybbs', lazyloadRouteHandler('./routes/shinybbs/index'));
|
||||
|
||||
// 天眼查
|
||||
router.get('/tianyancha/hot', lazyloadRouteHandler('./routes/tianyancha/hot'));
|
||||
|
||||
@@ -2145,10 +2094,6 @@ router.get('/topbook/today', lazyloadRouteHandler('./routes/topbook/today'));
|
||||
// Melon
|
||||
router.get('/melon/chart/:category?', lazyloadRouteHandler('./routes/melon/chart'));
|
||||
|
||||
// 弯弯字幕组
|
||||
router.get('/wanwansub/info/:id', lazyloadRouteHandler('./routes/wanwansub/info'));
|
||||
router.get('/wanwansub/:id?', lazyloadRouteHandler('./routes/wanwansub/index'));
|
||||
|
||||
// FIX 字幕侠
|
||||
// router.get('/zimuxia/portfolio/:id', lazyloadRouteHandler('./routes/zimuxia/portfolio'));
|
||||
// router.get('/zimuxia/:category?', lazyloadRouteHandler('./routes/zimuxia/index'));
|
||||
@@ -2239,9 +2184,6 @@ router.get('/uwants/:fid', lazyloadRouteHandler('./routes/uwants'));
|
||||
// Now新聞
|
||||
router.get('/now/news/rank', lazyloadRouteHandler('./routes/now/rank'));
|
||||
|
||||
// s-hentai
|
||||
router.get('/s-hentai/:id?', lazyloadRouteHandler('./routes/s-hentai'));
|
||||
|
||||
// etherscan
|
||||
router.get('/etherscan/transactions/:address', lazyloadRouteHandler('./routes/etherscan/transactions'));
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
module.exports = async (ctx) => {
|
||||
const url = ctx.params.postid ? `https://app.vmovier.com/apiv3/post/getPostInCate?p=1&size=10&cateid=${ctx.params.postid}` : `https://app.vmovier.com/apiv3/index/getIndexPosts/lastid/`;
|
||||
const config = {
|
||||
headers: {
|
||||
'user-agent': 'VmovierApp 5.7.7 / Android 10 / WIFI / 1080*2175 / 2.75',
|
||||
'content-type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
};
|
||||
const res = await got({
|
||||
method: 'get',
|
||||
url,
|
||||
});
|
||||
const list = res.data.data.list ? res.data.data.list : res.data.data;
|
||||
const items = await Promise.all(
|
||||
list.map(async (list) => {
|
||||
const title = list.title;
|
||||
const link = `https://app.vmovier.com/apiv3/post/view?postid=${list.postid}`;
|
||||
const description = await ctx.cache.tryGet(link, async () => {
|
||||
const res = await got.get(link, config);
|
||||
const playurl = res.data.data.content_video[0].progressive[0].url;
|
||||
const desc = `<meta name="referrer" content="no-referrer"><video src='${playurl}' controls='controls' width='100%'></video><p>${res.data.data.intro}</p><img src='${res.data.data.image}' width='200'>`;
|
||||
return desc;
|
||||
});
|
||||
return Promise.resolve({
|
||||
title,
|
||||
description,
|
||||
author: list.creator_username,
|
||||
link: `https://www.vmovier.com/${list.postid}`,
|
||||
});
|
||||
})
|
||||
);
|
||||
ctx.state.data = {
|
||||
title: `${ctx.params.postid ? list[0].cate[0].catename : '每日精选'}-场库`,
|
||||
link: url,
|
||||
description: '场库_高品质短片分享平台',
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
@@ -5,7 +5,7 @@ module.exports = async (ctx) => {
|
||||
const name = ctx.params.name;
|
||||
const season = ctx.params.season;
|
||||
|
||||
let link = `https://ddrk.me/${name}/`;
|
||||
let link = `https://ddys.pro/${name}/`;
|
||||
|
||||
if (season) {
|
||||
link += `${season}/`;
|
||||
|
||||
@@ -3,7 +3,7 @@ const cheerio = require('cheerio');
|
||||
const md5 = require('@/utils/md5');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const url = ctx.params.tag ? `https://ddrk.me/tag/${encodeURIComponent(ctx.params.tag)}/` : ctx.params.category ? `https://ddrk.me/category/${ctx.params.category}/` : 'https://ddrk.me/';
|
||||
const url = ctx.params.tag ? `https://ddys.pro/tag/${encodeURIComponent(ctx.params.tag)}/` : ctx.params.category ? `https://ddrk.me/category/${ctx.params.category}/` : 'https://ddys.pro/';
|
||||
|
||||
const response = await got(url);
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const responseData = (await got.get(`http://www.wuhaozhan.net/movie/list/?p=1`)).data;
|
||||
const $ = cheerio.load(responseData);
|
||||
const list = $('.pure-u-16-24').get();
|
||||
const data = {
|
||||
title: '电影首发站',
|
||||
link: 'http://www.wuhaozhan.net/movie/list/',
|
||||
description: '高清电影',
|
||||
item: list.map((item) => ({
|
||||
title: $(item).find('h2').text(),
|
||||
description: $(item).find('.l-des').text(),
|
||||
pubDate: new Date($(item).find('.dt').text()).toUTCString(),
|
||||
link: $(item).find('.l-a').attr('href'),
|
||||
})),
|
||||
};
|
||||
ctx.state.data = data;
|
||||
};
|
||||
@@ -1,37 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const tag = ['bluray', '1080p', '720p', '3d', 'webdl'].includes(ctx.params.tag) ? ctx.params.tag : '';
|
||||
|
||||
const { data } = await got({
|
||||
method: 'get',
|
||||
url: `http://gaoqing.la/${tag}`,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(data);
|
||||
const list = $('#post_container > li .thumbnail > a');
|
||||
|
||||
let result = list
|
||||
.map((_, ele) => {
|
||||
const coverImg = $(ele).find('img').attr('src');
|
||||
const title = $(ele).attr('title');
|
||||
return {
|
||||
title,
|
||||
link: $(ele).attr('href'),
|
||||
description: `
|
||||
<h1>${title}</h1>
|
||||
<img src="${coverImg}" />
|
||||
`.trim(),
|
||||
};
|
||||
})
|
||||
.get();
|
||||
result = result.slice(0, 10);
|
||||
|
||||
ctx.state.data = {
|
||||
title: '中国高清网',
|
||||
link: 'http://gaoqing.la',
|
||||
description: $('meta[name="description"]').attr('content'),
|
||||
item: result,
|
||||
};
|
||||
};
|
||||
@@ -1,133 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
const baseUrl = 'http://www.mp4ba.com';
|
||||
|
||||
class ParamType {
|
||||
static get paramType() {
|
||||
return { type: 0, search: 1 };
|
||||
}
|
||||
|
||||
constructor(param) {
|
||||
this._param = param;
|
||||
|
||||
if (param.match(/\d{1,2}/)) {
|
||||
this._type = ParamType.paramType.type; // 参数为1-2位数字即为类型RSS
|
||||
} else {
|
||||
this._type = ParamType.paramType.search; // 其他情况为搜索
|
||||
}
|
||||
}
|
||||
|
||||
get param() {
|
||||
return this._param;
|
||||
}
|
||||
|
||||
get type() {
|
||||
return this._type;
|
||||
}
|
||||
|
||||
get url() {
|
||||
let url;
|
||||
if (!this._url) {
|
||||
switch (this._type) {
|
||||
case ParamType.paramType.type:
|
||||
url = `${baseUrl}/index/index/lists/catid/${this._param}.html`;
|
||||
break;
|
||||
case ParamType.paramType.search:
|
||||
url = `${baseUrl}/index.php?m=search&q=${this._param}`;
|
||||
break;
|
||||
}
|
||||
this._url = url;
|
||||
}
|
||||
return this._url;
|
||||
}
|
||||
}
|
||||
|
||||
async function buildRss($, paramType, ctx) {
|
||||
const $list = (selector) => $('.content').find(selector); // 列表对象
|
||||
const title = $('title').text();
|
||||
const typeString = title.substring(0, title.indexOf('_'));
|
||||
let selectorPath1,
|
||||
selectorPath2 = null;
|
||||
|
||||
function buildDesc() {
|
||||
let desc = '';
|
||||
switch (paramType.type) {
|
||||
case ParamType.paramType.type:
|
||||
desc = `${typeString}类型`;
|
||||
selectorPath1 = '.detail .list ul li';
|
||||
selectorPath2 = 'a';
|
||||
break;
|
||||
case ParamType.paramType.search:
|
||||
desc = typeString;
|
||||
selectorPath1 = '.search .search_content .sousuo';
|
||||
selectorPath2 = 'b a';
|
||||
break;
|
||||
}
|
||||
return desc;
|
||||
}
|
||||
|
||||
function buildItem($) {
|
||||
return Promise.all(
|
||||
$(selectorPath1)
|
||||
.map(async (_, result) => {
|
||||
const $ = cheerio.load(result);
|
||||
const pubDate = new Date(
|
||||
$('span')
|
||||
.text()
|
||||
.match(/\d{4}-\d{1,2}-\d{1,2}/)
|
||||
).toUTCString();
|
||||
const $a = $(selectorPath2);
|
||||
const pageUrl = $a.attr('href');
|
||||
const { cache } = ctx;
|
||||
const title = $a.text();
|
||||
const link = pageUrl;
|
||||
const guid = pageUrl.match(/(\d+?).html/);
|
||||
let description = null;
|
||||
const enclosure_type = 'application/x-bittorrent';
|
||||
let $magnet = null;
|
||||
|
||||
async function getDescription() {
|
||||
const key = `Mp4Ba${pageUrl}`;
|
||||
const value = await ctx.cache.get(key);
|
||||
if (value) {
|
||||
description = value;
|
||||
const $ = cheerio.load(value);
|
||||
$magnet = $('a[href^="magnet:?xt=urn:btih:"]');
|
||||
} else {
|
||||
const pageData = (await got.get(pageUrl)).data;
|
||||
const $page = cheerio.load(pageData);
|
||||
const downloadAll = $page('#fadecon > .dow_con:nth-child(1)');
|
||||
const downloadBd = $page('#fadecon > .dow_con:nth-child(4)');
|
||||
const info_detail = $page('.content .article .box .info_con').find('.info_detail');
|
||||
const ar_banner = $page('.content .article .box .info_con').find('.ar_banner');
|
||||
$magnet = downloadAll.find('a[href^="magnet:?xt=urn:btih:"]');
|
||||
description = info_detail.html() + ar_banner.html() + downloadAll.html() + downloadBd.html();
|
||||
cache.set(key, description);
|
||||
}
|
||||
}
|
||||
|
||||
await getDescription();
|
||||
const enclosure_url = $magnet.attr('href');
|
||||
return { title, link, description, enclosure_url, enclosure_type, guid, pubDate };
|
||||
})
|
||||
.get()
|
||||
);
|
||||
}
|
||||
|
||||
return {
|
||||
title: `${typeString} - 高清MP4吧`,
|
||||
link: paramType.url,
|
||||
description: buildDesc(),
|
||||
item: await buildItem($list),
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { params } = ctx;
|
||||
const { param } = params;
|
||||
const paramType = new ParamType(param);
|
||||
const { data } = await got.get(encodeURI(paramType.url));
|
||||
const $ = cheerio.load(data);
|
||||
ctx.state.data = await buildRss($, paramType, ctx);
|
||||
};
|
||||
@@ -1,21 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const url = 'https://mqube.net/';
|
||||
|
||||
const response = await got.get(url);
|
||||
|
||||
const list = JSON.parse(response.data.match(/gon.item_list=(.*?);/)[1]) || [];
|
||||
|
||||
ctx.state.data = {
|
||||
title: `MQube 新着`,
|
||||
link: url,
|
||||
item: list.map((item) => ({
|
||||
title: item.title,
|
||||
author: item.user.name,
|
||||
description: `<audio src="https://s3.mqube.net/t/files/item/file/${item.code.toString().substring(0, 6)}/${item.code}/${item.file}" controls loop></audio><div><br>${item.description.replace(/\n/g, '<br>')}</dive>`,
|
||||
pubDate: new Date(item.created_at),
|
||||
link: `https://mqube.net/play/${item.code}`,
|
||||
})),
|
||||
};
|
||||
};
|
||||
@@ -1,23 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const tag = ctx.params.tag;
|
||||
|
||||
const url = `https://mqube.net/search/tag/${encodeURIComponent(tag)}`;
|
||||
|
||||
const response = await got.get(url);
|
||||
|
||||
const list = JSON.parse(response.data.match(/gon.item_list=(.*?);/)[1]) || [];
|
||||
|
||||
ctx.state.data = {
|
||||
title: `MQube - ${tag}`,
|
||||
link: url,
|
||||
item: list.map((item) => ({
|
||||
title: item.title,
|
||||
author: item.user.name,
|
||||
description: `<audio src="https://s3.mqube.net/t/files/item/file/${item.code.toString().substring(0, 6)}/${item.code}/${item.file}" controls loop></audio><div><br>${item.description.replace(/\n/g, '<br>')}</dive>`,
|
||||
pubDate: new Date(item.created_at),
|
||||
link: `https://mqube.net/play/${item.code}`,
|
||||
})),
|
||||
};
|
||||
};
|
||||
@@ -1,21 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const url = 'https://mqube.net/';
|
||||
|
||||
const response = await got.get(url);
|
||||
|
||||
const list = JSON.parse(response.data.match(/gon.right_riot_item_lists=(.*?);/)[1]) || [];
|
||||
|
||||
ctx.state.data = {
|
||||
title: `MQube デイリーランキング`,
|
||||
link: url,
|
||||
item: list.map((item) => ({
|
||||
title: item.title,
|
||||
author: item.user.name,
|
||||
description: `<audio src="https://s3.mqube.net/t/files/item/file/${item.code.toString().substring(0, 6)}/${item.code}/${item.file}" controls loop></audio><div><br>${item.description.replace(/\n/g, '<br>')}</dive>`,
|
||||
pubDate: new Date(item.created_at),
|
||||
link: `https://mqube.net/play/${item.code}`,
|
||||
})),
|
||||
};
|
||||
};
|
||||
@@ -1,25 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const user = ctx.params.user;
|
||||
|
||||
const url = `https://mqube.net/user/${user}`;
|
||||
|
||||
const response = await got.get(url);
|
||||
|
||||
const list = JSON.parse(response.data.match(/gon.item_list=(.*?);/)[1]) || [];
|
||||
|
||||
const username = list[0].user.name;
|
||||
|
||||
ctx.state.data = {
|
||||
title: `MQube - ${username}`,
|
||||
link: url,
|
||||
item: list.map((item) => ({
|
||||
title: item.title,
|
||||
author: item.user.name,
|
||||
description: `<audio src="https://s3.mqube.net/t/files/item/file/${item.code.toString().substring(0, 6)}/${item.code}/${item.file}" controls loop></audio><div><br>${item.description.replace(/\n/g, '<br>')}</dive>`,
|
||||
pubDate: new Date(item.created_at),
|
||||
link: `https://mqube.net/play/${item.code}`,
|
||||
})),
|
||||
};
|
||||
};
|
||||
@@ -1,58 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
const host = 'https://www.nfmovies.com/';
|
||||
const mv_slot = 'https://www.nfmovies.com/video/?UID-0-0.html';
|
||||
const url_slot = 'https://www.nfmovies.com/list/?ID.html';
|
||||
|
||||
const idProps = {
|
||||
0: '首页',
|
||||
1: '电影',
|
||||
2: '电视剧',
|
||||
3: '综艺',
|
||||
4: '动漫',
|
||||
5: '奈菲独家',
|
||||
};
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id || '0';
|
||||
let t_url = '';
|
||||
if (id === '0') {
|
||||
t_url = host;
|
||||
} else if (id === '5') {
|
||||
t_url = 'https://www.nfmovies.com/search.php?searchtype=5&order=time&player=%E5%A5%88%E8%8F%B2%E7%8B%AC%E5%AE%B6%E9%AB%98%E6%B8%85%E7%89%87%E6%BA%90';
|
||||
} else {
|
||||
t_url = url_slot.replace('ID', id);
|
||||
}
|
||||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: t_url,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
const items = [];
|
||||
$('.col-md-2').each(function () {
|
||||
const item = $(this);
|
||||
const link = mv_slot.replace(
|
||||
'UID',
|
||||
item
|
||||
.find('a')
|
||||
.attr('href')
|
||||
.match(/\d{4,}/g)
|
||||
);
|
||||
const src = host + item.children('a').attr('data-original');
|
||||
items.push({
|
||||
title: item.find('h5').text(),
|
||||
description: `<img src="` + src + `"/><br>` + item.html(),
|
||||
link,
|
||||
});
|
||||
});
|
||||
|
||||
ctx.state.data = {
|
||||
title: `${idProps[id]} - 奈菲影视`,
|
||||
link: t_url,
|
||||
description: `${idProps[id]} - 奈菲影视-永久免费无广告的福利超清影视站,没有套路,完全免费!`,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
@@ -1,77 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
const sourceTimezoneOffset = -8;
|
||||
module.exports = async (ctx) => {
|
||||
const url = 'http://www.ningmeng.name/archives/category/%E7%A7%81%E6%88%BF%E6%AD%8C';
|
||||
const res = await got.get(url);
|
||||
const $$ = cheerio.load(res.data);
|
||||
const postUrls = $$('.site-main .posts-wrapper .grid-item a.u-permalink')
|
||||
.slice(0, 3)
|
||||
.map((i, el) => $$(el).attr('href'))
|
||||
.get();
|
||||
|
||||
const postItemGroups = await Promise.all(
|
||||
postUrls.map(async (postUrl) => {
|
||||
const cache = await ctx.cache.get(postUrl);
|
||||
if (cache) {
|
||||
return JSON.parse(cache);
|
||||
}
|
||||
|
||||
const postRes = await got.get(postUrl);
|
||||
const $ = cheerio.load(postRes.data);
|
||||
|
||||
let time = $('.iconfont.icon-shijian + span.count').text();
|
||||
time = time ? new Date(time) : new Date();
|
||||
time.setTime(time.getTime() + (sourceTimezoneOffset - time.getTimezoneOffset() / 60) * 60 * 60 * 1000);
|
||||
const pubDate = time.toUTCString();
|
||||
|
||||
const content = $('.entry-content');
|
||||
|
||||
const mp3s = content.find('.karma-by-kadar__simple-player');
|
||||
const mp3Urls = mp3s.map((i, el) => $(el).attr('data-src')).get();
|
||||
|
||||
const images = content.find('img');
|
||||
const imageUrls = images.map((i, el) => $(el).attr('src')).get();
|
||||
|
||||
const playerTextRe = /\n*play_circle_filledpause_circle_filledvolume_downvolume_upvolume_off\n*/g;
|
||||
const songSplitterRe = /—+.+—+/g;
|
||||
const texts = content
|
||||
.text()
|
||||
.replace(songSplitterRe, '')
|
||||
.split(playerTextRe)
|
||||
.map((p) => p.trim().split(/\n+/));
|
||||
|
||||
const out = mp3Urls.map((mp3Url, i) => {
|
||||
const ss = mp3Url.split('/');
|
||||
const filename = ss[ss.length - 1].split('.')[0];
|
||||
const [title, artist] = filename.split('-');
|
||||
const description = [`<img src="${imageUrls[i]}" />`, `<h4>${texts[i][0]}</h4>`, `<p>${texts[i][1]}</p>`].join();
|
||||
|
||||
return {
|
||||
title: unescape(title).trim(),
|
||||
author: unescape(artist).trim(),
|
||||
link: mp3Url,
|
||||
guid: mp3Url,
|
||||
description,
|
||||
pubDate,
|
||||
};
|
||||
});
|
||||
|
||||
ctx.cache.set(postUrl, JSON.stringify(out));
|
||||
|
||||
return out;
|
||||
})
|
||||
);
|
||||
|
||||
let items = [];
|
||||
postItemGroups.forEach((group) => {
|
||||
items = items.concat(group);
|
||||
});
|
||||
|
||||
ctx.state.data = {
|
||||
title: '柠檬私房歌',
|
||||
link: 'http://www.ningmeng.name',
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
@@ -1,37 +0,0 @@
|
||||
const url = require('url');
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const link = 'https://www.piaohua.com/';
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: link,
|
||||
});
|
||||
const $ = cheerio.load(response.data);
|
||||
const list = $('ul.ul-imgtxt1.row li')
|
||||
.map((_, item) => {
|
||||
item = $(item);
|
||||
return {
|
||||
title: item.find('h3').text(),
|
||||
link: url.resolve(link, item.find('a').attr('href')),
|
||||
pubDate: new Date(item.find('span').text()).toUTCString(),
|
||||
};
|
||||
})
|
||||
.get();
|
||||
|
||||
ctx.state.data = {
|
||||
title: '飘花电影网 - 今日推荐',
|
||||
link,
|
||||
item: await Promise.all(
|
||||
list.map((item) =>
|
||||
ctx.cache.tryGet(item.link, async () => {
|
||||
const detailResponse = await got({ method: 'get', url: item.link });
|
||||
const content = cheerio.load(detailResponse.data);
|
||||
item.description = content('div.m-text1').html();
|
||||
return item;
|
||||
})
|
||||
)
|
||||
),
|
||||
};
|
||||
};
|
||||
@@ -1,35 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: 'http://www.wuhaozhan.net/movie/list/',
|
||||
headers: {
|
||||
Referer: 'http://www.wuhaozhan.net/movie/list/',
|
||||
},
|
||||
});
|
||||
|
||||
const data = response.data;
|
||||
|
||||
const $ = cheerio.load(data);
|
||||
const list = $('.pure-g .l-box');
|
||||
ctx.state.data = {
|
||||
title: '人生05电影更新列表',
|
||||
link: 'http://www.wuhaozhan.net/movie/list/',
|
||||
description: '人生05电影更新列表',
|
||||
item:
|
||||
list &&
|
||||
list
|
||||
.map((index, item) => {
|
||||
item = $(item);
|
||||
return {
|
||||
title: item.find('.pr h1 a').text(),
|
||||
description: item.find('.pr h2').text() + '<img src="' + item.find('.pure-g iframe').attr('src') + '">',
|
||||
pubDate: item.find('.pr .dt').text(),
|
||||
link: item.find('.l-a').attr('href'),
|
||||
};
|
||||
})
|
||||
.get(),
|
||||
};
|
||||
};
|
||||
@@ -1,64 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id || 'ready-to-download';
|
||||
|
||||
const rootUrl = 'https://s-hentai.org';
|
||||
const currentUrl = `${rootUrl}/${id === 'ready-to-download' ? id : `menu/${id}`}`;
|
||||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
const list = $('.block-product')
|
||||
.slice(0, ctx.query.limit ? parseInt(ctx.query.limit) : 20)
|
||||
.map((_, item) => {
|
||||
item = $(item);
|
||||
|
||||
const a = item.find('.name-product a');
|
||||
|
||||
return {
|
||||
title: a.text(),
|
||||
link: a.attr('href'),
|
||||
pubDate: parseDate(item.find('.post-date').text().trim().split(' ')[0], 'YYYY年MM月DD日'),
|
||||
};
|
||||
})
|
||||
.get();
|
||||
|
||||
const items = await Promise.all(
|
||||
list.map((item) =>
|
||||
ctx.cache.tryGet(item.link, async () => {
|
||||
const detailResponse = await got({
|
||||
method: 'get',
|
||||
url: item.link,
|
||||
});
|
||||
|
||||
const content = cheerio.load(detailResponse.data);
|
||||
|
||||
const images = content('#sync1');
|
||||
const description = content('#description-deital');
|
||||
|
||||
content('.single-support').remove();
|
||||
|
||||
item.enclosure_url = content('.file-download-comment a').eq(0).attr('href');
|
||||
item.enclosure_type = 'application/x-bittorrent';
|
||||
|
||||
item.description = (images ? images.html() : '') + content('.detial-short').html() + (description ? description.html() : '');
|
||||
item.category = detailResponse.data.match(/<a href="https:\/\/s-hentai\.org\/category\/\d+">(.*)<\/a>/g).map((category) => category.match(/>(.*)</)[1]);
|
||||
|
||||
return item;
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: `${$('title').text().trim().split('|')[0]} | S-HENTAI.ORG`,
|
||||
link: currentUrl,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
@@ -1,50 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: 'https://idol.sankakucomplex.com/post/atom',
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
ctx.state.data = {
|
||||
title: 'Posts | Idol Complex - Idol & Cosplay Images',
|
||||
link: 'https://idol.sankakucomplex.com/',
|
||||
item: $('entry')
|
||||
.map((index, item) => {
|
||||
item = $(item);
|
||||
|
||||
const title = item.find('title').text();
|
||||
const link = `https:${item.find('link').attr('href')}`;
|
||||
const pubDate = new Date(item.find('updated').text()).toUTCString();
|
||||
const author = item.find('author name').text();
|
||||
const summary = item.find('summary').text();
|
||||
const id = 'x-rss';
|
||||
const $2 = cheerio.load(`<div id="${id}">${item.find('content').html()}</div>`);
|
||||
|
||||
$2('a').each((index, item) => {
|
||||
item = $2(item);
|
||||
item.attr('href', `https:${item.attr('href')}`);
|
||||
});
|
||||
$2('img').each((index, item) => {
|
||||
item = $2(item);
|
||||
item.attr('src', `https:${item.attr('src')}`);
|
||||
item.attr('referrerpolicy', 'no-referrer');
|
||||
});
|
||||
|
||||
const content = $2(`#${id}`).html();
|
||||
const description = `${summary}<br>${content}`;
|
||||
|
||||
return {
|
||||
title,
|
||||
link,
|
||||
pubDate,
|
||||
author,
|
||||
description,
|
||||
};
|
||||
})
|
||||
.get(),
|
||||
};
|
||||
};
|
||||
@@ -1,60 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id || '';
|
||||
|
||||
const rootUrl = 'https://sub.shinybbs.vip';
|
||||
const currentUrl = `${rootUrl}/?page_id=${id}`;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
const list = $('.elementor-button-link, .kb-gallery-item-link')
|
||||
.slice(0, 10)
|
||||
.map((_, item) => {
|
||||
item = $(item);
|
||||
return {
|
||||
link: item.attr('href'),
|
||||
};
|
||||
})
|
||||
.get();
|
||||
|
||||
const items = await Promise.all(
|
||||
list.map((item) =>
|
||||
ctx.cache.tryGet(item.link, async () => {
|
||||
const detailResponse = await got({
|
||||
method: 'get',
|
||||
url: item.link,
|
||||
});
|
||||
const content = cheerio.load(detailResponse.data);
|
||||
|
||||
content('.elementor-section').last().remove();
|
||||
content('.elementor-section').last().remove();
|
||||
|
||||
content('.elementor-tabs-wrapper').remove();
|
||||
|
||||
item.title = content('.post-title').text();
|
||||
item.description = content('.elementor-inner, .post-content').html();
|
||||
item.pubDate = new Date(content('.post-date').text().replace(/年|月/g, '-').replace('日', '')).toUTCString();
|
||||
|
||||
item.enclosure_type = 'application/x-bittorrent';
|
||||
|
||||
const enclosureUrl = content('.elementor-tab-content a').last().attr('href');
|
||||
|
||||
item.enclosure_url = enclosureUrl ? enclosureUrl.replace('http://magnet', 'magnet') : '';
|
||||
|
||||
return item;
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: $('title').text(),
|
||||
link: currentUrl,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
@@ -1,57 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const rootUrl = 'https://sub.shinybbs.vip';
|
||||
const currentUrl = `${rootUrl}/?page_id=152`;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
const list = $('.wp-block-latest-posts__list li a')
|
||||
.slice(0, 10)
|
||||
.map((_, item) => {
|
||||
item = $(item);
|
||||
return {
|
||||
title: item.text(),
|
||||
link: item.attr('href'),
|
||||
pubDate: new Date(item.next('time').attr('datetime')).toUTCString(),
|
||||
};
|
||||
})
|
||||
.get();
|
||||
|
||||
const items = await Promise.all(
|
||||
list.map((item) =>
|
||||
ctx.cache.tryGet(item.link, async () => {
|
||||
const detailResponse = await got({
|
||||
method: 'get',
|
||||
url: item.link,
|
||||
});
|
||||
const content = cheerio.load(detailResponse.data);
|
||||
|
||||
content('.elementor-section').last().remove();
|
||||
content('.elementor-section').last().remove();
|
||||
|
||||
content('.elementor-tabs-wrapper').remove();
|
||||
|
||||
item.description = content('.elementor-inner').html();
|
||||
item.enclosure_type = 'application/x-bittorrent';
|
||||
|
||||
const enclosureUrl = content('.elementor-tab-content a').last().attr('href');
|
||||
|
||||
item.enclosure_url = enclosureUrl ? enclosureUrl.replace('http://magnet', 'magnet') : '';
|
||||
|
||||
return item;
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: $('title').text(),
|
||||
link: currentUrl,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
@@ -1,38 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id;
|
||||
|
||||
const rootUrl = 'https://sub.shinybbs.vip';
|
||||
const currentUrl = `${rootUrl}/?p=${id}`;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
$('.elementor-section').last().remove();
|
||||
$('.elementor-section').last().remove();
|
||||
|
||||
$('.elementor-tabs-wrapper').remove();
|
||||
|
||||
const items = $('.elementor-tab-content a')
|
||||
.map((_, item) => {
|
||||
item = $(item);
|
||||
return {
|
||||
title: item.text(),
|
||||
link: item.attr('href'),
|
||||
enclosure_url: item.attr('href'),
|
||||
enclosure_type: 'application/x-bittorrent',
|
||||
};
|
||||
})
|
||||
.get();
|
||||
|
||||
ctx.state.data = {
|
||||
title: `${$('.post-title').text()} - 深影译站`,
|
||||
link: currentUrl,
|
||||
item: items.reverse(),
|
||||
};
|
||||
};
|
||||
@@ -1,46 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { id } = ctx.params;
|
||||
const link = `https://v.qq.com/detail/${id[0]}/${id}.html`;
|
||||
const page = await got.get(link);
|
||||
const $ = cheerio.load(page.data);
|
||||
|
||||
let vtype = 4;
|
||||
// 支持地址 https://v.qq.com/detail/8/84842.html
|
||||
let items = null;
|
||||
if (id[0] === '8') {
|
||||
vtype = 1;
|
||||
const episodes = await got.get(`https://s.video.qq.com/get_playsource?id=${id}&plat=2&type=${vtype}&data_type=2&video_type=3&range=1&plname=qq&otype=json&num_mod_cnt=20&callback=a&_t=${Date.now()}`);
|
||||
const playList = JSON.parse(episodes.data.slice(2, -1)).playlist[0].videoPlayList;
|
||||
items = playList.map((video) => {
|
||||
const video_id = video.playUrl.split('=')[1];
|
||||
const info = {
|
||||
title: video.title,
|
||||
link: video.playUrl,
|
||||
description: `
|
||||
<iframe src="https://v.qq.com/txp/iframe/player.html?vid=${video_id}" allowFullScreen="true" width="640" height="430"></iframe>
|
||||
`,
|
||||
};
|
||||
return info;
|
||||
});
|
||||
} else {
|
||||
const episodes = await got.get(`https://s.video.qq.com/get_playsource?id=${id}&plat=2&type=${vtype}&data_type=2&video_type=3&range=1&plname=qq&otype=json&num_mod_cnt=20&callback=a&_t=${Date.now()}`);
|
||||
const playList = JSON.parse(episodes.data.slice(2, -1)).PlaylistItem.videoPlayList;
|
||||
items = playList.map((video) => ({
|
||||
title: video.title,
|
||||
link: video.playUrl,
|
||||
description: `
|
||||
<iframe src="https://v.qq.com/txp/iframe/player.html?vid=${video.id}" allowFullScreen="true" width="640" height="430"></iframe>
|
||||
`,
|
||||
}));
|
||||
}
|
||||
|
||||
ctx.state.data = {
|
||||
title: $('title').text(),
|
||||
link,
|
||||
description: $('meta[name=description]').attr('content'),
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
@@ -1,57 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id || '139';
|
||||
|
||||
const rootUrl = 'http://wanwansub.com';
|
||||
const currentUrl = `${rootUrl}/node/${id}`;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
const list = $('.pg-item a')
|
||||
.slice(0, 10)
|
||||
.map((_, item) => {
|
||||
item = $(item);
|
||||
return {
|
||||
title: item.text(),
|
||||
link: `${rootUrl}${item.attr('href')}`,
|
||||
};
|
||||
})
|
||||
.get();
|
||||
|
||||
const items = await Promise.all(
|
||||
list.map((item) =>
|
||||
ctx.cache.tryGet(item.link, async () => {
|
||||
const detailResponse = await got({
|
||||
method: 'get',
|
||||
url: item.link,
|
||||
});
|
||||
const content = cheerio.load(detailResponse.data);
|
||||
|
||||
content('.button').remove();
|
||||
|
||||
const links = detailResponse.data.match(/<a href="magnet:(.*?)" target="_self">磁力<\/a>/g);
|
||||
|
||||
if (links) {
|
||||
item.enclosure_type = 'application/x-bittorrent';
|
||||
item.enclosure_url = links.pop().match(/<a href="(.*)" target="_self">磁力<\/a>/)[1];
|
||||
}
|
||||
|
||||
item.description = content('.content-box').html();
|
||||
|
||||
return item;
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: $('title').text(),
|
||||
link: currentUrl,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
@@ -1,44 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id;
|
||||
|
||||
const rootUrl = 'http://wanwansub.com';
|
||||
const currentUrl = `${rootUrl}/info/${id}`;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
const items = $('.lightbox-image')
|
||||
.nextAll('p')
|
||||
.slice(3)
|
||||
.map((_, item) => {
|
||||
const i = {};
|
||||
|
||||
item = $(item);
|
||||
|
||||
item.find('a').each(function () {
|
||||
if ($(this).text() === '磁力') {
|
||||
i.enclosure_url = $(this).attr('href');
|
||||
i.enclosure_type = 'application/x-bittorrent';
|
||||
}
|
||||
});
|
||||
|
||||
i.description = `<p>${item.html()}</p>`;
|
||||
i.title = item.text().split(' ')[0];
|
||||
i.link = currentUrl;
|
||||
|
||||
return i;
|
||||
})
|
||||
.get();
|
||||
|
||||
ctx.state.data = {
|
||||
title: $('title').text(),
|
||||
link: currentUrl,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
Vendored
-21
@@ -1,21 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const querystring = require('querystring');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const query = querystring.stringify({ q: ctx.params.query });
|
||||
const link = `https://tv.yahoo.co.jp/search/?${query}`;
|
||||
const response = await got(link);
|
||||
const $ = cheerio.load(response.body);
|
||||
const [title] = $('.search_result').find('p').text().split(':');
|
||||
const item = $('.programlist li')
|
||||
.map((index, item) => {
|
||||
const $item = $(item);
|
||||
const title = `${$item.find('.leftarea').text().replace(/\n/g, '')} ${$item.find('.yjLS').text()}`;
|
||||
const link = `https://tv.yahoo.co.jp${$item.find('div.rightarea p.yjLS.pb5p a').attr('href')}`;
|
||||
const description = $item.find('p.yjMS:nth-child(3)').text();
|
||||
return { title, description, link };
|
||||
})
|
||||
.get();
|
||||
ctx.state.data = { title, link, item };
|
||||
};
|
||||
@@ -3,7 +3,7 @@ const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { type = 'mv' } = ctx.params;
|
||||
const baseUrl = 'https://www.zimuku.org';
|
||||
const baseUrl = 'https://srtku.com';
|
||||
const url = `${baseUrl}/newsubs?t=${type}`;
|
||||
const response = await got(url);
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
const parser = require('@/utils/rss-parser');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { id = 0 } = ctx.params;
|
||||
const feed = await parser.parseURL(`http://rss.rrys.tv/rss/feed/${id}`);
|
||||
feed.items.map((item) => {
|
||||
item.link = null;
|
||||
item.enclosure_url = item.magnet;
|
||||
item.enclosure_type = 'application/x-bittorrent';
|
||||
return item;
|
||||
});
|
||||
|
||||
ctx.state.data = {
|
||||
title: feed.title,
|
||||
link: feed.link,
|
||||
description: feed.description,
|
||||
item: feed.items,
|
||||
};
|
||||
};
|
||||
@@ -1,27 +0,0 @@
|
||||
const cheerio = require('cheerio');
|
||||
const got = require('@/utils/got');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { range, type } = ctx.params;
|
||||
|
||||
const url = `http://www.rrys2019.com/html/top/${range}_${type}_list.html`;
|
||||
const response = await got(url);
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
const list = $('li.clearfix');
|
||||
|
||||
ctx.state.data = {
|
||||
title: `${$('.title').text().trim()}-字幕组`,
|
||||
link: url,
|
||||
item: list
|
||||
.map((_, item) => {
|
||||
item = $(item);
|
||||
return {
|
||||
title: item.find('.info a').first().text(),
|
||||
description: item.find('.info p').first().html() + '<br>' + item.find('.a1 p').html() + '<br>' + `<img src='${item.find('.img img').first().attr('rel').replace('m_', '')}'>`,
|
||||
link: item.find('.info a').first().attr('href'),
|
||||
};
|
||||
})
|
||||
.get(),
|
||||
};
|
||||
};
|
||||
@@ -1,59 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { share_id, parent_file_id } = ctx.params;
|
||||
const url = `https://www.aliyundrive.com/s/${share_id}${parent_file_id ? `/folder/${parent_file_id}` : ''}`;
|
||||
|
||||
const headers = {
|
||||
referer: 'https://www.aliyundrive.com/',
|
||||
origin: 'https://www.aliyundrive.com',
|
||||
'x-canary': 'client=web,app=share,version=v2.3.1',
|
||||
};
|
||||
|
||||
const shareRes = await got.post('https://api.aliyundrive.com/adrive/v3/share_link/get_share_by_anonymous', {
|
||||
params: {
|
||||
share_id,
|
||||
},
|
||||
json: {
|
||||
share_id,
|
||||
},
|
||||
headers,
|
||||
});
|
||||
|
||||
const tokenRes = await got.post('https://api.aliyundrive.com/v2/share_link/get_share_token', {
|
||||
headers,
|
||||
json: {
|
||||
share_id,
|
||||
},
|
||||
});
|
||||
const share_token = tokenRes.data.share_token;
|
||||
|
||||
const listRes = await got.post('https://api.aliyundrive.com/adrive/v2/file/list_by_share', {
|
||||
headers: {
|
||||
...headers,
|
||||
'x-share-token': share_token,
|
||||
},
|
||||
json: {
|
||||
limit: 100,
|
||||
order_by: 'created_at',
|
||||
order_direction: 'DESC',
|
||||
parent_file_id: parent_file_id || 'root',
|
||||
share_id,
|
||||
},
|
||||
});
|
||||
|
||||
const result = listRes.data.items.map((item) => ({
|
||||
title: item.name,
|
||||
description: item.name + (item.thumbnail ? `<img src="${item.thumbnail}">` : ''),
|
||||
link: url,
|
||||
pubDate: item.created_at,
|
||||
updated: item.updated_at,
|
||||
guid: item.file_id,
|
||||
}));
|
||||
|
||||
ctx.state.data = {
|
||||
title: `${shareRes.data.display_name || `${share_id}${parent_file_id ? `-${parent_file_id}` : ''}`}-阿里云盘`,
|
||||
link: url,
|
||||
item: result,
|
||||
};
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'/files/:share_id/:parent_file_id?': ['DIYgod'],
|
||||
};
|
||||
@@ -1,13 +0,0 @@
|
||||
module.exports = {
|
||||
'aliyundrive.com': {
|
||||
_name: '阿里云盘',
|
||||
www: [
|
||||
{
|
||||
title: '文件列表',
|
||||
docs: 'https://docs.rsshub.app/routes/programming#a-li-yun-pan',
|
||||
source: ['/s/:share_id', '/s/:share_id/folder/:parent_file_id'],
|
||||
target: '/aliyundrive/files/:share_id/:parent_file_id?',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = (router) => {
|
||||
router.get('/files/:share_id/:parent_file_id?', require('./files'));
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'/update/:mid': ['zytomorrow'],
|
||||
};
|
||||
@@ -1,13 +0,0 @@
|
||||
module.exports = {
|
||||
'gaze.run': {
|
||||
_name: '注视影视',
|
||||
'.': [
|
||||
{
|
||||
title: '更新通知',
|
||||
docs: 'https://docs.rsshub.app/routes//multimedia#gaze-run',
|
||||
source: ['/play/:mid'],
|
||||
target: (params) => `/gaze/update/${params.mid}`,
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = function (router) {
|
||||
router.get('/update/:mid', require('./update'));
|
||||
};
|
||||
@@ -1,4 +0,0 @@
|
||||
<div>
|
||||
{{ data.name }}已于{{ data.update_time }}更新第{{ data.episodes }}集。<br/>
|
||||
观看地址:<a href="https://gaze.run/play/{{ data.cid }}">{{ data.name }}第{{ data.episodes }}集</a>
|
||||
</div>
|
||||
@@ -1,27 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const { art } = require('@/utils/render');
|
||||
const path = require('path');
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
const timezone = require('@/utils/timezone');
|
||||
|
||||
// 站长提供的API
|
||||
const rootUrl = 'https://gaze.run/3e47b75000b0924b6c9ba5759a7cf15d';
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const mid = ctx.params.mid;
|
||||
const response = await got.post(rootUrl, { form: { mid } });
|
||||
const data = response.data.data;
|
||||
|
||||
ctx.state.data = {
|
||||
title: `gaze.run影视更新通知 - ${data.name}`,
|
||||
link: `https://gaze.run/play/${mid}`,
|
||||
item: [
|
||||
{
|
||||
title: `${data.name}-第${data.episodes}集`,
|
||||
description: art(path.resolve(__dirname, './templates/update.art'), { data }),
|
||||
link: `https://gaze.run/play/${mid}`,
|
||||
pubDate: timezone(parseDate(data.update_time), +8),
|
||||
},
|
||||
],
|
||||
};
|
||||
};
|
||||
@@ -1,4 +0,0 @@
|
||||
module.exports = {
|
||||
'/maitta': ['fengkx'],
|
||||
'/radio/:id?': ['nczitzk'],
|
||||
};
|
||||
@@ -1,32 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const url = 'https://www.ibc.co.jp/radio/maitta/audio/';
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const res = await got(url);
|
||||
const $ = cheerio.load(res.data);
|
||||
const items = $('.up').toArray();
|
||||
ctx.state.data = {
|
||||
title: 'IBCラジオ イヤーマイッタマイッタ|IBC岩手放送',
|
||||
link: 'http://www.ibc.co.jp/radio/maitta/audio',
|
||||
description: $('meta[name=description]').attr('content'),
|
||||
itunes_author: '水越アナと大塚アナ',
|
||||
image: 'https://cdn.ibc.co.jp/radio/maitta/audio/images/header.png',
|
||||
language: 'ja',
|
||||
item: items.map((item) => {
|
||||
item = $(item);
|
||||
const link = new URL(item.find('a').attr('href'), url).href;
|
||||
const uid = link.match(/\/(\d+)\/$/)[1];
|
||||
return {
|
||||
title: item.find('h3').text(),
|
||||
description: item.find('.audio_intro').text().trim(),
|
||||
link,
|
||||
pubDate: parseDate(item.find('.onair_date').text().split('日')[0].replace(/年|月/g, '-')),
|
||||
itunes_item_image: 'https://assets.blubrry.com/coverart/300/357155.png',
|
||||
enclosure_url: `https://media-data.cdn.ibc.co.jp/out/sound/28_${uid}/28_${uid}.mp3`, // 音频链接
|
||||
enclosure_type: 'audio/mpeg',
|
||||
};
|
||||
}),
|
||||
};
|
||||
};
|
||||
@@ -1,19 +0,0 @@
|
||||
module.exports = {
|
||||
'ibc.co.jp': {
|
||||
_name: 'IBC 岩手放送',
|
||||
'.': [
|
||||
{
|
||||
title: 'イヤーマイッタマイッタ',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#ibc-yan-shou-fang-song',
|
||||
source: ['/radio/maitta/audio', '/'],
|
||||
target: '/ibc/maitta',
|
||||
},
|
||||
{
|
||||
title: 'ラジオ',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#ibc-yan-shou-fang-song',
|
||||
source: ['/radio/:id/audio', '/'],
|
||||
target: '/ibc/radio/:id?',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,73 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const timezone = require('@/utils/timezone');
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
const { art } = require('@/utils/render');
|
||||
const path = require('path');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id ?? 'maitta';
|
||||
const limit = ctx.query.limit ? parseInt(ctx.query.limit) : 150;
|
||||
|
||||
const rootUrl = 'https://www.ibc.co.jp';
|
||||
const currentUrl = `${rootUrl}/radio/${id}/audio/`;
|
||||
|
||||
let response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
|
||||
let $ = cheerio.load(response.data);
|
||||
|
||||
const image = $('meta[property="og:image"]').attr('content');
|
||||
|
||||
let radioId = $('link[title="RSS"]').attr('href')?.split('/rss/').pop().replace(/\/$/, '') ?? '';
|
||||
|
||||
let items = $('.audio_list section').toArray();
|
||||
|
||||
if (!radioId) {
|
||||
const item = $(items[0]);
|
||||
|
||||
response = await got({
|
||||
method: 'get',
|
||||
url: new URL(item.find('a').attr('href'), rootUrl).href,
|
||||
});
|
||||
|
||||
$ = cheerio.load(response.data);
|
||||
|
||||
radioId = $('audio')
|
||||
.attr('src')
|
||||
.match(/\/sound\/(\d+)_/)[1];
|
||||
}
|
||||
|
||||
items = items.slice(0, limit).map((item) => {
|
||||
item = $(item);
|
||||
|
||||
const link = new URL(item.find('a').attr('href'), rootUrl).href;
|
||||
const audioId = link.match(/\/aitem\/(\d+)/)[1];
|
||||
const audio = `https://media-data.cdn.ibc.co.jp/out/sound/${radioId}_${audioId}/${radioId}_${audioId}.mp3`;
|
||||
|
||||
return {
|
||||
link,
|
||||
title: item.find('h3').text(),
|
||||
pubDate: timezone(parseDate(item.find('.update_date').text(), 'YYYY年MM月DD日'), +9),
|
||||
enclosure_url: audio,
|
||||
enclosure_type: 'audio/mpeg',
|
||||
itunes_item_image: image,
|
||||
description: art(path.join(__dirname, 'templates/description.art'), {
|
||||
description: item.find('.audio_intro').text(),
|
||||
audio,
|
||||
}),
|
||||
};
|
||||
});
|
||||
|
||||
ctx.state.data = {
|
||||
title: $('title').text() || `IBC岩手放送|${$('.programinfo h3').text()}`,
|
||||
link: currentUrl,
|
||||
item: items,
|
||||
description: $('meta[property="og:description"]').attr('content'),
|
||||
itunes_author: 'IBC岩手放送',
|
||||
image,
|
||||
allowEmpty: true,
|
||||
};
|
||||
};
|
||||
@@ -1,4 +0,0 @@
|
||||
module.exports = (router) => {
|
||||
router.get('/maitta', require('./maitta'));
|
||||
router.get('/radio/:id?', require('./radio'));
|
||||
};
|
||||
@@ -1,6 +0,0 @@
|
||||
{{ if description }}
|
||||
<p>{{ description }}</p>
|
||||
{{ /if }}
|
||||
{{ if audio }}
|
||||
<audio controls src="{{ audio }}"></audio>
|
||||
{{ /if }}
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'/news': ['TsSmartTT'],
|
||||
};
|
||||
@@ -1,52 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const timezone = require('@/utils/timezone');
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
const asyncPool = require('tiny-async-pool');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const link = 'http://news.mtime.com';
|
||||
const response = await got(link, {
|
||||
https: {
|
||||
rejectUnauthorized: false,
|
||||
},
|
||||
});
|
||||
const $ = cheerio.load(response.data);
|
||||
const list = $('ul.left-cont.fix li')
|
||||
.toArray()
|
||||
.map((item) => {
|
||||
item = $(item);
|
||||
return {
|
||||
title: item.find('h4 a').text(),
|
||||
link: item.find('h4 a').attr('href'),
|
||||
};
|
||||
});
|
||||
|
||||
const items = [];
|
||||
for await (const item of asyncPool(4, list, (item) =>
|
||||
ctx.cache.tryGet(item.link, async () => {
|
||||
const detailResponse = await got(item.link);
|
||||
const content = cheerio.load(detailResponse.data);
|
||||
|
||||
content('.DRE-subject-wrapper').remove();
|
||||
|
||||
item.author = content('.editor').text().replace('编辑:', '');
|
||||
item.description = content('.body').first().html();
|
||||
item.pubDate = timezone(parseDate(content('.userCreateTime').text()), 8);
|
||||
item.category = content('.keyword a')
|
||||
.toArray()
|
||||
.map((item) => content(item).text());
|
||||
|
||||
return item;
|
||||
})
|
||||
)) {
|
||||
items.push(item);
|
||||
}
|
||||
|
||||
ctx.state.data = {
|
||||
title: $('head title').text().trim(),
|
||||
link,
|
||||
image: 'http://static1.mtime.cn/favicon.ico',
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
@@ -1,13 +0,0 @@
|
||||
module.exports = {
|
||||
'mtime.com': {
|
||||
_name: '时光网',
|
||||
news: [
|
||||
{
|
||||
title: '时光新闻',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#shi-guang-wang',
|
||||
source: '/',
|
||||
target: '/mtime/news',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = function (router) {
|
||||
router.get('/news', require('./news'));
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'/series/:mid/:sort?': ['minimalistrojan'],
|
||||
};
|
||||
@@ -1,18 +0,0 @@
|
||||
module.exports = {
|
||||
'prestige-av.com': {
|
||||
_name: 'Prestige 蚊香社',
|
||||
'.': [
|
||||
{
|
||||
title: '系列作品',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#prestige-wen-xiang-she',
|
||||
source: ['/goods/goods_list.php'],
|
||||
target: (_params, url) => {
|
||||
const link = new URL(url);
|
||||
if (link.searchParams.get('mode') === 'series') {
|
||||
return link.searchParams.has('sort') ? `/prestige-av/series/${link.searchParams.get('mid')}/${link.searchParams.get('sort')}` : `/prestige-av/series/${link.searchParams.get('mid')}`;
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = (router) => {
|
||||
router.get('/series/:mid/:sort?', require('./series'));
|
||||
};
|
||||
@@ -1,42 +0,0 @@
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const browser = await require('@/utils/puppeteer')();
|
||||
|
||||
const id = ctx.params.mid;
|
||||
const sort = ctx.params.sort ?? 'near';
|
||||
|
||||
const page = await browser.newPage();
|
||||
const link = `https://www.prestige-av.com/goods/goods_list.php?mode=series&mid=${id}&count=100&sort=${sort}`;
|
||||
await page.setRequestInterception(true);
|
||||
page.on('request', (request) => {
|
||||
request.resourceType() === 'document' || request.resourceType() === 'script' ? request.continue() : request.abort();
|
||||
});
|
||||
await page.goto(link);
|
||||
await page.waitForSelector('.buttons');
|
||||
await page.click('#AC');
|
||||
await page.waitForSelector('#body_goods');
|
||||
const html = await page.evaluate(() => document.documentElement.innerHTML);
|
||||
browser.close();
|
||||
|
||||
const $ = cheerio.load(html);
|
||||
const list = $('div#body_goods li');
|
||||
|
||||
ctx.state.data = {
|
||||
title: `【Prestige】${$('div[class=search_title_layout_01]').children('h1').first().text().replace('シリーズ ▶ ', '').replace(/\s*/g, '')}`,
|
||||
description: $('meta[name=Description]').attr('content'),
|
||||
link: `https://www.prestige-av.com/goods/goods_list.php?mode=series&mid=${id}&sort=${sort}`,
|
||||
item:
|
||||
list &&
|
||||
list
|
||||
.map((index, item) => {
|
||||
item = $(item);
|
||||
return {
|
||||
title: item.find('span.title').text().replace(/\s*/g, ''),
|
||||
description: item.find('div.spec_layout').children('p').first().text().replace(/\s*/g, '') + '<br/>' + `<img src="https://www.prestige-av.com/${item.find('img').attr('src').replace('pf_t1', 'pb_e')}"/>`,
|
||||
link: item.find('a').attr('href'),
|
||||
};
|
||||
})
|
||||
.get(),
|
||||
};
|
||||
};
|
||||
@@ -37,23 +37,6 @@ module.exports = {
|
||||
target: '/tencent/pvp/newsindex/all',
|
||||
},
|
||||
],
|
||||
v: [
|
||||
{
|
||||
title: '视频 - 播放列表',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#teng-xun-shi-pin',
|
||||
source: '/x/cover/:id',
|
||||
target: (params) => {
|
||||
const id = params.id.match('(.*).html')[1];
|
||||
return id ? `/tencentvideo/playlist/${id}` : '';
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '视频 - 播放列表',
|
||||
docs: 'https://docs.rsshub.app/routes/multimedia#teng-xun-shi-pin',
|
||||
source: '/x/cover/:id/:detail',
|
||||
target: '/tencentvideo/playlist/:id',
|
||||
},
|
||||
],
|
||||
'wiki.connect': [
|
||||
{
|
||||
title: 'QQ 互联 SDK 更新日志',
|
||||
|
||||
@@ -485,22 +485,6 @@ Official RSS: [https://eztv.io/ezrss.xml](https://eztv.io/ezrss.xml)
|
||||
|
||||
<Route author="everyonus" example="/hentaimama/videos" path="/hentaimama/videos" />
|
||||
|
||||
## IBC 岩手放送 {#ibc-yan-shou-fang-song}
|
||||
|
||||
### イヤーマイッタマイッタ {#ibc-yan-shou-fang-song-%E3%82%A4%E3%83%A4%E3%83%BC%E3%83%9E%E3%82%A4%E3%83%83%E3%82%BF%E3%83%9E%E3%82%A4%E3%83%83%E3%82%BF}
|
||||
|
||||
<Route author="fengkx" example="/ibc/maitta" path="/ibc/maitta" supportPodcast="1" radar="1" notOperational="1" />
|
||||
|
||||
### ラジオ {#ibc-yan-shou-fang-song-%E3%83%A9%E3%82%B8%E3%82%AA}
|
||||
|
||||
<Route author="nczitzk" example="/ibc/radio/maitta" path="/ibc/radio/:id?" paramsDesc={['Radio id, can be found in URL, イヤーマイッタマイッタ by default']} supportPodcast="1" notOperational="1">
|
||||
:::tip
|
||||
If you subscribe to [イヤーマイッタマイッタ](https://www.ibc.co.jp/radio/maitta/audio), the URL is `https://www.ibc.co.jp/radio/maitta/audio`. Intercept `maitta` between `https://www.ibc.co.jp/radio/` and `/audio/` as an argument, then the route will be [`/ibc/radio/maitta`](https://rsshub.app/ibc/radio/maitta).
|
||||
|
||||
If you subscribe to [火曜ワイド「境界トラブル解決ラジオ!](https://www.ibc.co.jp/radio/TochiKyokai/audio), the URL is `https://www.ibc.co.jp/radio/TochiKyokai/audio`. Intercept `TochiKyokai` between `https://www.ibc.co.jp/radio/` and `/audio/` as an argument, then the route is [`/ibc/radio/TochiKyokai`](https://rsshub.app/ibc/radio/TochiKyokai).
|
||||
:::
|
||||
</Route>
|
||||
|
||||
## JavBus {#javbus}
|
||||
|
||||
:::warning
|
||||
@@ -873,48 +857,6 @@ JavDB 有多个备用域名,本路由默认使用永久域名 `https://javdb.c
|
||||
| uploads | favorites | listens | stream |
|
||||
</Route>
|
||||
|
||||
## Mp4Ba {#mp4ba}
|
||||
|
||||
### 影视分类 {#mp4ba-ying-shi-fen-lei}
|
||||
|
||||
<Route author="SettingDust wolfyu1991" example="/mp4ba/6" path="/mp4ba/:param" paramsDesc={['类型']} supportBT="1" notOperational="1">
|
||||
**类型参考这里**
|
||||
|
||||
| 电影 | 连续剧 | 动画 | 综艺 | 纪录片 |
|
||||
| ---- | ------ | ---- | ---- | ------ |
|
||||
| 6 | 7 | 15 | 20 | 24 |
|
||||
|
||||
| 动作片 | 喜剧片 | 爱情片 | 科幻片 | 恐怖片 |
|
||||
| ------ | ------ | ------ | ------ | ------ |
|
||||
| 8 | 9 | 10 | 11 | 12 |
|
||||
|
||||
| 剧情片 | 战争片 | 国产剧 | 港台剧 | 日韩剧 | 欧美剧 |
|
||||
| ------ | ------ | ------ | ------ | ------ | ------ |
|
||||
| 13 | 14 | 16 | 17 | 18 | 19 |
|
||||
</Route>
|
||||
|
||||
### 影视搜索 {#mp4ba-ying-shi-sou-suo}
|
||||
|
||||
<Route author="wolfyu1991" example="/mp4ba/复仇者联盟" path="/mp4ba/:keyword" paramsDesc={['搜索关键字']} supportBT="1" />
|
||||
|
||||
## MQube {#mqube}
|
||||
|
||||
### 全站最近更新 {#mqube-quan-zhan-zui-jin-geng-xin}
|
||||
|
||||
<Route author="hoilc" example="/mqube/latest" path="/mqube/latest" radar="1" notOperational="1" />
|
||||
|
||||
### 全站每日排行 {#mqube-quan-zhan-mei-ri-pai-hang}
|
||||
|
||||
<Route author="hoilc" example="/mqube/top" path="/mqube/top" radar="1" notOperational="1" />
|
||||
|
||||
### 个人最近更新 {#mqube-ge-ren-zui-jin-geng-xin}
|
||||
|
||||
<Route author="hoilc" example="/mqube/user/mukamui_v_p" path="/mqube/user/:user" paramsDesc={['用户 ID, 可以在个人资料页的 URL 中找到']} radar="1" notOperational="1" />
|
||||
|
||||
### 标签最近更新 {#mqube-biao-qian-zui-jin-geng-xin}
|
||||
|
||||
<Route author="hoilc" example="/mqube/tag/UTAU" path="/mqube/tag/:tag" paramsDesc={['标签名称, 可参考`https://mqube.net/search/tag`']} radar="1" notOperational="1" />
|
||||
|
||||
## Netflav {#netflav}
|
||||
|
||||
### Index {#netflav-index}
|
||||
@@ -1055,38 +997,6 @@ JavDB 有多个备用域名,本路由默认使用永久域名 `https://javdb.c
|
||||
- `jp` (Japanese), for Pornhub in Japan [https://jp.pornhub.com](https://jp.pornhub.com) etc.
|
||||
</Route>
|
||||
|
||||
## PRESTIGE (プレステージ 蚊香社) {#prestige-%E3%83%97%E3%83%AC%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8-wen-xiang-she}
|
||||
|
||||
### シリーズ {#prestige-%E3%83%97%E3%83%AC%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8-wen-xiang-she-%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA}
|
||||
|
||||
<Route author="minimalistrojan" example="/prestige-av/series/847" path="/prestige-av/series/:mid/:sort?" paramsDesc={['Series number', 'Sorting, `near` by default']} puppeteer="1" notOperational="1">
|
||||
| 人気順 | 新着順 | 発売日順 | タイトル順 | 価格の安い順 | 価格の高い順 |
|
||||
| ------- | ------ | -------- | ---------- | ------------ | ------------ |
|
||||
| popular | near | date | title | low | high |
|
||||
</Route>
|
||||
|
||||
## rs05 人生 05 电影 {#rs05-ren-sheng-05-dian-ying}
|
||||
|
||||
### rs05 电影列表 {#rs05-ren-sheng-05-dian-ying-rs05-dian-ying-lie-biao}
|
||||
|
||||
<Route author="monner-henster" example="/rs05/rs05" path="/rs05/rs05" notOperational="1" />
|
||||
|
||||
## s-hentai {#s-hentai}
|
||||
|
||||
### Category {#s-hentai-category}
|
||||
|
||||
<Route author="nczitzk" example="/s-hentai" path="/hentai/:id?" paramsDesc={['id, see below, ready-to-download by default']} notOperational="1">
|
||||
| Doujin | HCG | Games・Animes | Voices・ASMR | Ready to Download |
|
||||
| ------ | --- | ------------- | ------------ | ----------------- |
|
||||
| 1 | 2 | 3 | 4 | ready-to-download |
|
||||
</Route>
|
||||
|
||||
## Sankaku Complex {#sankaku-complex}
|
||||
|
||||
### Post {#sankaku-complex-post}
|
||||
|
||||
<Route author="xyqfer" example="/sankakucomplex/post" path="/sankakucomplex/post" notOperational="1" />
|
||||
|
||||
## sexinsex {#sexinsex}
|
||||
|
||||
### 分区帖子 {#sexinsex-fen-qu-tie-zi}
|
||||
@@ -1135,7 +1045,7 @@ JavDB 有多个备用域名,本路由默认使用永久域名 `https://javdb.c
|
||||
|
||||
### 字幕 {#sub-hd-zi-mu}
|
||||
|
||||
<Route author="laampui nczitzk" example="/subhd/sub/new" path="/subhd/sub/:category?" paramsDesc={['分类,见下表,默认为最新']} notOperational="1">
|
||||
<Route author="laampui nczitzk" example="/subhd/sub/new" path="/subhd/sub/:category?" paramsDesc={['分类,见下表,默认为最新']}>
|
||||
| 最新字幕 | 热门字幕 | 剧集字幕 | 电影字幕 |
|
||||
| -------- | -------- | -------- | -------- |
|
||||
| new | top | tv | movie |
|
||||
@@ -1213,24 +1123,12 @@ Refer to [https://developers.themoviedb.org/3/getting-started/languages](https:/
|
||||
|
||||
<Route author="TonyRL" example="/u9a9/search/新片速递" path="/u3c3/search/:keyword/:preview?" paramsDesc={['Search keyword', 'Show image preview, off by default, non empty value means on']} supportBT="1" radar="1" />
|
||||
|
||||
## Yahoo! テレビ {#yahoo!-%E3%83%86%E3%83%AC%E3%83%93}
|
||||
|
||||
### 番組検索 {#yahoo!-%E3%83%86%E3%83%AC%E3%83%93-fan-zu-jian-suo}
|
||||
|
||||
<Route author="sakamossan" example="/yahoo-jp-tv/%E8%8A%B1%E6%BE%A4%E9%A6%99%E8%8F%9C" path="/yahoo-jp-tv/:query" paramsDesc={['搜索查询']} notOperational="1" />
|
||||
|
||||
## 阿基米德 FM {#a-ji-mi-de-fm}
|
||||
|
||||
### 播客 {#a-ji-mi-de-fm-bo-ke}
|
||||
|
||||
<Route author="Fatpandac" example="/ajmide/10603594" path="/ajmide/:id" paramsDesc={['播客 id,可以从播客页面 URL 中找到']} radar="1" />
|
||||
|
||||
## 阿里云盘 {#a-li-yun-pan}
|
||||
|
||||
### 文件列表 {#a-li-yun-pan-wen-jian-lie-biao}
|
||||
|
||||
<Route author="DIYgod" example="/aliyundrive/files/XDFSyJ3J5wk/63035a070a078cf4e55e4b7ea3fd5bd269c4e41c" path="/aliyundrive/files/:share_id/:parent_file_id?" paramsDesc={['分享 id,可以从分享页面 URL 中找到', '文件夹 id,可以从文件夹页面 URL 中找到']} radar="1" notOperational="1" />
|
||||
|
||||
## 爱奇艺 {#ai-qi-yi}
|
||||
|
||||
### 用户视频 {#ai-qi-yi-yong-hu-shi-pin}
|
||||
@@ -1345,55 +1243,23 @@ Refer to [https://developers.themoviedb.org/3/getting-started/languages](https:/
|
||||
:::
|
||||
</Route>
|
||||
|
||||
## 场库 {#chang-ku}
|
||||
|
||||
### 今日精选 {#chang-ku-jin-ri-jing-xuan}
|
||||
|
||||
<Route author="Wenmoux" example="/changku" path="/changku" notOperational="1" />
|
||||
|
||||
### 分类 {#chang-ku-fen-lei}
|
||||
|
||||
<Route author="Wenmoux" example="/changku/cate/12" path="/changku/cate/:cateid" paramsDesc={['分类id']} notOperational="1">
|
||||
| 创意 | 励志 | 搞笑 | 广告 | 汽车 | 旅行 |
|
||||
| ---- | ---- | ---- | ---- | ---- | ---- |
|
||||
| 6 | 7 | 8 | 13 | 92 | 11 |
|
||||
|
||||
| 爱情 | 剧情 | 运动 | 动画 | 音乐 | 科幻 |
|
||||
| ---- | ---- | ---- | ---- | ---- | ---- |
|
||||
| 12 | 17 | 10 | 16 | 18 | 23 |
|
||||
|
||||
| 预告 | 记录 | 混剪 | 游戏 | 时尚 | 实验 |
|
||||
| ---- | ---- | ---- | ---- | ---- | ---- |
|
||||
| 43 | 24 | 44 | 104 | 88 | 45 |
|
||||
|
||||
| 生活 |
|
||||
| ---- |
|
||||
| 78 |
|
||||
</Route>
|
||||
|
||||
## 低端影视 {#di-duan-ying-shi}
|
||||
|
||||
### 影视剧集更新 {#di-duan-ying-shi-ying-shi-ju-ji-geng-xin}
|
||||
|
||||
<Route author="saintwinkle" example="/ddrk/update/silicon-valley/6" path="/ddrk/update/:name/:season?" paramsDesc={['影视名称,可以在 URL 中找到','季数,可以在 URL 中找到,剧集没有分季时不用填写,或是默认输出第一季的内容']} radar="1" notOperational="1" />
|
||||
<Route author="saintwinkle" example="/ddrk/update/silicon-valley/6" path="/ddrk/update/:name/:season?" paramsDesc={['影视名称,可以在 URL 中找到','季数,可以在 URL 中找到,剧集没有分季时不用填写,或是默认输出第一季的内容']} radar="1" anticrawler="1" />
|
||||
|
||||
### 首页 {#di-duan-ying-shi-shou-ye}
|
||||
|
||||
<Route author="hoilc" example="/ddrk/index" path="/ddrk/index" radar="1" notOperational="1" />
|
||||
<Route author="hoilc" example="/ddrk/index" path="/ddrk/index" radar="1" anticrawler="1" />
|
||||
|
||||
### 分类 {#di-duan-ying-shi-fen-lei}
|
||||
|
||||
<Route author="hoilc" example="/ddrk/category/jp-drama" path="/ddrk/category/:category" paramsDesc={['分类 ID, 可在 URL 中找到, 注意, 如果有两级分类, 只需要填写第二级即可']} radar="1" notOperational="1" />
|
||||
<Route author="hoilc" example="/ddrk/category/jp-drama" path="/ddrk/category/:category" paramsDesc={['分类 ID, 可在 URL 中找到, 注意, 如果有两级分类, 只需要填写第二级即可']} radar="1" anticrawler="1" />
|
||||
|
||||
### 标签 {#di-duan-ying-shi-biao-qian}
|
||||
|
||||
<Route author="hoilc" example="/ddrk/tag/石原里美" path="/ddrk/tag/:tag" paramsDesc={['标签名, 可在 URL 中找到']} radar="1" />
|
||||
|
||||
## 电影首发站 {#dian-ying-shou-fa-zhan}
|
||||
|
||||
### 电影 {#dian-ying-shou-fa-zhan-dian-ying}
|
||||
|
||||
<Route author="epirus" example="/dysfz" path="/dysfz" notOperational="1" />
|
||||
<Route author="hoilc" example="/ddrk/tag/石原里美" path="/ddrk/tag/:tag" paramsDesc={['标签名, 可在 URL 中找到']} radar="1" anticrawler="1" />
|
||||
|
||||
## 电影天堂 {#dian-ying-tian-tang}
|
||||
|
||||
@@ -1405,7 +1271,7 @@ Refer to [https://developers.themoviedb.org/3/getting-started/languages](https:/
|
||||
|
||||
### 最新电影 {#gao-qing-dian-tai-zui-xin-dian-ying}
|
||||
|
||||
<Route author="Songkeys" example="/gaoqing/latest" path="/gaoqing/latest" notOperational="1" />
|
||||
<Route author="Songkeys" example="/gaoqing/latest" path="/gaoqing/latest" anticrawler="1" />
|
||||
|
||||
## 故事 FM {#gu-shi-fm}
|
||||
|
||||
@@ -1453,22 +1319,6 @@ Refer to [https://developers.themoviedb.org/3/getting-started/languages](https:/
|
||||
|
||||
<Route author="song-zhou" example="/maoyan/hotComplete" path="/maoyan/hotComplete/:orderby?/:ascOrDesc?/:top?" paramsDesc={['排序条件,(score: 评分,pubDate: 发布时间),', '正序或倒序 (asc: 正序, desc: 倒序) 默认倒序', '取前多少条,默认取所有']} />
|
||||
|
||||
## 奈菲影视 {#nai-fei-ying-shi}
|
||||
|
||||
### 分区 {#nai-fei-ying-shi-fen-qu}
|
||||
|
||||
<Route author="AngUOI" example="/nfmovies/0" path="/nfmovies/:id?" paramsDesc={['子版块 id, 为空默认首页']} notOperational="1">
|
||||
| 首页 | 电影 | 电视剧 | 综艺 | 动漫 | 奈菲独家 |
|
||||
| ---- | ---- | ------ | ---- | ---- | -------- |
|
||||
| 0 | 1 | 2 | 3 | 4 | 5 |
|
||||
</Route>
|
||||
|
||||
## 柠檬 私房歌 (ningmeng.name) {#ning-meng-si-fang-ge-ningmeng-name}
|
||||
|
||||
### 私房歌 {#ning-meng-si-fang-ge-ningmeng-name-si-fang-ge}
|
||||
|
||||
<Route author="dearrrfish" example="/ningmeng/song" path="/ningmeng/song" notOperational="1" />
|
||||
|
||||
## 片源网 {#pian-yuan-wang}
|
||||
|
||||
### 最新资源 {#pian-yuan-wang-zui-xin-zi-yuan}
|
||||
@@ -1485,12 +1335,6 @@ Refer to [https://developers.themoviedb.org/3/getting-started/languages](https:/
|
||||
|
||||
搜索路由模仿 jackett 的搜索 api, 以提供给 nastools 使用,填写在 nastools 配置 indexer 中
|
||||
|
||||
## 飘花电影网 {#piao-hua-dian-ying-wang}
|
||||
|
||||
### 今日热门 {#piao-hua-dian-ying-wang-jin-ri-re-men}
|
||||
|
||||
<Route author="nczitzk" example="/piaohua/hot" path="/piaohua/hot" notOperational="1" />
|
||||
|
||||
## 蜻蜓 FM {#qing-ting-fm}
|
||||
|
||||
### 专辑 {#qing-ting-fm-zhuan-ji}
|
||||
@@ -1549,60 +1393,12 @@ Refer to [https://developers.themoviedb.org/3/getting-started/languages](https:/
|
||||
|
||||
<Route author="JamYiz" example="/sehuatang/user/411096" path="/sehuatang/user/:uid" paramsDesc={['用户 uid, 可在用户主页 URL 中找到']} configRequired="1" />
|
||||
|
||||
## 深影译站 {#shen-ying-yi-zhan}
|
||||
|
||||
### 首页 {#shen-ying-yi-zhan-shou-ye}
|
||||
|
||||
<Route author="nczitzk" example="/shinybbs" path="/shinybbs" />
|
||||
|
||||
### 剧集类型 {#shen-ying-yi-zhan-ju-ji-lei-xing}
|
||||
|
||||
<Route author="nczitzk" example="/shinybbs/page/62" path="/shinybbs/page/:id?" paramsDesc={['类型 id,见下表']}>
|
||||
| 英美剧 | 日韩剧 | 小语种 |
|
||||
| ------ | ------ | ------ |
|
||||
| 62 | 140 | 2 |
|
||||
</Route>
|
||||
|
||||
### 最新作品 {#shen-ying-yi-zhan-zui-xin-zuo-pin}
|
||||
|
||||
<Route author="nczitzk" example="/shinybbs/latest" path="/shinybbs/latest" />
|
||||
|
||||
### 指定剧集 {#shen-ying-yi-zhan-zhi-ding-ju-ji}
|
||||
|
||||
<Route author="nczitzk" example="/shinybbs/p/1790" path="/shinybbs/p/:id" paramsDesc={['剧集 id,可在剧集页 URL 中找到']} notOperational="1" />
|
||||
|
||||
## 时光网 {#shi-guang-wang}
|
||||
|
||||
### 时光新闻 {#shi-guang-wang-shi-guang-xin-wen}
|
||||
|
||||
<Route author="TsSmartTT" example="/mtime/news" path="/mtime/news" radar="1" notOperational="1" />
|
||||
|
||||
## 腾讯视频 {#teng-xun-shi-pin}
|
||||
|
||||
### 播放列表 {#teng-xun-shi-pin-bo-fang-lie-biao}
|
||||
|
||||
<Route author="Andiedie" example="/tencentvideo/playlist/jx7g4sm320sqm7i" path="/tencentvideo/playlist/:id" paramsDesc={['播放列表 ID,可以在 URL 中找到']} radar="1" notOperational="1" />
|
||||
|
||||
## 听听 FM {#ting-ting-fm}
|
||||
|
||||
### 节目 {#ting-ting-fm-jie-mu}
|
||||
|
||||
<Route author="TonyRL" example="/tingtingfm/program/M7VJv6Jj4R" path="/tingtingfm/program/:programId" paramsDesc={['节目 ID,可以在 URL 中找到']} radar="1" supportPodcast="1" />
|
||||
|
||||
## 弯弯字幕组 {#wan-wan-zi-mu-zu}
|
||||
|
||||
### 分类 {#wan-wan-zi-mu-zu-fen-lei}
|
||||
|
||||
<Route author="nczitzk" example="/wanwansub/139" path="/wanwansub/:id?" paramsDesc={['分类 id,见下表,默认为 ALL']} notOperational="1">
|
||||
| ALL | 英语小分队 | 日语小分队 | 韩语小分队 | 葡语小分队 | 西语小分队 | 法语小分队 | 意语小分队 | 德语小分队 | 泰语小分队 | 其他语种 |
|
||||
| --- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | -------- |
|
||||
| 139 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 153 | 117 | 154 |
|
||||
</Route>
|
||||
|
||||
### 剧集 {#wan-wan-zi-mu-zu-ju-ji}
|
||||
|
||||
<Route author="nczitzk" example="/wanwansub/info/393" path="/wanwansub/info/:id" paramsDesc={['剧集 id,可在剧集页 URL 中找到']} notOperational="1" />
|
||||
|
||||
## 网易云音乐 {#wang-yi-yun-yin-yue}
|
||||
|
||||
:::tip
|
||||
@@ -1731,16 +1527,6 @@ Refer to [https://developers.themoviedb.org/3/getting-started/languages](https:/
|
||||
| nba | zuqiu |
|
||||
</Route>
|
||||
|
||||
## 中国高清网 {#zhong-guo-gao-qing-wang}
|
||||
|
||||
### 电影 {#zhong-guo-gao-qing-wang-dian-ying}
|
||||
|
||||
<Route author="minosss" example="/gaoqingla" path="/gaoqingla/:tag?" paramsDesc={['标签tag,视频清晰度']} anticrawler="1" />
|
||||
|
||||
| 全部 | 蓝光 | 1080P | 720P | 3D | WEB-DL |
|
||||
| ---- | ------ | ----- | ---- | -- | ------ |
|
||||
| 留空 | bluray | 1080p | 720p | 3d | webdl |
|
||||
|
||||
## 中文播客榜 {#zhong-wen-bo-ke-bang}
|
||||
|
||||
:::tip
|
||||
@@ -1767,12 +1553,6 @@ Refer to [https://developers.themoviedb.org/3/getting-started/languages](https:/
|
||||
|
||||
<Route author="nczitzk" example="/xyzrank/new-podcasts" path="/xyzrank/new-podcasts" />
|
||||
|
||||
## 注视影视 {#zhu-shi-ying-shi}
|
||||
|
||||
### 更新通知 {#zhu-shi-ying-shi-geng-xin-tong-zhi}
|
||||
|
||||
<Route author="zytomorrow" example="/gaze/update/5157c267ee121ab8d1b45092304a1e85" path="/gaze/update/:mid" paramsDesc={['剧集的id。播放页面play之后的一串字符']} notOperational="1" />
|
||||
|
||||
## 追新番 {#zhui-xin-fan}
|
||||
|
||||
### 最近更新 {#zhui-xin-fan-zui-jin-geng-xin}
|
||||
@@ -1783,7 +1563,7 @@ Refer to [https://developers.themoviedb.org/3/getting-started/languages](https:/
|
||||
|
||||
### 字幕列表 {#zi-mu-ku-zi-mu-lie-biao}
|
||||
|
||||
<Route author="sanmmm" example="/zimuku/mv" path="/zimuku/:type?" paramsDesc={['类型, 默认为`mv`电影']} notOperational="1">
|
||||
<Route author="sanmmm" example="/zimuku/mv" path="/zimuku/:type?" paramsDesc={['类型, 默认为`mv`电影']}>
|
||||
类型
|
||||
|
||||
| 最新电影 | 最新美剧 |
|
||||
@@ -1791,27 +1571,11 @@ Refer to [https://developers.themoviedb.org/3/getting-started/languages](https:/
|
||||
| mv | tv |
|
||||
</Route>
|
||||
|
||||
## 字幕组(ZiMuZu.tv) {#zi-mu-zu-zimuzu-tv}
|
||||
|
||||
### 影视 {#zi-mu-zu-zimuzu-tv-ying-shi}
|
||||
|
||||
:::tip
|
||||
跟官方提供的 RSS 相比:官方使用了不规范的 magnet 字段,无法被 BT 客户端识别并自动下载,其他数据相同
|
||||
:::
|
||||
|
||||
<Route author="DIYgod" example="/zimuzu/resource/37031" path="/zimuzu/resource/:id?" paramsDesc={['影视 id,对应影视的 URL 中找到,为空时输出最近更新']} supportBT="1" notOperational="1" />
|
||||
|
||||
### 排行榜 {#zi-mu-zu-zimuzu-tv-pai-hang-bang}
|
||||
|
||||
<Route author="queensferryme DIYgod" example="/zimuzu/top/week/movie" path="/zimuzu/top/:range/:type" paramsDesc={['时间范围, 可以是 `week` `month` `year` `total`', '排行类型, 可以是 `fav` `tv` `movie`']} notOperational="1">
|
||||
例如,路由 `/zimuzu/top/week/movie` 应该输出 [http://www.rrys2019.com/html/top/week\_movie\_list.html](http://www.rrys2019.com/html/top/week_movie_list.html) 的排行榜单
|
||||
</Route>
|
||||
|
||||
## 综艺秀 {#zong-yi-xiu}
|
||||
|
||||
### 综艺 {#zong-yi-xiu-zong-yi}
|
||||
|
||||
<Route author="pharaoh2012 nczitzk" example="/zyshow/chongchongchong" path="/zyshow/:region?/:id" paramsDesc={['地区,见下表,默认为空,即台湾', '综艺 id,综艺详情对应页 URL 中找到']} radar="1" notOperational="1">
|
||||
<Route author="pharaoh2012 nczitzk" example="/zyshow/chongchongchong" path="/zyshow/:region?/:id" paramsDesc={['地区,见下表,默认为空,即台湾', '综艺 id,综艺详情对应页 URL 中找到']} radar="1" anticrawler="1">
|
||||
地区
|
||||
|
||||
| 台湾 | 韩国 | 大陆 |
|
||||
|
||||
Reference in New Issue
Block a user