From 90d73d0e749f0e9cde8197cdf32e10ace67fb3fb Mon Sep 17 00:00:00 2001 From: Maxim Vershinin Date: Tue, 1 Sep 2026 13:08:28 +0500 Subject: [PATCH] refact (core): removes useless fields from CODEC_INFO --- audio_splitter/constants.py | 34 +++++++++++++---------- web/frontend/src/hooks/useFilterCodecs.ts | 12 ++++---- web/frontend/src/types/index.ts | 3 +- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/audio_splitter/constants.py b/audio_splitter/constants.py index af96789..07c8d32 100644 --- a/audio_splitter/constants.py +++ b/audio_splitter/constants.py @@ -47,22 +47,26 @@ def get_container_info(container_name: str) -> Optional[Dict]: # ------------------------------------------------------------------------------ CODEC_INFO = [ # Audio codecs - {'name': 'opus', 'ffmpeg': 'libopus', 'recommended_container': 'ogg', 'recommended_extension': '.opus', 'supports_transcoding': True, 'supports_video': False}, - {'name': 'vorbis', 'ffmpeg': 'libvorbis', 'recommended_container': 'ogg', 'recommended_extension': '.ogg', 'supports_transcoding': True, 'supports_video': False}, - {'name': 'flac', 'ffmpeg': 'flac', 'recommended_container': 'flac', 'recommended_extension': '.flac', 'supports_transcoding': True, 'supports_video': False}, - {'name': 'aac', 'ffmpeg': 'aac', 'recommended_container': 'mp4', 'recommended_extension': '.m4a', 'supports_transcoding': True, 'supports_video': False}, - {'name': 'mp3', 'ffmpeg': 'libmp3lame', 'recommended_container': 'mp3', 'recommended_extension': '.mp3', 'supports_transcoding': True, 'supports_video': False}, - {'name': 'alac', 'ffmpeg': 'alac', 'recommended_container': 'mp4', 'recommended_extension': '.m4a', 'supports_transcoding': True, 'supports_video': False}, - {'name': 'pcm_s16le', 'ffmpeg': 'pcm_s16le', 'recommended_container': 'wav', 'recommended_extension': '.wav', 'supports_transcoding': True, 'supports_video': False}, + {'name': 'opus', 'ffmpeg': 'libopus', 'recommended_container': 'ogg', 'recommended_extension': '.opus', 'codec_type': 'audio'}, + {'name': 'vorbis', 'ffmpeg': 'libvorbis', 'recommended_container': 'ogg', 'recommended_extension': '.ogg', 'codec_type': 'audio'}, + {'name': 'flac', 'ffmpeg': 'flac', 'recommended_container': 'flac', 'recommended_extension': '.flac', 'codec_type': 'audio'}, + {'name': 'aac', 'ffmpeg': 'aac', 'recommended_container': 'mp4', 'recommended_extension': '.m4a', 'codec_type': 'audio'}, + {'name': 'mp3', 'ffmpeg': 'libmp3lame', 'recommended_container': 'mp3', 'recommended_extension': '.mp3', 'codec_type': 'audio'}, + {'name': 'alac', 'ffmpeg': 'alac', 'recommended_container': 'mp4', 'recommended_extension': '.m4a', 'codec_type': 'audio'}, + {'name': 'pcm_s16le', 'ffmpeg': 'pcm_s16le', 'recommended_container': 'wav', 'recommended_extension': '.wav', 'codec_type': 'audio'}, # Video codecs - {'name': 'theora', 'ffmpeg': 'libtheora', 'recommended_container': 'ogg', 'recommended_extension': '.ogv', 'supports_transcoding': True, 'supports_video': True}, - {'name': 'vp8', 'ffmpeg': 'libvpx', 'recommended_container': 'webm', 'recommended_extension': '.webm', 'supports_transcoding': True, 'supports_video': True}, - {'name': 'vp9', 'ffmpeg': 'libvpx-vp9', 'recommended_container': 'webm', 'recommended_extension': '.webm', 'supports_transcoding': True, 'supports_video': True}, - {'name': 'av1', 'ffmpeg': 'libaom-av1', 'recommended_container': 'mkv', 'recommended_extension': '.mkv', 'supports_transcoding': True, 'supports_video': True}, - {'name': 'h264', 'ffmpeg': 'libx264', 'recommended_container': 'mp4', 'recommended_extension': '.mp4', 'supports_transcoding': True, 'supports_video': True}, - {'name': 'h265', 'ffmpeg': 'libx265', 'recommended_container': 'mp4', 'recommended_extension': '.mp4', 'supports_transcoding': True, 'supports_video': True}, - {'name': 'png', 'ffmpeg': 'png', 'recommended_container': 'ogg', 'recommended_extension': '.png', 'supports_transcoding': False, 'supports_video': True}, - {'name': 'mjpeg', 'ffmpeg': 'mjpeg', 'recommended_container': 'ogg', 'recommended_extension': '.jpg', 'supports_transcoding': False, 'supports_video': True}, + {'name': 'theora', 'ffmpeg': 'libtheora', 'recommended_container': 'ogg', 'recommended_extension': '.ogv', 'codec_type': 'video'}, + {'name': 'vp8', 'ffmpeg': 'libvpx', 'recommended_container': 'webm', 'recommended_extension': '.webm', 'codec_type': 'video'}, + {'name': 'vp9', 'ffmpeg': 'libvpx-vp9', 'recommended_container': 'webm', 'recommended_extension': '.webm', 'codec_type': 'video'}, + {'name': 'av1', 'ffmpeg': 'libaom-av1', 'recommended_container': 'mkv', 'recommended_extension': '.mkv', 'codec_type': 'video'}, + {'name': 'h264', 'ffmpeg': 'libx264', 'recommended_container': 'mp4', 'recommended_extension': '.mp4', 'codec_type': 'video'}, + {'name': 'h265', 'ffmpeg': 'libx265', 'recommended_container': 'mp4', 'recommended_extension': '.mp4', 'codec_type': 'video'}, + {'name': 'png', 'ffmpeg': 'png', 'recommended_container': 'ogg', 'recommended_extension': '.png', 'codec_type': 'video'}, + {'name': 'mjpeg', 'ffmpeg': 'mjpeg', 'recommended_container': 'ogg', 'recommended_extension': '.jpg', 'codec_type': 'video'}, + # Subtitle codecs + {'name': 'srt', 'ffmpeg': 'srt', 'recommended_container': 'mkv', 'recommended_extension': '.srt', 'codec_type': 'subtitle'}, + {'name': 'ass', 'ffmpeg': 'ass', 'recommended_container': 'mkv', 'recommended_extension': '.ass', 'codec_type': 'subtitle'}, + {'name': 'vtt', 'ffmpeg': 'webvtt', 'recommended_container': 'webm', 'recommended_extension': '.vtt', 'codec_type': 'subtitle'}, ] # Map codec name → recommended container diff --git a/web/frontend/src/hooks/useFilterCodecs.ts b/web/frontend/src/hooks/useFilterCodecs.ts index a6fec63..4690aa6 100644 --- a/web/frontend/src/hooks/useFilterCodecs.ts +++ b/web/frontend/src/hooks/useFilterCodecs.ts @@ -13,18 +13,18 @@ export function useFilterCodecs( ) { const filteredAudioCodecs = useMemo(() => { const entry = compatibility?.[container || ''] - if (!entry) return codecs.filter(c => c.supports_transcoding) + if (!entry) return codecs.filter(c => c.codec_type === 'audio') const audioList = entry.audio - if (audioList === null) return codecs.filter(c => c.supports_transcoding) - return codecs.filter(c => c.supports_transcoding && audioList.includes(c.name)) + if (audioList === null) return codecs.filter(c => c.codec_type === 'audio') + return codecs.filter(c => c.codec_type === 'audio' && audioList.includes(c.name)) }, [compatibility, container, codecs]) const filteredVideoCodecs = useMemo(() => { const entry = compatibility?.[container || ''] - if (!entry) return codecs.filter(c => c.supports_video) + if (!entry) return codecs.filter(c => c.codec_type === 'video') const videoList = entry.video - if (videoList === null) return codecs.filter(c => c.supports_video) - return codecs.filter(c => c.supports_video && videoList.includes(c.name)) + if (videoList === null) return codecs.filter(c => c.codec_type === 'video') + return codecs.filter(c => c.codec_type === 'video' && videoList.includes(c.name)) }, [compatibility, container, codecs]) return { filteredAudioCodecs, filteredVideoCodecs } diff --git a/web/frontend/src/types/index.ts b/web/frontend/src/types/index.ts index b6c02cb..0701db6 100644 --- a/web/frontend/src/types/index.ts +++ b/web/frontend/src/types/index.ts @@ -57,8 +57,7 @@ export interface CodecInfo { ffmpeg: string recommended_container: string recommended_extension: string - supports_transcoding: boolean - supports_video: boolean + codec_type: 'audio' | 'video' | 'subtitle' } export interface CompatibilityEntry {