Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kentcdodds/google

src/youtube-channels.ts

92 lines · 2.9 KB · TypeScript
import type { GoogleAccountAlias } from './accounts.ts'

export type YouTubeChannelKey = 'main' | 'plus'

export type YouTubeChannelInfo = {
	key: YouTubeChannelKey
	/** google account alias used for YouTube Data API OAuth */
	account: Extract<GoogleAccountAlias, 'youtube-brand' | 'youtube-plus'>
	channelId: string
	title: string
	handle: string
	url: string
	/** Primary content on this channel (for agent routing) */
	content: string[]
	/** Former public names agents may still encounter in legacy copy */
	legacyNames?: string[]
}

/** Canonical Kent YouTube channel registry for agent routing. */
export const YOUTUBE_CHANNELS: Record<YouTubeChannelKey, YouTubeChannelInfo> = {
	main: {
		key: 'main',
		account: 'youtube-brand',
		channelId: 'UCz-BYvuntVRt_VpfR6FKXJw',
		title: 'Kent C. Dodds',
		handle: '@kentcdodds',
		url: 'https://www.youtube.com/@kentcdodds',
		content: [
			'Better with Kent',
			'workshop promos',
			'curated dev content',
			'live streams (VOD unlisted after stream)',
		],
	},
	plus: {
		key: 'plus',
		account: 'youtube-plus',
		channelId: 'UCyCnaVEEdtP_IzGv06wBArQ',
		title: 'kentcdodds-plus',
		handle: '@kentcdodds-plus',
		url: 'https://www.youtube.com/@kentcdodds-plus',
		content: [
			'Become an Epic Product Engineer full episodes',
			'BEPE promo Shorts',
			'legacy Chats with Kent video archive',
		],
		legacyNames: ['Chats with Kent'],
	},
}

export const YOUTUBE_CHANNEL_KEYS = ['main', 'plus'] as const

export function listYouTubeChannels(): YouTubeChannelInfo[] {
	return YOUTUBE_CHANNEL_KEYS.map((key) => ({ ...YOUTUBE_CHANNELS[key] }))
}

export function resolveYouTubeChannel(
	input: { channel?: string; account?: string } | string = {},
): YouTubeChannelInfo {
	const channelKey =
		typeof input === 'string' ? input
		: input.channel?.trim() || input.account?.trim()
	if (!channelKey) return { ...YOUTUBE_CHANNELS.main }

	const fromKey = YOUTUBE_CHANNELS[channelKey as YouTubeChannelKey]
	if (fromKey) return { ...fromKey }

	const fromAccount = YOUTUBE_CHANNEL_KEYS.map((key) => YOUTUBE_CHANNELS[key]).find(
		(entry) => entry.account === channelKey,
	)
	if (fromAccount) return { ...fromAccount }

	const fromChannelId = YOUTUBE_CHANNEL_KEYS.map((key) => YOUTUBE_CHANNELS[key]).find(
		(entry) => entry.channelId === channelKey,
	)
	if (fromChannelId) return { ...fromChannelId }

	throw new Error(
		`Unknown YouTube channel "${channelKey}". Pass one of: ${YOUTUBE_CHANNEL_KEYS.join(', ')}, youtube-brand, youtube-plus, or a channel id.`,
	)
}

/**
 * Return Kent's canonical YouTube channel registry for routing uploads and analytics.
 * @example
 * import youtubeChannels from 'kody:@kentcdodds/google/youtube-channels'
 * const channel = youtubeChannels().channels.find((c) => c.key === 'main')
 * // => { key: 'main', account: 'youtube-brand', channelId: 'UC...', ... }
 */
export default function youtubeChannels() {
	return { channels: listYouTubeChannels(), keys: [...YOUTUBE_CHANNEL_KEYS] }
}