mirror of
https://github.com/yusufipk/OpenFrame.git
synced 2026-09-11 17:46:06 +00:00
remove experimental vimeo video provider support
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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:') {
|
||||||
|
|||||||
@@ -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,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -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'],
|
||||||
|
|||||||
Reference in New Issue
Block a user