├── logs └── .gitkeep ├── .nvmrc ├── assets ├── build │ └── .gitkeep ├── CNAME ├── 404.html └── index.html ├── lib ├── v2 │ ├── 2047 │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── 2048 │ │ ├── radar.js │ │ ├── maintainer.js │ │ ├── templates │ │ │ └── download.art │ │ └── router.js │ ├── 12306 │ │ ├── maintainer.js │ │ └── router.js │ ├── hket │ │ ├── templates │ │ │ ├── description.art │ │ │ └── image.art │ │ ├── maintainer.js │ │ └── router.js │ ├── agirls │ │ ├── templates │ │ │ └── description.art │ │ ├── maintainer.js │ │ └── router.js │ ├── eprice │ │ ├── templates │ │ │ ├── description.art │ │ │ └── image.art │ │ ├── maintainer.js │ │ └── router.js │ ├── hkepc │ │ ├── templates │ │ │ ├── description.art │ │ │ └── image.art │ │ ├── maintainer.js │ │ └── router.js │ ├── lfsyd │ │ ├── templates │ │ │ └── card.art │ │ ├── maintainer.js │ │ └── router.js │ ├── wechat │ │ ├── templates │ │ │ ├── description.art │ │ │ └── image.art │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── github │ │ └── templates │ │ │ └── comments-description.art │ ├── gov │ │ ├── guangdong │ │ │ └── tqyb │ │ │ │ └── templates │ │ │ │ ├── tfxtq.art │ │ │ │ └── sncsyjxh.art │ │ └── shanghai │ │ │ └── rsj │ │ │ └── templates │ │ │ └── ksxm.art │ ├── hkej │ │ ├── templates │ │ │ ├── description.art │ │ │ └── articleImg.art │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── mingpao │ │ ├── templates │ │ │ ├── description.art │ │ │ └── fancybox.art │ │ ├── maintainer.js │ │ └── router.js │ ├── lanqiao │ │ ├── templates │ │ │ └── courseDesc.art │ │ ├── maintainer.js │ │ ├── router.js │ │ └── utils.js │ ├── 50forum │ │ ├── maintainer.js │ │ └── router.js │ ├── getdr │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── gocn │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── oncc │ │ ├── templates │ │ │ └── article.art │ │ ├── maintainer.js │ │ └── router.js │ ├── ssm │ │ ├── templates │ │ │ └── news.art │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── yaohuo │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── yxdzqb │ │ ├── templates │ │ │ └── description.art │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── ahjzu │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── ajmide │ │ ├── maintainer.js │ │ └── router.js │ ├── bupt │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── cdi │ │ ├── maintainer.js │ │ └── router.js │ ├── ciidbnu │ │ ├── maintainer.js │ │ └── router.js │ ├── distill │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── gameapps │ │ ├── maintainer.js │ │ ├── templates │ │ │ └── description.art │ │ ├── router.js │ │ └── radar.js │ ├── hkjunkcall │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── lativ │ │ ├── maintainer.js │ │ ├── router.js │ │ ├── templates │ │ │ └── detail.art │ │ └── radar.js │ ├── news │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── orcid │ │ ├── maintainer.js │ │ ├── router.js │ │ ├── templates │ │ │ └── description.art │ │ └── radar.js │ ├── oup │ │ ├── maintainer.js │ │ ├── router.js │ │ ├── templates │ │ │ └── article.art │ │ └── radar.js │ ├── rfi │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── secnews │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── shmeea │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── szse │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── watchout │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── zhubai │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── 8world │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── audiobar │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── barronschina │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── bit │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── bnu │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── btzj │ │ ├── maintainer.js │ │ ├── router.js │ │ ├── templates │ │ │ └── torrents.art │ │ └── radar.js │ ├── cahkms │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── cbirc │ │ ├── maintainer.js │ │ └── router.js │ ├── cpcey │ │ ├── maintainer.js │ │ └── router.js │ ├── dushu │ │ ├── maintainer.js │ │ ├── router.js │ │ └── fuzhou │ │ │ └── templates │ │ │ └── message.art │ ├── ezone │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── firefox │ │ ├── maintainer.js │ │ ├── templates │ │ │ └── description.art │ │ ├── router.js │ │ └── radar.js │ ├── fisher-spb │ │ ├── maintainer.js │ │ ├── router.js │ │ ├── templates │ │ │ ├── image.art │ │ │ └── video.art │ │ └── radar.js │ ├── guduodata │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── hizu │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── hotukdeals │ │ ├── maintainer.js │ │ └── router.js │ ├── latepost │ │ ├── maintainer.js │ │ └── router.js │ ├── mox │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── mvm │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── mygopen │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── ngocn2 │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── nippon │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── pku │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── pts │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── ruc │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── shopback │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── tisi │ │ ├── maintainer.js │ │ └── router.js │ ├── topys │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── trow │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── ucas │ │ ├── maintainer.js │ │ └── router.js │ ├── zjgtjy │ │ ├── maintainer.js │ │ └── router.js │ ├── appledaily │ │ ├── maintainer.js │ │ ├── router.js │ │ └── templates │ │ │ └── content.art │ ├── baozimh │ │ ├── maintainer.js │ │ ├── templates │ │ │ └── desc.art │ │ ├── router.js │ │ └── radar.js │ ├── bendibao │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── biodiscover │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── blockbeats │ │ ├── maintainer.js │ │ └── router.js │ ├── codeforces │ │ ├── maintainer.js │ │ ├── router.js │ │ ├── templates │ │ │ └── contest.art │ │ └── radar.js │ ├── cqwu │ │ ├── maintainer.js │ │ └── router.js │ ├── csc │ │ ├── maintainer.js │ │ └── router.js │ ├── disinfo │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── focustaiwan │ │ ├── maintainer.js │ │ ├── templates │ │ │ └── article.art │ │ ├── router.js │ │ └── radar.js │ ├── gf-cn │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── informs │ │ ├── maintainer.js │ │ ├── templates │ │ │ └── content.art │ │ └── router.js │ ├── knowmedia │ │ ├── maintainer.js │ │ ├── templates │ │ │ └── desc.art │ │ └── router.js │ ├── medsci │ │ ├── maintainer.js │ │ └── router.js │ ├── mohw │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── mydrivers │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── newsmarket │ │ ├── maintainer.js │ │ └── router.js │ ├── nodejs │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── nsfc │ │ ├── maintainer.js │ │ └── router.js │ ├── odaily │ │ ├── utils.js │ │ ├── maintainer.js │ │ └── router.js │ ├── qm120 │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── storm │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── test │ │ ├── maintainer.js │ │ └── router.js │ ├── wangqiutiyu │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── wsyu │ │ ├── maintainer.js │ │ └── router.js │ ├── wyzxwk │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── wzu │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── 423down │ │ ├── maintainer.js │ │ └── router.js │ ├── acm-ecnu │ │ ├── maintainer.js │ │ ├── router.js │ │ └── templates │ │ │ └── description.art │ ├── ash-maurya │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── bse │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── ccac │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── cde │ │ ├── maintainer.js │ │ └── router.js │ ├── cntv │ │ ├── maintainer.js │ │ ├── router.js │ │ ├── templates │ │ │ └── column.art │ │ └── radar.js │ ├── filmdeepfocus │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── fortunechina │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── gamer │ │ ├── maintainer.js │ │ └── router.js │ ├── hbr │ │ ├── maintainer.js │ │ └── router.js │ ├── hex-rays │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── icac │ │ ├── maintainer.js │ │ ├── router.js │ │ ├── utils.js │ │ └── radar.js │ ├── independent │ │ ├── maintainer.js │ │ └── router.js │ ├── line │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── nikkei-asia │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── now │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── sciencedirect │ │ ├── maintainer.js │ │ └── router.js │ ├── startuplatte │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── timednews │ │ ├── maintainer.js │ │ └── router.js │ ├── uibe │ │ ├── maintainer.js │ │ └── router.js │ ├── ulapia │ │ ├── maintainer.js │ │ └── router.js │ ├── verfghbw │ │ ├── maintainer.js │ │ └── router.js │ ├── aamacau │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── abmedia │ │ ├── maintainer.js │ │ └── router.js │ ├── ccreports │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── cebbank │ │ ├── templates │ │ │ ├── allDes.art │ │ │ └── historyDes.art │ │ ├── maintainer.js │ │ └── router.js │ ├── chaoxing │ │ ├── maintainer.js │ │ ├── templates │ │ │ └── description.art │ │ └── router.js │ ├── cool18 │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── ecust-jxjy │ │ ├── maintainer.js │ │ └── router.js │ ├── eventernote │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── gamersecret │ │ ├── maintainer.js │ │ └── router.js │ ├── iresearch │ │ ├── maintainer.js │ │ ├── router.js │ │ ├── templates │ │ │ └── report.art │ │ └── radar.js │ ├── iwara │ │ ├── maintainer.js │ │ └── router.js │ ├── jisilu │ │ ├── maintainer.js │ │ └── router.js │ ├── learnku │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── nifd │ │ ├── maintainer.js │ │ └── router.js │ ├── polkaworld │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── radio-canada │ │ ├── maintainer.js │ │ └── router.js │ ├── solidot │ │ ├── maintainer.js │ │ └── router.js │ ├── swissinfo │ │ ├── maintainer.js │ │ └── router.js │ ├── bandcamp │ │ ├── templates │ │ │ └── weekly.art │ │ ├── maintainer.js │ │ └── router.js │ ├── changba │ │ ├── maintainer.js │ │ ├── router.js │ │ ├── templates │ │ │ └── work_description.art │ │ └── radar.js │ ├── producthunt │ │ ├── maintainer.js │ │ ├── router.js │ │ ├── templates │ │ │ └── descImg.art │ │ └── radar.js │ ├── taobao │ │ ├── maintainer.js │ │ ├── router.js │ │ └── templates │ │ │ └── zhongchou.art │ ├── whitehouse │ │ ├── maintainer.js │ │ └── router.js │ ├── consumer │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── e-hentai │ │ ├── templates │ │ │ └── images.art │ │ ├── router.js │ │ └── maintainer.js │ ├── logonews │ │ ├── templates │ │ │ └── description.art │ │ ├── router.js │ │ └── maintainer.js │ ├── nikkei-cn │ │ ├── maintainer.js │ │ └── router.js │ ├── eastday │ │ ├── maintainer.js │ │ └── router.js │ ├── jandan │ │ ├── maintainer.js │ │ ├── templates │ │ │ └── description.art │ │ └── router.js │ ├── jump │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── neea │ │ ├── maintainer.js │ │ └── router.js │ ├── youku │ │ ├── maintainer.js │ │ ├── router.js │ │ ├── templates │ │ │ └── channel.art │ │ └── radar.js │ ├── youzhiyouxing │ │ ├── maintainer.js │ │ └── router.js │ ├── zaker │ │ ├── router.js │ │ └── maintainer.js │ ├── ddosi │ │ ├── maintainer.js │ │ └── router.js │ ├── hackernews │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── houxu │ │ ├── maintainer.js │ │ ├── router.js │ │ └── templates │ │ │ └── description.art │ ├── kemono │ │ ├── maintainer.js │ │ ├── router.js │ │ └── radar.js │ ├── stcn │ │ ├── router.js │ │ └── maintainer.js │ ├── app-center │ │ ├── maintainer.js │ │ └── router.js │ ├── disinformationindex │ │ ├── maintainer.js │ │ ├── router.js │ │ └── templates │ │ │ └── description.art │ ├── epicgames │ │ ├── router.js │ │ └── maintainer.js │ ├── ff14 │ │ ├── templates │ │ │ └── description.art │ │ ├── maintainer.js │ │ └── router.js │ ├── hotchina │ │ ├── router.js │ │ └── maintainer.js │ ├── ruancan │ │ ├── router.js │ │ └── maintainer.js │ ├── subhd │ │ ├── router.js │ │ └── maintainer.js │ ├── ustb │ │ ├── router.js │ │ └── radar.js │ ├── whoscall │ │ ├── router.js │ │ └── maintainer.js │ ├── bioone │ │ ├── maintainer.js │ │ └── router.js │ ├── literotica │ │ ├── maintainer.js │ │ └── router.js │ ├── nogizaka46 │ │ ├── maintainer.js │ │ └── router.js │ ├── rsshub │ │ ├── maintainer.js │ │ └── router.js │ ├── xiaoyuzhou │ │ ├── maintainer.js │ │ └── router.js │ ├── furstar │ │ ├── templates │ │ │ ├── description.art │ │ │ └── author.art │ │ ├── maintainer.js │ │ └── router.js │ ├── jasa │ │ ├── maintainer.js │ │ ├── router.js │ │ └── templates │ │ │ └── description.art │ ├── cnki │ │ ├── maintainer.js │ │ ├── templates │ │ │ └── desc.art │ │ └── router.js │ ├── qidiantu │ │ ├── router.js │ │ └── maintainer.js │ ├── douban │ │ └── templates │ │ │ └── explore.art │ ├── ft │ │ ├── maintainer.js │ │ ├── router.js │ │ └── channel.js │ ├── hongkong │ │ ├── maintainer.js │ │ └── router.js │ ├── cnbeta │ │ ├── maintainer.js │ │ └── router.js │ ├── dockerhub │ │ ├── maintainer.js │ │ ├── router.js │ │ └── utils.js │ ├── lkong │ │ ├── maintainer.js │ │ └── router.js │ ├── qq │ │ ├── maintainer.js │ │ ├── router.js │ │ └── ac │ │ │ └── templates │ │ │ └── description.art │ ├── elsevier │ │ ├── maintainer.js │ │ ├── router.js │ │ └── templates │ │ │ └── description.art │ ├── sicau │ │ ├── maintainer.js │ │ └── router.js │ ├── wenku8 │ │ ├── maintainer.js │ │ └── router.js │ ├── atcoder │ │ ├── maintainer.js │ │ └── router.js │ ├── wallstreetcn │ │ ├── maintainer.js │ │ └── router.js │ ├── leiphone │ │ ├── maintainer.js │ │ └── router.js │ ├── wallhaven │ │ ├── maintainer.js │ │ └── router.js │ ├── xaut │ │ ├── maintainer.js │ │ └── router.js │ ├── swpu │ │ ├── maintainer.js │ │ └── router.js │ ├── ieee │ │ ├── maintainer.js │ │ ├── router.js │ │ └── templates │ │ │ └── description.art │ ├── netease │ │ ├── maintainer.js │ │ └── router.js │ ├── ithome │ │ ├── maintainer.js │ │ └── router.js │ ├── panewslab │ │ ├── maintainer.js │ │ └── router.js │ ├── telegram │ │ ├── maintainer.js │ │ ├── templates │ │ │ └── video.art │ │ └── router.js │ ├── people │ │ ├── maintainer.js │ │ └── router.js │ ├── zaobao │ │ ├── maintainer.js │ │ └── router.js │ ├── nju │ │ ├── maintainer.js │ │ └── router.js │ ├── spotify │ │ ├── maintainer.js │ │ └── router.js │ ├── 18comic │ │ ├── maintainer.js │ │ └── router.js │ ├── google │ │ ├── maintainer.js │ │ └── router.js │ ├── heu │ │ └── maintainer.js │ ├── javlibrary │ │ ├── templates │ │ │ └── description.art │ │ ├── update.js │ │ └── newentries.js │ └── javdb │ │ └── rankings.js ├── favicon.png ├── errors │ ├── index.js │ └── RequestInProgress.js ├── routes │ ├── micmicidol │ │ ├── latest.js │ │ └── search.js │ ├── 8kcos │ │ └── const.js │ ├── javbus │ │ ├── home.js │ │ ├── western │ │ │ ├── home.js │ │ │ ├── genre.js │ │ │ ├── star.js │ │ │ └── series.js │ │ ├── uncensored │ │ │ ├── home.js │ │ │ ├── genre.js │ │ │ ├── star.js │ │ │ └── series.js │ │ ├── star.js │ │ ├── genre.js │ │ └── series.js │ ├── titsguru │ │ ├── home.js │ │ ├── daily.js │ │ └── category.js │ ├── ruby-china │ │ └── constants.js │ ├── mcbbs │ │ └── utils.js │ ├── dapenti │ │ ├── tugua.js │ │ └── subject.js │ ├── mind42 │ │ ├── tag.js │ │ ├── search.js │ │ └── index.js │ ├── allnow │ │ ├── index.js │ │ ├── tag.js │ │ ├── column.js │ │ └── user.js │ ├── xiachufang │ │ ├── popular.js │ │ └── user │ │ │ ├── cooked.js │ │ │ └── created.js │ ├── sobooks │ │ ├── tag.js │ │ ├── index.js │ │ └── date.js │ ├── gameres │ │ ├── hot.js │ │ └── list.js │ ├── pixiv │ │ └── constants.js │ ├── twitter │ │ ├── media.js │ │ ├── user.js │ │ └── keyword.js │ ├── 95mm │ │ ├── tag.js │ │ └── tab.js │ ├── dongqiudi │ │ ├── player_news.js │ │ └── team_news.js │ ├── dribbble │ │ ├── user.js │ │ ├── keyword.js │ │ └── popular.js │ ├── amazfitwatchfaces │ │ ├── fresh.js │ │ ├── search.js │ │ └── updated.js │ ├── 199it │ │ ├── tag.js │ │ └── category.js │ ├── letterboxd │ │ ├── userdiary.js │ │ └── followingdiary.js │ ├── fanbox │ │ └── header.js │ ├── grubstreet │ │ └── index.js │ ├── ncm │ │ └── templates │ │ │ └── djradio-content.art │ └── bilibili │ │ └── utils.js ├── utils │ ├── render.js │ ├── wait.js │ ├── md5.js │ ├── common-utils.js │ └── rss-parser.js ├── middleware │ └── api-template.js └── protected_router.js ├── .codecov.yml ├── Procfile ├── test ├── .eslintrc └── utils │ ├── md5.js │ ├── common-utils.js │ └── wait.js ├── docs ├── .vuepress │ ├── styles │ │ └── palette.styl │ └── public │ │ ├── _headers │ │ ├── logo.png │ │ ├── readable-douban.png │ │ ├── readable-weibo.png │ │ ├── apple-touch-icon.png │ │ ├── readable-twitter.png │ │ ├── android-chrome-192x192.png │ │ └── android-chrome-384x384.png ├── en │ ├── live.md │ └── joinus │ │ └── use-cache.md ├── joinus │ └── use-cache.md └── .format │ └── file.js ├── .github ├── ISSUE_TEMPLATE │ └── config.yml └── FUNDING.yml ├── scripts ├── ansible │ ├── try.sh │ ├── rsshub.Caddyfile │ ├── rsshub.env │ ├── Vagrantfile │ └── rsshub.service └── workflow │ └── build-radar.js ├── .eslintignore ├── .prettierignore ├── .prettierrc ├── CONTRIBUTING.md ├── now.json ├── jsconfig.json ├── process.json ├── .gitignore ├── SECURITY.md ├── api └── now.js └── .dockerignore /logs/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | lts/* 2 | -------------------------------------------------------------------------------- /assets/build/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/v2/2048/radar.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/CNAME: -------------------------------------------------------------------------------- 1 | rsshub.js.org -------------------------------------------------------------------------------- /.codecov.yml: -------------------------------------------------------------------------------- 1 | comment: off 2 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: node lib/index.js 2 | -------------------------------------------------------------------------------- /test/.eslintrc: -------------------------------------------------------------------------------- 1 | env: 2 | jest: true 3 | -------------------------------------------------------------------------------- /lib/v2/hket/templates/description.art: -------------------------------------------------------------------------------- 1 | {{@ desc }} 2 | -------------------------------------------------------------------------------- /lib/v2/agirls/templates/description.art: -------------------------------------------------------------------------------- 1 | {{@ desc }} 2 | -------------------------------------------------------------------------------- /lib/v2/eprice/templates/description.art: -------------------------------------------------------------------------------- 1 | {{@ desc }} 2 | -------------------------------------------------------------------------------- /lib/v2/hkepc/templates/description.art: -------------------------------------------------------------------------------- 1 | {{@ desc }} 2 | -------------------------------------------------------------------------------- /lib/v2/lfsyd/templates/card.art: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/v2/wechat/templates/description.art: -------------------------------------------------------------------------------- 1 | {{@ desc }} 2 | -------------------------------------------------------------------------------- /docs/.vuepress/styles/palette.styl: -------------------------------------------------------------------------------- 1 | $accentColor = #F5712C 2 | -------------------------------------------------------------------------------- /lib/v2/wechat/templates/image.art: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /lib/v2/github/templates/comments-description.art: -------------------------------------------------------------------------------- 1 | {{@ desc }} 2 | -------------------------------------------------------------------------------- /docs/en/live.md: -------------------------------------------------------------------------------- 1 | --- 2 | pageClass: routes 3 | --- 4 | 5 | # Live 6 | -------------------------------------------------------------------------------- /lib/v2/gov/guangdong/tqyb/templates/tfxtq.art: -------------------------------------------------------------------------------- 1 |

{{ content }}

2 | -------------------------------------------------------------------------------- /lib/v2/hkej/templates/description.art: -------------------------------------------------------------------------------- 1 | {{@ pics }} 2 | {{@ desc }} 3 | -------------------------------------------------------------------------------- /lib/v2/mingpao/templates/description.art: -------------------------------------------------------------------------------- 1 | {{@ pics }} 2 | {{@ desc }} 3 | -------------------------------------------------------------------------------- /docs/.vuepress/public/_headers: -------------------------------------------------------------------------------- 1 | /* 2 | cache-control: public, max-age=60 3 | -------------------------------------------------------------------------------- /lib/v2/hkepc/templates/image.art: -------------------------------------------------------------------------------- 1 | {{ alt }} 2 | -------------------------------------------------------------------------------- /lib/v2/lanqiao/templates/courseDesc.art: -------------------------------------------------------------------------------- 1 |
{{ desc }} -------------------------------------------------------------------------------- /lib/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aliuq/RSSHub/master/lib/favicon.png -------------------------------------------------------------------------------- /lib/v2/50forum/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/': ['sddiky'], 3 | }; 4 | -------------------------------------------------------------------------------- /lib/v2/getdr/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/': ['nczitzk'], 3 | }; 4 | -------------------------------------------------------------------------------- /lib/v2/gocn/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/': ['AtlanCI'], 3 | }; 4 | -------------------------------------------------------------------------------- /lib/v2/oncc/templates/article.art: -------------------------------------------------------------------------------- 1 | 2 | {{ content }} 3 | -------------------------------------------------------------------------------- /lib/v2/ssm/templates/news.art: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /lib/v2/sicau/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/dky/:category?': ['nczitzk'], 3 | '/yan/:category?': ['nczitzk'], 4 | '/zsjy/:category?': ['nczitzk'], 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/wenku8/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/:category?': ['Fatpandac'], 3 | '/volume/:id': ['huangliangshusheng'], 4 | '/chapter/:id': ['zsakvo'], 5 | }; 6 | -------------------------------------------------------------------------------- /docs/joinus/use-cache.md: -------------------------------------------------------------------------------- 1 | # 使用缓存 2 | 3 | 部分 RSS 在生成时需要访问数个页面,这些页面同时并不是很可能经常变化。出于减轻对方服务器压力和节约不必要流量 / 算力的考虑,这种情况下应当使用缓存。下面是关于缓存工具类的使用场景和具体介绍 4 | 5 | 6 | -------------------------------------------------------------------------------- /lib/routes/dapenti/tugua.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | ctx.state.data = await utils.parseFeed({ subjectid: 70 }); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/routes/mind42/tag.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | ctx.state.data = await utils(ctx, `tag/${ctx.params.id}`); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/abmedia/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/index', require('./index')); 3 | router.get('/:category?', require('./category')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/atcoder/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/post/:language?/:keyword?': ['nczitzk'], 3 | '/contest/:language?/:rated?/:category?/:keyword?': ['nczitzk'], 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/ddosi/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/category/:category?', require('./category')); 3 | router.get('/', require('./index')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/disinformationindex/router.js: -------------------------------------------------------------------------------- 1 | module.exports = (router) => { 2 | router.get('/blog', require('./blog')); 3 | router.get('/research', require('./research')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/jasa/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/latest', require('./latest')); 3 | router.get('/section/:id', require('./section')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/lanqiao/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/author/:uid': ['huhuhang'], 3 | '/courses/:sort/:tag': ['huhuhang'], 4 | '/questions/:id': ['huhuhang'], 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/wallstreetcn/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/live/:category?': ['nczitzk'], 3 | '/news/:category?': ['nczitzk'], 4 | '/:category?': ['nczitzk'], 5 | }; 6 | -------------------------------------------------------------------------------- /now.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "routes": [ 4 | { "src": "/api/.*", "dest": "/api/now.js" }, 5 | { "src": "/.*", "dest": "/api/now.js" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /lib/routes/allnow/index.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | ctx.state.data = await utils.processItems(ctx, utils.rootUrl); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/ft/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/myft/:key', require('./myft')); 3 | router.get('/:language/:channel?', require('./channel')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/literotica/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/new', require('./new')); 3 | router.get('/category/:category', require('./category')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/routes/mind42/search.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | ctx.state.data = await utils(ctx, `search?q=${ctx.params.keyword}`); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/12306/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/:date/:from/:to/:type?', require('./index')); 3 | router.get('/zxdt/:id?', require('./zxdt')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/bioone/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/featured', require('./featured')); 3 | router.get('/journals/:journal?', require('./journal')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/disinformationindex/templates/description.art: -------------------------------------------------------------------------------- 1 | {{ if image }} 2 |
3 | {{ /if }} 4 | {{ if title }} 5 | {{@ title }} 6 | {{ /if }} 7 | {{@ links }} 8 | -------------------------------------------------------------------------------- /lib/v2/furstar/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/characters/:lang?': ['NeverBehave'], 3 | '/artists/:lang?': ['NeverBehave'], 4 | '/archive/:lang?': ['NeverBehave'], 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/gov/guangdong/tqyb/templates/sncsyjxh.art: -------------------------------------------------------------------------------- 1 | 地区: {{ item.cname }} 2 |
3 | 等级: {{ item.sigtypename }} 4 |
5 | 发布时间:{{ item.datetime }} 6 | -------------------------------------------------------------------------------- /lib/v2/leiphone/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/leiphone': ['vlcheng'], 3 | '/leiphone/category/:catname': ['vlcheng'], 4 | '/leiphone/newsflash': ['vlcheng'], 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/leiphone/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/newsflash', require('./newsflash')); 3 | router.get('/:do?/:keyword?', require('./index')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/lkong/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/forum/:id?/:digest?', require('./forum')); 3 | router.get('/thread/:id', require('./thread')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/odaily/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/activity': ['nczitzk'], 3 | '/newsflash': ['nczitzk'], 4 | '/user/:id': ['nczitzk'], 5 | '/:id?': ['nczitzk'], 6 | }; 7 | -------------------------------------------------------------------------------- /lib/v2/wallhaven/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/search/:filter?/:needDetails?': ['nczitzk', 'Fatpandac'], 3 | '/:filter?/:needDetails?': ['nczitzk', 'Fatpandac'], 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/xaut/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/index/:category?': ['mocusez'], 3 | '/jwc/:category?': ['mocusez'], 4 | '/rsc/:category?': ['mocusez', 'light0926'], 5 | }; 6 | -------------------------------------------------------------------------------- /lib/routes/dapenti/subject.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | ctx.state.data = await utils.parseFeed({ subjectid: ctx.params.id }); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/cebbank/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/quotation/all', require('./all')); 3 | router.get('/quotation/history/:type', require('./history')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/cnki/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/journals/:name', require('./journals')); 3 | router.get('/journals/debut/:name', require('./debut')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/elsevier/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/:journal/latest', require('./latest')); 3 | router.get('/:journal/vol/:id', require('./volume')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/hkej/templates/articleImg.art: -------------------------------------------------------------------------------- 1 | {{ each pics }} 2 |
{{ $value.title }}
{{ $value.title }}
3 | {{ /each }} 4 | -------------------------------------------------------------------------------- /lib/v2/hongkong/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/dh/:language?', require('./dh')); 3 | router.get('/chp/:category?/:language?', require('./chp')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/mingpao/templates/fancybox.art: -------------------------------------------------------------------------------- 1 | {{ each pics }} 2 |
{{ $value.title }}
{{ $value.title }}
3 | {{ /each }} 4 | -------------------------------------------------------------------------------- /lib/v2/stcn/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/data/:id?': ['nczitzk'], 3 | '/kuaixun/:id?': ['nczitzk'], 4 | '/stock/:id?': ['nczitzk'], 5 | '/:id?': ['nczitzk'], 6 | }; 7 | -------------------------------------------------------------------------------- /lib/v2/swpu/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/bgw/:code': ['CYTMWIA'], 3 | '/dean/:code': ['CYTMWIA'], 4 | '/dxy/:code': ['CYTMWIA'], 5 | '/scs/:code': ['CYTMWIA'], 6 | }; 7 | -------------------------------------------------------------------------------- /lib/v2/ulapia/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/reports/:category?', require('./index')); 3 | router.get('/research/latest', require('./research')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/ieee/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/:journal/latest/date/:sortType?': ['Derekmini', 'auto-bot-ty'], 3 | '/:journal/latest/vol/:sortType?': ['Derekmini', 'auto-bot-ty'], 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/netease/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/renjian/:category?': ['nczitzk'], 3 | '/today/:need_content?': ['nczitzk'], 4 | '/news/rank/:category?/:type?/:time?': ['nczitzk'], 5 | }; 6 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "@/*": ["./lib/*"] 6 | } 7 | }, 8 | "include": ["./lib/**/*"] 9 | } 10 | -------------------------------------------------------------------------------- /lib/routes/xiachufang/popular.js: -------------------------------------------------------------------------------- 1 | const { generatePopularData } = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | ctx.state.data = await generatePopularData(ctx.params.timeframe); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/dockerhub/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/build/:owner/:image/:tag?', require('./build')); 3 | router.get('/tag/:owner/:image/:limits?', require('./tag')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/ithome/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/ranking/:type': ['immmortal', 'luyuhuang'], 3 | '/tag/:name': ['Fatpandac'], 4 | '/zt/:id': ['nczitzk'], 5 | '/:caty': ['luyuhuang'], 6 | }; 7 | -------------------------------------------------------------------------------- /lib/v2/panewslab/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/column/:id': ['nczitzk'], 3 | '/newsflash/:language?': ['nczitzk'], 4 | '/topic/:id': ['nczitzk'], 5 | '/:category?': ['nczitzk'], 6 | }; 7 | -------------------------------------------------------------------------------- /lib/v2/telegram/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/telegram/channel/:username/:searchQuery?': ['DIYgod'], 3 | '/telegram/stickerpack/:name': ['DIYgod'], 4 | '/telegram/blog': ['fengkx'], 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/telegram/templates/video.art: -------------------------------------------------------------------------------- 1 | {{ if source }} 2 | 3 | {{ else }} 4 | Media is too big 5 | {{ /if }} 6 | -------------------------------------------------------------------------------- /lib/v2/wallhaven/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/search/:filter?/:needDetails?', require('./index')); 3 | router.get('/:filter?/:needDetails?', require('./index')); 4 | }; 5 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | github: DIYgod 3 | patreon: DIYgod 4 | custom: ['https://afdian.net/@diygod', 'https://diygod.me/images/zfb.jpg', 'https://diygod.me/images/wx.jpg'] 5 | -------------------------------------------------------------------------------- /lib/routes/sobooks/tag.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const id = ctx.params.id || '小说'; 5 | 6 | ctx.state.data = await utils(ctx, `books/tag/${id}`); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/iresearch/templates/report.art: -------------------------------------------------------------------------------- 1 | {{@ data.Content }} 2 | <% for (let i = 1; i <= data.PagesCount; i++){ %> 3 | 4 | <% } %> 5 | 6 | -------------------------------------------------------------------------------- /lib/v2/lfsyd/maintainer.js: -------------------------------------------------------------------------------- 1 | // 旅法师营地 2 | module.exports = { 3 | '/home': ['auto-bot-ty'], 4 | '/old_home': ['auto-bot-ty'], 5 | '/user/:id?': ['auto-bot-ty'], 6 | '/tag/:tagId?': ['auto-bot-ty'], 7 | }; 8 | -------------------------------------------------------------------------------- /lib/routes/sobooks/index.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const category = ctx.params.category || ''; 5 | 6 | ctx.state.data = await utils(ctx, category); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/bandcamp/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/tag/:tag?', require('./tag')); 3 | router.get('/live', require('./live')); 4 | router.get('/weekly', require('./weekly')); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/gov/shanghai/rsj/templates/ksxm.art: -------------------------------------------------------------------------------- 1 | 考试项目名称:{{ name }} 2 |
3 | 考试类别:{{ type }} 4 |
5 | 考试日期:{{ date }} 6 |
7 | 报名起止日期:{{ registrationDeadline }} 8 | -------------------------------------------------------------------------------- /lib/v2/people/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/cpc/24h': ['nczitzk'], 3 | '/liuyan/:id/:state?': ['nczitzk'], 4 | '/xjpjh/:keyword?/:year': ['LogicJake'], 5 | '/:site?/:category?': ['nczitzk'], 6 | }; 7 | -------------------------------------------------------------------------------- /lib/v2/ruancan/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/ruancan': ['nczitzk'], 3 | '/ruancan/sort/:sort?': ['nczitzk'], 4 | '/ruancan/tag/:tag': ['nczitzk'], 5 | '/ruancan/search/:keyword?': ['nczitzk'], 6 | }; 7 | -------------------------------------------------------------------------------- /lib/v2/youku/templates/channel.art: -------------------------------------------------------------------------------- 1 | {{ if embed }} 2 | 3 | {{ /if }} 4 |
5 | 6 | -------------------------------------------------------------------------------- /lib/v2/zaobao/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/interactive-graphics': ['shunf4'], 3 | '/realtime/:section?': ['shunf4'], 4 | '/znews/:section?': ['shunf4'], 5 | '/:type/:section': ['shunf4'], 6 | }; 7 | -------------------------------------------------------------------------------- /test/utils/md5.js: -------------------------------------------------------------------------------- 1 | const md5 = require('../../lib/utils/md5'); 2 | 3 | describe('md5', () => { 4 | it('md5 RSSHub', () => { 5 | expect(md5('RSSHub')).toBe('3187d745ec5983413e4f0dce3900d92d'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /lib/routes/mind42/index.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const currentUrl = ctx.params.caty || 'mindmaps'; 5 | 6 | ctx.state.data = await utils(ctx, currentUrl); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/furstar/templates/author.art: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{ if link !== null }} 4 | {{name}} 5 | {{ else }} 6 | {{name}} 7 | {{ /if }} 8 |
-------------------------------------------------------------------------------- /lib/v2/ieee/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/:journal/latest/date/:sortType?', require('./latestdate')); 3 | router.get('/:journal/latest/vol/:sortType?', require('./latestvol')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/v2/taobao/templates/zhongchou.art: -------------------------------------------------------------------------------- 1 |

2 | 达成率: {{item.finish_per}}%
3 | 已筹金额: {{item.curr_money}}元
4 | 支持人数: {{item.buy_amount}}
5 | -------------------------------------------------------------------------------- /lib/routes/allnow/tag.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const id = ctx.params.id; 5 | 6 | ctx.state.data = await utils.processItems(ctx, `${utils.rootUrl}/tag/${id}`); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/routes/gameres/hot.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const rootUrl = 'https://www.gameres.com'; 5 | 6 | ctx.state.data = await utils(ctx, rootUrl, '.hot-item h3'); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/atcoder/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/post/:language?/:keyword?', require('./post')); 3 | router.get('/contest/:language?/:rated?/:category?/:keyword?', require('./contest')); 4 | }; 5 | -------------------------------------------------------------------------------- /lib/routes/allnow/column.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const id = ctx.params.id; 5 | 6 | ctx.state.data = await utils.processItems(ctx, `${utils.rootUrl}/column/${id}`); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/routes/allnow/user.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const id = ctx.params.id; 5 | 6 | ctx.state.data = await utils.processItems(ctx, `${utils.rootUrl}/user/${id}`); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/routes/javbus/star.js: -------------------------------------------------------------------------------- 1 | const { getPage } = require('./util'); 2 | 3 | module.exports = async (ctx) => { 4 | const { sid } = ctx.params; 5 | 6 | ctx.state.data = await getPage(`https://www.javbus.com/star/${sid}`, ctx); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/agirls/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/topic/:topic', require('./topic')); 3 | router.get('/topic_list', require('./topic_list')); 4 | router.get('/:category?', require('./index')); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/nju/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/jw/:type': ['ret-1'], 3 | '/gra': ['ret-1'], 4 | '/rczp/:type': ['ret-1'], 5 | '/scit/:type': ['ret-1'], 6 | '/zcc': ['ret-1'], 7 | '/zbb/:type': ['ret-1'], 8 | }; 9 | -------------------------------------------------------------------------------- /lib/v2/rsshub/router.js: -------------------------------------------------------------------------------- 1 | module.exports = (router) => { 2 | router.get('/rss', require('./routes')); // 弃用 3 | 4 | router.get('/routes/:lang?', require('./routes')); 5 | router.get('/sponsors', require('./sponsors')); 6 | }; 7 | -------------------------------------------------------------------------------- /lib/v2/sicau/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/dky/:category?', require('./dky')); 3 | router.get('/yan/:category?', require('./yan')); 4 | router.get('/zsjy/:category?', require('./zsjy')); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/wenku8/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/chapter/:id', require('./chapter')); 3 | router.get('/volume/:id', require('./volume')); 4 | router.get('/:category?', require('./index')); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/routes/javbus/genre.js: -------------------------------------------------------------------------------- 1 | const { getPage } = require('./util'); 2 | 3 | module.exports = async (ctx) => { 4 | const { gid } = ctx.params; 5 | 6 | ctx.state.data = await getPage(`https://www.javbus.com/genre/${gid}`, ctx); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/logonews/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/work/tags/:tag', require('./index')); 3 | router.get('/tag/:tag', require('./index')); 4 | router.get(/([\w|\d|/|-]+)?/, require('./index')); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/qq/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/ac/comic/:id?', require('./ac/comic')); 3 | router.get('/ac/rank/:type?/:time?', require('./ac/rank')); 4 | router.get('/live/:id', require('./live')); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/xaut/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/index/:category?', require('./index')); 3 | router.get('/jwc/:category?', require('./jwc')); 4 | router.get('/rsc/:category?', require('./rsc')); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/routes/javbus/western/genre.js: -------------------------------------------------------------------------------- 1 | const { getPage } = require('../util'); 2 | 3 | module.exports = async (ctx) => { 4 | const { gid } = ctx.params; 5 | 6 | ctx.state.data = await getPage(`https://www.javbus.one/genre/${gid}`, ctx); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/routes/javbus/western/star.js: -------------------------------------------------------------------------------- 1 | const { getPage } = require('../util'); 2 | 3 | module.exports = async (ctx) => { 4 | const { sid } = ctx.params; 5 | 6 | ctx.state.data = await getPage(`https://www.javbus.one/star/${sid}`, ctx); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/wallstreetcn/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/live/:category?', require('./live')); 3 | router.get('/news/:category?', require('./news')); 4 | router.get('/:category?', require('./news')); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/routes/javbus/series.js: -------------------------------------------------------------------------------- 1 | const { getPage } = require('./util'); 2 | 3 | module.exports = async (ctx) => { 4 | const { seriesid } = ctx.params; 5 | 6 | ctx.state.data = await getPage(`https://www.javbus.com/series/${seriesid}`, ctx); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/furstar/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/characters/:lang?', require('./index')); 3 | router.get('/artists/:lang?', require('./artists')); 4 | router.get('/archive/:lang?', require('./archive')); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/lanqiao/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/author/:uid', require('./author')); 3 | router.get('/courses/:sort/:tag', require('./courses')); 4 | router.get('/questions/:id', require('./questions')); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/spotify/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/artist/:id': ['outloudvi'], 3 | '/playlist/:id': ['outloudvi'], 4 | '/saved/:limit?': ['outloudvi'], 5 | '/top/tracks': ['outloudvi'], 6 | '/top/artists': ['outloudvi'], 7 | }; 8 | -------------------------------------------------------------------------------- /lib/routes/javbus/uncensored/genre.js: -------------------------------------------------------------------------------- 1 | const { getPage } = require('../util'); 2 | 3 | module.exports = async (ctx) => { 4 | const { gid } = ctx.params; 5 | ctx.state.data = await getPage(`https://www.javbus.com/uncensored/genre/${gid}`, ctx); 6 | }; 7 | -------------------------------------------------------------------------------- /lib/routes/xiachufang/user/cooked.js: -------------------------------------------------------------------------------- 1 | const { generateUserData } = require('../utils'); 2 | 3 | module.exports = async (ctx) => { 4 | ctx.state.data = await generateUserData({ 5 | id: ctx.params.id, 6 | path: 'cooked', 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /lib/routes/xiachufang/user/created.js: -------------------------------------------------------------------------------- 1 | const { generateUserData } = require('../utils'); 2 | 3 | module.exports = async (ctx) => { 4 | ctx.state.data = await generateUserData({ 5 | id: ctx.params.id, 6 | path: 'created', 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /lib/routes/javbus/uncensored/star.js: -------------------------------------------------------------------------------- 1 | const { getPage } = require('../util'); 2 | 3 | module.exports = async (ctx) => { 4 | const { sid } = ctx.params; 5 | 6 | ctx.state.data = await getPage(`https://www.javbus.com/uncensored/star/${sid}`, ctx); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/routes/javbus/western/series.js: -------------------------------------------------------------------------------- 1 | const { getPage } = require('../util'); 2 | 3 | module.exports = async (ctx) => { 4 | const { seriesid } = ctx.params; 5 | 6 | ctx.state.data = await getPage(`https://www.javbus.one/series/${seriesid}`, ctx); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/routes/pixiv/constants.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | maskHeader: { 3 | 'App-OS': 'ios', 4 | 'App-OS-Version': '10.3.1', 5 | 'App-Version': '6.7.1', 6 | 'User-Agent': 'PixivIOSApp/6.7.1 (iOS 10.3.1; iPhone8,1)', 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /lib/routes/twitter/media.js: -------------------------------------------------------------------------------- 1 | // const config = require('@/config').value; 2 | // const devApiImpl = require('./developer-api/user'); 3 | const webApiImpl = require('./web-api/media'); 4 | 5 | module.exports = async (ctx) => { 6 | await webApiImpl(ctx); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/e-hentai/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/category/:category?/:needTorrents?/:needImages?': ['nczitzk'], 3 | '/tag/:tag?/:needTorrents?/:needImages?': ['nczitzk'], 4 | '/search/:keyword?/:needTorrents?/:needImages?': ['nczitzk'], 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/telegram/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/channel/:username/:searchQuery?', require('./channel')); 3 | router.get('/stickerpack/:name', require('./stickerpack')); 4 | router.get('/blog', require('./blog')); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/routes/95mm/tag.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const rootUrl = `https://www.95mm.net/tag-${ctx.params.tag}/page-1/index.html`; 5 | 6 | ctx.state.data = await utils(ctx, ctx.params.tag, rootUrl); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/routes/micmicidol/search.js: -------------------------------------------------------------------------------- 1 | const parse = require('./parse'); 2 | 3 | module.exports = (ctx) => { 4 | const max = ctx.query.limit || 50; 5 | const { label } = ctx.params; 6 | return parse(ctx, `search/label/${label}?max-results=${max}`, label); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/18comic/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/album/:id': ['nczitzk'], 3 | '/blogs/:category?': ['nczitzk'], 4 | '/search/:option?/:category?/:time?/:order?/:keyword?': ['nczitzk'], 5 | '/:category?/:time?/:order?/:keyword?': ['nczitzk'], 6 | }; 7 | -------------------------------------------------------------------------------- /lib/v2/houxu/templates/description.art: -------------------------------------------------------------------------------- 1 |
2 |

3 | {{ title }} 4 |

5 |

{{ description }}

6 | 来源 {{ author }} 7 |
8 | 时间 {{ pubDate }} 9 |
-------------------------------------------------------------------------------- /scripts/ansible/Vagrantfile: -------------------------------------------------------------------------------- 1 | Vagrant.configure("2") do |config| 2 | config.vm.box = "generic/ubuntu2004" 3 | config.vm.synced_folder ".", "/vagrant", type: "rsync", rsync__exclude: ".git/" 4 | config.ssh.extra_args = ["-t", "cd /vagrant; bash --login"] 5 | end 6 | -------------------------------------------------------------------------------- /lib/routes/javbus/uncensored/series.js: -------------------------------------------------------------------------------- 1 | const { getPage } = require('../util'); 2 | 3 | module.exports = async (ctx) => { 4 | const { seriesid } = ctx.params; 5 | 6 | ctx.state.data = await getPage(`https://www.javbus.com/uncensored/series/${seriesid}`, ctx); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/ithome/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/ranking/:type', require('./ranking')); 3 | router.get('/tag/:name', require('./tag')); 4 | router.get('/zt/:id', require('./zt')); 5 | router.get('/:caty', require('./index')); 6 | }; 7 | -------------------------------------------------------------------------------- /lib/v2/lfsyd/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/home', require('./home')); 3 | router.get('/old_home', require('./old_home')); 4 | router.get('/user/:id?', require('./user')); 5 | router.get('/tag/:tagId?', require('./tag')); 6 | }; 7 | -------------------------------------------------------------------------------- /lib/v2/netease/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/renjian/:category?', require('./renjian')); 3 | router.get('/today/:need_content?', require('./today')); 4 | router.get('/news/rank/:category?/:type?/:time?', require('./rank')); 5 | }; 6 | -------------------------------------------------------------------------------- /lib/v2/swpu/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/bgw/:code', require('./bgw')); 3 | router.get('/dean/:code', require('./dean')); 4 | router.get('/dxy/:code', require('./dxy')); 5 | router.get('/scs/:code', require('./scs')); 6 | }; 7 | -------------------------------------------------------------------------------- /lib/routes/dongqiudi/player_news.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const id = ctx.params.id; 5 | const link = `https://www.dongqiudi.com/player/${id}.html`; 6 | 7 | await utils.ProcessFeed(ctx, link, 'player'); 8 | }; 9 | -------------------------------------------------------------------------------- /lib/routes/dongqiudi/team_news.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const team = ctx.params.team; 5 | const link = `https://www.dongqiudi.com/team/${team}.html`; 6 | 7 | await utils.ProcessFeed(ctx, link, 'team'); 8 | }; 9 | -------------------------------------------------------------------------------- /lib/v2/google/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/album/:id': ['hoilc'], 3 | '/citations/:id': ['KellyHwong'], 4 | '/doodles/:language?': ['xyqfer'], 5 | '/fonts/:sort?': ['Fatpandac'], 6 | '/scholar/:query': ['HenryQW'], 7 | '/sites/:id': ['hoilc'], 8 | }; 9 | -------------------------------------------------------------------------------- /lib/v2/odaily/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/activity', require('./activity')); 3 | router.get('/newsflash', require('./newsflash')); 4 | router.get('/user/:id', require('./user')); 5 | router.get('/:id?', require('./post')); 6 | }; 7 | -------------------------------------------------------------------------------- /lib/routes/titsguru/category.js: -------------------------------------------------------------------------------- 1 | const { getPage, normalizeKeyword } = require('./util'); 2 | 3 | module.exports = async (ctx) => { 4 | const { type } = ctx.params; 5 | 6 | ctx.state.data = await getPage(`https://tits-guru.com/category/${normalizeKeyword(type)}/date`); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/appledaily/templates/content.art: -------------------------------------------------------------------------------- 1 | {{ each content_elements }} 2 | {{ if $value.type === 'image' }} 3 | {{ $value.caption }} 4 | {{ else if $value.type === 'text' }} 5 |

{{ $value.content }}

6 | {{ /if }} 7 | {{ /each }} 8 | -------------------------------------------------------------------------------- /lib/v2/codeforces/templates/contest.art: -------------------------------------------------------------------------------- 1 | 比赛:{{ title }} 2 |
3 | 开始时间:{{ startTime }} 4 |
5 | 持续时间:{{ durationTime }} 分钟 6 |
7 | 相对时间:{{ relativeTime }} 分钟 8 |
9 | 比赛类型:{{ type }} 10 |
11 | 12 | -------------------------------------------------------------------------------- /lib/v2/logonews/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/work/tags/:tag': ['nczitzk'], 3 | '/work/categorys/:category': ['nczitzk'], 4 | '/work': ['nczitzk'], 5 | '/category/:category/:type': ['nczitzk'], 6 | '/tag/:tag': ['nczitzk'], 7 | '/': ['nczitzk'], 8 | }; 9 | -------------------------------------------------------------------------------- /test/utils/common-utils.js: -------------------------------------------------------------------------------- 1 | const utils = require('../../lib/utils/common-utils'); 2 | 3 | describe('common-utils', () => { 4 | it('toTitleCase', () => { 5 | expect(utils.toTitleCase('RSSHub IS AS aweSOme aS henry')).toBe('Rsshub Is As Awesome As Henry'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /lib/routes/sobooks/date.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const date = ctx.params.date || `${new Date().getFullYear()}/${new Date().getMonth()}`; 5 | 6 | ctx.state.data = await utils(ctx, `books/date/${date.replace('-', '/')}`); 7 | }; 8 | -------------------------------------------------------------------------------- /scripts/workflow/build-radar.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const target = path.join(__dirname, '../../assets/build/radar-rules.js'); 4 | const radar = require(path.join(__dirname, '../../lib/radar.js')); 5 | 6 | fs.writeFileSync(target, radar.toSource()); 7 | -------------------------------------------------------------------------------- /lib/v2/ft/channel.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | ctx.state.data = await utils.getData({ 5 | site: ctx.params.language === 'chinese' ? 'www' : 'big5', 6 | channel: ctx.params.channel, 7 | ctx, 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /lib/v2/heu/maintainer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/yjsy/list/:id': ['Derekmini'], 3 | '/job/bigemploy': ['Derekmini'], 4 | '/job/calendar': ['Derekmini'], 5 | '/job/list/:id': ['Derekmini'], 6 | '/gx/:type/:colume/:id?': ['Derekmini'], 7 | '/uae/list/:id': ['Derekmini'], 8 | }; 9 | -------------------------------------------------------------------------------- /lib/v2/lativ/templates/detail.art: -------------------------------------------------------------------------------- 1 |
2 | {{ if discount != null }} 3 |

原价: {{ price }}

4 |

特价: {{ discount }}

5 | {{ else }} 6 |

价格: {{ price }}

7 | {{ /if }} 8 | {{ title }} 9 |
10 | -------------------------------------------------------------------------------- /lib/v2/panewslab/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/column/:id', require('./column')); 3 | router.get('/newsflash/:language?', require('./newsflash')); 4 | router.get('/topic/:id', require('./topic')); 5 | router.get('/:category?', require('./index')); 6 | }; 7 | -------------------------------------------------------------------------------- /lib/routes/gameres/list.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const rootUrl = 'https://www.gameres.com'; 5 | const currentUrl = `${rootUrl}/list/${ctx.params.id}`; 6 | 7 | ctx.state.data = await utils(ctx, currentUrl, '.feed-item-right a h3'); 8 | }; 9 | -------------------------------------------------------------------------------- /lib/v2/dushu/fuzhou/templates/message.art: -------------------------------------------------------------------------------- 1 | 地区:{{item.areaName}} 2 |
3 | 地点:{{item.address}} 4 |
5 | 开始时间: {{item.startTime}} 6 |
7 | 结束时间: {{item.endTime}} 8 |
9 | 10 | -------------------------------------------------------------------------------- /lib/v2/people/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/liuyan/:id/:state?', require('./liuyan')); 3 | router.get('/xjpjh/:keyword?/:year?', require('./xjpjh')); 4 | router.get(/([\w|\d]+)\/([\w|\d|/]+)?/, require('./index')); 5 | router.get('/:0?', require('./index')); 6 | }; 7 | -------------------------------------------------------------------------------- /lib/v2/qq/ac/templates/description.art: -------------------------------------------------------------------------------- 1 | {{ if image !== '' }} 2 | 3 | {{ /if }} 4 | {{ if description !== '' }} 5 |

{{ description }}

6 | {{ /if }} 7 | {{ each chapters chapter }} 8 |
{{ chapter.title }}
9 | {{/each}} -------------------------------------------------------------------------------- /lib/v2/wzu/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'wzu.edu.cn': { 3 | _name: '温州大学', 4 | '.': [ 5 | { 6 | title: '温州大学 - 主站新闻', 7 | docs: 'https://docs.rsshub.app/university.html#wen-zhou-da-xue', 8 | }, 9 | ], 10 | }, 11 | }; 12 | -------------------------------------------------------------------------------- /lib/utils/common-utils.js: -------------------------------------------------------------------------------- 1 | // convert a string into title case 2 | const toTitleCase = (str) => 3 | str 4 | .toLowerCase() 5 | .split(' ') 6 | .map((word) => word.replace(word[0], word[0].toUpperCase())) 7 | .join(' '); 8 | 9 | module.exports = { 10 | toTitleCase, 11 | }; 12 | -------------------------------------------------------------------------------- /lib/v2/lanqiao/utils.js: -------------------------------------------------------------------------------- 1 | const { art } = require('@/utils/render'); 2 | const path = require('path'); 3 | 4 | const courseDesc = (picurl, desc) => 5 | art(path.join(__dirname, 'templates/courseDesc.art'), { 6 | picurl, 7 | desc, 8 | }); 9 | 10 | module.exports = { 11 | courseDesc, 12 | }; 13 | -------------------------------------------------------------------------------- /lib/v2/zaobao/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/interactive-graphics', require('./interactive')); 3 | router.get('/realtime/:section?', require('./realtime')); 4 | router.get('/znews/:section?', require('./znews')); 5 | router.get('/:type?/:section?', require('./index')); 6 | }; 7 | -------------------------------------------------------------------------------- /scripts/ansible/rsshub.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=RSSHub is an open source, easy to use, and extensible RSS feed aggregator 3 | 4 | [Service] 5 | User=rsshub 6 | WorkingDirectory=/home/rsshub/app 7 | ExecStart=yarn start 8 | EnvironmentFile=/home/rsshub/app/.env 9 | 10 | [Install] 11 | WantedBy=multi-user.target 12 | -------------------------------------------------------------------------------- /lib/routes/dribbble/user.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const name = ctx.params.name; 5 | const url = `https://dribbble.com/${name}`; 6 | 7 | const title = `Dribbble - user ${name}`; 8 | 9 | ctx.state.data = await utils.getData(ctx, url, title); 10 | }; 11 | -------------------------------------------------------------------------------- /lib/utils/rss-parser.js: -------------------------------------------------------------------------------- 1 | const config = require('@/config').value; 2 | const Parser = require('rss-parser'); 3 | 4 | const parser = new Parser({ 5 | customFields: { 6 | item: ['magnet'], 7 | }, 8 | headers: { 9 | 'User-Agent': config.ua, 10 | }, 11 | }); 12 | 13 | module.exports = parser; 14 | -------------------------------------------------------------------------------- /lib/v2/zhubai/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'zhubai.love': { 3 | _name: '竹白', 4 | '.': [ 5 | { 6 | title: '文章', 7 | docs: 'https://docs.rsshub.app/blog.html#zhu-bai', 8 | source: ['/'], 9 | }, 10 | ], 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /process.json: -------------------------------------------------------------------------------- 1 | { 2 | "apps": [ 3 | { 4 | "name": "rsshub", 5 | "script": "lib/index.js", 6 | "instances": "max", 7 | "exec_mode": "cluster", 8 | "env": { 9 | "NODE_ENV": "production" 10 | } 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /lib/routes/95mm/tab.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | ctx.params.tab = ctx.params.tab || '最新'; 5 | 6 | const rootUrl = `https://www.95mm.net/home-ajax/index.html?tabcid=${ctx.params.tab}&page=1`; 7 | 8 | ctx.state.data = await utils(ctx, ctx.params.tab, rootUrl); 9 | }; 10 | -------------------------------------------------------------------------------- /lib/v2/ff14/router.js: -------------------------------------------------------------------------------- 1 | module.exports = (router) => { 2 | router.get('/global/:lang/:type?', require('./ff14_global')); 3 | router.get('/zh/:type?', require('./ff14_zh')); 4 | // Deprecated 5 | router.get('/ff14_global/:lang/:type?', require('./ff14_global')); 6 | router.get('/ff14_zh/:type?', require('./ff14_zh')); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/routes/amazfitwatchfaces/fresh.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const currentUrl = `${ctx.params.model}/fresh?${ctx.params.lang ? 'lang=' + ctx.params.lang : ''}${ctx.params.type ? '&compatible=' + ctx.params.type : ''}`; 5 | 6 | ctx.state.data = await utils(ctx, currentUrl); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/jasa/templates/description.art: -------------------------------------------------------------------------------- 1 |

2 | {{ item.title }}
3 | {{ item.authors }}
4 | https://doi.org/{{ item.doi }}
5 | 6 |

7 |

8 | {{ item.abstract }}
9 |

-------------------------------------------------------------------------------- /lib/v2/wechat/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'feeddd.org': { 3 | _name: '微信', 4 | '.': [ 5 | { 6 | title: '公众号 (feeddd 来源)', 7 | docs: 'https://docs.rsshub.app/new-media.html#wei-xin', 8 | source: ['/'], 9 | }, 10 | ], 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /lib/routes/amazfitwatchfaces/search.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const currentUrl = `search/${ctx.params.model}/tags/${ctx.params.keyword ? ctx.params.keyword : ''}${ctx.params.sortBy ? '?sortby=' + ctx.params.sortBy : ''}`; 5 | 6 | ctx.state.data = await utils(ctx, currentUrl); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/routes/amazfitwatchfaces/updated.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const currentUrl = `${ctx.params.model}/updated?${ctx.params.lang ? 'lang=' + ctx.params.lang : ''}${ctx.params.type ? '&compatible=' + ctx.params.type : ''}`; 5 | 6 | ctx.state.data = await utils(ctx, currentUrl); 7 | }; 8 | -------------------------------------------------------------------------------- /lib/v2/javlibrary/templates/description.art: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{@ info }} 4 | 5 | {{if comment}} 6 |
7 | {{@ comment }} 8 |
9 | {{/if}} 10 | 11 | {{each videos}} 12 | 13 | {{/each}} 14 | 15 | {{each thumbs}} 16 | 17 | {{/each}} -------------------------------------------------------------------------------- /lib/routes/199it/tag.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | const rootUrl = 'http://www.199it.com/archives/tag/'; 4 | 5 | module.exports = async (ctx) => { 6 | const keyword = ctx.params.tag.split('|').join('/'); 7 | const currentUrl = `${rootUrl}/${keyword}`; 8 | 9 | ctx.state.data = await utils(ctx, keyword, currentUrl); 10 | }; 11 | -------------------------------------------------------------------------------- /lib/v2/18comic/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/album/:id', require('./album')); 3 | router.get('/blogs/:category?', require('./blogs')); 4 | router.get('/search/:option?/:category?/:keyword?/:time?/:order?', require('./search')); 5 | router.get('/:category?/:time?/:order?/:keyword?', require('./index')); 6 | }; 7 | -------------------------------------------------------------------------------- /lib/middleware/api-template.js: -------------------------------------------------------------------------------- 1 | module.exports = async (ctx, next) => { 2 | await next(); 3 | if (ctx.request.path.startsWith('/api/')) { 4 | return ctx.res.ok({ 5 | message: `request returned ${ctx.body.counter} ${ctx.body.counter > 1 ? 'routes' : 'route'}`, 6 | data: ctx.body.result, 7 | }); 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /lib/routes/letterboxd/userdiary.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const url = `https://letterboxd.com/${ctx.params.username}/films/diary/by/added/`; 5 | const title = `Letterboxd - diary - ${ctx.params.username}`; 6 | 7 | ctx.state.data = await utils.getData(ctx, ctx.params.username, url, title); 8 | }; 9 | -------------------------------------------------------------------------------- /lib/v2/nju/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/jw/:type', require('./jw')); 3 | router.get('/gra', require('./gra')); 4 | router.get('/rczp/:type', require('./rczp')); 5 | router.get('/scit/:type', require('./scit')); 6 | router.get('/zcc', require('./zcc')); 7 | router.get('/zbb/:type', require('./zbb')); 8 | }; 9 | -------------------------------------------------------------------------------- /lib/routes/199it/category.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | const rootUrl = 'http://www.199it.com/archives/category/'; 4 | 5 | module.exports = async (ctx) => { 6 | const keyword = ctx.params.caty.split('|').join('/'); 7 | const currentUrl = `${rootUrl}/${keyword}`; 8 | 9 | ctx.state.data = await utils(ctx, keyword, currentUrl); 10 | }; 11 | -------------------------------------------------------------------------------- /lib/routes/dribbble/keyword.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const keyword = ctx.params.keyword; 5 | const url = `https://dribbble.com/search/shots/recent?q=${keyword}`; 6 | 7 | const title = `Dribbble - keyword ${keyword}`; 8 | 9 | ctx.state.data = await utils.getData(ctx, url, title); 10 | }; 11 | -------------------------------------------------------------------------------- /lib/v2/dockerhub/utils.js: -------------------------------------------------------------------------------- 1 | const md5 = require('@/utils/md5'); 2 | 3 | function hash(images) { 4 | const entries = Object.entries(images) 5 | .map((x) => [`${x[1].os}/${x[1].architecture}`, x[1].digest]) 6 | .sort((a, b) => a[0] - b[0]); 7 | return md5(entries.map((x) => x.join(',')).join('|')); 8 | } 9 | 10 | module.exports = { hash }; 11 | -------------------------------------------------------------------------------- /lib/v2/gocn/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'gocn.vip': { 3 | _name: 'GoCN', 4 | '.': [ 5 | { 6 | title: '文章', 7 | docs: 'https://docs.rsshub.app/programming.html#GoCN', 8 | source: ['/'], 9 | target: '/gocn', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/spotify/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/artist/:id', require('./artist')); 3 | router.get('/playlist/:id', require('./playlist')); 4 | router.get('/saved/:limit?', require('./saved')); 5 | router.get('/top/tracks', require('./top')('tracks')); 6 | router.get('/top/artists', require('./top')('artists')); 7 | }; 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | error.log 4 | combined.log 5 | .vscode 6 | .idea 7 | .DS_Store 8 | docs/.vuepress/dist 9 | lib/config/app.json 10 | lib/config/config.js 11 | yarn-error.log 12 | tmp 13 | *.swp 14 | *.iml 15 | coverage 16 | .env 17 | app-minimal/ 18 | Session.vim 19 | 20 | .now 21 | .vercel 22 | 23 | assets/build/ 24 | package-lock.json 25 | -------------------------------------------------------------------------------- /lib/v2/javlibrary/update.js: -------------------------------------------------------------------------------- 1 | const { defaultLanguage, rootUrl, ProcessItems } = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const language = ctx.params.language ?? defaultLanguage; 5 | const currentUrl = `${rootUrl}/${language}/vl_update.php?list`; 6 | 7 | ctx.state.data = await ProcessItems(language, currentUrl, ctx.cache.tryGet); 8 | }; 9 | -------------------------------------------------------------------------------- /lib/v2/orcid/templates/description.art: -------------------------------------------------------------------------------- 1 |

{{ title }}

{{ journalTitle }}

2 | {{ if publicationDate.year }}{{ publicationDate.year }}{{ /if }}{{ if publicationDate.month }}-{{ publicationDate.month }}{{ /if }}{{ if publicationDate.day }}-{{ publicationDate.day }}{{ /if }} | {{ workType }}
3 | {{@ Str }}Source: {{ sourceName }} -------------------------------------------------------------------------------- /lib/protected_router.js: -------------------------------------------------------------------------------- 1 | const Router = require('@koa/router'); 2 | const router = new Router(); 3 | const auth = require('koa-basic-auth'); 4 | const config = require('./config').value; 5 | 6 | router.use('/(.*)', auth(config.authentication)); 7 | 8 | // RSSHub 9 | router.get('/rsshub/routes/:lang?', require('./v2/rsshub/routes')); 10 | 11 | module.exports = router; 12 | -------------------------------------------------------------------------------- /lib/routes/letterboxd/followingdiary.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const url = `https://letterboxd.com/${ctx.params.username}/following/`; 5 | const title = `Letterboxd - following diary - ${ctx.params.username}`; 6 | 7 | ctx.state.data = await utils.getFollowingData(ctx, ctx.params.username, url, title); 8 | }; 9 | -------------------------------------------------------------------------------- /lib/v2/javlibrary/newentries.js: -------------------------------------------------------------------------------- 1 | const { defaultLanguage, rootUrl, ProcessItems } = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const language = ctx.params.language ?? defaultLanguage; 5 | const currentUrl = `${rootUrl}/${language}/vl_newentries.php?list`; 6 | 7 | ctx.state.data = await ProcessItems(language, currentUrl, ctx.cache.tryGet); 8 | }; 9 | -------------------------------------------------------------------------------- /lib/v2/orcid/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'orcid.org': { 3 | _name: 'ORCID', 4 | '.': [ 5 | { 6 | title: '作品列表', 7 | docs: 'https://docs.rsshub.app/study.html#orcid', 8 | source: ['/:id', '/'], 9 | target: '/ocrid/:id', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/yaohuo/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'yaohuo.me': { 3 | _name: '妖火', 4 | '.': [ 5 | { 6 | title: '首页', 7 | docs: 'https://docs.rsshub.app/new-media.html#yao-huo-shou-ye', 8 | source: ['/'], 9 | target: '/yaohuo', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/cntv/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'cctv.com': { 3 | _name: 'CCTV', 4 | navi: [ 5 | { 6 | title: '栏目订阅', 7 | docs: 'https://docs.rsshub.app/multimedia.html#cntv-lan-mu', 8 | source: ['/'], 9 | target: '/cntv/:column', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/elsevier/templates/description.art: -------------------------------------------------------------------------------- 1 |

2 | {{ item.title }}
3 | {{ item.authors }}
4 | https://doi.org/{{ item.doi }}
5 | {{ item.volume }}
6 |

7 |

8 | {{ item.abstract }}
9 |

-------------------------------------------------------------------------------- /lib/v2/hizu/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'hizh.cn': { 3 | _name: '珠海网', 4 | '.': [ 5 | { 6 | title: '栏目', 7 | docs: 'https://docs.rsshub.app/new-media.html#zhu-hai-wang-lan-mu', 8 | source: '/', 9 | target: '/hizu/:column?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/icac/utils.js: -------------------------------------------------------------------------------- 1 | const BASE_URL = 'https://www.icac.org.hk'; 2 | 3 | const LANG_TYPE = { 4 | en: 'en-us', 5 | sc: 'zh-cn', 6 | tc: 'zh-hk', 7 | }; 8 | 9 | function langBase(lang) { 10 | return lang ? `${BASE_URL}/${lang}` : `https://www.icac.org.hk/sc`; 11 | } 12 | 13 | module.exports = { 14 | LANG_TYPE, 15 | BASE_URL, 16 | langBase, 17 | }; 18 | -------------------------------------------------------------------------------- /lib/v2/2047/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '2047.name': { 3 | _name: '2047', 4 | '.': [ 5 | { 6 | title: '分类', 7 | docs: 'https://docs.rsshub.app/bbs.html#2047-fen-lei', 8 | source: ['/'], 9 | target: '/2047/:category?/:sort?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/btzj/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'btbtt20.com': { 3 | _name: 'BT之家', 4 | '.': [ 5 | { 6 | title: '分类', 7 | docs: 'https://docs.rsshub.app/multimedia.html#bt-zhi-jia', 8 | source: ['/'], 9 | target: '/btzj/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/distill/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'distill.pub': { 3 | _name: 'Distill', 4 | '.': [ 5 | { 6 | title: 'Latest', 7 | docs: 'https://docs.rsshub.app/programming.html#distill', 8 | source: ['/'], 9 | target: '/distill', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/ieee/templates/description.art: -------------------------------------------------------------------------------- 1 |

2 | {{ item.title }}
3 | {{ item.authors }}
4 | https://doi.org/{{ item.doi }}
5 | Volume: {{ item.volume }}
6 |

7 |

8 | {{ item.abstract }}
9 |

-------------------------------------------------------------------------------- /lib/v2/jump/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'jumpvg.com': { 3 | _name: 'jump app', 4 | switch: [ 5 | { 6 | title: '折扣清单', 7 | docs: 'https://docs.rsshub.app/game.html#jump', 8 | source: ['/'], 9 | target: '/jump/discount/switch', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/lativ/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'lativ.com.tw': { 3 | _name: 'lativ', 4 | www: [ 5 | { 6 | title: '订阅商品价格', 7 | docs: 'https://docs.rsshub.app/shopping.html#lativ', 8 | source: '/Detail/:id', 9 | target: '/lativ/:id', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/trow/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'trow.cc': { 3 | _name: 'The Ring of Wonder', 4 | '.': [ 5 | { 6 | title: '首页更新', 7 | docs: 'https://docs.rsshub.app/bbs.html#the-ring-of-wonder', 8 | source: ['/'], 9 | target: '/portal', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/youku/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'youku.com': { 3 | _name: '优酷', 4 | i: [ 5 | { 6 | title: '订阅作者', 7 | docs: 'https://docs.rsshub.app/multimedia.html#you-ku', 8 | source: ['/i/:id'], 9 | target: '/youku/channel/:id', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Version 4 | 5 | Latest commits in master branch 6 | 7 | ## Reporting a Vulnerability 8 | 9 | If you believe you have found a security vulnerability in RSSHub, please let us know right away, you can email us at [i@diygod.me](mailto:i@diygod.me). We will investigate all legitimate reports and do our best to quickly fix the problem. 10 | -------------------------------------------------------------------------------- /api/now.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const moduleAlias = require('module-alias'); 3 | moduleAlias.addAlias('@', path.join(__dirname, '../lib')); 4 | 5 | const config = require('../lib/config'); 6 | config.set({ 7 | NO_LOGFILES: true, 8 | }); 9 | 10 | const app = require('../lib/app'); 11 | 12 | module.exports = (req, res) => { 13 | app.callback()(req, res); 14 | }; 15 | -------------------------------------------------------------------------------- /lib/routes/dribbble/popular.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const timeframe = ctx.params.timeframe; 5 | const url = `https://dribbble.com/shots/popular${timeframe ? `?timeframe=${timeframe}` : ''}`; 6 | 7 | const title = 'Dribbble - Popular Shots'; 8 | 9 | ctx.state.data = await utils.getData(ctx, url, title); 10 | }; 11 | -------------------------------------------------------------------------------- /lib/v2/cool18/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'cool18.com': { 3 | _name: '酷 18', 4 | '.': [ 5 | { 6 | title: '分站', 7 | docs: 'https://docs.rsshub.app/picture.html#cool-18', 8 | source: '/', 9 | target: '/cool18/:id?/:type?/:keyword?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/guduodata/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'guduodata.com': { 3 | _name: '骨朵数据', 4 | data: [ 5 | { 6 | title: '日榜', 7 | docs: 'https://docs.rsshub.app/other.html#gu-duo-shu-ju', 8 | source: ['/'], 9 | target: '/guduodata/daily', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/ngocn2/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'ngocn2.org': { 3 | _name: 'NGOCN', 4 | '.': [ 5 | { 6 | title: '分类', 7 | docs: 'https://docs.rsshub.app/new-media.html#ngocn2-fen-lei', 8 | source: ['/'], 9 | target: '/ngocn2/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/audiobar/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'audiobar.cn': { 3 | _name: '音频应用', 4 | '.': [ 5 | { 6 | title: '最新主题', 7 | docs: 'https://docs.rsshub.app/bbs.html#yin-pin-ying-yong', 8 | source: ['/all.php'], 9 | target: '/audiobar/latest', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/changba/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'changba.com': { 3 | _name: '唱吧', 4 | '.': [ 5 | { 6 | title: '用户', 7 | docs: 'https://docs.rsshub.app/social-media.html#chang-ba', 8 | source: ['/s/:userid'], 9 | target: `/changba/:userid`, 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/learnku/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'learnku.com': { 3 | _name: 'Learn Ku 社区', 4 | '.': [ 5 | { 6 | title: '分区', 7 | docs: 'https://docs.rsshub.app/bbs.html#learnku', 8 | source: ['/:community'], 9 | target: '/learnku/:community', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/mox/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'mox.moe': { 3 | _name: 'Mox.moe', 4 | '.': [ 5 | { 6 | title: '首頁', 7 | docs: 'https://docs.rsshub.app/anime.html#mox-moe-shou-ye', 8 | source: ['/l/:category', '/'], 9 | target: '/mox/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/news/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'news.cn': { 3 | _name: '新华网', 4 | '.': [ 5 | { 6 | title: '新华社新闻', 7 | docs: 'https://docs.rsshub.app/new-media.html#xin-hua-wang-xin-hua-she-xin-wen', 8 | source: ['/'], 9 | target: '/news/whxw', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/watchout/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'watchout.tw': { 3 | _name: '沃草', 4 | '.': [ 5 | { 6 | title: '文件列表', 7 | docs: 'https://docs.rsshub.app/new-media.html#wo-cao-wen-jian-lie-biao', 8 | source: ['/'], 9 | target: '/watchout', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/routes/fanbox/header.js: -------------------------------------------------------------------------------- 1 | const config = require('@/config').value; 2 | 3 | // unlock contents paid by user 4 | module.exports = () => { 5 | const sessid = config.fanbox.session; 6 | let cookie = ''; 7 | if (sessid) { 8 | cookie += `FANBOXSESSID=${sessid}`; 9 | } 10 | const headers = { origin: 'https://fanbox.cc', cookie }; 11 | 12 | return headers; 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/fisher-spb/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'fisher.spb.ru': { 3 | _name: 'fisher spb', 4 | '.': [ 5 | { 6 | title: 'news', 7 | docs: 'https://docs.rsshub.app/en/other.html#fisher-spb', 8 | source: ['/news'], 9 | target: '/fisher-spb/news', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/mydrivers/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'mydrivers.com': { 3 | _name: '快科技', 4 | '.': [ 5 | { 6 | title: '新闻', 7 | docs: 'https://docs.rsshub.app/new-media.html#kuai-ke-ji-xin-wen', 8 | source: ['/'], 9 | target: '/mydrivers/:type?/:id?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/now/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'news.now.com': { 3 | _name: 'Now 新聞', 4 | '.': [ 5 | { 6 | title: '新聞', 7 | docs: 'https://docs.rsshub.app/traditional-media.html#now-xin-wen', 8 | source: ['/'], 9 | target: '/now/news/:category?/:id?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/pku/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'pku.edu.cn': { 3 | _name: '北京大学', 4 | hr: [ 5 | { 6 | title: '人事处', 7 | docs: 'https://docs.rsshub.app/university.html#bei-jing-da-xue-ren-shi-chu', 8 | source: ['/'], 9 | target: '/pku/hr/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/secnews/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'furstar.jp': { 3 | _name: 'Furstar', 4 | '.': [ 5 | { 6 | title: '安全文摘首頁', 7 | docs: 'https://docs.rsshub.app/shopping.html#an-quan-wen-zhai', 8 | source: ['/', '/'], 9 | target: '/secnews/index', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/storm/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'storm.mg': { 3 | _name: '風傳媒', 4 | '.': [ 5 | { 6 | title: '分类', 7 | docs: 'https://docs.rsshub.app/new-media.html#feng-chuan-mei', 8 | source: ['/:category/:id'], 9 | target: '/storm/:category?/:id?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /docs/en/joinus/use-cache.md: -------------------------------------------------------------------------------- 1 | # Use Cache 2 | 3 | Some routes require visiting several pages when generating RSS feeds, and these pages are not likely to be changed very often. In this case, caching should be used for reducing the server load and saving unnecessary traffics/calculations. Here are some scenarios and details about the use of the caching tools. 4 | 5 | 6 | -------------------------------------------------------------------------------- /lib/v2/8world/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '8world.com': { 3 | _name: '8视界', 4 | '.': [ 5 | { 6 | title: '分类', 7 | docs: 'https://docs.rsshub.app/new-media.html#_8-shi-jie-fen-lei', 8 | source: ['/:category', '/'], 9 | target: '/8world/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/ahjzu/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'ahjzu.edu.cn': { 3 | _name: '安徽建筑大学', 4 | news: [ 5 | { 6 | title: '通知公告', 7 | docs: 'https://docs.rsshub.app/university.html#an-hui-jian-zhu-da-xue', 8 | source: '/20/list.htm', 9 | target: '/ahjzu/news', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/bendibao/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'bendibao.com': { 3 | _name: '本地宝', 4 | '.': [ 5 | { 6 | title: '焦点资讯', 7 | docs: 'https://docs.rsshub.app/new-media.html#ben-di-bao-jiao-dian-zi-xun', 8 | source: '/', 9 | target: '/bendibao/news/:city', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/ezone/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'ezone.hk': { 3 | _name: 'ezone.hk', 4 | '.': [ 5 | { 6 | title: '分类', 7 | docs: 'https://docs.rsshub.app/new-media.html#ezone-hk-fen-lei', 8 | source: ['/:category', '/'], 9 | target: '/ezone/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/hkej/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'hkej.com': { 3 | _name: '信报财经新闻', 4 | '.': [ 5 | { 6 | title: '即时新闻', 7 | docs: 'https://docs.rsshub.app/traditional-media.html##xin-bao-cai-jing-xin-wen', 8 | source: ['/'], 9 | target: '/hkej/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/iresearch/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'iresearch.com.cn': { 3 | _name: '艾瑞', 4 | www: [ 5 | { 6 | title: '研究报告', 7 | docs: 'https://docs.rsshub.app/journal.html#ieee-xplore', 8 | source: ['/report.shtml'], 9 | target: '/iresearch/report', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/line/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'line.me': { 3 | _name: 'LINE Today', 4 | '.': [ 5 | { 6 | title: 'LINE Today', 7 | docs: 'https://docs.rsshub.app/new-media.html#line-today', 8 | source: ['/'], 9 | target: '/line/today/:edition?/:tab?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/shmeea/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'shmeea.edu.cn': { 3 | _name: '上海市教育考试院', 4 | www: [ 5 | { 6 | title: '消息速递', 7 | docs: 'https://docs.rsshub.app/other.html#shang-hai-shi-jiao-yu-kao-shi-yuan', 8 | source: ['/'], 9 | target: '/shmeea', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/ustb/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'ustb.edu.cn': { 3 | _name: '北京科技大学', 4 | gs: [ 5 | { 6 | title: '研究生院', 7 | docs: 'https://docs.rsshub.app/university.html#bei-jing-ke-ji-da-xue', 8 | source: '/:type', 9 | target: '/ustb/yjsy/news/:type', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/yxdzqb/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'yxdzqb.com': { 3 | _name: '游戏打折情报', 4 | '.': [ 5 | { 6 | title: '游戏折扣', 7 | docs: 'https://docs.rsshub.app/game.html#you-xi-da-zhe-qing-bao-you-xi-zhe-kou', 8 | source: '/', 9 | target: '/yxdzqb/:type', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/biodiscover/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'biodiscover.com': { 3 | _name: '生物探索', 4 | www: [ 5 | { 6 | title: '频道', 7 | docs: 'https://docs.rsshub.app/new-media.html#sheng-wu-tan-suo', 8 | source: '/:channel', 9 | target: '/biodiscover/:channel', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/bupt/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'bupt.edu.cn': { 3 | _name: '北京邮电大学', 4 | '.': [ 5 | { 6 | title: '人才招聘', 7 | docs: 'https://docs.rsshub.app/university.html#bei-jing-you-dian-da-xue-ren-cai-zhao-pin', 8 | source: ['/'], 9 | target: '/bupt/rczp', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/cahkms/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'cahkms.org': { 3 | _name: '全国港澳研究会', 4 | '.': [ 5 | { 6 | title: '分类', 7 | docs: 'https://docs.rsshub.app/new-media.html#quan-guo-gang-ao-yan-jiu-hui-fen-lei', 8 | source: '/', 9 | target: '/cahkms/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/ccreports/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'ccreports.com.cn': { 3 | _name: '消费者报道', 4 | www: [ 5 | { 6 | title: '要闻', 7 | docs: 'https://docs.rsshub.app/shopping.html#xiao-fei-zhe-bao-dao-yao-wen', 8 | source: ['/'], 9 | target: '/ccreports/article', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/firefox/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'firefox.com': { 3 | _name: 'Mozilla', 4 | monitor: [ 5 | { 6 | title: 'Firefox Monitor', 7 | docs: 'https://docs.rsshub.app/other.html#mozilla', 8 | source: ['/', '/breaches'], 9 | target: '/firefox/breaches', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/hex-rays/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'hex-rays.com': { 3 | _name: 'Hex-Rays', 4 | '.': [ 5 | { 6 | title: 'Hex-Rays News', 7 | docs: 'https://docs.rsshub.app/programming.html#hex-rays', 8 | source: ['/', '/blog'], 9 | target: '/hex-rays/news', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/mvm/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'mwm.net.cn': { 3 | _name: '管理世界', 4 | '.': [ 5 | { 6 | title: '分类', 7 | docs: 'https://docs.rsshub.app/journal.html#guan-li-shi-jie-fen-lei', 8 | source: ['/web/:category', '/'], 9 | target: '/mvm/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/nikkei-asia/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'nikkei.com': { 3 | _name: 'Nikkei Asia', 4 | asia: [ 5 | { 6 | title: 'Latest News', 7 | docs: 'https://docs.rsshub.app/traditional-media.html#nikkei-asia', 8 | source: '/', 9 | target: '/nikkei-asia/', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/nippon/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'nippon.com': { 3 | _name: '走进日本', 4 | www: [ 5 | { 6 | title: '政治外交', 7 | docs: 'https://docs.rsshub.app/travel.html#zou-jin-ri-ben', 8 | source: ['/nippon/:category?', '/cn'], 9 | target: '/nippon/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/producthunt/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'producthunt.com': { 3 | _name: 'Product Hunt', 4 | www: [ 5 | { 6 | title: 'Today Popular', 7 | docs: 'https://docs.rsshub.app/other.html#product-hunt', 8 | source: ['/'], 9 | target: '/producthunt/today', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/qm120/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'qm120.com': { 3 | _name: '全民健康网', 4 | '.': [ 5 | { 6 | title: '新闻', 7 | docs: 'https://docs.rsshub.app/new-media.html#quan-min-jian-kang-wang-xin-wen', 8 | source: ['/'], 9 | target: '/qm120/news/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/ruc/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'ruc.edu.cn': { 3 | _name: '中国人民大学', 4 | hr: [ 5 | { 6 | title: '人事处', 7 | docs: 'https://docs.rsshub.app/university.html#zhong-guo-ren-min-da-xue-ren-shi-chu', 8 | source: ['/'], 9 | target: '/ruc/hr/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/topys/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'topys.cn': { 3 | _name: 'TOPYS', 4 | '.': [ 5 | { 6 | title: '关键字', 7 | docs: 'https://docs.rsshub.app/new-media.html#topys-guan-jian-zi', 8 | source: ['/search/:keyword', '/'], 9 | target: '/topys/:keyword?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/ash-maurya/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'blog.leanstack.com': { 3 | _name: "Ash Maurya's blog", 4 | '.': [ 5 | { 6 | title: "Ash Maurya's blog", 7 | docs: 'https://docs.rsshub.app/en/blog.html#ash-maurya', 8 | source: ['/'], 9 | target: '/ash-maurya', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/bse/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'bse.cn': { 3 | _name: '北京证券交易所', 4 | '.': [ 5 | { 6 | title: '栏目', 7 | docs: 'https://docs.rsshub.app/finance.html#bei-jing-zheng-quan-jiao-yi-suo-lan-mu', 8 | source: ['/'], 9 | target: '/bse/:category?/:keyword?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/disinfo/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'disinfo.eu': { 3 | _name: 'EU Disinfo Lab', 4 | '.': [ 5 | { 6 | title: 'Publications', 7 | docs: 'https://docs.rsshub.app/new-media.html#eu-disinfo-lab', 8 | source: ['/'], 9 | target: '/disinfo/publications', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/google/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router) { 2 | router.get('/album/:id', require('./album')); 3 | router.get('/citations/:id', require('./citations')); 4 | router.get('/doodles/:language?', require('./doodles')); 5 | router.get('/fonts/:sort?', require('./fonts')); 6 | router.get('/scholar/:query', require('./scholar')); 7 | router.get('/sites/:id', require('./sites')); 8 | }; 9 | -------------------------------------------------------------------------------- /lib/v2/javdb/rankings.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const category = ctx.params.category ?? 'censored'; 5 | const time = ctx.params.time ?? 'daily'; 6 | 7 | const currentUrl = `/rankings/video_${category}?period=${time}`; 8 | 9 | const title = 'JavDB'; 10 | 11 | ctx.state.data = await utils.ProcessItems(ctx, currentUrl, title); 12 | }; 13 | -------------------------------------------------------------------------------- /lib/v2/kemono/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'kemono.party': { 3 | _name: 'Kemono', 4 | '.': [ 5 | { 6 | title: 'Posts', 7 | docs: 'https://docs.rsshub.app/anime.html#kemono-posts', 8 | source: ['/:source/user/:id', '/'], 9 | target: '/kemono/:source?/:id?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/mygopen/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'mygopen.com': { 3 | _name: 'MyGoPen', 4 | '.': [ 5 | { 6 | title: '分類', 7 | docs: 'https://docs.rsshub.app/new-media.html#mygopen-fen-lei', 8 | source: ['/search/label/:label', '/'], 9 | target: '/mygopen/:label?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/nodejs/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'nodejs.org': { 3 | _name: 'Node.js', 4 | '.': [ 5 | { 6 | title: 'News', 7 | docs: 'https://docs.rsshub.app/programming.html#nodejs-news', 8 | source: ['/:language/blog', '/'], 9 | target: '/nodejs/blog/:language?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/polkaworld/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'polkaworld.org': { 3 | _name: 'PolkaWorld', 4 | www: [ 5 | { 6 | title: '最新资讯', 7 | docs: 'https://docs.rsshub.app/blog.html#polkaworld', 8 | source: ['/', '/articles/:name'], 9 | target: '/polkaworld/newest', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/rfi/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'rfi.fr': { 3 | _name: '法国国际广播电台', 4 | '.': [ 5 | { 6 | title: '滚动新闻', 7 | docs: 'https://docs.rsshub.app/multimedia.html#fa-guo-guo-ji-guang-bo-dian-tai-gun-dong-xin-wen', 8 | source: ['/'], 9 | target: '/rfi/news', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/shopback/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'shopback.com.tw': { 3 | _name: 'ShopBack', 4 | '.': [ 5 | { 6 | title: 'Store', 7 | docs: 'https://docs.rsshub.app/shopping.html#shopback-store', 8 | source: ['/:category', '/'], 9 | target: '/shopback/:store', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/ssm/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'ssm.gov.mo': { 3 | _name: '澳门卫生局', 4 | www: [ 5 | { 6 | title: '最新消息', 7 | docs: 'https://docs.rsshub.app/government.html#ao-men-wei-sheng-ju-zui-xin-xiao-xi', 8 | source: ['/', '/portal'], 9 | target: '/ssm/news', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/wyzxwk/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'wyzxwk.com': { 3 | _name: '乌有之乡', 4 | '.': [ 5 | { 6 | title: '栏目', 7 | docs: 'https://docs.rsshub.app/new-media.html#wu-you-zhi-xiang-lan-mu', 8 | source: ['/Article/:id', '/'], 9 | target: '/wyzxwk/article/:id?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /test/utils/wait.js: -------------------------------------------------------------------------------- 1 | const wait = require('../../lib/utils/wait'); 2 | 3 | describe('wait', () => { 4 | it('wait 0.1 second', async () => { 5 | const startDate = new Date(); 6 | 7 | await wait(0.1 * 1000); 8 | 9 | const endDate = new Date(); 10 | expect(endDate - startDate).toBeGreaterThan(90); 11 | expect(endDate - startDate).toBeLessThan(150); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /docs/.format/file.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | module.exports = { 4 | ROUTE_TYPE: 'route', 5 | GUIDE_TYPE: 'guide', 6 | NAV_TYPE: 'nav', 7 | LANG_CN: 'zh-CN', 8 | LANG_EN: 'en-US', 9 | readFile: async (filePath) => fs.promises.readFile(filePath, { encoding: 'utf8' }), 10 | writeFile: async (filePath, data) => fs.promises.writeFile(filePath, data, { encoding: 'utf8' }), 11 | }; 12 | -------------------------------------------------------------------------------- /lib/routes/grubstreet/index.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils'); 2 | 3 | module.exports = async (ctx) => { 4 | const url = `https://www.grubstreet.com/_components/newsfeed/instances/grubstreet-index@published`; 5 | const title = `Grub Street`; 6 | const description = `New York Magazine's Food and Restaurant Blog`; 7 | 8 | ctx.state.data = await utils.getData(ctx, url, title, description); 9 | }; 10 | -------------------------------------------------------------------------------- /lib/v2/baozimh/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'baozimh.com': { 3 | _name: '包子漫画', 4 | www: [ 5 | { 6 | title: '订阅漫画', 7 | docs: 'https://docs.rsshub.app/multimedia.html#bandcamp-upcoming-live-streams', 8 | source: '/comic/:name', 9 | target: '/baozimh/comic/:name', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/bit/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'bit.edu.cn': { 3 | _name: '北京理工大学', 4 | rszhaopin: [ 5 | { 6 | title: '人才招聘', 7 | docs: 'https://docs.rsshub.app/university.html#bei-jing-li-gong-da-xue-ren-cai-zhao-pin', 8 | source: ['/'], 9 | target: '/bit/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/ccac/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'ccac.org.mo': { 3 | _name: '澳门廉政公署', 4 | '.': [ 5 | { 6 | title: '最新消息', 7 | docs: 'https://docs.rsshub.app/government.html#ao-men-lian-zheng-gong-shu', 8 | source: ['/:lang/news.html'], 9 | target: '/ccac/news/all/:lang', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/gf-cn/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'sunborngame.com': { 3 | _name: '少女前线', 4 | '.': [ 5 | { 6 | title: '情报局', 7 | docs: 'https://docs.rsshub.app/game.html#shao-nv-qian-xian-qing-bao-ju', 8 | source: ['/:category', '/'], 9 | target: '/gf-cn/news/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/routes/ncm/templates/djradio-content.art: -------------------------------------------------------------------------------- 1 | 2 |
3 | {{each description}} 4 |

{{$value}}

5 | {{/each}} 6 |
7 |
8 | 9 |

时长: {{itunes_duration}}

10 |

查看节目

11 |
12 | -------------------------------------------------------------------------------- /lib/routes/twitter/user.js: -------------------------------------------------------------------------------- 1 | const config = require('@/config').value; 2 | const devApiImpl = require('./developer-api/user'); 3 | const webApiImpl = require('./web-api/user'); 4 | 5 | module.exports = async (ctx) => { 6 | if (!config.twitter || !config.twitter.consumer_key || !config.twitter.consumer_secret) { 7 | await webApiImpl(ctx); 8 | } else { 9 | await devApiImpl(ctx); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /lib/v2/filmdeepfocus/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'filmdeepfocus.com': { 3 | _name: '深焦', 4 | '.': [ 5 | { 6 | title: '分类', 7 | docs: 'https://docs.rsshub.app/new-media.html#shen-jiao-fen-lei', 8 | source: ['/:category', '/'], 9 | target: '/filmdeepfocus/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/gameapps/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'gameapps.hk': { 3 | _name: 'GameApps.hk 香港手机游戏网', 4 | '.': [ 5 | { 6 | title: '最新消息', 7 | docs: 'https://docs.rsshub.app/game.html#gameapps-hk-xiang-gang-shou-ji-you-xi-wang', 8 | source: ['/'], 9 | target: '/gameapps', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/getdr/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'getdr.com': { 3 | _name: '趨勢科技防詐達人', 4 | '.': [ 5 | { 6 | title: '最新詐騙情報', 7 | docs: 'https://docs.rsshub.app/new-media.html#qu-shi-ke-ji-fang-zha-da-ren-zui-xin-zha-pian-qing-bao', 8 | source: ['/'], 9 | target: '/getdr', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/pts/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'pts.org.tw': { 3 | _name: '公視新聞網 PNN', 4 | news: [ 5 | { 6 | title: '即時', 7 | docs: 'https://docs.rsshub.app/traditional-media.html#gong-shi-xin-wen-wang-ji-shi-xin-wen', 8 | source: ['/dailynews'], 9 | target: '/pts/dailynews', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/routes/twitter/keyword.js: -------------------------------------------------------------------------------- 1 | const config = require('@/config').value; 2 | const webApiImpl = require('./web-api/search'); 3 | const devApiImpl = require('./developer-api/search'); 4 | 5 | module.exports = async (ctx) => { 6 | if (!config.twitter || !config.twitter.consumer_key || !config.twitter.consumer_secret) { 7 | await webApiImpl(ctx); 8 | } else { 9 | await devApiImpl(ctx); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /lib/v2/codeforces/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'codeforces.com': { 3 | _name: 'Codeforces', 4 | www: [ 5 | { 6 | title: '最新比赛', 7 | docs: 'https://docs.rsshub.app/programming.html#codeforces-zui-xin-bi-sai', 8 | source: ['/contests'], 9 | target: '/codeforces/contests', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/hkjunkcall/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'hkjunkcall.com': { 3 | _name: 'HKJunkCall資訊中心', 4 | '.': [ 5 | { 6 | title: '近期資訊', 7 | docs: 'https://docs.rsshub.app/new-media.html#hkjunkcall-zi-xun-zhong-xin-jin-qi-zi-xun', 8 | source: ['/'], 9 | target: '/hkjunkcall', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/oup/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'oup.com': { 3 | _name: 'Oxford University Press', 4 | academic: [ 5 | { 6 | title: '期刊', 7 | docs: 'https://docs.rsshub.app/journal.html#oxford-university-press', 8 | source: ['/', '/:name/issue'], 9 | target: '/oup/journals/:name', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/szse/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'szse.cn': { 3 | _name: '深圳证券交易所', 4 | '.': [ 5 | { 6 | title: '最新规则', 7 | docs: 'https://docs.rsshub.app/other.html#shen-zhen-zheng-quan-jiao-yi-suo-zui-xin-gui-ze', 8 | source: ['/lawrules/rule/new', '/'], 9 | target: '/szse/rule', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | Dockerfile* 4 | docker-compose* 5 | .dockerignore 6 | .gitignore 7 | LICENSE 8 | .vscode 9 | .github 10 | assets 11 | coverage 12 | docs 13 | test 14 | .codecov.yml 15 | .eslint* 16 | .prettier* 17 | .(yarn|npm|nvm)rc 18 | *.md 19 | process.json 20 | app.json 21 | .travis.yml 22 | 23 | #git but keep the git commit hash 24 | .git/logs 25 | .git/objects 26 | .git/index 27 | .git/info 28 | -------------------------------------------------------------------------------- /lib/v2/aamacau/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'aamacau.com': { 3 | _name: '論盡媒體 AllAboutMacau Media', 4 | '.': [ 5 | { 6 | title: '话题', 7 | docs: 'https://docs.rsshub.app/new-media.html#lun-jin-mei-ti-allaboutmacau-media-hua-ti', 8 | source: ['/'], 9 | target: '/:category?/:id?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/barronschina/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'barronschina.com.cn': { 3 | _name: '巴伦周刊中文版', 4 | '.': [ 5 | { 6 | title: '栏目', 7 | docs: 'https://docs.rsshub.app/finance.html#ba-lun-zhou-kan-zhong-wen-ban-lan-mu', 8 | source: ['/'], 9 | target: '/barronschina/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/eventernote/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'eventernote.com': { 3 | _name: 'Eventernote', 4 | www: [ 5 | { 6 | title: '声优活动及演唱会', 7 | docs: 'https://docs.rsshub.app/anime.html#eventernote', 8 | source: '/actors/:name/:id/events', 9 | target: '/eventernote/actors/:name/:id', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/focustaiwan/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'focustaiwan.tw': { 3 | _name: 'Focus Taiwan', 4 | '.': [ 5 | { 6 | title: 'Category', 7 | docs: 'https://docs.rsshub.app/new-media.html#focus-taiwan-category', 8 | source: ['/:category', '/'], 9 | target: '/focustaiwan/category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/fortunechina/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'fortunechina.com': { 3 | _name: '财富中文网', 4 | '.': [ 5 | { 6 | title: '分类', 7 | docs: 'https://docs.rsshub.app/new-media.html#cai-fu-zhong-wen-wang-fen-lei', 8 | source: ['/:category', '/'], 9 | target: '/fortunechina/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/mohw/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'mohw.gov.tw': { 3 | _name: '台灣衛生福利部', 4 | '.': [ 5 | { 6 | title: '即時新聞澄清', 7 | docs: 'https://docs.rsshub.app/government.html#tai-wan-wei-sheng-fu-li-bu-ji-shi-xin-wen-cheng-qing', 8 | source: ['/'], 9 | target: '/mohw/clarification', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/wangqiutiyu/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'wangqiutiyu.com': { 3 | _name: '旺球体育', 4 | '.': [ 5 | { 6 | title: '直播间开播', 7 | docs: 'https://docs.rsshub.app/live.html#wang-qiu-ti-yu-zhi-bo-jian-kai-bo', 8 | source: ['/anchor/:id', '/'], 9 | target: '/wangqiutiyu/anchor/:id', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/routes/bilibili/utils.js: -------------------------------------------------------------------------------- 1 | const iframe = (aid, page, bvid) => 2 | ``; 5 | 6 | module.exports = { 7 | iframe, 8 | bvidTime: 1589990400, 9 | }; 10 | -------------------------------------------------------------------------------- /lib/v2/bnu/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'bnu.edu.cn': { 3 | _name: '北京师范大学', 4 | '.': [ 5 | { 6 | title: '经济与工商管理学院', 7 | docs: 'https://docs.rsshub.app/universities.html#bei-jing-shi-fan-da-xue-jing-ji-yu-gong-shang-guan-li-xue-yuan', 8 | source: ['/'], 9 | target: '/bs/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/consumer/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'consumer.org.hk': { 3 | _name: '消费者委员会', 4 | '.': [ 5 | { 6 | title: '文章', 7 | docs: 'https://docs.rsshub.app/new-media.html#xiao-fei-zhe-wei-yuan-hui-wen-zhang', 8 | source: ['/'], 9 | target: '/consumer/:category?/:language?/:keyword?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/hackernews/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'ycombinator.com': { 3 | _name: 'Hacker News', 4 | '.': [ 5 | { 6 | title: 'Section', 7 | docs: 'https://docs.rsshub.app/programming.html#hacker-news', 8 | source: ['/:section', '/'], 9 | target: '/hackernews/:section?/:type?/:user?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/icac/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'https://www.icac.org.hk': { 3 | _name: '廉政公署', 4 | '.': [ 5 | { 6 | title: '新闻公布', 7 | docs: 'https://docs.rsshub.app/government.html#xiang-gang-lian-zheng-gong-shu', 8 | source: ['/:lang/press/index.html'], 9 | target: '/icac/news/:lang', 10 | }, 11 | ], 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /lib/v2/startuplatte/radar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'startuplatte.com': { 3 | _name: '創新拿鐵', 4 | '.': [ 5 | { 6 | title: '分类', 7 | docs: 'https://docs.rsshub.app/new-media.html#chuang-xin-na-tie-fen-lei', 8 | source: ['/category/:category', '/'], 9 | target: '/startuplatte/:category?', 10 | }, 11 | ], 12 | }, 13 | }; 14 | --------------------------------------------------------------------------------