remove experimental vimeo video provider support

This commit is contained in:
Yusuf İpek
2026-02-15 12:55:36 +03:00
parent c572ddb522
commit 7e55c578df
6 changed files with 1 additions and 111 deletions
@@ -51,9 +51,6 @@ function getEmbedUrl(version: Version) {
if (version.providerId === 'youtube') { if (version.providerId === 'youtube') {
return `https://www.youtube.com/embed/${version.videoId}?enablejsapi=1&rel=0&modestbranding=1`; return `https://www.youtube.com/embed/${version.videoId}?enablejsapi=1&rel=0&modestbranding=1`;
} }
if (version.providerId === 'vimeo') {
return `https://player.vimeo.com/video/${version.videoId}`;
}
return version.originalUrl; return version.originalUrl;
} }
-3
View File
@@ -358,9 +358,6 @@ export function VideoPageContent({ mode, videoId, projectId: propProjectId }: Vi
if (activeVersion.providerId === 'youtube') { if (activeVersion.providerId === 'youtube') {
return `https://www.youtube.com/embed/${activeVersion.videoId}?enablejsapi=1&rel=0&modestbranding=1&controls=0&showinfo=0&iv_load_policy=3&disablekb=1`; return `https://www.youtube.com/embed/${activeVersion.videoId}?enablejsapi=1&rel=0&modestbranding=1&controls=0&showinfo=0&iv_load_policy=3&disablekb=1`;
} }
if (activeVersion.providerId === 'vimeo') {
return `https://player.vimeo.com/video/${activeVersion.videoId}`;
}
try { try {
const url = new URL(activeVersion.originalUrl); const url = new URL(activeVersion.originalUrl);
if (url.protocol !== 'http:' && url.protocol !== 'https:') { if (url.protocol !== 'http:' && url.protocol !== 'https:') {
-2
View File
@@ -1,7 +1,6 @@
// Video Provider Registry - Central place to manage all video providers // Video Provider Registry - Central place to manage all video providers
import { youtubeProvider } from './youtube'; import { youtubeProvider } from './youtube';
import { vimeoProvider } from './vimeo';
import { directProvider } from './direct'; import { directProvider } from './direct';
import type { VideoProvider, VideoSource, VideoMetadata, VideoProviderType } from './types'; import type { VideoProvider, VideoSource, VideoMetadata, VideoProviderType } from './types';
@@ -11,7 +10,6 @@ export * from './types';
// Registry of all available providers // Registry of all available providers
const providers: VideoProvider[] = [ const providers: VideoProvider[] = [
youtubeProvider, youtubeProvider,
vimeoProvider,
directProvider, directProvider,
]; ];
+1 -1
View File
@@ -38,7 +38,7 @@ export interface EmbedOptions {
export type ThumbnailSize = 'small' | 'medium' | 'large' | 'maxres'; export type ThumbnailSize = 'small' | 'medium' | 'large' | 'maxres';
// Supported provider types - extend as we add more // Supported provider types - extend as we add more
export type VideoProviderType = 'youtube' | 'vimeo' | 'direct'; export type VideoProviderType = 'youtube' | 'direct';
// Video source stored in database // Video source stored in database
export interface VideoSource { export interface VideoSource {
-100
View File
@@ -1,100 +0,0 @@
import type { VideoProvider, VideoMetadata, EmbedOptions, ThumbnailSize } from './types';
import { getCachedMetadata, setCachedMetadata } from './metadata-cache';
// Vimeo URL patterns
const VIMEO_PATTERNS = [
/vimeo\.com\/(\d+)/,
/vimeo\.com\/video\/(\d+)/,
/player\.vimeo\.com\/video\/(\d+)/,
/vimeo\.com\/channels\/\w+\/(\d+)/,
/vimeo\.com\/groups\/\w+\/videos\/(\d+)/,
];
export const vimeoProvider: VideoProvider = {
id: 'vimeo',
name: 'Vimeo',
icon: 'Video', // Lucide doesn't have Vimeo icon
canHandle(url: string): boolean {
return VIMEO_PATTERNS.some(pattern => pattern.test(url));
},
extractVideoId(url: string): string | null {
for (const pattern of VIMEO_PATTERNS) {
const match = url.match(pattern);
if (match?.[1]) {
return match[1];
}
}
return null;
},
getEmbedUrl(videoId: string, options: EmbedOptions = {}): string {
const params = new URLSearchParams();
if (options.autoplay) params.set('autoplay', '1');
if (options.startTime) params.set('t', `${Math.floor(options.startTime)}s`);
if (options.loop) params.set('loop', '1');
if (options.muted) params.set('muted', '1');
// Better UX options
params.set('byline', '0');
params.set('portrait', '0');
params.set('title', '0');
const queryString = params.toString();
return `https://player.vimeo.com/video/${videoId}${queryString ? `?${queryString}` : ''}`;
},
getThumbnailUrl(videoId: string, size: ThumbnailSize = 'medium'): string {
// Vimeo requires API call to get thumbnail, return placeholder
// In production, cache these after fetching metadata
const sizeMap: Record<ThumbnailSize, number> = {
small: 200,
medium: 400,
large: 640,
maxres: 1280,
};
// This is a placeholder - actual thumbnail comes from metadata API
return `https://vumbnail.com/${videoId}_${sizeMap[size]}.jpg`;
},
async getMetadata(videoId: string): Promise<VideoMetadata> {
const cacheKey = `vimeo:${videoId}`;
const cached = getCachedMetadata(cacheKey);
if (cached) return cached;
try {
const response = await fetch(
`https://vimeo.com/api/oembed.json?url=https://vimeo.com/${videoId}`,
{ signal: AbortSignal.timeout(5000) }
);
if (!response.ok) {
throw new Error('Failed to fetch video metadata');
}
const data = await response.json();
const metadata: VideoMetadata = {
title: data.title,
description: data.description,
thumbnailUrl: data.thumbnail_url,
duration: data.duration,
author: data.author_name,
authorUrl: data.author_url,
uploadDate: data.upload_date ? new Date(data.upload_date) : undefined,
};
setCachedMetadata(cacheKey, metadata);
return metadata;
} catch (error) {
const fallback: VideoMetadata = {
title: 'Vimeo Video',
thumbnailUrl: this.getThumbnailUrl(videoId, 'large'),
};
setCachedMetadata(cacheKey, fallback);
return fallback;
}
},
};
-2
View File
@@ -5,8 +5,6 @@ const nextConfig: NextConfig = {
remotePatterns: [ remotePatterns: [
{ protocol: 'https', hostname: 'img.youtube.com' }, { protocol: 'https', hostname: 'img.youtube.com' },
{ protocol: 'https', hostname: 'i.ytimg.com' }, { protocol: 'https', hostname: 'i.ytimg.com' },
{ protocol: 'https', hostname: 'i.vimeocdn.com' },
{ protocol: 'https', hostname: 'vumbnail.com' },
{ protocol: 'https', hostname: 'images.unsplash.com' }, { protocol: 'https', hostname: 'images.unsplash.com' },
], ],
formats: ['image/avif', 'image/webp'], formats: ['image/avif', 'image/webp'],