style: auto format
This commit is contained in:
parent
62b5544512
commit
ebfe021b50
|
|
@ -5,7 +5,7 @@ import app from '@/app';
|
|||
import { config } from '@/config';
|
||||
|
||||
describe('error', () => {
|
||||
it(`error`, async () => {
|
||||
it('error', async () => {
|
||||
const response = await app.request('/test/error');
|
||||
expect(response.status).toBe(503);
|
||||
const text = await response.text();
|
||||
|
|
@ -14,7 +14,7 @@ describe('error', () => {
|
|||
});
|
||||
|
||||
describe('httperror', () => {
|
||||
it(`httperror`, async () => {
|
||||
it('httperror', async () => {
|
||||
const response = await app.request('/test/httperror');
|
||||
expect(response.status).toBe(503);
|
||||
const text = await response.text();
|
||||
|
|
@ -23,11 +23,11 @@ describe('httperror', () => {
|
|||
});
|
||||
|
||||
describe('RequestInProgressError', () => {
|
||||
it(`RequestInProgressError with retry`, async () => {
|
||||
it('RequestInProgressError with retry', async () => {
|
||||
const responses = await Promise.all([app.request('/test/slow'), app.request('/test/slow')]);
|
||||
expect(new Set(responses.map((r) => r.status))).toEqual(new Set([200, 200]));
|
||||
});
|
||||
it(`RequestInProgressError`, async () => {
|
||||
it('RequestInProgressError', async () => {
|
||||
const responses = await Promise.all([app.request('/test/slow4'), app.request('/test/slow4')]);
|
||||
expect(new Set(responses.map((r) => r.status))).toEqual(new Set([200, 503]));
|
||||
expect(new Set(responses.map((r) => r.headers.get('cache-control')))).toEqual(new Set([`public, max-age=${config.cache.routeExpire}`, `public, max-age=${config.requestTimeout / 1000}`]));
|
||||
|
|
@ -37,7 +37,7 @@ describe('RequestInProgressError', () => {
|
|||
});
|
||||
|
||||
describe('config-not-found-error', () => {
|
||||
it(`config-not-found-error`, async () => {
|
||||
it('config-not-found-error', async () => {
|
||||
const response = await app.request('/test/config-not-found-error');
|
||||
expect(response.status).toBe(503);
|
||||
const text = await response.text();
|
||||
|
|
@ -46,7 +46,7 @@ describe('config-not-found-error', () => {
|
|||
});
|
||||
|
||||
describe('invalid-parameter-error', () => {
|
||||
it(`invalid-parameter-error`, async () => {
|
||||
it('invalid-parameter-error', async () => {
|
||||
const response = await app.request('/test/invalid-parameter-error');
|
||||
expect(response.status).toBe(503);
|
||||
const text = await response.text();
|
||||
|
|
@ -55,7 +55,7 @@ describe('invalid-parameter-error', () => {
|
|||
});
|
||||
|
||||
describe('captcha-error', () => {
|
||||
it(`captcha-error`, async () => {
|
||||
it('captcha-error', async () => {
|
||||
const response = await app.request('/test/captcha-error');
|
||||
expect(response.status).toBe(503);
|
||||
const text = await response.text();
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ afterEach(() => {
|
|||
});
|
||||
|
||||
describe('access-control', () => {
|
||||
it(`access key`, async () => {
|
||||
it('access key', async () => {
|
||||
const key = '1L0veRSSHub';
|
||||
const code = md5('/test/2' + key);
|
||||
process.env.ACCESS_KEY = key;
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ afterEach(() => {
|
|||
});
|
||||
|
||||
describe('filter-engine', () => {
|
||||
it(`filter RE2 engine ReDoS attack`, async () => {
|
||||
it('filter RE2 engine ReDoS attack', async () => {
|
||||
const app = (await import('@/app')).default;
|
||||
|
||||
const response = await app.request('/test/1?filter=abc(%3F%3Ddef)');
|
||||
|
|
@ -18,7 +18,7 @@ describe('filter-engine', () => {
|
|||
expect(await response.text()).toMatch(/RE2JSSyntaxException/);
|
||||
});
|
||||
|
||||
it(`filter Regexp engine backward compatibility`, async () => {
|
||||
it('filter Regexp engine backward compatibility', async () => {
|
||||
process.env.FILTER_REGEX_ENGINE = 'regexp';
|
||||
|
||||
const app = (await import('@/app')).default;
|
||||
|
|
@ -27,7 +27,7 @@ describe('filter-engine', () => {
|
|||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
it(`filter Regexp engine test config`, async () => {
|
||||
it('filter Regexp engine test config', async () => {
|
||||
process.env.FILTER_REGEX_ENGINE = 'somethingelse';
|
||||
|
||||
const app = (await import('@/app')).default;
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ afterAll(() => {
|
|||
});
|
||||
|
||||
describe('header', () => {
|
||||
it(`header`, async () => {
|
||||
it('header', async () => {
|
||||
const app = (await import('@/app')).default;
|
||||
const { config } = await import('@/config');
|
||||
const response = await app.request('/test/1');
|
||||
|
|
@ -32,7 +32,7 @@ describe('header', () => {
|
|||
expect(response.headers.get('x-rsshub-route')).toBe('/test/:id/:params?');
|
||||
});
|
||||
|
||||
it(`etag`, async () => {
|
||||
it('etag', async () => {
|
||||
const app = (await import('@/app')).default;
|
||||
const response = await app.request('/test/1', {
|
||||
headers: {
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ const { default: app } = await import('@/app');
|
|||
const parser = new Parser();
|
||||
|
||||
describe('filter', () => {
|
||||
it(`filter`, async () => {
|
||||
it('filter', async () => {
|
||||
const response = await app.request('/test/1?filter=Description4|Title5');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(2);
|
||||
|
|
@ -19,13 +19,13 @@ describe('filter', () => {
|
|||
expect(parsed.items[1].title).toBe('Title5');
|
||||
});
|
||||
|
||||
it(`filter filter_case_sensitive default`, async () => {
|
||||
it('filter filter_case_sensitive default', async () => {
|
||||
const response = await app.request('/test/1?filter=description4|title5');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(0);
|
||||
});
|
||||
|
||||
it(`filter filter_case_sensitive=false`, async () => {
|
||||
it('filter filter_case_sensitive=false', async () => {
|
||||
const response = await app.request('/test/1?filter=description4|title5&filter_case_sensitive=false');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(2);
|
||||
|
|
@ -33,35 +33,35 @@ describe('filter', () => {
|
|||
expect(parsed.items[1].title).toBe('Title5');
|
||||
});
|
||||
|
||||
it(`filter_title`, async () => {
|
||||
it('filter_title', async () => {
|
||||
const response = await app.request('/test/1?filter_title=Description4|Title5');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(1);
|
||||
expect(parsed.items[0].title).toBe('Title5');
|
||||
});
|
||||
|
||||
it(`filter_title filter_case_sensitive=false`, async () => {
|
||||
it('filter_title filter_case_sensitive=false', async () => {
|
||||
const response = await app.request('/test/1?filter_title=description4|title5&filter_case_sensitive=false');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(1);
|
||||
expect(parsed.items[0].title).toBe('Title5');
|
||||
});
|
||||
|
||||
it(`filter_description`, async () => {
|
||||
it('filter_description', async () => {
|
||||
const response = await app.request('/test/1?filter_description=Description4|Title5');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(1);
|
||||
expect(parsed.items[0].title).toBe('Title4');
|
||||
});
|
||||
|
||||
it(`filter_description filter_case_sensitive=false`, async () => {
|
||||
it('filter_description filter_case_sensitive=false', async () => {
|
||||
const response = await app.request('/test/1?filter_description=description4|title5&filter_case_sensitive=false');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(1);
|
||||
expect(parsed.items[0].title).toBe('Title4');
|
||||
});
|
||||
|
||||
it(`filter_author`, async () => {
|
||||
it('filter_author', async () => {
|
||||
const response = await app.request('/test/1?filter_author=DIYgod4|DIYgod5');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(2);
|
||||
|
|
@ -69,13 +69,13 @@ describe('filter', () => {
|
|||
expect(parsed.items[1].title).toBe('Title5');
|
||||
});
|
||||
|
||||
it(`filter_author filter_case_sensitive default`, async () => {
|
||||
it('filter_author filter_case_sensitive default', async () => {
|
||||
const response = await app.request('/test/1?filter_author=diygod4|diygod5');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(0);
|
||||
});
|
||||
|
||||
it(`filter_author filter_case_sensitive=false`, async () => {
|
||||
it('filter_author filter_case_sensitive=false', async () => {
|
||||
const response = await app.request('/test/1?filter_author=diygod4|diygod5&filter_case_sensitive=false');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(2);
|
||||
|
|
@ -83,7 +83,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[1].title).toBe('Title5');
|
||||
});
|
||||
|
||||
it(`filter_category`, async () => {
|
||||
it('filter_category', async () => {
|
||||
const response = await app.request('/test/filter?filter_category=Category0|Category1');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(2);
|
||||
|
|
@ -91,13 +91,13 @@ describe('filter', () => {
|
|||
expect(parsed.items[1].title).toBe('Filter Title2');
|
||||
});
|
||||
|
||||
it(`filter_category filter_case_sensitive default`, async () => {
|
||||
it('filter_category filter_case_sensitive default', async () => {
|
||||
const response = await app.request('/test/filter?filter_category=category0|category1');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(0);
|
||||
});
|
||||
|
||||
it(`filter_category filter_case_sensitive=false`, async () => {
|
||||
it('filter_category filter_case_sensitive=false', async () => {
|
||||
const response = await app.request('/test/filter?filter_category=category0|category1&filter_case_sensitive=false');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(2);
|
||||
|
|
@ -105,14 +105,14 @@ describe('filter', () => {
|
|||
expect(parsed.items[1].title).toBe('Filter Title2');
|
||||
});
|
||||
|
||||
it(`filter_category filter_case_sensitive=false category string`, async () => {
|
||||
it('filter_category filter_case_sensitive=false category string', async () => {
|
||||
const response = await app.request('/test/filter?filter_category=category3&filter_case_sensitive=false');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(1);
|
||||
expect(parsed.items[0].title).toBe('Filter Title3');
|
||||
});
|
||||
|
||||
it(`filter_category illegal_category`, async () => {
|
||||
it('filter_category illegal_category', async () => {
|
||||
const response = await app.request('/test/filter-illegal-category?filter_category=CategoryIllegal');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(1);
|
||||
|
|
@ -120,7 +120,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[0].categories?.[0]).toBe('CategoryIllegal');
|
||||
});
|
||||
|
||||
it(`filter_time`, async () => {
|
||||
it('filter_time', async () => {
|
||||
const response = await app.request('/test/current_time?filter_time=25');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(2);
|
||||
|
|
@ -128,7 +128,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[1].title).toBe('Title2');
|
||||
});
|
||||
|
||||
it(`filterout`, async () => {
|
||||
it('filterout', async () => {
|
||||
const response = await app.request('/test/1?filterout=Description4|Title5');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(3);
|
||||
|
|
@ -137,7 +137,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[2].title).toBe('Title3');
|
||||
});
|
||||
|
||||
it(`filterout filter_case_sensitive default`, async () => {
|
||||
it('filterout filter_case_sensitive default', async () => {
|
||||
const response = await app.request('/test/1?filterout=description4|title5');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(5);
|
||||
|
|
@ -146,7 +146,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[2].title).toBe('Title3');
|
||||
});
|
||||
|
||||
it(`filterout filter_case_sensitive=false`, async () => {
|
||||
it('filterout filter_case_sensitive=false', async () => {
|
||||
const response = await app.request('/test/1?filterout=description4|title5&filter_case_sensitive=false');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(3);
|
||||
|
|
@ -155,7 +155,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[2].title).toBe('Title3');
|
||||
});
|
||||
|
||||
it(`filterout_title`, async () => {
|
||||
it('filterout_title', async () => {
|
||||
const response = await app.request('/test/1?filterout_title=Description4|Title5');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(4);
|
||||
|
|
@ -165,7 +165,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[3].title).toBe('Title4');
|
||||
});
|
||||
|
||||
it(`filterout_title filter_case_sensitive=false`, async () => {
|
||||
it('filterout_title filter_case_sensitive=false', async () => {
|
||||
const response = await app.request('/test/1?filterout_title=description4|title5&filter_case_sensitive=false');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(4);
|
||||
|
|
@ -175,7 +175,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[3].title).toBe('Title4');
|
||||
});
|
||||
|
||||
it(`filterout_description`, async () => {
|
||||
it('filterout_description', async () => {
|
||||
const response = await app.request('/test/1?filterout_description=Description4|Title5');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(4);
|
||||
|
|
@ -185,7 +185,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[3].title).toBe('Title5');
|
||||
});
|
||||
|
||||
it(`filterout_description filter_case_sensitive=false`, async () => {
|
||||
it('filterout_description filter_case_sensitive=false', async () => {
|
||||
const response = await app.request('/test/1?filterout_description=description4|title5&filter_case_sensitive=false');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(4);
|
||||
|
|
@ -195,7 +195,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[3].title).toBe('Title5');
|
||||
});
|
||||
|
||||
it(`filterout_author`, async () => {
|
||||
it('filterout_author', async () => {
|
||||
const response = await app.request('/test/1?filterout_author=DIYgod4|DIYgod5');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(3);
|
||||
|
|
@ -204,7 +204,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[2].title).toBe('Title3');
|
||||
});
|
||||
|
||||
it(`filterout_author filter_case_sensitive default`, async () => {
|
||||
it('filterout_author filter_case_sensitive default', async () => {
|
||||
const response = await app.request('/test/1?filterout_author=diygod4|diygod5');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(5);
|
||||
|
|
@ -213,7 +213,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[2].title).toBe('Title3');
|
||||
});
|
||||
|
||||
it(`filterout_author filter_case_sensitive=false`, async () => {
|
||||
it('filterout_author filter_case_sensitive=false', async () => {
|
||||
const response = await app.request('/test/1?filterout_author=diygod4|diygod5&filter_case_sensitive=false');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(3);
|
||||
|
|
@ -222,7 +222,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[2].title).toBe('Title3');
|
||||
});
|
||||
|
||||
it(`filterout_category`, async () => {
|
||||
it('filterout_category', async () => {
|
||||
const response = await app.request('/test/filter?filterout_category=Category0|Category1');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(6);
|
||||
|
|
@ -231,7 +231,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[2].title).toBe('Title2');
|
||||
});
|
||||
|
||||
it(`filterout_category filter_case_sensitive default`, async () => {
|
||||
it('filterout_category filter_case_sensitive default', async () => {
|
||||
const response = await app.request('/test/filter?filterout_category=category0|category1');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(8);
|
||||
|
|
@ -241,7 +241,7 @@ describe('filter', () => {
|
|||
expect(parsed.items[3].title).toBe('Title1');
|
||||
});
|
||||
|
||||
it(`filterout_category filter_case_sensitive=false`, async () => {
|
||||
it('filterout_category filter_case_sensitive=false', async () => {
|
||||
const response = await app.request('/test/filter?filterout_category=category0|category1&filter_case_sensitive=false');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(6);
|
||||
|
|
@ -250,14 +250,14 @@ describe('filter', () => {
|
|||
expect(parsed.items[2].title).toBe('Title2');
|
||||
});
|
||||
|
||||
it(`filter combination`, async () => {
|
||||
it('filter combination', async () => {
|
||||
const response = await app.request('/test/filter?filter_title=Filter&filter_description=Description1');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(1);
|
||||
expect(parsed.items[0].title).toBe('Filter Title1');
|
||||
});
|
||||
|
||||
it(`filterout combination`, async () => {
|
||||
it('filterout combination', async () => {
|
||||
const response = await app.request('/test/filter?filterout_title=Filter&filterout_description=Description1');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(4);
|
||||
|
|
@ -266,7 +266,7 @@ describe('filter', () => {
|
|||
});
|
||||
|
||||
describe('limit', () => {
|
||||
it(`limit`, async () => {
|
||||
it('limit', async () => {
|
||||
const response = await app.request('/test/1?limit=3');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(3);
|
||||
|
|
@ -289,16 +289,16 @@ describe('sorted', () => {
|
|||
});
|
||||
|
||||
describe('tgiv', () => {
|
||||
it(`tgiv`, async () => {
|
||||
it('tgiv', async () => {
|
||||
const response = await app.request('/test/1?tgiv=test');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items[0].link).toBe(`https://t.me/iv?url=https%3A%2F%2Fgithub.com%2FDIYgod%2FRSSHub%2Fissues%2F1&rhash=test`);
|
||||
expect(parsed.items[1].link).toBe(`https://t.me/iv?url=https%3A%2F%2Fgithub.com%2FDIYgod%2FRSSHub%2Fissues%2F2&rhash=test`);
|
||||
expect(parsed.items[0].link).toBe('https://t.me/iv?url=https%3A%2F%2Fgithub.com%2FDIYgod%2FRSSHub%2Fissues%2F1&rhash=test');
|
||||
expect(parsed.items[1].link).toBe('https://t.me/iv?url=https%3A%2F%2Fgithub.com%2FDIYgod%2FRSSHub%2Fissues%2F2&rhash=test');
|
||||
});
|
||||
});
|
||||
|
||||
describe('empty', () => {
|
||||
it(`empty`, async () => {
|
||||
it('empty', async () => {
|
||||
const response1 = await app.request('/test/empty');
|
||||
expect(response1.status).toBe(503);
|
||||
expect(await response1.text()).toMatch(/Error: this route is empty/);
|
||||
|
|
@ -311,7 +311,7 @@ describe('empty', () => {
|
|||
});
|
||||
|
||||
describe('allow_empty', () => {
|
||||
it(`allow_empty`, async () => {
|
||||
it('allow_empty', async () => {
|
||||
const response = await app.request('/test/allow_empty');
|
||||
expect(response.status).toBe(200);
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
|
|
@ -320,7 +320,7 @@ describe('allow_empty', () => {
|
|||
});
|
||||
|
||||
describe('wrong_path', () => {
|
||||
it(`wrong_path`, async () => {
|
||||
it('wrong_path', async () => {
|
||||
const response = await app.request('/wrong');
|
||||
expect(response.status).toBe(404);
|
||||
expect(response.headers.get('cache-control')).toBe(`public, max-age=${config.cache.routeExpire}`);
|
||||
|
|
@ -329,7 +329,7 @@ describe('wrong_path', () => {
|
|||
});
|
||||
|
||||
describe('fulltext_mode', () => {
|
||||
it(`fulltext`, async () => {
|
||||
it('fulltext', async () => {
|
||||
const response = await app.request('/test/1?mode=fulltext');
|
||||
expect(response.status).toBe(200);
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
|
|
@ -338,7 +338,7 @@ describe('fulltext_mode', () => {
|
|||
});
|
||||
|
||||
describe('complicated_description', () => {
|
||||
it(`complicated_description`, async () => {
|
||||
it('complicated_description', async () => {
|
||||
const response = await app.request('/test/complicated');
|
||||
expect(response.status).toBe(200);
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
|
|
@ -359,7 +359,7 @@ describe('complicated_description', () => {
|
|||
});
|
||||
|
||||
describe('multimedia_description', () => {
|
||||
it(`multimedia_description`, async () => {
|
||||
it('multimedia_description', async () => {
|
||||
const response = await app.request('/test/multimedia');
|
||||
expect(response.status).toBe(200);
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
|
|
@ -375,7 +375,7 @@ describe('multimedia_description', () => {
|
|||
});
|
||||
|
||||
describe('sort', () => {
|
||||
it(`sort`, async () => {
|
||||
it('sort', async () => {
|
||||
const response = await app.request('/test/sort');
|
||||
expect(response.status).toBe(200);
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
|
|
@ -387,7 +387,7 @@ describe('sort', () => {
|
|||
});
|
||||
|
||||
describe('mess parameter', () => {
|
||||
it(`date`, async () => {
|
||||
it('date', async () => {
|
||||
const response = await app.request('/test/mess');
|
||||
expect(response.status).toBe(200);
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
|
|
@ -397,7 +397,7 @@ describe('mess parameter', () => {
|
|||
});
|
||||
|
||||
describe('opencc', () => {
|
||||
it(`opencc`, async () => {
|
||||
it('opencc', async () => {
|
||||
const response = await app.request('/test/opencc?opencc=t2s');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items[0].title).toBe('小可爱');
|
||||
|
|
@ -406,7 +406,7 @@ describe('opencc', () => {
|
|||
});
|
||||
|
||||
describe('brief', () => {
|
||||
it(`brief`, async () => {
|
||||
it('brief', async () => {
|
||||
const response = await app.request('/test/brief?brief=100');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items[0].title).toBe('小可愛');
|
||||
|
|
@ -417,7 +417,7 @@ describe('brief', () => {
|
|||
});
|
||||
|
||||
describe('multi parameter', () => {
|
||||
it(`filter before limit`, async () => {
|
||||
it('filter before limit', async () => {
|
||||
const response = await app.request('/test/filter-limit?filterout_title=2&limit=2');
|
||||
const parsed = await parser.parseString(await response.text());
|
||||
expect(parsed.items.length).toBe(2);
|
||||
|
|
|
|||
|
|
@ -414,7 +414,7 @@ const middleware: MiddlewareHandler = async (ctx, next) => {
|
|||
}
|
||||
}
|
||||
} else {
|
||||
throw new Error(`Invalid parameter brief. Please check the doc https://docs.rsshub.app/guide/parameters#shu-chu-jian-xun`);
|
||||
throw new Error('Invalid parameter brief. Please check the doc https://docs.rsshub.app/guide/parameters#shu-chu-jian-xun');
|
||||
}
|
||||
}
|
||||
// some parameters are processed in `anti-hotlink.js`
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import { config } from '@/config';
|
|||
|
||||
describe('registry', () => {
|
||||
// root
|
||||
it(`/`, async () => {
|
||||
it('/', async () => {
|
||||
const response = await app.request('/');
|
||||
expect(response.status).toBe(200);
|
||||
expect(response.headers.get('content-type')).toBe('text/html; charset=UTF-8');
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ export const route: Route = {
|
|||
async function handler(ctx) {
|
||||
const id = ctx.req.param('id');
|
||||
|
||||
const { data } = await got(`https://music.163.com/api/v1/artist/songs`, {
|
||||
const { data } = await got('https://music.163.com/api/v1/artist/songs', {
|
||||
headers: {
|
||||
Referer: 'https://music.163.com/',
|
||||
},
|
||||
|
|
|
|||
|
|
@ -52,49 +52,49 @@ async function handler(ctx) {
|
|||
let type;
|
||||
switch (selectedType) {
|
||||
case 1:
|
||||
type = `BD21K0DLwangning`; // 轻松一刻
|
||||
type = 'BD21K0DLwangning'; // 轻松一刻
|
||||
break;
|
||||
case 2:
|
||||
type = `CICMICLUwangning`; // 槽值
|
||||
type = 'CICMICLUwangning'; // 槽值
|
||||
break;
|
||||
case 3:
|
||||
type = `CICMOMBLwangning`; // 人间
|
||||
type = 'CICMOMBLwangning'; // 人间
|
||||
break;
|
||||
case 4:
|
||||
type = `CICMPVC5wangning`; // 大国小民
|
||||
type = 'CICMPVC5wangning'; // 大国小民
|
||||
break;
|
||||
case 5:
|
||||
type = `CICMLCOUwangning`; // 三三有梗
|
||||
type = 'CICMLCOUwangning'; // 三三有梗
|
||||
break;
|
||||
case 6:
|
||||
type = `D551V75Cwangning`; // 数读
|
||||
type = 'D551V75Cwangning'; // 数读
|
||||
break;
|
||||
case 7:
|
||||
type = `D55253RHwangning`; // 看客
|
||||
type = 'D55253RHwangning'; // 看客
|
||||
break;
|
||||
case 8:
|
||||
type = `D553A53Lwangning`; // 下划线
|
||||
type = 'D553A53Lwangning'; // 下划线
|
||||
break;
|
||||
case 9:
|
||||
type = `D553PGHQwangning`; // 谈心社
|
||||
type = 'D553PGHQwangning'; // 谈心社
|
||||
break;
|
||||
case 10:
|
||||
type = `CICMS5BIwangning`; // 哒哒
|
||||
type = 'CICMS5BIwangning'; // 哒哒
|
||||
break;
|
||||
case 11:
|
||||
type = `CQ9UDVKOwangning`; // 胖编怪聊
|
||||
type = 'CQ9UDVKOwangning'; // 胖编怪聊
|
||||
break;
|
||||
case 12:
|
||||
type = `CQ9UJIJNwangning`; // 曲一刀
|
||||
type = 'CQ9UJIJNwangning'; // 曲一刀
|
||||
break;
|
||||
case 13:
|
||||
type = `BD284UM8wangning`; // 今日之声
|
||||
type = 'BD284UM8wangning'; // 今日之声
|
||||
break;
|
||||
case 14:
|
||||
type = `CICMMGBHwangning`; // 浪潮
|
||||
type = 'CICMMGBHwangning'; // 浪潮
|
||||
break;
|
||||
case 15:
|
||||
type = `D5543R68wangning`; // 沸点
|
||||
type = 'D5543R68wangning'; // 沸点
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ async function handler(ctx: Context): Promise<Data> {
|
|||
const response = await got(currentUrl);
|
||||
const $ = load(response.data as any);
|
||||
|
||||
let selector = `.news`;
|
||||
let selector = '.news';
|
||||
if (tab !== 'all') {
|
||||
selector = `#${tab} > ${selector}`;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ async function handler(ctx: Context): Promise<Data> {
|
|||
const response = await got(currentUrl);
|
||||
const $ = load(response.data as any);
|
||||
|
||||
const selector = `form .newItem`;
|
||||
const selector = 'form .newItem';
|
||||
const items: DataItem[] = $(selector)
|
||||
.toArray()
|
||||
.map((item) => {
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ async function handler(ctx) {
|
|||
const tag = ctx.req.param('tag');
|
||||
const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit')) : 25;
|
||||
|
||||
const { data: response } = await got(`https://www.4gamers.com.tw/site/api/news/by-tag`, {
|
||||
const { data: response } = await got('https://www.4gamers.com.tw/site/api/news/by-tag', {
|
||||
searchParams: {
|
||||
tag,
|
||||
pageSize: limit,
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ function getPeriodConfig(period) {
|
|||
}
|
||||
return {
|
||||
url: `${SUB_URL}most-view/`,
|
||||
range: `all`,
|
||||
range: 'all',
|
||||
title: `${SUB_NAME_PREFIX} - Most views`,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ async function handler() {
|
|||
)
|
||||
);
|
||||
return {
|
||||
title: `中国经济50人论坛专家文章`,
|
||||
title: '中国经济50人论坛专家文章',
|
||||
link: 'https://www.50forum.org.cn/portal/list/index.html?id=6',
|
||||
description: '中国经济50人论坛专家文章',
|
||||
item: out,
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ export const SUB_NAME_PREFIX = '8KCosplay';
|
|||
export const SUB_URL = 'https://www.8kcosplay.com';
|
||||
|
||||
export const getPosts = async (limit: number, options?: { categories?: number; tags?: number }) => {
|
||||
const data = await ofetch(`https://www.8kcosplay.com/wp-json/wp/v2/posts`, {
|
||||
const data = await ofetch('https://www.8kcosplay.com/wp-json/wp/v2/posts', {
|
||||
query: {
|
||||
per_page: limit,
|
||||
_embed: '',
|
||||
|
|
@ -26,7 +26,7 @@ export const getPosts = async (limit: number, options?: { categories?: number; t
|
|||
|
||||
export const getCategoryInfo = (category: string) =>
|
||||
cache.tryGet(`8kcosplay:category:${category}`, async () => {
|
||||
const data = await ofetch(`https://www.8kcosplay.com/wp-json/wp/v2/categories`, {
|
||||
const data = await ofetch('https://www.8kcosplay.com/wp-json/wp/v2/categories', {
|
||||
query: {
|
||||
slug: category,
|
||||
},
|
||||
|
|
@ -45,7 +45,7 @@ export const getCategoryInfo = (category: string) =>
|
|||
|
||||
export const getTagInfo = (tag: string) =>
|
||||
cache.tryGet(`8kcosplay:tag:${tag}`, async () => {
|
||||
const data = await ofetch(`https://www.8kcosplay.com/wp-json/wp/v2/tags`, {
|
||||
const data = await ofetch('https://www.8kcosplay.com/wp-json/wp/v2/tags', {
|
||||
query: {
|
||||
slug: tag,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ async function handler() {
|
|||
const response = await got(`${host}/wp-json/wp/v2/posts?per_page=30`);
|
||||
const list = response.data;
|
||||
return {
|
||||
title: `ACG17 - 全部文章`,
|
||||
title: 'ACG17 - 全部文章',
|
||||
link: `${host}/blog`,
|
||||
description: 'ACG17 - 全部文章',
|
||||
item: list.map((item) => ({
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ async function handler(ctx) {
|
|||
return await buildData({
|
||||
link,
|
||||
url: link,
|
||||
title: `%title%`,
|
||||
title: '%title%',
|
||||
params: {
|
||||
title: 'AIEA Seminars',
|
||||
},
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ export const route: Route = {
|
|||
|
||||
async function handler(ctx) {
|
||||
const { type, name = 'newest' } = ctx.req.param();
|
||||
const u = name === 'newest' ? `https://aijishu.com/` : `https://aijishu.com/${type}/${name}`;
|
||||
const u = name === 'newest' ? 'https://aijishu.com/' : `https://aijishu.com/${type}/${name}`;
|
||||
const html = await got(u);
|
||||
|
||||
const $ = load(html.data);
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import { puppeteerGet, renderDesc } from './utils';
|
|||
const handler = async (ctx) => {
|
||||
const pub = ctx.req.param('pub');
|
||||
const jrn = ctx.req.param('jrn');
|
||||
const host = `https://pubs.aip.org`;
|
||||
const host = 'https://pubs.aip.org';
|
||||
const jrnlUrl = `${host}/${pub}/${jrn}/issue`;
|
||||
if (!isValidHost(pub)) {
|
||||
throw new InvalidParameterError('Invalid pub');
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ export const route: Route = {
|
|||
async function handler(ctx) {
|
||||
const pub = ctx.req.param('pub');
|
||||
const jrn = ctx.req.param('jrn');
|
||||
const host = `https://pubs.aip.org`;
|
||||
const host = 'https://pubs.aip.org';
|
||||
const jrnlUrl = `${host}/${pub}/${jrn}/issue`;
|
||||
|
||||
const { data: response } = await got.get(jrnlUrl);
|
||||
|
|
|
|||
|
|
@ -36,8 +36,8 @@ async function handler() {
|
|||
const data = await buildData({
|
||||
link,
|
||||
url: link,
|
||||
title: `%title%`,
|
||||
description: `%description%`,
|
||||
title: '%title%',
|
||||
description: '%description%',
|
||||
params: {
|
||||
title: '国航服务公告',
|
||||
description: '中国国际航空公司服务公告',
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ export const route: Route = {
|
|||
path: '/pkgs/:name/:routeParams?',
|
||||
parameters: { name: 'Packages name', routeParams: 'Filters of packages type. E.g. branch=edge&repo=main&arch=armv7&maintainer=Jakub%20Jirutka' },
|
||||
example: '/alpinelinux/pkgs/nodejs',
|
||||
description: `Alpine Linux packages update`,
|
||||
description: 'Alpine Linux packages update',
|
||||
handler,
|
||||
radar: [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ export const route: Route = {
|
|||
name: 'Platform Software',
|
||||
maintainers: ['JimenezLi'],
|
||||
handler,
|
||||
description: `> routeParms can be copied from original site URL, example: \`/alternativeto/platform/firefox/license=free\``,
|
||||
description: '> routeParms can be copied from original site URL, example: `/alternativeto/platform/firefox/license=free`',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ export const route: Route = {
|
|||
name: 'Software Alternatives',
|
||||
maintainers: ['JimenezLi'],
|
||||
handler,
|
||||
description: `> routeParms can be copied from original site URL, example: \`/alternativeto/software/cpp/license=opensource&platform=windows\``,
|
||||
description: '> routeParms can be copied from original site URL, example: `/alternativeto/software/cpp/license=opensource&platform=windows`',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ async function handler(ctx) {
|
|||
const id = ctx.req.param('id');
|
||||
|
||||
const rootUrl = 'https://www.annualreviews.org';
|
||||
const apiRootUrl = `https://api.crossref.org`;
|
||||
const apiRootUrl = 'https://api.crossref.org';
|
||||
const feedUrl = `${rootUrl}/r/${id}_rss`;
|
||||
const currentUrl = `${rootUrl}/toc/${id}/current`;
|
||||
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ async function handler(ctx) {
|
|||
.find(String.raw`news\:publication_date`)
|
||||
.text()
|
||||
);
|
||||
const lastmod = timezone(parseDate($(e).find(`lastmod`).text()), -4);
|
||||
const lastmod = timezone(parseDate($(e).find('lastmod').text()), -4);
|
||||
const language = LANGUAGE_MAP.get(
|
||||
$(e)
|
||||
.find(String.raw`news\:language`)
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ async function handler(ctx) {
|
|||
const { id, region } = ctx.req.param();
|
||||
const numericId = id.match(/id(\d+)/)?.[1];
|
||||
const baseUrl = 'https://podcasts.apple.com';
|
||||
const link = `${baseUrl}/${region || `cn`}/podcast/${id}`;
|
||||
const link = `${baseUrl}/${region || 'cn'}/podcast/${id}`;
|
||||
|
||||
const response = await ofetch(link);
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ async function handler(ctx) {
|
|||
const params = { kw: encodeURIComponent(kw) };
|
||||
ctx.req.path.includes('good') && (params.tab = 'good');
|
||||
cid && (params.cid = cid);
|
||||
const { data } = await got(`https://tieba.baidu.com/f`, {
|
||||
const { data } = await got('https://tieba.baidu.com/f', {
|
||||
headers: {
|
||||
Referer: 'https://tieba.baidu.com/',
|
||||
},
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ export const route: Route = {
|
|||
name: '用户帖子',
|
||||
maintainers: ['igxlin', 'nczitzk'],
|
||||
handler,
|
||||
description: `用户 ID 可以通过打开用户的主页后查看地址栏的 \`un\` 字段来获取。`,
|
||||
description: '用户 ID 可以通过打开用户的主页后查看地址栏的 `un` 字段来获取。',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ async function handler(ctx) {
|
|||
const title =
|
||||
$('title')
|
||||
.text()
|
||||
.replace(/-爱上本地宝,生活会更好/, '') + `焦点资讯`;
|
||||
.replace(/-爱上本地宝,生活会更好/, '') + '焦点资讯';
|
||||
|
||||
let items = $('ul.focus-news li')
|
||||
.toArray()
|
||||
|
|
|
|||
|
|
@ -100,8 +100,8 @@ async function handler(ctx) {
|
|||
}));
|
||||
|
||||
return {
|
||||
title: `Bestblogs.dev`,
|
||||
link: `https://www.bestblogs.dev/feeds`,
|
||||
title: 'Bestblogs.dev',
|
||||
link: 'https://www.bestblogs.dev/feeds',
|
||||
item: items,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -196,7 +196,7 @@ const getUserInfoFromLiveID = (liveID) => {
|
|||
const getVideoNameFromId = (aid, bvid) => {
|
||||
const key = `bili-videoname-from-id-${bvid || aid}`;
|
||||
return cache.tryGet(key, async () => {
|
||||
const { data } = await got(`https://api.bilibili.com/x/web-interface/view`, {
|
||||
const { data } = await got('https://api.bilibili.com/x/web-interface/view', {
|
||||
searchParams: {
|
||||
aid: aid || undefined,
|
||||
bvid: bvid || undefined,
|
||||
|
|
|
|||
|
|
@ -19,17 +19,17 @@ async function handler() {
|
|||
};
|
||||
}
|
||||
|
||||
const response = await ofetch(`https://api.bilibili.com/x/web-interface/nav`, {
|
||||
const response = await ofetch('https://api.bilibili.com/x/web-interface/nav', {
|
||||
headers: {
|
||||
Referer: `https://space.bilibili.com/1/`,
|
||||
Referer: 'https://space.bilibili.com/1/',
|
||||
Cookie: cookie as string,
|
||||
},
|
||||
});
|
||||
const isResponseValid = response.code === 0 && !!response.data.mid;
|
||||
|
||||
const subtitleResponse = await ofetch(`https://api.bilibili.com/x/player/wbi/v2?bvid=BV1iU411o7R2&cid=1550543560`, {
|
||||
const subtitleResponse = await ofetch('https://api.bilibili.com/x/player/wbi/v2?bvid=BV1iU411o7R2&cid=1550543560', {
|
||||
headers: {
|
||||
Referer: `https://www.bilibili.com/video/BV1iU411o7R2`,
|
||||
Referer: 'https://www.bilibili.com/video/BV1iU411o7R2',
|
||||
Cookie: cookie,
|
||||
},
|
||||
});
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ async function handler(ctx) {
|
|||
|
||||
return {
|
||||
title: `${name} 关注专栏动态`,
|
||||
link: `https://t.bilibili.com/?tab=64`,
|
||||
link: 'https://t.bilibili.com/?tab=64',
|
||||
item: out,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@ async function handler(ctx) {
|
|||
|
||||
return {
|
||||
title: `${name} 关注的动态`,
|
||||
link: `https://t.bilibili.com`,
|
||||
link: 'https://t.bilibili.com',
|
||||
description: `${name} 关注的动态`,
|
||||
item: items,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ async function handler(ctx) {
|
|||
|
||||
return {
|
||||
title: `${name} 关注视频动态`,
|
||||
link: `https://t.bilibili.com/?tab=8`,
|
||||
link: 'https://t.bilibili.com/?tab=8',
|
||||
item: out,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ async function handler() {
|
|||
method: 'get',
|
||||
url,
|
||||
headers: {
|
||||
Referer: `https://api.bilibili.com`,
|
||||
Referer: 'https://api.bilibili.com',
|
||||
},
|
||||
});
|
||||
const trending = response?.data?.data?.trending;
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ async function handler(ctx) {
|
|||
const link = 'https://manga.bilibili.com/account-center';
|
||||
const response = await got({
|
||||
method: 'POST',
|
||||
url: `https://manga.bilibili.com/twirp/bookshelf.v1.Bookshelf/ListFavorite?device=pc&platform=web`,
|
||||
url: 'https://manga.bilibili.com/twirp/bookshelf.v1.Bookshelf/ListFavorite?device=pc&platform=web',
|
||||
json: { page_num: 1, page_size, order: 2, wait_free: 0 },
|
||||
headers: {
|
||||
Referer: link,
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ async function handler(ctx) {
|
|||
const embed = !ctx.req.param('embed');
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: `https://api.bilibili.com/x/web-interface/popular`,
|
||||
url: 'https://api.bilibili.com/x/web-interface/popular',
|
||||
headers: {
|
||||
Referer: 'https://www.bilibili.com/',
|
||||
},
|
||||
|
|
@ -35,9 +35,9 @@ async function handler(ctx) {
|
|||
const list = response.data.data.list;
|
||||
|
||||
return {
|
||||
title: `bilibili 综合热门`,
|
||||
title: 'bilibili 综合热门',
|
||||
link: 'https://www.bilibili.com',
|
||||
description: `bilibili 综合热门`,
|
||||
description: 'bilibili 综合热门',
|
||||
item:
|
||||
list &&
|
||||
list.map((item) => ({
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ async function handler(ctx) {
|
|||
title: `[${item.new_ep.index_show}]${item.title}`,
|
||||
description: `${item.evaluate}<br><img src="${item.cover}">`,
|
||||
pubDate: new Date(item.new_ep.pub_time ?? Date.now()).toUTCString(),
|
||||
link: `https://www.bilibili.com/bangumi/play/` + (item.new_ep.id ? `ep${item.new_ep.id}` : `ss${item.season_id}`),
|
||||
link: 'https://www.bilibili.com/bangumi/play/' + (item.new_ep.id ? `ep${item.new_ep.id}` : `ss${item.season_id}`),
|
||||
})),
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ async function handler(ctx: Context) {
|
|||
const response = await got(`https://api.bilibili.com/x/space/wbi/arc/search?${params}`, {
|
||||
headers: {
|
||||
Referer: `https://space.bilibili.com/${uid}`,
|
||||
origin: `https://space.bilibili.com`,
|
||||
origin: 'https://space.bilibili.com',
|
||||
Cookie: cookie,
|
||||
},
|
||||
});
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ async function handler(ctx) {
|
|||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: `https://api.bilibili.com/x/v2/history/toview`,
|
||||
url: 'https://api.bilibili.com/x/v2/history/toview',
|
||||
headers: {
|
||||
Referer: `https://space.bilibili.com/${uid}/`,
|
||||
Cookie: cookie,
|
||||
|
|
|
|||
|
|
@ -466,8 +466,8 @@ const nodeRenderers = {
|
|||
}
|
||||
return nextNode(node.content);
|
||||
},
|
||||
br: () => `<br/>`,
|
||||
hr: () => `<br/>`,
|
||||
br: () => '<br/>',
|
||||
hr: () => '<br/>',
|
||||
ad: () => {},
|
||||
blockquote: async (node, nextNode) => `<blockquote>${await nextNode(node.content)}</blockquote>`,
|
||||
quote: async (node, nextNode) => `<blockquote>${await nextNode(node.content)}</blockquote>`,
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ export const route: Route = {
|
|||
name: '党委学生工作部',
|
||||
maintainers: ['Fatpandac'],
|
||||
handler,
|
||||
description: `\`https://dwxgb.bnu.edu.cn/xwzx/tzgg/index.html\` 则对应为 \`/bnu/dwxgb/xwzx/tzgg`,
|
||||
description: '`https://dwxgb.bnu.edu.cn/xwzx/tzgg/index.html` 则对应为 `/bnu/dwxgb/xwzx/tzgg',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ export const route: Route = {
|
|||
name: '教育学部-培养动态',
|
||||
maintainers: ['etShaw-zh'],
|
||||
handler,
|
||||
description: `\`https://fe.bnu.edu.cn/pc/cms1info/list/1/18\` 则对应为 \`/bnu/fe/18`,
|
||||
description: '`https://fe.bnu.edu.cn/pc/cms1info/list/1/18` 则对应为 `/bnu/fe/18',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ export const handler = async (ctx) => {
|
|||
const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 15;
|
||||
|
||||
const rootUrl = 'https://www.c114.com.cn';
|
||||
const currentUrl = new URL(`news/roll.asp${original === 'true' ? `?o=true` : ''}`, rootUrl).href;
|
||||
const currentUrl = new URL(`news/roll.asp${original === 'true' ? '?o=true' : ''}`, rootUrl).href;
|
||||
|
||||
const { data: response } = await got(currentUrl, {
|
||||
responseType: 'buffer',
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ export const route: Route = {
|
|||
name: '用户博客',
|
||||
maintainers: [],
|
||||
handler,
|
||||
description: `通过提取文章全文,以提供比官方源更佳的阅读体验.`,
|
||||
description: '通过提取文章全文,以提供比官方源更佳的阅读体验.',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
@ -94,7 +94,7 @@ async function handler(ctx) {
|
|||
const items = await Promise.all(posts.map((item) => cache.tryGet(item.link, () => parseBlogArticle(item))));
|
||||
|
||||
return {
|
||||
title: `财新博客 - 全部`,
|
||||
title: '财新博客 - 全部',
|
||||
link: 'https://blog.caixin.com',
|
||||
// description: introduce,
|
||||
// image: avatar,
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ export const route: Route = {
|
|||
maintainers: ['tpnonthealps'],
|
||||
handler,
|
||||
url: 'caixin.com/',
|
||||
description: `说明:此 RSS feed 会自动抓取财新网的最新文章,但不包含 FM 及视频内容。订阅用户可根据文档设置环境变量后,在url传入\`fulltext=\`以解锁全文。`,
|
||||
description: '说明:此 RSS feed 会自动抓取财新网的最新文章,但不包含 FM 及视频内容。订阅用户可根据文档设置环境变量后,在url传入`fulltext=`以解锁全文。',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import type { Namespace } from '@/types';
|
|||
export const namespace: Namespace = {
|
||||
name: '财新博客',
|
||||
url: 'caixin.com',
|
||||
description: `> 网站部分内容需要付费订阅,RSS 仅做更新提醒,不含付费内容。若需要得到付费内容全文,请使用订阅账户在手机网页版登录,然后设置\`CAIXIN_COOKIE\`为至少包含cookie中的以下字段: \`SA_USER_UID\`, \`SA_USER_UNIT\`, \`SA_USER_DEVICE_TYPE\`, \`USER_LOGIN_CODE\``,
|
||||
description:
|
||||
'> 网站部分内容需要付费订阅,RSS 仅做更新提醒,不含付费内容。若需要得到付费内容全文,请使用订阅账户在手机网页版登录,然后设置`CAIXIN_COOKIE`为至少包含cookie中的以下字段: `SA_USER_UID`, `SA_USER_UNIT`, `SA_USER_DEVICE_TYPE`, `USER_LOGIN_CODE`',
|
||||
lang: 'zh-CN',
|
||||
};
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ export async function getFulltext(url: string) {
|
|||
const sigValueHex = hextob64(sig.sign());
|
||||
|
||||
const isWeekly = url.includes('weekly');
|
||||
const res = await ofetch(`https://gateway.caixin.com/api/newauth/checkAuthByIdJsonp`, {
|
||||
const res = await ofetch('https://gateway.caixin.com/api/newauth/checkAuthByIdJsonp', {
|
||||
query: {
|
||||
type: 1,
|
||||
page: isWeekly ? 0 : 1,
|
||||
|
|
|
|||
|
|
@ -3,5 +3,5 @@ import type { Namespace } from '@/types';
|
|||
export const namespace: Namespace = {
|
||||
name: 'Castbox',
|
||||
url: 'castbox.fm',
|
||||
description: `Castbox is a podcast distribution network and producer.`,
|
||||
description: 'Castbox is a podcast distribution network and producer.',
|
||||
};
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ export const route: Route = {
|
|||
maintainers: ['shengmaosu'],
|
||||
handler,
|
||||
url: 'ciee.cau.edu.cn/col/col26712/index.html',
|
||||
description: `#### 信电学院 {#zhong-guo-nong-ye-da-xue-yan-zhao-wang-tong-zhi-gong-gao-xin-dian-xue-yuan}`,
|
||||
description: '#### 信电学院 {#zhong-guo-nong-ye-da-xue-yan-zhao-wang-tong-zhi-gong-gao-xin-dian-xue-yuan}',
|
||||
};
|
||||
|
||||
async function handler() {
|
||||
|
|
|
|||
|
|
@ -4,69 +4,69 @@ import got from '@/utils/got';
|
|||
|
||||
const categories = {
|
||||
jgdt: {
|
||||
baseUrl: `http://www.cbirc.gov.cn`,
|
||||
baseUrl: 'http://www.cbirc.gov.cn',
|
||||
description: '监管动态',
|
||||
link: `http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=915,pageIndex=1,pageSize=18.json`,
|
||||
link: 'http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=915,pageIndex=1,pageSize=18.json',
|
||||
title: '监管动态',
|
||||
},
|
||||
ggtz: {
|
||||
baseUrl: `http://www.cbirc.gov.cn`,
|
||||
baseUrl: 'http://www.cbirc.gov.cn',
|
||||
description: '公告通知',
|
||||
link: `http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=925,pageIndex=1,pageSize=18.json`,
|
||||
link: 'http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=925,pageIndex=1,pageSize=18.json',
|
||||
title: '公告通知',
|
||||
},
|
||||
zcfg: {
|
||||
baseUrl: `http://www.cbirc.gov.cn`,
|
||||
baseUrl: 'http://www.cbirc.gov.cn',
|
||||
description: '政策法规',
|
||||
link: `http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=926,pageIndex=1,pageSize=18.json`,
|
||||
link: 'http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=926,pageIndex=1,pageSize=18.json',
|
||||
title: '政策法规',
|
||||
},
|
||||
zcjd: {
|
||||
baseUrl: `http://www.cbirc.gov.cn`,
|
||||
baseUrl: 'http://www.cbirc.gov.cn',
|
||||
description: '政策解读',
|
||||
link: `http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=916,pageIndex=1,pageSize=18.json`,
|
||||
link: 'http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=916,pageIndex=1,pageSize=18.json',
|
||||
title: '政策解读',
|
||||
},
|
||||
zqyj: {
|
||||
baseUrl: `http://www.cbirc.gov.cn`,
|
||||
baseUrl: 'http://www.cbirc.gov.cn',
|
||||
description: '征求意见',
|
||||
link: `http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=951,pageIndex=1,pageSize=18.json`,
|
||||
link: 'http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=951,pageIndex=1,pageSize=18.json',
|
||||
title: '征求意见',
|
||||
},
|
||||
xzxk: {
|
||||
baseUrl: `http://www.cbirc.gov.cn`,
|
||||
baseUrl: 'http://www.cbirc.gov.cn',
|
||||
description: '行政许可',
|
||||
link: `http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=930,pageIndex=1,pageSize=18.json`,
|
||||
link: 'http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=930,pageIndex=1,pageSize=18.json',
|
||||
title: '行政许可',
|
||||
},
|
||||
xzcf: {
|
||||
baseUrl: `http://www.cbirc.gov.cn`,
|
||||
baseUrl: 'http://www.cbirc.gov.cn',
|
||||
description: '行政处罚',
|
||||
link: `http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=931,pageIndex=1,pageSize=18.json`,
|
||||
link: 'http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=931,pageIndex=1,pageSize=18.json',
|
||||
title: '行政处罚',
|
||||
},
|
||||
xzjgcs: {
|
||||
baseUrl: `http://www.cbirc.gov.cn`,
|
||||
baseUrl: 'http://www.cbirc.gov.cn',
|
||||
description: '行政监管措施',
|
||||
link: `http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=932,pageIndex=1,pageSize=18.json`,
|
||||
link: 'http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=932,pageIndex=1,pageSize=18.json',
|
||||
title: '行政监管措施',
|
||||
},
|
||||
gzlw: {
|
||||
baseUrl: `http://www.cbirc.gov.cn`,
|
||||
baseUrl: 'http://www.cbirc.gov.cn',
|
||||
description: '工作论文',
|
||||
link: `http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=934,pageIndex=1,pageSize=18.json`,
|
||||
link: 'http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=934,pageIndex=1,pageSize=18.json',
|
||||
title: '工作论文',
|
||||
},
|
||||
jrzgyj: {
|
||||
baseUrl: `http://www.cbirc.gov.cn`,
|
||||
baseUrl: 'http://www.cbirc.gov.cn',
|
||||
description: '金融监管研究',
|
||||
link: `http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=935,pageIndex=1,pageSize=18.json`,
|
||||
link: 'http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=935,pageIndex=1,pageSize=18.json',
|
||||
title: '金融监管研究',
|
||||
},
|
||||
tjxx: {
|
||||
baseUrl: `http://www.cbirc.gov.cn`,
|
||||
baseUrl: 'http://www.cbirc.gov.cn',
|
||||
description: '统计信息',
|
||||
link: `http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=954,pageIndex=1,pageSize=18.json`,
|
||||
link: 'http://www.cbirc.gov.cn/cn/static/data/DocInfo/SelectDocByItemIdAndChild/data_itemId=954,pageIndex=1,pageSize=18.json',
|
||||
title: '统计信息',
|
||||
},
|
||||
};
|
||||
|
|
@ -101,7 +101,7 @@ async function handler(ctx) {
|
|||
method: 'get',
|
||||
url: cat.link,
|
||||
headers: {
|
||||
Referer: `http://www.cbirc.gov.cn`,
|
||||
Referer: 'http://www.cbirc.gov.cn',
|
||||
},
|
||||
});
|
||||
return resp.data;
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ export const route: Route = {
|
|||
maintainers: ['zengxs'],
|
||||
handler,
|
||||
url: 'tv.cctv.com/lm/xwlb',
|
||||
description: `新闻联播内容摘要。`,
|
||||
description: '新闻联播内容摘要。',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ export const route: Route = {
|
|||
};
|
||||
|
||||
async function handler() {
|
||||
const rootUrl = `https://chaping.cn/`;
|
||||
const rootUrl = 'https://chaping.cn/';
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: rootUrl,
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ async function handler() {
|
|||
);
|
||||
|
||||
return {
|
||||
title: `中国研究生招生信息网 - 热点`,
|
||||
title: '中国研究生招生信息网 - 热点',
|
||||
link: host,
|
||||
description: '中国研究生招生信息网 - 热点',
|
||||
item: items,
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ async function handler() {
|
|||
);
|
||||
|
||||
return {
|
||||
title: `中国研究生招生信息网 - 考研动态`,
|
||||
title: '中国研究生招生信息网 - 考研动态',
|
||||
link: `${host}/kyzx/kydt/`,
|
||||
description: '中国研究生招生信息网 - 考研动态',
|
||||
item: items,
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ async function handler() {
|
|||
link: `${hostURL}/${item.fullPath}`,
|
||||
author: String(item.fullPath.split('/', 1)),
|
||||
enclosure_url: item.max_res_url,
|
||||
enclosure_type: `image/png`,
|
||||
enclosure_type: 'image/png',
|
||||
category: item.topics,
|
||||
})),
|
||||
};
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ async function handler(ctx) {
|
|||
|
||||
return {
|
||||
title: `Civitai model ${params.modelId} discussions`,
|
||||
link: `https://civitai.com/`,
|
||||
link: 'https://civitai.com/',
|
||||
item: items,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ export const route: Route = {
|
|||
};
|
||||
|
||||
async function handler() {
|
||||
const { data } = await got(`https://civitai.com/api/v1/models`, {
|
||||
const { data } = await got('https://civitai.com/api/v1/models', {
|
||||
searchParams: {
|
||||
limit: 20,
|
||||
sort: 'Newest',
|
||||
|
|
@ -45,8 +45,8 @@ async function handler() {
|
|||
}));
|
||||
|
||||
return {
|
||||
title: `Civitai latest models`,
|
||||
link: `https://civitai.com/`,
|
||||
title: 'Civitai latest models',
|
||||
link: 'https://civitai.com/',
|
||||
item: items,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ export const route: Route = {
|
|||
maintainers: ['hujingnb'],
|
||||
handler,
|
||||
url: 'www.cnblogs.com/pick',
|
||||
description: `在博客园主页的分类出可查看所有类型。例如,go 的分类地址为: \`https://www.cnblogs.com/cate/go/\`, 则: [\`/cnblogs/cate/go\`](https://rsshub.app/cnblogs/cate/go)`,
|
||||
description: '在博客园主页的分类出可查看所有类型。例如,go 的分类地址为: `https://www.cnblogs.com/cate/go/`, 则: [`/cnblogs/cate/go`](https://rsshub.app/cnblogs/cate/go)',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ async function handler() {
|
|||
);
|
||||
|
||||
return {
|
||||
title: `CNCF - Reports`,
|
||||
title: 'CNCF - Reports',
|
||||
link: url,
|
||||
item: items,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ export const route: Route = {
|
|||
name: '学习时报',
|
||||
maintainers: ['nczitzk'],
|
||||
handler,
|
||||
description: `如订阅 **第 A1 版:国内大局**,路由为 [\`/cntheory/paper/国内大局\`](https://rsshub.app/cntheory/paper/国内大局)。`,
|
||||
description: '如订阅 **第 A1 版:国内大局**,路由为 [`/cntheory/paper/国内大局`](https://rsshub.app/cntheory/paper/国内大局)。',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ export const route: Route = {
|
|||
const { id } = ctx.req.param();
|
||||
const baseUrl = 'https://comic-fuz.com';
|
||||
const openUrl = `${baseUrl}/magazine/${id}`;
|
||||
const imgUrl = `https://img.comic-fuz.com`;
|
||||
const imgUrl = 'https://img.comic-fuz.com';
|
||||
|
||||
const response = await ofetch(openUrl, {
|
||||
headers: {
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ export const route: Route = {
|
|||
const { id } = ctx.req.param();
|
||||
const baseUrl = 'https://comic-fuz.com';
|
||||
const openUrl = `${baseUrl}/manga/${id}`;
|
||||
const imgUrl = `https://img.comic-fuz.com`;
|
||||
const imgUrl = 'https://img.comic-fuz.com';
|
||||
|
||||
const response = await ofetch(openUrl, {
|
||||
headers: {
|
||||
|
|
|
|||
|
|
@ -58,11 +58,11 @@ const getLinkAndTitle = (type, period) => {
|
|||
statDays: '30days',
|
||||
},
|
||||
};
|
||||
link = `#/feed/coolPictureList?statDays=` + trans[period].statDays + `&listType=statFavNum&buildCard=1&title=` + trans[period].description + `&page=1`;
|
||||
link = '#/feed/coolPictureList?statDays=' + trans[period].statDays + '&listType=statFavNum&buildCard=1&title=' + trans[period].description + '&page=1';
|
||||
res.title = '酷图榜-' + trans[period].description;
|
||||
} else {
|
||||
link = `#/feed/statList?statType=` + periods[period].statType + `&sortField=` + types[type].sortField + `&title=` + periods[period].description + `&page=1`;
|
||||
res.title = types[type].title + `-` + periods[period].description;
|
||||
link = '#/feed/statList?statType=' + periods[period].statType + '&sortField=' + types[type].sortField + '&title=' + periods[period].description + '&page=1';
|
||||
res.title = types[type].title + '-' + periods[period].description;
|
||||
}
|
||||
res.link = baseURL + encodeURIComponent(link);
|
||||
return res;
|
||||
|
|
@ -129,7 +129,7 @@ async function handler(ctx) {
|
|||
return {
|
||||
title,
|
||||
link: 'https://www.coolapk.com/',
|
||||
description: `热榜-` + title,
|
||||
description: '热榜-' + title,
|
||||
item: out,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ async function handler(ctx) {
|
|||
}
|
||||
return {
|
||||
title: `酷安话题-${tag}`,
|
||||
link: `https://www.coolapk.com/`,
|
||||
link: 'https://www.coolapk.com/',
|
||||
description: `酷安话题-${tag}`,
|
||||
item: out,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -88,13 +88,13 @@ const parseDynamic = async (item) => {
|
|||
const result = await ofetch(itemUrl, {
|
||||
headers: getHeaders(),
|
||||
});
|
||||
const message = `<p>` + result.data?.message.split('\n').join('<br>') + `</p>`;
|
||||
const message = '<p>' + result.data?.message.split('\n').join('<br>') + '</p>';
|
||||
const picArr = item.picArr.filter(Boolean).map((i) => `<img src="${i}">`); // 若无图片,item.picArr=[""]
|
||||
return message + picArr.join('');
|
||||
});
|
||||
} else {
|
||||
const picArr = item.picArr.filter(Boolean).map((i) => `<img src="${i}">`);
|
||||
description = `<p>` + item.message + `</p>` + picArr.join('');
|
||||
description = '<p>' + item.message + '</p>' + picArr.join('');
|
||||
}
|
||||
const $ = load('<div class="title-filter">' + description + '</div>');
|
||||
title = $('.title-filter').text().trim(); // no need to perform substring because it's will be handled by RSSHub 'TITLE_LENGTH_LIMIT'
|
||||
|
|
@ -103,7 +103,7 @@ const parseDynamic = async (item) => {
|
|||
|
||||
if (type === 17) {
|
||||
const keys = item.extra_key.split(',');
|
||||
description += `<p>` + item.vote.message_title + ` 已选${keys.length}项</p>`;
|
||||
description += '<p>' + item.vote.message_title + ` 已选${keys.length}项</p>`;
|
||||
for (const i of item.vote.options) {
|
||||
if (keys.includes(String(i.id))) {
|
||||
description += `<p>${i.title}√</p>`;
|
||||
|
|
|
|||
|
|
@ -121,12 +121,12 @@ export const route: Route = {
|
|||
{
|
||||
title: '中国人事考试网通知公告',
|
||||
source: ['www.cpta.com.cn/notice.html', 'www.cpta.com.cn'],
|
||||
target: `/notice`,
|
||||
target: '/notice',
|
||||
},
|
||||
{
|
||||
title: '中国人事考试网成绩发布',
|
||||
source: ['www.cpta.com.cn/performance.html', 'www.cpta.com.cn'],
|
||||
target: `/performance`,
|
||||
target: '/performance',
|
||||
},
|
||||
],
|
||||
example: '/cpta/notice',
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import ofetch from '@/utils/ofetch';
|
|||
import { parseDate } from '@/utils/parse-date';
|
||||
|
||||
export const baseUrl = 'https://app.daily.dev';
|
||||
const gqlUrl = `https://api.daily.dev/graphql`;
|
||||
const gqlUrl = 'https://api.daily.dev/graphql';
|
||||
export const variables = {
|
||||
version: 54,
|
||||
loggedIn: false,
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ export const route: Route = {
|
|||
name: '票务更新',
|
||||
maintainers: ['hoilc', 'Konano'],
|
||||
handler,
|
||||
description: `城市、分类名、子分类名,请参见[大麦网搜索页面](https://search.damai.cn/search.htm)`,
|
||||
description: '城市、分类名、子分类名,请参见[大麦网搜索页面](https://search.damai.cn/search.htm)',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ async function handler(ctx) {
|
|||
|
||||
return {
|
||||
title: `当当开放平台 - ${typeMap[type] || typeMap[0]}`,
|
||||
link: `https://open.dangdang.com/home/notice/message/1`,
|
||||
link: 'https://open.dangdang.com/home/notice/message/1',
|
||||
item: result,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,16 +28,16 @@ async function handler(ctx) {
|
|||
const limit = ctx.req.query('limit') ? Number(ctx.req.query('limit')) : 30;
|
||||
const browser = await puppeteer();
|
||||
|
||||
let link = `https://www.dcard.tw/f`;
|
||||
let api = `https://www.dcard.tw/service/api/v2`;
|
||||
let title = `Dcard - `;
|
||||
let link = 'https://www.dcard.tw/f';
|
||||
let api = 'https://www.dcard.tw/service/api/v2';
|
||||
let title = 'Dcard - ';
|
||||
|
||||
if (section !== 'posts' && section !== 'popular' && section !== 'latest') {
|
||||
link += `/${section}`;
|
||||
api += `/forums/${section}`;
|
||||
title += `${section} - `;
|
||||
}
|
||||
api += `/posts`;
|
||||
api += '/posts';
|
||||
if (type === 'popular') {
|
||||
link += '?latest=false';
|
||||
api += '?popular=true';
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ async function handler() {
|
|||
});
|
||||
|
||||
return {
|
||||
title: `雨苁`,
|
||||
title: '雨苁',
|
||||
link: String(url),
|
||||
item: items,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ async function handler(ctx) {
|
|||
const headers = {
|
||||
Accept: 'application/json, text/plain, */*',
|
||||
'Content-Type': 'application/json;charset=UTF-8',
|
||||
Referer: `https://m.igetget.com/share/course/free/detail?id=nb9L2q1e3OxKBPNsdoJrgN8P0Rwo6B`,
|
||||
Referer: 'https://m.igetget.com/share/course/free/detail?id=nb9L2q1e3OxKBPNsdoJrgN8P0Rwo6B',
|
||||
Origin: 'https://m.igetget.com',
|
||||
};
|
||||
const max_id = 0;
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ export const handler = async (ctx: Context): Promise<Data> => {
|
|||
|
||||
const items: DataItem[] = ProcessFeedItems(limit, response.data.dataList, $);
|
||||
|
||||
const title: string | undefined = $(`div.tags-detail-top-1 h2`).text();
|
||||
const title: string | undefined = $('div.tags-detail-top-1 h2').text();
|
||||
|
||||
return {
|
||||
title: `${$('title').text().trim().split(/\s/)[0]}${title ? ` - ${title}` : id}`,
|
||||
|
|
|
|||
|
|
@ -69,9 +69,9 @@ async function handler(ctx) {
|
|||
});
|
||||
|
||||
return {
|
||||
title: `二柄APP`,
|
||||
link: `https://www.diershoubing.com`,
|
||||
description: `二柄APP新闻`,
|
||||
title: '二柄APP',
|
||||
link: 'https://www.diershoubing.com',
|
||||
description: '二柄APP新闻',
|
||||
item: items,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ export const route: Route = {
|
|||
requireConfig: [
|
||||
{
|
||||
name: 'DISCOURSE_CONFIG_*',
|
||||
description: `Configure the Discourse environment variables referring to [https://docs.rsshub.app/deploy/config#discourse](https://docs.rsshub.app/deploy/config#discourse).`,
|
||||
description: 'Configure the Discourse environment variables referring to [https://docs.rsshub.app/deploy/config#discourse](https://docs.rsshub.app/deploy/config#discourse).',
|
||||
},
|
||||
],
|
||||
requirePuppeteer: false,
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import { getItemList as detailItemList } from './detail';
|
|||
import { ensureDomain } from './utils';
|
||||
|
||||
function getItemList($) {
|
||||
const list = $(`#vod .list-group-item`)
|
||||
const list = $('#vod .list-group-item')
|
||||
.toArray()
|
||||
.map((item) => {
|
||||
item = $(item);
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ const ProcessImg = (content) => {
|
|||
|
||||
const ProcessFeed = async (ctx, type, id) => {
|
||||
const link = `https://www.dongqiudi.com/${type}/${id}.html`;
|
||||
const apiUrl = `https://api.dongqiudi.com/v3/archive/app/channel/feeds`;
|
||||
const apiUrl = 'https://api.dongqiudi.com/v3/archive/app/channel/feeds';
|
||||
const { data: response } = await got(link);
|
||||
|
||||
let name;
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ async function handler(ctx) {
|
|||
|
||||
return {
|
||||
title: `豆瓣电影分类${score ? `超过 ${score} 分的` : ''}影视`,
|
||||
link: `https://movie.douban.com/tag/#/?sort=U&range=0,10&tags=`,
|
||||
link: 'https://movie.douban.com/tag/#/?sort=U&range=0,10&tags=',
|
||||
item: movies
|
||||
.map((item) => {
|
||||
const itemScore = Number.parseFloat(item.rate) || 0;
|
||||
|
|
|
|||
|
|
@ -25,13 +25,13 @@ async function handler(ctx) {
|
|||
const score = Number.parseFloat(ctx.req.param('score')) || 0;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: `https://movie.douban.com/cinema/nowplaying/beijing`,
|
||||
url: 'https://movie.douban.com/cinema/nowplaying/beijing',
|
||||
});
|
||||
const $ = load(response.data);
|
||||
|
||||
return {
|
||||
title: `正在上映的${score ? `超过 ${score} 分的` : ''}电影`,
|
||||
link: `https://movie.douban.com/cinema/nowplaying/`,
|
||||
link: 'https://movie.douban.com/cinema/nowplaying/',
|
||||
item: $('.list-item')
|
||||
.toArray()
|
||||
.map((i) => {
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ export const route: Route = {
|
|||
<img loading="lazy" src="/img/readable-douban.png" alt="豆瓣读书的可读豆瓣广播 RSS" />`,
|
||||
};
|
||||
|
||||
const headers = { Referer: `https://m.douban.com/` };
|
||||
const headers = { Referer: 'https://m.douban.com/' };
|
||||
|
||||
function tryFixStatus(status) {
|
||||
let result = { isFixSuccess: true, why: '' };
|
||||
|
|
@ -222,20 +222,20 @@ function getContentByActivity(ctx, item, params = {}, picsPrefixes = []) {
|
|||
activityInDesc += `<a href="${status.reshared_status.author.url}" target="_blank" rel="noopener noreferrer">`;
|
||||
}
|
||||
if (authorNameBold) {
|
||||
activityInDesc += `<strong>`;
|
||||
activityInDesc += '<strong>';
|
||||
}
|
||||
activityInDesc += status.reshared_status.author.name;
|
||||
if (authorNameBold) {
|
||||
activityInDesc += `</strong>`;
|
||||
activityInDesc += '</strong>';
|
||||
}
|
||||
if (readable) {
|
||||
activityInDesc += `</a>`;
|
||||
activityInDesc += '</a>';
|
||||
}
|
||||
activityInDesc += ` 的广播`;
|
||||
activityInDesc += ' 的广播';
|
||||
activityInTitle = `转发 ${status.reshared_status.author.name} 的广播`;
|
||||
} else {
|
||||
activityInDesc = `转发广播`;
|
||||
activityInTitle = `转发广播`;
|
||||
activityInDesc = '转发广播';
|
||||
activityInTitle = '转发广播';
|
||||
}
|
||||
} else {
|
||||
activityInDesc = status.activity;
|
||||
|
|
@ -251,16 +251,16 @@ function getContentByActivity(ctx, item, params = {}, picsPrefixes = []) {
|
|||
usernameAndAvatar += `<img width="${sizeOfAuthorAvatar}" height="${sizeOfAuthorAvatar}" src="${status.author.avatar}" ${readable ? 'hspace="8" vspace="8" align="left"' : ''} />`;
|
||||
}
|
||||
if (authorNameBold) {
|
||||
usernameAndAvatar += `<strong>`;
|
||||
usernameAndAvatar += '<strong>';
|
||||
}
|
||||
usernameAndAvatar += status.author.name;
|
||||
if (authorNameBold) {
|
||||
usernameAndAvatar += `</strong>`;
|
||||
usernameAndAvatar += '</strong>';
|
||||
}
|
||||
if (readable) {
|
||||
usernameAndAvatar += `</a>`;
|
||||
usernameAndAvatar += '</a>';
|
||||
}
|
||||
usernameAndAvatar += ` `;
|
||||
usernameAndAvatar += ' ';
|
||||
description += usernameAndAvatar + activityInDesc + (showColonInDesc ? ': ' : '');
|
||||
}
|
||||
|
||||
|
|
@ -299,7 +299,7 @@ function getContentByActivity(ctx, item, params = {}, picsPrefixes = []) {
|
|||
}
|
||||
|
||||
if (status.images && status.images.length) {
|
||||
description += readable ? `<br clear="both" /><div style="clear: both"></div>` : `<br>`;
|
||||
description += readable ? '<br clear="both" /><div style="clear: both"></div>' : '<br>';
|
||||
|
||||
// 一些RSS Reader会识别所有<img>标签作为内含图片显示,我们不想要头像也作为内含图片之一
|
||||
// 让所有配图在description的最前面再次出现一次,但宽高设为0
|
||||
|
|
@ -320,7 +320,7 @@ function getContentByActivity(ctx, item, params = {}, picsPrefixes = []) {
|
|||
}
|
||||
|
||||
if (status.video_info) {
|
||||
description += readable ? `<br clear="both" /><div style="clear: both"></div>` : `<br>`;
|
||||
description += readable ? '<br clear="both" /><div style="clear: both"></div>' : '<br>';
|
||||
const videoCover = status.video_info.cover_url;
|
||||
const videoSrc = status.video_info.video_url;
|
||||
if (videoSrc) {
|
||||
|
|
@ -350,16 +350,16 @@ function getContentByActivity(ctx, item, params = {}, picsPrefixes = []) {
|
|||
usernameAndAvatar += `<a href="${status.parent_status.author.url}">`;
|
||||
}
|
||||
if (authorNameBold) {
|
||||
usernameAndAvatar += `<strong>`;
|
||||
usernameAndAvatar += '<strong>';
|
||||
}
|
||||
usernameAndAvatar += status.parent_status.author.name;
|
||||
if (authorNameBold) {
|
||||
usernameAndAvatar += `</strong>`;
|
||||
usernameAndAvatar += '</strong>';
|
||||
}
|
||||
if (readable) {
|
||||
usernameAndAvatar += `</a>`;
|
||||
usernameAndAvatar += '</a>';
|
||||
}
|
||||
usernameAndAvatar += `: `;
|
||||
usernameAndAvatar += ': ';
|
||||
description += usernameAndAvatar + status.parent_status.text;
|
||||
if (showRetweetTextInTitle) {
|
||||
title += status.parent_status.author.name + ': ' + status.parent_status.text;
|
||||
|
|
@ -376,8 +376,8 @@ function getContentByActivity(ctx, item, params = {}, picsPrefixes = []) {
|
|||
if (status.card) {
|
||||
if (description) {
|
||||
description += readable
|
||||
? `<br clear="both" /><div style="clear: both"></div><blockquote style="background: #80808010;border-top:1px solid #80808030;border-bottom:1px solid #80808030;margin:0;padding:5px 20px;">`
|
||||
: `<br>`;
|
||||
? '<br clear="both" /><div style="clear: both"></div><blockquote style="background: #80808010;border-top:1px solid #80808030;border-bottom:1px solid #80808030;margin:0;padding:5px 20px;">'
|
||||
: '<br>';
|
||||
}
|
||||
if (!status.card.images_block && status.card.image) {
|
||||
description += `<img src="${status.card.image.large.url}" ${readable ? 'vspace="0" hspace="12" align="left" height="75" style="height: 75px;"' : ''} />`;
|
||||
|
|
@ -408,7 +408,7 @@ function getContentByActivity(ctx, item, params = {}, picsPrefixes = []) {
|
|||
}
|
||||
description += cardContents.join('<br>');
|
||||
if (readable) {
|
||||
description += `<br clear="both" /><div style="clear: both"></div></blockquote>`;
|
||||
description += '<br clear="both" /><div style="clear: both"></div></blockquote>';
|
||||
}
|
||||
if (status.card.images_block) {
|
||||
const imageUrls: Array<string | undefined> = [];
|
||||
|
|
@ -421,7 +421,7 @@ function getContentByActivity(ctx, item, params = {}, picsPrefixes = []) {
|
|||
|
||||
// video_card
|
||||
if (status.video_card) {
|
||||
description += readable ? `<br clear="both" /><div style="clear: both"></div><blockquote style="background: #80808010;border-top:1px solid #80808030;border-bottom:1px solid #80808030;margin:0;padding:5px 20px;">` : `<br>`;
|
||||
description += readable ? '<br clear="both" /><div style="clear: both"></div><blockquote style="background: #80808010;border-top:1px solid #80808030;border-bottom:1px solid #80808030;margin:0;padding:5px 20px;">' : '<br>';
|
||||
const videoCover = status.video_card.video_info && status.video_card.video_info.cover_url;
|
||||
const videoSrc = status.video_card.video_info && status.video_card.video_info.video_url;
|
||||
|
||||
|
|
@ -431,13 +431,13 @@ function getContentByActivity(ctx, item, params = {}, picsPrefixes = []) {
|
|||
|
||||
description += `${videoSrc ? `<video src="${videoSrc}" ${videoCover ? `poster="${videoCover}"` : ''}></video>` : ''}<br>${status.video_card.title ? `<a href="${status.video_card.url}">${status.video_card.title}</a>` : ''}`;
|
||||
if (readable) {
|
||||
description += `</blockquote>`;
|
||||
description += '</blockquote>';
|
||||
}
|
||||
}
|
||||
|
||||
// reshared_status
|
||||
if (status.reshared_status) {
|
||||
description += readable ? `<br clear="both" /><div style="clear: both"></div><blockquote style="background: #80808010;border-top:1px solid #80808030;border-bottom:1px solid #80808030;margin:0;padding:5px 20px;">` : `<br>`;
|
||||
description += readable ? '<br clear="both" /><div style="clear: both"></div><blockquote style="background: #80808010;border-top:1px solid #80808030;border-bottom:1px solid #80808030;margin:0;padding:5px 20px;">' : '<br>';
|
||||
|
||||
if (showRetweetTextInTitle) {
|
||||
title += ' | ';
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ For the site https://www.dw.com/de/deutschland/s-12321 the language code would b
|
|||
],
|
||||
};
|
||||
|
||||
const defaultUrl = `https://www.dw.com/graph-api/en/content/navigation/9097`;
|
||||
const defaultUrl = 'https://www.dw.com/graph-api/en/content/navigation/9097';
|
||||
const typenames = new Set(['Article', 'Liveblog', 'Video']);
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ export const route: Route = {
|
|||
maintainers: ['LogicJake'],
|
||||
handler,
|
||||
url: 'www.cea.gov.cn/cea/xwzx/zqsd/index.html',
|
||||
description: `可通过全局过滤参数订阅您感兴趣的地区.`,
|
||||
description: '可通过全局过滤参数订阅您感兴趣的地区.',
|
||||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ async function handler() {
|
|||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: `https://apin.eastday.com/apiplus/special/specialnewslistbyurl?specialUrl=1632798465040016&skipCount=0&limitCount=20`,
|
||||
url: 'https://apin.eastday.com/apiplus/special/specialnewslistbyurl?specialUrl=1632798465040016&skipCount=0&limitCount=20',
|
||||
});
|
||||
|
||||
const result = await Promise.all(
|
||||
|
|
@ -69,7 +69,7 @@ async function handler() {
|
|||
);
|
||||
|
||||
return {
|
||||
title: `东方网-上海`,
|
||||
title: '东方网-上海',
|
||||
link: `${domain}/wap/sh.html`,
|
||||
item: result,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ async function handler(ctx) {
|
|||
};
|
||||
const cb = `jQuery${('3.5.1' + Math.random()).replaceAll(/\D/g, '')}_${Date.now()}`;
|
||||
|
||||
const url = `https://search-api-web.eastmoney.com/search/jsonp`;
|
||||
const url = 'https://search-api-web.eastmoney.com/search/jsonp';
|
||||
|
||||
const response = await got(url, {
|
||||
searchParams: {
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import got from '@/utils/got';
|
|||
const getCateName = async (cid = 0) => {
|
||||
const key = 'eleduck-categories';
|
||||
const cates = await cache.tryGet(key, async () => {
|
||||
const res = await got(`https://svc.eleduck.com/api/v1/categories`);
|
||||
const res = await got('https://svc.eleduck.com/api/v1/categories');
|
||||
const map = {};
|
||||
for (const item of res.data.categories) {
|
||||
map[item.id] = item.name;
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ export const route: Route = {
|
|||
};
|
||||
|
||||
async function handler() {
|
||||
const url = `https://europechinese.blogspot.com/`;
|
||||
const url = 'https://europechinese.blogspot.com/';
|
||||
const { data: response } = await got(url);
|
||||
const $ = load(response);
|
||||
const list = $('h3.post-title');
|
||||
|
|
@ -60,7 +60,7 @@ async function handler() {
|
|||
);
|
||||
|
||||
return {
|
||||
title: `歐洲動態(國際)| 最新`,
|
||||
title: '歐洲動態(國際)| 最新',
|
||||
link: url,
|
||||
item: out,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@ function passageConv(p) {
|
|||
p.styles.map((s) => {
|
||||
switch (s.type) {
|
||||
case 'bold':
|
||||
seg[s.offset] = `<b>` + seg[s.offset];
|
||||
seg[s.offset + s.length - 1] += `</b>`;
|
||||
seg[s.offset] = '<b>' + seg[s.offset];
|
||||
seg[s.offset + s.length - 1] += '</b>';
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
|
@ -53,7 +53,7 @@ function passageConv(p) {
|
|||
if (p.links) {
|
||||
p.links.map((l) => {
|
||||
seg[l.offset] = `<a href="${l.url}">` + seg[l.offset];
|
||||
seg[l.offset + l.length - 1] += `</a>`;
|
||||
seg[l.offset + l.length - 1] += '</a>';
|
||||
return l;
|
||||
});
|
||||
}
|
||||
|
|
@ -171,7 +171,7 @@ export function parseItem(item: PostItem) {
|
|||
return cache.tryGet(`fanbox-${item.id}-${item.updatedDatetime}`, async () => {
|
||||
const postDetail = (await ofetch(`https://api.fanbox.cc/post.info?postId=${item.id}`, { headers: { ...getHeaders(), 'User-Agent': config.trueUA } })) as PostDetailResponse;
|
||||
return {
|
||||
title: item.title || `No title`,
|
||||
title: item.title || 'No title',
|
||||
description: await parseDetail(postDetail.body),
|
||||
pubDate: parseDate(item.updatedDatetime),
|
||||
link: `https://${item.creatorId}.fanbox.cc/posts/${item.id}`,
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ async function handler(ctx) {
|
|||
const id = ctx.req.param('id');
|
||||
const count = ctx.req.query('limit') || 99999;
|
||||
const cdnNum = ctx.req.param('cdn') || 5;
|
||||
const cdn = !Number.isNaN(Number.parseInt(cdnNum)) && 1 <= Number.parseInt(cdnNum) && Number.parseInt(cdnNum) <= 5 ? `https://p${cdnNum}.fzacg.com` : `https://p5.fzacg.com`;
|
||||
const cdn = !Number.isNaN(Number.parseInt(cdnNum)) && 1 <= Number.parseInt(cdnNum) && Number.parseInt(cdnNum) <= 5 ? `https://p${cdnNum}.fzacg.com` : 'https://p5.fzacg.com';
|
||||
|
||||
// 获取漫画清单
|
||||
const response = await got(`${host}/api/manhua/${id}`);
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ async function handler(ctx: Context) {
|
|||
const extra = {
|
||||
description: (topic: string) => `Articles for your research and knowledge under ${topic}`,
|
||||
date: true,
|
||||
selector: `div.card`,
|
||||
selector: 'div.card',
|
||||
};
|
||||
return await commonHandler('https://insider.finology.in', `/${category}`, extra);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ async function handler() {
|
|||
const extra = {
|
||||
description: (topic: string) => `Check out the most talked-about articles among our readers! ${topic}`,
|
||||
date: false,
|
||||
selector: `div.card`,
|
||||
selector: 'div.card',
|
||||
};
|
||||
return await commonHandler('https://insider.finology.in', '/most-viewed', extra);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ async function handler(ctx: Context) {
|
|||
const extra = {
|
||||
description: (topic: string) => `Everything that Insider has to offer about ${topic} for you to read and learn.`,
|
||||
date: true,
|
||||
selector: `div.card`,
|
||||
selector: 'div.card',
|
||||
};
|
||||
return await commonHandler('https://insider.finology.in', `/tag/${topic}`, extra);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ export const route: Route = {
|
|||
async function handler(ctx) {
|
||||
const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 50;
|
||||
|
||||
const apiUrl = new URL(`v2/feed`, apiRootUrl).href;
|
||||
const apiUrl = new URL('v2/feed', apiRootUrl).href;
|
||||
|
||||
const { items } = await processItems(apiUrl, limit);
|
||||
|
||||
|
|
|
|||
|
|
@ -69,9 +69,9 @@ async function handler(ctx) {
|
|||
);
|
||||
|
||||
return {
|
||||
title: `FT.com - myFT`,
|
||||
title: 'FT.com - myFT',
|
||||
link,
|
||||
description: `FT.com - myFT`,
|
||||
description: 'FT.com - myFT',
|
||||
item: items,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ export const route: Route = {
|
|||
};
|
||||
|
||||
async function handler(ctx) {
|
||||
const { data: response } = await got(`https://fuliba2023.net/wp-json/wp/v2/posts`, {
|
||||
const { data: response } = await got('https://fuliba2023.net/wp-json/wp/v2/posts', {
|
||||
searchParams: {
|
||||
per_page: ctx.req.query('limit') ?? 100,
|
||||
_embed: 1,
|
||||
|
|
@ -44,7 +44,7 @@ async function handler(ctx) {
|
|||
|
||||
return {
|
||||
title: '福利吧',
|
||||
link: `https://fuliba2023.net`,
|
||||
link: 'https://fuliba2023.net',
|
||||
item: items,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ async function handler(ctx) {
|
|||
return {
|
||||
title: 'Fur Affinity | Browse',
|
||||
link: 'https://www.furaffinity.net/browse/',
|
||||
description: `Fur Affinity Browsing Artwork`,
|
||||
description: 'Fur Affinity Browsing Artwork',
|
||||
item: items,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ async function handler(ctx) {
|
|||
return {
|
||||
title: 'Fur Affinity | Home',
|
||||
link: 'https://www.furaffinity.net/',
|
||||
description: `Fur Affinity Index`,
|
||||
description: 'Fur Affinity Index',
|
||||
item: items,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ async function handler(ctx) {
|
|||
allowEmpty: true,
|
||||
title: 'Fur Affinity | Search',
|
||||
link: `https://www.furaffinity.net/Search/?q=${query}`,
|
||||
description: `Fur Affinity Search`,
|
||||
description: 'Fur Affinity Search',
|
||||
item: items,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue