diff --git a/src/converters/ffmpeg.ts b/src/converters/ffmpeg.ts index cfbd53c..212f4d2 100644 --- a/src/converters/ffmpeg.ts +++ b/src/converters/ffmpeg.ts @@ -3,650 +3,764 @@ import { exec } from "node:child_process"; // This could be done dynamically by running `ffmpeg -formats` and parsing the output export const properties = { from: { - video: [ - "012v", + muxer: [ + "264", + "265", + "302", + "3dostr", + "3g2", + "3gp", "4xm", - "8bps", - "aasc", - "agm", - "aic", + "669", + "722", + "aa", + "aa3", + "aac", + "aax", + "ac3", + "ace", + "acm", + "act", + "adf", + "adp", + "ads", + "adx", + "aea", + "afc", + "aiff", + "aix", + "al", + "alaw", "alias_pix", - "amv", + "alp", + "alsa", + "amf", + "amr", + "amrnb", + "amrwb", + "ams", "anm", - "ansi", + "ans", + "apc", + "ape", + "apl", + "apm", "apng", - "arbc", - "argo", - "asv1", - "asv2", - "aura", - "aura2", + "aptx", + "aptxhd", + "aptx_hd", + "aqt", + "aqtitle", + "argo_asf", + "argo_brp", + "art", + "asc", + "asf", + "asf_o", + "ass", + "ast", + "au", "av1", - "avrn", - "avrp", + "avc", + "avi", + "avr", "avs", - "avui", - "ayuv", + "avs2", + "avs3", + "bcstm", "bethsoftvid", "bfi", - "binkvideo", - "bintext", - "bitpacked", - "bmp", - "bmv_video", + "bfstm", + "bin", + "bink", + "binka", + "bit", + "bmp_pipe", + "bmv", + "boa", "brender_pix", + "brstm", + "c2", "c93", - "cavs", - "cdgraphics", - "cdtoons", + "caf", + "cavsvideo", + "cdata", + "cdg", "cdxl", - "cfhd", - "cinepak", - "clearvideo", - "cljr", - "cllc", - "cmv", - "cpia", - "cri", - "cscd", - "cyuv", - "dds", + "cgi", + "cif", + "cine", + "codec2", + "codec2raw", + "concat", + "cri_pipe", + "dash", + "dat", + "data", + "daud", + "dav", + "dbm", + "dcstr", + "dds_pipe", + "derf", "dfa", + "dhav", + "dif", + "digi", "dirac", + "diz", + "dmf", "dnxhd", - "dpx", - "dsicinvideo", - "dvvideo", + "dpx_pipe", + "dsf", + "dsicin", + "dsm", + "dss", + "dtk", + "dtm", + "dts", + "dtshd", + "dv", + "dvbsub", + "dvbtxt", "dxa", - "dxtory", - "dxv", - "escape124", - "escape130", - "exr", - "ffv1", - "ffvhuff", - "fic", + "ea", + "eac3", + "ea_cdata", + "epaf", + "exr_pipe", + "f32be", + "f32le", + "f4v", + "f64be", + "f64le", + "fap", + "far", + "fbdev", + "ffmetadata", + "filmstrip", + "film_cpk", "fits", - "flashsv", - "flashsv2", + "flac", "flic", - "flv1", - "fmvc", - "fraps", - "frwu", - "g2m", + "flm", + "flv", + "frm", + "fsb", + "fwse", + "g722", + "g723_1", + "g726", + "g726le", + "g729", + "gdm", "gdv", + "genh", "gif", + "gif_pipe", + "gsm", + "gxf", "h261", "h263", - "h263i", - "h263p", "h264", - "hap", - "hevc", - "hnm4video", - "hq_hqa", - "hqx", - "huffyuv", - "hymt", - "idcin", - "idf", - "iff_ilbm", - "imm4", - "imm5", - "indeo2", - "indeo3", - "indeo4", - "indeo5", - "interplayvideo", - "ipu", - "jpeg2000", - "jpegls", - "jv", - "kgv1", - "kmvc", - "lagarith", - "loco", - "lscr", - "m101", - "mad", - "magicyuv", - "mdec", - "mimic", - "mjpeg", - "mjpegb", - "mmvideo", - "mobiclip", - "motionpixels", - "mpeg1video", - "mpeg2video", - "mpeg4", - "msa1", - "mscc", - "msmpeg4v1", - "msmpeg4v2", - "msmpeg4v3", - "msp2", - "msrle", - "mss1", - "mss2", - "msvideo1", - "mszh", - "mts2", - "mv30", - "mvc1", - "mvc2", - "mvdv", - "mvha", - "mwsc", - "mxpeg", - "notchlc", - "nuv", - "paf_video", - "pam", - "pbm", - "pcx", - "pfm", - "pgm", - "pgmyuv", - "pgx", - "photocd", - "pictor", - "pixlet", - "png", - "ppm", - "prores", - "prosumer", - "psd", - "ptx", - "qdraw", - "qpeg", - "qtrle", - "r10k", - "r210", - "rasc", - "rawvideo", - "rl2", - "roq", - "rpza", - "rscc", - "rv10", - "rv20", - "rv30", - "rv40", - "sanm", - "scpr", - "screenpresso", - "sga", - "sgi", - "sgirle", - "sheervideo", - "simbiosis_imx", - "smackvideo", - "smc", - "smvjpeg", - "snow", - "sp5x", - "speedhq", - "srgc", - "sunrast", - "svg", - "svq1", - "svq3", - "targa", - "targa_y216", - "tdsc", - "tgq", - "tgv", - "theora", - "thp", - "tiertexseqvideo", - "tiff", - "tmv", - "tqi", - "truemotion1", - "truemotion2", - "truemotion2rt", - "tscc", - "tscc2", - "txd", - "ulti", - "utvideo", - "v210", - "v210x", - "v308", - "v408", - "v410", - "vb", - "vble", - "vc1", - "vc1image", - "vcr1", - "vixl", - "vmdvideo", - "vmnc", - "vp3", - "vp4", - "vp5", - "vp6", - "vp6a", - "vp6f", - "vp7", - "vp8", - "vp9", - "wcmv", - "webp", - "wmv1", - "wmv2", - "wmv3", - "wmv3image", - "wnv1", - "wrapped_avframe", - "ws_vqa", - "xan_wc3", - "xan_wc4", - "xbin", - "xbm", - "xface", - "xpm", - "xwd", - "y41p", - "ylc", - "yop", - "yuv4", - "zerocodec", - "zlib", - "zmbv", - ], - audio: [ - "8svx_exp", - "8svx_fib", - "aac", - "aac_latm", - "ac3", - "acelp.kelvin", - "adpcm_4xm", - "adpcm_adx", - "adpcm_afc", - "adpcm_agm", - "adpcm_aica", - "adpcm_argo", - "adpcm_ct", - "adpcm_dtk", - "adpcm_ea", - "adpcm_ea_maxis_xa", - "adpcm_ea_r1", - "adpcm_ea_r2", - "adpcm_ea_r3", - "adpcm_ea_xas", - "adpcm_g722", - "adpcm_g726", - "adpcm_g726le", - "adpcm_ima_alp", - "adpcm_ima_amv", - "adpcm_ima_apc", - "adpcm_ima_apm", - "adpcm_ima_cunning", - "adpcm_ima_dat4", - "adpcm_ima_dk3", - "adpcm_ima_dk4", - "adpcm_ima_ea_eacs", - "adpcm_ima_ea_sead", - "adpcm_ima_iss", - "adpcm_ima_moflex", - "adpcm_ima_mtf", - "adpcm_ima_oki", - "adpcm_ima_qt", - "adpcm_ima_rad", - "adpcm_ima_smjpeg", - "adpcm_ima_ssi", - "adpcm_ima_wav", - "adpcm_ima_ws", - "adpcm_ms", - "adpcm_mtaf", - "adpcm_psx", - "adpcm_sbpro_2", - "adpcm_sbpro_3", - "adpcm_sbpro_4", - "adpcm_swf", - "adpcm_thp", - "adpcm_thp_le", - "adpcm_vima", - "adpcm_xa", - "adpcm_yamaha", - "adpcm_zork", - "alac", - "amr_nb", - "amr_wb", - "ape", - "aptx", - "aptx_hd", - "atrac1", - "atrac3", - "atrac3al", - "atrac3p", - "atrac3pal", - "atrac9", - "avc", - "binkaudio_dct", - "binkaudio_rdft", - "bmv_audio", - "codec2", - "comfortnoise", - "cook", - "derf_dpcm", - "dolby_e", - "dsd_lsbf", - "dsd_lsbf_planar", - "dsd_msbf", - "dsd_msbf_planar", - "dsicinaudio", - "dss_sp", - "dst", - "dts", - "dvaudio", - "eac3", - "evrc", - "fastaudio", - "flac", - "g723_1", - "g729", - "gremlin_dpcm", - "gsm", - "gsm_ms", + "h265", + "h26l", "hca", "hcom", - "iac", + "hevc", + "hls", + "hnm", + "ice", + "ico", + "idcin", + "idf", + "idx", + "iec61883", + "iff", + "ifv", "ilbc", - "imc", - "interplay_dpcm", - "interplayacm", - "mace3", - "mace6", - "metasound", + "image2", + "image2pipe", + "imf", + "imx", + "ingenient", + "ipmovie", + "ipu", + "ircam", + "ism", + "isma", + "ismv", + "iss", + "it", + "iv8", + "ivf", + "ivr", + "j2b", + "j2k", + "j2k_pipe", + "jack", + "jacosub", + "jpegls_pipe", + "jpeg_pipe", + "jv", + "kmsgrab", + "kux", + "kvag", + "lavfi", + "libcdio", + "libdc1394", + "libgme", + "libopenmpt", + "live_flv", + "lmlm4", + "loas", + "lrc", + "luodat", + "lvf", + "lxf", + "m15", + "m2a", + "m4a", + "m4b", + "m4v", + "mac", + "matroska", + "mca", + "mcc", + "mdl", + "med", + "mgsts", + "microdvd", + "mj2", + "mjpeg", + "mjpeg_2000", + "mjpg", + "mk3d", + "mka", + "mks", + "mkv", "mlp", - "mp1", + "mlv", + "mm", + "mmcmp", + "mmf", + "mms", + "mo3", + "mod", + "mods", + "moflex", + "mov", "mp2", "mp3", - "mp3adu", - "mp3on4", - "mp4als", - "musepack7", - "musepack8", - "nellymoser", - "opus", - "paf_audio", - "pcm_alaw", - "pcm_bluray", - "pcm_dvd", - "pcm_f16le", - "pcm_f24le", - "pcm_f32be", - "pcm_f32le", - "pcm_f64be", - "pcm_f64le", - "pcm_lxf", - "pcm_mulaw", - "pcm_s16be", - "pcm_s16be_planar", - "pcm_s16le", - "pcm_s16le_planar", - "pcm_s24be", - "pcm_s24daud", - "pcm_s24le", - "pcm_s24le_planar", - "pcm_s32be", - "pcm_s32le", - "pcm_s32le_planar", - "pcm_s64be", - "pcm_s64le", - "pcm_s8", - "pcm_s8_planar", - "pcm_sga", - "pcm_u16be", - "pcm_u16le", - "pcm_u24be", - "pcm_u24le", - "pcm_u32be", - "pcm_u32le", - "pcm_u8", - "pcm_vidc", - "qcelp", - "qdm2", - "qdmc", - "ra_144", - "ra_288", - "ralf", - "roq_dpcm", - "s302m", - "sbc", - "sdx2_dpcm", - "shorten", - "sipr", - "siren", - "smackaudio", - "sol_dpcm", - "sonic", - "speex", - "tak", - "truehd", - "truespeech", - "tta", - "twinvq", - "vmdaudio", - "vorbis", - "wavesynth", - "wavpack", - "westwood_snd1", - "wmalossless", - "wmapro", - "wmav1", - "wmav2", - "wmavoice", - "xan_dpcm", - "xma1", - "xma2", - ], - subtitles: [ - "ass", - "dvb_subtitle", - "dvb_teletext", - "dvd_subtitle", - "eia_608", - "hdmv_pgs_subtitle", - "jacosub", - "microdvd", - "mov_text", + "mp4", + "mpa", + "mpc", + "mpc8", + "mpeg", + "mpegts", + "mpegtsraw", + "mpegvideo", + "mpjpeg", "mpl2", + "mpo", + "mpsub", + "mptm", + "msbc", + "msf", + "msnwctcp", + "msp", + "mt2", + "mtaf", + "mtm", + "mtv", + "mulaw", + "musx", + "mv", + "mvi", + "mxf", + "mxg", + "nc", + "nfo", + "nist", + "nistsphere", + "nsp", + "nst", + "nsv", + "nut", + "nuv", + "obu", + "ogg", + "okt", + "oma", + "omg", + "openal", + "oss", + "paf", + "pam_pipe", + "pbm_pipe", + "pcx_pipe", + "pgmyuv_pipe", + "pgm_pipe", + "pgx_pipe", + "photocd_pipe", + "pictor_pipe", "pjs", + "plm", + "pmp", + "png_pipe", + "ppm", + "ppm_pipe", + "pp_bnk", + "psd_pipe", + "psm", + "psp", + "psxstr", + "pt36", + "ptm", + "pulse", + "pva", + "pvf", + "qcif", + "qcp", + "qdraw_pipe", + "r3d", + "rawvideo", + "rco", + "rcv", "realtext", + "redspark", + "rgb", + "rl2", + "rm", + "roq", + "rpl", + "rsd", + "rso", + "rt", + "rtp", + "rtsp", + "s16be", + "s16le", + "s24be", + "s24le", + "s32be", + "s32le", + "s337m", + "s3m", + "s8", "sami", + "sap", + "sb", + "sbc", + "sbg", + "scc", + "sdp", + "sdr2", + "sds", + "sdx", + "ser", + "sf", + "sfx", + "sfx2", + "sga", + "sgi_pipe", + "shn", + "siff", + "simbiosis_imx", + "sln", + "smi", + "smjpeg", + "smk", + "smush", + "sndio", + "sol", + "son", + "sox", + "spdif", + "sph", + "srt", + "ss2", + "ssa", + "st26", + "stk", "stl", - "subrip", + "stm", + "stp", + "str", + "sub", "subviewer", "subviewer1", - "text", + "sunrast_pipe", + "sup", + "svag", + "svg_pipe", + "svs", + "sw", + "swf", + "tak", + "tco", + "tedcaptions", + "thd", + "thp", + "tiertexseq", + "tiff_pipe", + "tmv", + "truehd", + "tta", + "tty", + "txd", + "txt", + "ty", + "ty+", + "u16be", + "u16le", + "u24be", + "u24le", + "u32be", + "u32le", + "u8", + "ub", + "ul", + "ult", + "umx", + "uw", + "v", + "v210", + "v210x", + "vag", + "vb", + "vc1", + "vc1test", + "vidc", + "video4linux2", + "viv", + "vividas", + "vivo", + "vmd", + "vobsub", + "voc", + "vpk", "vplayer", + "vqe", + "vqf", + "vql", + "vt", + "vtt", + "w64", + "wav", + "wc3movie", + "webm", + "webm_dash_manifest", + "webp_pipe", "webvtt", - "xsub", + "wow", + "wsaud", + "wsd", + "wsvqa", + "wtv", + "wv", + "wve", + "x11grab", + "xa", + "xbin", + "xbm_pipe", + "xl", + "xm", + "xmv", + "xpk", + "xpm_pipe", + "xvag", + "xwd_pipe", + "xwma", + "y4m", + "yop", + "yuv", + "yuv10", + "yuv4mpegpipe", ], }, to: { - video: [ - "a64_multi", - "a64_multi5", - "ljpeg", - "alias_pix", + muxer: [ + "264", + "265", + "302", + "3g2", + "3gp", + "a64", + "aac", + "ac3", + "adts", + "adx", + "afc", + "aif", + "aifc", + "aiff", + "al", + "alaw", + "alp", + "alsa", + "amr", "amv", + "apm", "apng", - "asv1", - "asv2", - "av1", - "avrp", - "avui", - "ayuv", + "aptx", + "aptxhd", + "aptx_hd", + "argo_asf", + "asf", + "asf_stream", + "ass", + "ast", + "au", + "avi", + "avm2", + "avs", + "avs2", + "bit", "bmp", - "cfhd", - "cinepak", - "cljr", + "c2", + "caca", + "caf", + "cavs", + "cavsvideo", + "chk", + "chromaprint", + "codec2", + "codec2raw", + "cpk", + "crc", + "dash", + "data", + "daud", "dirac", "dnxhd", + "dnxhr", "dpx", - "dvvideo", + "drc", + "dts", + "dv", + "dvd", + "eac3", "exr", - "ffv1", - "ffvhuff", + "f32be", + "f32le", + "f4v", + "f64be", + "f64le", + "fbdev", + "ffmeta", + "ffmetadata", + "fifo", + "fifo_test", + "filmstrip", + "film_cpk", "fits", - "flashsv", - "flashsv2", - "flv1", + "flac", + "flm", + "flv", + "framecrc", + "framehash", + "framemd5", + "g722", + "g723_1", + "g726", + "g726le", "gif", + "gsm", + "gxf", "h261", "h263", - "h263p", "h264", - "hap", + "h265", + "hash", + "hds", "hevc", - "huffyuv", - "jpeg2000", - "jpegls", - "magicyuv", + "hls", + "ico", + "ilbc", + "im1", + "im24", + "im8", + "image2", + "image2pipe", + "ipod", + "ircam", + "isma", + "ismv", + "ivf", + "j2c", + "j2k", + "jacosub", + "jls", + "jp2", + "jpeg", + "jpg", + "js", + "jss", + "kvag", + "latm", + "lbc", + "ljpg", + "loas", + "lrc", + "m1v", + "m2a", + "m2t", + "m2ts", + "m2v", + "m3u8", + "m4a", + "m4b", + "m4v", + "matroska", + "md5", + "microdvd", "mjpeg", + "mjpg", + "mkv", + "mkvtimestamp_v2", + "mlp", + "mmf", + "mov", + "mp2", + "mp3", + "mp4", + "mpa", + "mpd", + "mpeg", "mpeg1video", "mpeg2video", - "mpeg4", - "msmpeg4v2", - "msmpeg4v3", - "msvideo1", + "mpegts", + "mpg", + "mpjpeg", + "msbc", + "mts", + "mulaw", + "mxf", + "mxf_d10", + "mxf_opatom", + "null", + "nut", + "oga", + "ogg", + "ogv", + "oma", + "opengl", + "opus", + "oss", "pam", "pbm", + "pcm", "pcx", "pfm", "pgm", "pgmyuv", + "pix", "png", "ppm", - "prores", - "qtrle", - "r10k", - "r210", + "psp", + "pulse", + "ra", + "ras", "rawvideo", + "rco", + "rcv", + "rgb", + "rm", "roq", - "rpza", - "rv10", - "rv20", + "rs", + "rso", + "rtp", + "rtp_mpegts", + "rtsp", + "s16be", + "s16le", + "s24be", + "s24le", + "s32be", + "s32le", + "s8", + "sap", + "sb", + "sbc", + "scc", + "sdl", + "sdl2", + "segment", + "sf", "sgi", - "snow", - "speedhq", - "sunrast", - "svq1", - "targa", - "theora", + "singlejpeg", + "smjpeg", + "smoothstreaming", + "sndio", + "sox", + "spdif", + "spx", + "srt", + "ssa", + "ssegment", + "streamhash", + "stream_segment", + "sub", + "sun", + "sunras", + "sup", + "svcd", + "sw", + "swf", + "tco", + "tee", + "tga", + "thd", + "tif", "tiff", - "utvideo", - "v210", - "v308", - "v408", - "v410", - "vp8", - "vp9", + "truehd", + "ts", + "tta", + "ttml", + "tun", + "u16be", + "u16le", + "u24be", + "u24le", + "u32be", + "u32le", + "u8", + "ub", + "ul", + "uncodedframecrc", + "uw", + "v4l2", + "vag", + "vc1", + "vc1test", + "vc2", + "vcd", + "vidc", + "video4linux2", + "vob", + "voc", + "vtt", + "w64", + "wav", + "webm", + "webm_chunk", + "webm_dash_manifest", "webp", - "wmv1", - "wmv2", - "wrapped_avframe", + "webvtt", + "wma", + "wmv", + "wtv", + "wv", "xbm", "xface", + "xml", + "xv", "xwd", - "y41p", - "yuv4", - "zlib", - "zmbv", - ], - audio: [ - "aac", - "ac3", - "adpcm_adx", - "adpcm_argo", - "adpcm_g722", - "adpcm_g726", - "adpcm_g726le", - "adpcm_ima_alp", - "adpcm_ima_amv", - "adpcm_ima_apm", - "adpcm_ima_qt", - "adpcm_ima_ssi", - "adpcm_ima_wav", - "adpcm_ms", - "adpcm_swf", - "adpcm_yamaha", - "alac", - "aptx", - "aptx_hd", - "codec2", - "comfortnoise", - "dts", - "eac3", - "flac", - "g723_1", - "gsm", - "gsm_ms", - "mlp", - "mp2", - "mp3", - "nellymoser", - "opus", - "pcm_alaw", - "pcm_dvd", - "pcm_f32be", - "pcm_f32le", - "pcm_f64be", - "pcm_f64le", - "pcm_mulaw", - "pcm_s16be", - "pcm_s16be_planar", - "pcm_s16le", - "pcm_s16le_planar", - "pcm_s24be", - "pcm_s24daud", - "pcm_s24le", - "pcm_s24le_planar", - "pcm_s32be", - "pcm_s32le", - "pcm_s32le_planar", - "pcm_s64be", - "pcm_s64le", - "pcm_s8", - "pcm_s8_planar", - "pcm_u16be", - "pcm_u16le", - "pcm_u24be", - "pcm_u24le", - "pcm_u32be", - "pcm_u32le", - "pcm_u8", - "pcm_vidc", - "ra_144", - "roq_dpcm", - "s302m", - "sbc", - "sonic", - "speex", - "truehd", - "tta", - "vorbis", - "wavpack", - "wmav1", - "wmav2", - ], - subtitles: [ - "ass", - "dvb_subtitle", - "dvd_subtitle", - "mov_text", - "subrip", - "text", - "webvtt", - "xsub", + "y", + "y4m", + "yuv", + "yuv4mpegpipe", ], }, }; @@ -659,21 +773,39 @@ export async function convert( // biome-ignore lint/suspicious/noExplicitAny: options?: any, ) { - let command = "ffmpeg"; + // let command = "ffmpeg"; - const notWorking = ["bmp"]; + // these are containers that can contain multiple formats + // const autoDetect = [ + // "mp4", + // "mkv", + // "avi", + // "mov", + // "m4a", + // "3gp", + // "3g2", + // "mj2", + // "psp", + // "m4b", + // "ism", + // "ismv", + // "isma", + // "f4v", + // ]; - if (!(fileType in notWorking)) { - command += ` -f "${fileType}"`; - } + // if (!(fileType in autoDetect)) { + // command += ` -f "${fileType}"`; + // } - command += ` -i "${filePath}"`; + // command += ` -i "${filePath}"`; - if (!(convertTo in notWorking)) { - command += ` -f "${convertTo}"`; - } + // if (!(convertTo in autoDetect)) { + // command += ` -f "${convertTo}"`; + // } - command += ` ${targetPath}`; + // command += ` "${targetPath}"`; + + const command = `ffmpeg -i "${filePath}" "${targetPath}"`; return exec(command, (error, stdout, stderr) => { if (error) { diff --git a/src/helpers/normalizeFiletype.ts b/src/helpers/normalizeFiletype.ts index f77b996..c1389f2 100644 --- a/src/helpers/normalizeFiletype.ts +++ b/src/helpers/normalizeFiletype.ts @@ -9,4 +9,17 @@ export const normalizeFiletype = (filetype: string): string => { default: return lowercaseFiletype; } +} + +export const normalizeOutputFiletype = (filetype: string): string => { + const lowercaseFiletype = filetype.toLowerCase(); + + switch (lowercaseFiletype) { + case "jpeg": + return "jpg"; + case "mpeg4": + return "mp4"; + default: + return lowercaseFiletype; + } } \ No newline at end of file diff --git a/src/index.tsx b/src/index.tsx index b53cc32..7b8bb51 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -615,6 +615,7 @@ const app = new Elysia() const filePath = `${userUploadsDir}${fileName}`; const fileTypeOrig = fileName.split(".").pop() as string; const fileType = normalizeFiletype(fileTypeOrig); + const newFileExt = normalizeOutputFiletype(convertTo); const newFileName = fileName.replace(fileTypeOrig, convertTo); const targetPath = `${userOutputDir}${newFileName}`; @@ -838,50 +839,51 @@ const app = new Elysia() } return ( - -
-
-
-

Converters

- - - - - - - - - - {Object.entries(getAllTargets()).map(([converter, targets]) => { - const inputs = getAllInputs(converter); - return ( - - - - + +
+
+
+

Converters

+
ConverterFrom (Count)To (Count)
{converter} - Count: {inputs.length} -
    - {inputs.map((input, index) => ( -
  • {input}
  • - ))} -
-
- Count: {targets.length} -
    - {targets.map((target, index) => ( -
  • {target}
  • - ))} -
-
+ + + + + - ); - })} - -
ConverterFrom (Count)To (Count)
-
-
- -); + + + {Object.entries(getAllTargets()).map(([converter, targets]) => { + const inputs = getAllInputs(converter); + return ( + // biome-ignore lint/correctness/useJsxKeyInIterable: + + {converter} + + Count: {inputs.length} +
    + {inputs.map((input) => ( +
  • {input}
  • + ))} +
+ + + Count: {targets.length} +
    + {targets.map((target) => ( +
  • {target}
  • + ))} +
+ + + ); + })} + + + + + + ); }) .get( "/zip/:userId/:jobId",