189 lines
4.0 KiB
TypeScript
189 lines
4.0 KiB
TypeScript
|
|
import type { ConversionOptions } from '@/types/conversion';
|
||
|
|
|
||
|
|
export interface FormatPreset {
|
||
|
|
id: string;
|
||
|
|
name: string;
|
||
|
|
description: string;
|
||
|
|
icon: string;
|
||
|
|
category: 'video' | 'audio' | 'image';
|
||
|
|
outputFormat: string;
|
||
|
|
options: ConversionOptions;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Predefined format presets for common use cases
|
||
|
|
*/
|
||
|
|
export const FORMAT_PRESETS: FormatPreset[] = [
|
||
|
|
// Video Presets
|
||
|
|
{
|
||
|
|
id: 'youtube-video',
|
||
|
|
name: 'YouTube Video',
|
||
|
|
description: '1080p MP4, optimized for YouTube',
|
||
|
|
icon: '🎬',
|
||
|
|
category: 'video',
|
||
|
|
outputFormat: 'mp4',
|
||
|
|
options: {
|
||
|
|
videoCodec: 'libx264',
|
||
|
|
videoBitrate: '5M',
|
||
|
|
videoResolution: '1920x-1',
|
||
|
|
videoFps: 30,
|
||
|
|
audioCodec: 'aac',
|
||
|
|
audioBitrate: '192k',
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 'instagram-video',
|
||
|
|
name: 'Instagram Video',
|
||
|
|
description: 'Square 1:1 format for Instagram',
|
||
|
|
icon: '📸',
|
||
|
|
category: 'video',
|
||
|
|
outputFormat: 'mp4',
|
||
|
|
options: {
|
||
|
|
videoCodec: 'libx264',
|
||
|
|
videoBitrate: '3M',
|
||
|
|
videoResolution: '1080x-1', // Will be cropped to square
|
||
|
|
videoFps: 30,
|
||
|
|
audioCodec: 'aac',
|
||
|
|
audioBitrate: '128k',
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 'twitter-video',
|
||
|
|
name: 'Twitter Video',
|
||
|
|
description: '720p, optimized for Twitter',
|
||
|
|
icon: '🐦',
|
||
|
|
category: 'video',
|
||
|
|
outputFormat: 'mp4',
|
||
|
|
options: {
|
||
|
|
videoCodec: 'libx264',
|
||
|
|
videoBitrate: '2M',
|
||
|
|
videoResolution: '1280x-1',
|
||
|
|
videoFps: 30,
|
||
|
|
audioCodec: 'aac',
|
||
|
|
audioBitrate: '128k',
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 'web-video',
|
||
|
|
name: 'Web Optimized',
|
||
|
|
description: 'Small file size for web streaming',
|
||
|
|
icon: '🌐',
|
||
|
|
category: 'video',
|
||
|
|
outputFormat: 'mp4',
|
||
|
|
options: {
|
||
|
|
videoCodec: 'libx264',
|
||
|
|
videoBitrate: '1.5M',
|
||
|
|
videoResolution: '854x-1',
|
||
|
|
videoFps: 24,
|
||
|
|
audioCodec: 'aac',
|
||
|
|
audioBitrate: '96k',
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
// Audio Presets
|
||
|
|
{
|
||
|
|
id: 'podcast-audio',
|
||
|
|
name: 'Podcast',
|
||
|
|
description: 'MP3, optimized for voice',
|
||
|
|
icon: '🎙️',
|
||
|
|
category: 'audio',
|
||
|
|
outputFormat: 'mp3',
|
||
|
|
options: {
|
||
|
|
audioCodec: 'libmp3lame',
|
||
|
|
audioBitrate: '128k',
|
||
|
|
audioSampleRate: 44100,
|
||
|
|
audioChannels: 2,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 'music-high-quality',
|
||
|
|
name: 'High Quality Music',
|
||
|
|
description: 'MP3, 320kbps for music',
|
||
|
|
icon: '🎵',
|
||
|
|
category: 'audio',
|
||
|
|
outputFormat: 'mp3',
|
||
|
|
options: {
|
||
|
|
audioCodec: 'libmp3lame',
|
||
|
|
audioBitrate: '320k',
|
||
|
|
audioSampleRate: 48000,
|
||
|
|
audioChannels: 2,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 'audiobook',
|
||
|
|
name: 'Audiobook',
|
||
|
|
description: 'Mono, small file size',
|
||
|
|
icon: '📚',
|
||
|
|
category: 'audio',
|
||
|
|
outputFormat: 'mp3',
|
||
|
|
options: {
|
||
|
|
audioCodec: 'libmp3lame',
|
||
|
|
audioBitrate: '64k',
|
||
|
|
audioSampleRate: 22050,
|
||
|
|
audioChannels: 1,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
// Image Presets
|
||
|
|
{
|
||
|
|
id: 'web-thumbnail',
|
||
|
|
name: 'Web Thumbnail',
|
||
|
|
description: 'JPG, 800px width, optimized',
|
||
|
|
icon: '🖼️',
|
||
|
|
category: 'image',
|
||
|
|
outputFormat: 'jpg',
|
||
|
|
options: {
|
||
|
|
imageQuality: 85,
|
||
|
|
imageWidth: 800,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 'hd-image',
|
||
|
|
name: 'HD Image',
|
||
|
|
description: 'PNG, high quality, lossless',
|
||
|
|
icon: '🎨',
|
||
|
|
category: 'image',
|
||
|
|
outputFormat: 'png',
|
||
|
|
options: {
|
||
|
|
imageQuality: 100,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 'social-media-image',
|
||
|
|
name: 'Social Media',
|
||
|
|
description: 'JPG, 1200px, optimized',
|
||
|
|
icon: '📱',
|
||
|
|
category: 'image',
|
||
|
|
outputFormat: 'jpg',
|
||
|
|
options: {
|
||
|
|
imageQuality: 90,
|
||
|
|
imageWidth: 1200,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 'web-optimized-image',
|
||
|
|
name: 'Web Optimized',
|
||
|
|
description: 'WebP, small file size',
|
||
|
|
icon: '⚡',
|
||
|
|
category: 'image',
|
||
|
|
outputFormat: 'webp',
|
||
|
|
options: {
|
||
|
|
imageQuality: 80,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
];
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get presets by category
|
||
|
|
*/
|
||
|
|
export function getPresetsByCategory(category: 'video' | 'audio' | 'image'): FormatPreset[] {
|
||
|
|
return FORMAT_PRESETS.filter(preset => preset.category === category);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get preset by ID
|
||
|
|
*/
|
||
|
|
export function getPresetById(id: string): FormatPreset | undefined {
|
||
|
|
return FORMAT_PRESETS.find(preset => preset.id === id);
|
||
|
|
}
|