74 lines
2.6 KiB
TypeScript
74 lines
2.6 KiB
TypeScript
import type { Route } from '@/types';
|
|
import { ViewType } from '@/types';
|
|
|
|
import { getDataByUsername as getDataByUsernameGoogle } from './api/google';
|
|
import { getDataByUsername as getDataByUsernameYoutubei } from './api/youtubei';
|
|
import { callApi } from './utils';
|
|
|
|
export const route: Route = {
|
|
path: '/user/:username/:routeParams?',
|
|
categories: ['social-media'],
|
|
view: ViewType.Videos,
|
|
example: '/youtube/user/@JFlaMusic',
|
|
parameters: {
|
|
username: 'YouTuber handle with @',
|
|
routeParams: 'Extra parameters, see the table below',
|
|
},
|
|
description: `::: tip Parameter
|
|
|
|
| Name | Description | Default |
|
|
| ------------ | ---------------------------------------------------------------------------------- | ------- |
|
|
| embed | Whether to embed the video, fill in any value to disable embedding | embed |
|
|
| filterShorts | Whether to filter out shorts from the feed, fill in any falsy value to show shorts | true |
|
|
|
|
:::`,
|
|
features: {
|
|
requireConfig: [
|
|
{
|
|
name: 'YOUTUBE_KEY',
|
|
description: ' YouTube API Key, support multiple keys, split them with `,`, [API Key application](https://console.developers.google.com/)',
|
|
optional: true,
|
|
},
|
|
],
|
|
requirePuppeteer: false,
|
|
antiCrawler: false,
|
|
supportBT: false,
|
|
supportPodcast: false,
|
|
supportScihub: false,
|
|
},
|
|
radar: [
|
|
{
|
|
source: ['www.youtube.com/user/:username', 'www.youtube.com/:username', 'www.youtube.com/:username/videos'],
|
|
target: '/user/:username',
|
|
},
|
|
],
|
|
name: 'Channel with user handle',
|
|
maintainers: ['DIYgod', 'pseudoyu'],
|
|
handler,
|
|
};
|
|
|
|
async function handler(ctx) {
|
|
const username = ctx.req.param('username');
|
|
|
|
// Parse route parameters
|
|
const routeParams = ctx.req.param('routeParams');
|
|
const params = new URLSearchParams(routeParams);
|
|
|
|
// Get embed parameter
|
|
const embed = !params.get('embed');
|
|
|
|
// Get filterShorts parameter (default to true if not specified)
|
|
const filterShortsStr = params.get('filterShorts');
|
|
const filterShorts = filterShortsStr === null || filterShortsStr === '' || filterShortsStr === 'true';
|
|
|
|
const isJsonFeed = ctx.req.query('format') === 'json';
|
|
|
|
const data = await callApi({
|
|
googleApi: getDataByUsernameGoogle,
|
|
youtubeiApi: getDataByUsernameYoutubei,
|
|
params: { username, embed, filterShorts, isJsonFeed },
|
|
});
|
|
|
|
return data;
|
|
}
|