feat: remove notOperational routes - multimedia

This commit is contained in:
DIYgod
2023-12-20 01:52:09 +08:00
parent 1c057d9ab7
commit 6d898277a0
54 changed files with 11 additions and 1823 deletions
-27
View File
@@ -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' }] },
-62
View File
@@ -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',
'.': [
-58
View File
@@ -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'));
-39
View File
@@ -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,
};
};
+1 -1
View File
@@ -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}/`;
+1 -1
View File
@@ -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);
-20
View File
@@ -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;
};
-37
View File
@@ -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,
};
};
-133
View File
@@ -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);
};
-21
View File
@@ -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}`,
})),
};
};
-23
View File
@@ -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}`,
})),
};
};
-21
View File
@@ -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}`,
})),
};
};
-25
View File
@@ -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}`,
})),
};
};
-58
View File
@@ -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,
};
};
-77
View File
@@ -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,
};
};
-37
View File
@@ -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;
})
)
),
};
};
-35
View File
@@ -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(),
};
};
-64
View File
@@ -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,
};
};
-50
View File
@@ -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(),
};
};
-60
View File
@@ -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,
};
};
-57
View File
@@ -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,
};
};
-38
View File
@@ -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(),
};
};
-46
View File
@@ -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,
};
};
-57
View File
@@ -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,
};
};
-44
View File
@@ -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,
};
};
-21
View File
@@ -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 };
};
+1 -1
View File
@@ -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);
-19
View File
@@ -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,
};
};
-27
View File
@@ -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(),
};
};
-59
View File
@@ -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,
};
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
'/files/:share_id/:parent_file_id?': ['DIYgod'],
};
-13
View File
@@ -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?',
},
],
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = (router) => {
router.get('/files/:share_id/:parent_file_id?', require('./files'));
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
'/update/:mid': ['zytomorrow'],
};
-13
View File
@@ -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}`,
},
],
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = function (router) {
router.get('/update/:mid', require('./update'));
};
-4
View File
@@ -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>
-27
View File
@@ -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),
},
],
};
};
-4
View File
@@ -1,4 +0,0 @@
module.exports = {
'/maitta': ['fengkx'],
'/radio/:id?': ['nczitzk'],
};
-32
View File
@@ -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',
};
}),
};
};
-19
View File
@@ -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?',
},
],
},
};
-73
View File
@@ -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,
};
};
-4
View File
@@ -1,4 +0,0 @@
module.exports = (router) => {
router.get('/maitta', require('./maitta'));
router.get('/radio/:id?', require('./radio'));
};
-6
View File
@@ -1,6 +0,0 @@
{{ if description }}
<p>{{ description }}</p>
{{ /if }}
{{ if audio }}
<audio controls src="{{ audio }}"></audio>
{{ /if }}
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
'/news': ['TsSmartTT'],
};
-52
View File
@@ -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,
};
};
-13
View File
@@ -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',
},
],
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = function (router) {
router.get('/news', require('./news'));
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
'/series/:mid/:sort?': ['minimalistrojan'],
};
-18
View File
@@ -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')}`;
}
},
},
],
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = (router) => {
router.get('/series/:mid/:sort?', require('./series'));
};
-42
View File
@@ -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(),
};
};
-17
View File
@@ -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 更新日志',
+8 -244
View File
@@ -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">
地区
| 台湾 | 韩国 | 大陆 |