refact (core): split large code blocks, remove useless files/code #12
+19
-15
@@ -47,22 +47,26 @@ def get_container_info(container_name: str) -> Optional[Dict]:
|
|||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
CODEC_INFO = [
|
CODEC_INFO = [
|
||||||
# Audio codecs
|
# Audio codecs
|
||||||
{'name': 'opus', 'ffmpeg': 'libopus', 'recommended_container': 'ogg', 'recommended_extension': '.opus', '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', 'supports_transcoding': True, 'supports_video': False},
|
{'name': 'vorbis', 'ffmpeg': 'libvorbis', 'recommended_container': 'ogg', 'recommended_extension': '.ogg', 'codec_type': 'audio'},
|
||||||
{'name': 'flac', 'ffmpeg': 'flac', 'recommended_container': 'flac', 'recommended_extension': '.flac', 'supports_transcoding': True, 'supports_video': False},
|
{'name': 'flac', 'ffmpeg': 'flac', 'recommended_container': 'flac', 'recommended_extension': '.flac', 'codec_type': 'audio'},
|
||||||
{'name': 'aac', 'ffmpeg': 'aac', 'recommended_container': 'mp4', 'recommended_extension': '.m4a', 'supports_transcoding': True, 'supports_video': False},
|
{'name': 'aac', 'ffmpeg': 'aac', 'recommended_container': 'mp4', 'recommended_extension': '.m4a', 'codec_type': 'audio'},
|
||||||
{'name': 'mp3', 'ffmpeg': 'libmp3lame', 'recommended_container': 'mp3', 'recommended_extension': '.mp3', 'supports_transcoding': True, 'supports_video': False},
|
{'name': 'mp3', 'ffmpeg': 'libmp3lame', 'recommended_container': 'mp3', 'recommended_extension': '.mp3', 'codec_type': 'audio'},
|
||||||
{'name': 'alac', 'ffmpeg': 'alac', 'recommended_container': 'mp4', 'recommended_extension': '.m4a', 'supports_transcoding': True, 'supports_video': False},
|
{'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', 'supports_transcoding': True, 'supports_video': False},
|
{'name': 'pcm_s16le', 'ffmpeg': 'pcm_s16le', 'recommended_container': 'wav', 'recommended_extension': '.wav', 'codec_type': 'audio'},
|
||||||
# Video codecs
|
# Video codecs
|
||||||
{'name': 'theora', 'ffmpeg': 'libtheora', 'recommended_container': 'ogg', 'recommended_extension': '.ogv', 'supports_transcoding': True, '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', 'supports_transcoding': True, 'supports_video': True},
|
{'name': 'vp8', 'ffmpeg': 'libvpx', 'recommended_container': 'webm', 'recommended_extension': '.webm', 'codec_type': 'video'},
|
||||||
{'name': 'vp9', 'ffmpeg': 'libvpx-vp9', 'recommended_container': 'webm', 'recommended_extension': '.webm', 'supports_transcoding': True, 'supports_video': True},
|
{'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', 'supports_transcoding': True, 'supports_video': True},
|
{'name': 'av1', 'ffmpeg': 'libaom-av1', 'recommended_container': 'mkv', 'recommended_extension': '.mkv', 'codec_type': 'video'},
|
||||||
{'name': 'h264', 'ffmpeg': 'libx264', 'recommended_container': 'mp4', 'recommended_extension': '.mp4', 'supports_transcoding': True, 'supports_video': True},
|
{'name': 'h264', 'ffmpeg': 'libx264', 'recommended_container': 'mp4', 'recommended_extension': '.mp4', 'codec_type': 'video'},
|
||||||
{'name': 'h265', 'ffmpeg': 'libx265', 'recommended_container': 'mp4', 'recommended_extension': '.mp4', 'supports_transcoding': True, 'supports_video': True},
|
{'name': 'h265', 'ffmpeg': 'libx265', 'recommended_container': 'mp4', 'recommended_extension': '.mp4', 'codec_type': 'video'},
|
||||||
{'name': 'png', 'ffmpeg': 'png', 'recommended_container': 'ogg', 'recommended_extension': '.png', 'supports_transcoding': False, 'supports_video': True},
|
{'name': 'png', 'ffmpeg': 'png', 'recommended_container': 'ogg', 'recommended_extension': '.png', 'codec_type': 'video'},
|
||||||
{'name': 'mjpeg', 'ffmpeg': 'mjpeg', 'recommended_container': 'ogg', 'recommended_extension': '.jpg', 'supports_transcoding': False, 'supports_video': True},
|
{'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
|
# Map codec name → recommended container
|
||||||
|
|||||||
@@ -13,18 +13,18 @@ export function useFilterCodecs(
|
|||||||
) {
|
) {
|
||||||
const filteredAudioCodecs = useMemo(() => {
|
const filteredAudioCodecs = useMemo(() => {
|
||||||
const entry = compatibility?.[container || '']
|
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
|
const audioList = entry.audio
|
||||||
if (audioList === null) return codecs.filter(c => c.supports_transcoding)
|
if (audioList === null) return codecs.filter(c => c.codec_type === 'audio')
|
||||||
return codecs.filter(c => c.supports_transcoding && audioList.includes(c.name))
|
return codecs.filter(c => c.codec_type === 'audio' && audioList.includes(c.name))
|
||||||
}, [compatibility, container, codecs])
|
}, [compatibility, container, codecs])
|
||||||
|
|
||||||
const filteredVideoCodecs = useMemo(() => {
|
const filteredVideoCodecs = useMemo(() => {
|
||||||
const entry = compatibility?.[container || '']
|
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
|
const videoList = entry.video
|
||||||
if (videoList === null) return codecs.filter(c => c.supports_video)
|
if (videoList === null) return codecs.filter(c => c.codec_type === 'video')
|
||||||
return codecs.filter(c => c.supports_video && videoList.includes(c.name))
|
return codecs.filter(c => c.codec_type === 'video' && videoList.includes(c.name))
|
||||||
}, [compatibility, container, codecs])
|
}, [compatibility, container, codecs])
|
||||||
|
|
||||||
return { filteredAudioCodecs, filteredVideoCodecs }
|
return { filteredAudioCodecs, filteredVideoCodecs }
|
||||||
|
|||||||
@@ -57,8 +57,7 @@ export interface CodecInfo {
|
|||||||
ffmpeg: string
|
ffmpeg: string
|
||||||
recommended_container: string
|
recommended_container: string
|
||||||
recommended_extension: string
|
recommended_extension: string
|
||||||
supports_transcoding: boolean
|
codec_type: 'audio' | 'video' | 'subtitle'
|
||||||
supports_video: boolean
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CompatibilityEntry {
|
export interface CompatibilityEntry {
|
||||||
|
|||||||
Reference in New Issue
Block a user