import styles from './embed.module.css';
interface EmbedProps {
url: string;
}
const Embed = ({ url }: EmbedProps) => {
const parsedUrl = new URL(url);
if (youtubeHosts.has(parsedUrl.host) || (parsedUrl.host.startsWith('yt.') && parsedUrl.searchParams.has('v'))) {
return ;
}
if (xHosts.has(parsedUrl.host)) {
return ;
}
if (redditHosts.has(parsedUrl.host)) {
return ;
}
if (twitchHosts.has(parsedUrl.host)) {
return ;
}
if (tiktokHosts.has(parsedUrl.host)) {
return ;
}
if (instagramHosts.has(parsedUrl.host)) {
return ;
}
if (odyseeHosts.has(parsedUrl.host)) {
return ;
}
if (bitchuteHosts.has(parsedUrl.host)) {
return ;
}
if (streamableHosts.has(parsedUrl.host)) {
return ;
}
if (spotifyHosts.has(parsedUrl.host)) {
return ;
}
if (soundcloudHosts.has(parsedUrl.host)) {
return ;
}
};
interface EmbedComponentProps {
parsedUrl: URL;
}
const srcDocSandbox = 'allow-scripts allow-popups allow-popups-to-escape-sandbox';
const youtubeHosts = new Set([
'youtube.com',
'www.youtube.com',
'youtu.be',
'www.youtu.be',
'm.youtube.com',
'music.youtube.com',
// working Invidious instances - https://docs.invidious.io/instances/ - https://uptime.invidious.io/
'yewtu.be',
'inv.nadeko.net',
'yt.artemislena.eu',
'invidious.nerdvpn.de',
]);
const YoutubeEmbed = ({ parsedUrl }: EmbedComponentProps) => {
let embedSrc = '';
const isInvidious = parsedUrl.host !== 'youtube.com' && parsedUrl.host !== 'www.youtube.com' && parsedUrl.host !== 'youtu.be' && parsedUrl.host !== 'www.youtu.be';
if (parsedUrl.searchParams.has('list')) {
const playlistId = parsedUrl.searchParams.get('list');
embedSrc = `https://www.youtube.com/embed/videoseries?list=${playlistId}`;
} else {
let videoId = parsedUrl.searchParams.get('v');
if (!videoId) {
if (parsedUrl.host.includes('youtu.be')) {
videoId = parsedUrl.pathname.substring(1);
} else if (parsedUrl.pathname.includes('/shorts/')) {
videoId = parsedUrl.pathname.split('/shorts/')[1];
} else if (isInvidious) {
if (parsedUrl.pathname.startsWith('/watch')) {
videoId = parsedUrl.searchParams.get('v');
} else {
videoId = parsedUrl.pathname.split('/').pop() || null;
}
}
}
if (videoId) {
embedSrc = `https://www.youtube.com/embed/${videoId}`;
}
}
if (embedSrc) {
return (
);
}
return null;
};
const xHosts = new Set(['twitter.com', 'www.twitter.com', 'x.com', 'www.x.com']);
const getXTweetId = (parsedUrl: URL): string | undefined => {
const pathParts = parsedUrl.pathname.split('/').filter(Boolean);
const statusIndex = pathParts.findIndex((part) => part === 'status' || part === 'statuses');
const statusId = statusIndex === -1 ? undefined : pathParts[statusIndex + 1];
return statusId && /^\d+$/.test(statusId) ? statusId : undefined;
};
const XEmbed = ({ parsedUrl }: EmbedComponentProps) => {
const tweetId = getXTweetId(parsedUrl);
if (!tweetId) {
return null;
}
const searchParams = new URLSearchParams({
id: tweetId,
theme: 'dark',
dnt: 'false',
hideThread: 'false',
hideCard: 'false',
lang: 'en',
});
return (
);
};
const redditHosts = new Set(['reddit.com', 'www.reddit.com', 'old.reddit.com']);
const RedditEmbed = ({ parsedUrl }: EmbedComponentProps) => {
return (