From 1ece1e443d7e2d1a8422291dcdd820ba8d5b00bb Mon Sep 17 00:00:00 2001 From: Leonid Nikitin Date: Thu, 7 Mar 2024 22:18:35 +0500 Subject: [PATCH] Added the ability to convert files to different extensions. --- convertor/view.go | 97 ++++++++++++++++++- encoder/apng/encoder.go | 21 +++++ encoder/bmp/encoder.go | 21 +++++ encoder/encoder.go | 79 ++++++++++++++++ encoder/flv/encoder.go | 21 +++++ encoder/gif/encoder.go | 21 +++++ encoder/h264_nvenc/encoder.go | 23 +++++ encoder/libmp3lame/encoder.go | 21 +++++ encoder/libshine/encoder.go | 21 +++++ encoder/libtwolame/encoder.go | 21 +++++ encoder/libvpx/encoder.go | 21 +++++ encoder/libvpx_vp9/encoder.go | 21 +++++ encoder/libwebp/encoder.go | 21 +++++ encoder/libwebp_anim/encoder.go | 21 +++++ encoder/libx264/encoder.go | 21 +++++ encoder/libx265/encoder.go | 21 +++++ encoder/libxvid/encoder.go | 21 +++++ encoder/mjpeg/encoder.go | 21 +++++ encoder/mp2/encoder.go | 21 +++++ encoder/mp2fixed/encoder.go | 21 +++++ encoder/mpeg1video/encoder.go | 21 +++++ encoder/mpeg2video/encoder.go | 21 +++++ encoder/mpeg4/encoder.go | 21 +++++ encoder/msmpeg4/encoder.go | 21 +++++ encoder/msmpeg4v2/encoder.go | 21 +++++ encoder/msvideo1/encoder.go | 21 +++++ encoder/png/encoder.go | 21 +++++ encoder/qtrle/encoder.go | 21 +++++ encoder/sgi/encoder.go | 21 +++++ encoder/tiff/encoder.go | 21 +++++ encoder/wmav1/encoder.go | 21 +++++ encoder/wmav2/encoder.go | 21 +++++ encoder/wmv1/encoder.go | 21 +++++ encoder/wmv2/encoder.go | 21 +++++ encoder/xbm/encoder.go | 21 +++++ handler/convertor.go | 16 +++- kernel/convertor.go | 73 +++++++++++++- kernel/encoder/encoder.go | 84 +++++++++++++++++ kernel/encoder/encoders.go | 74 +++++++++++++++ languages/active.en.toml | 162 ++++++++++++++++++++++++++++++-- languages/active.kk.toml | 160 +++++++++++++++++++++++++++++-- languages/active.ru.toml | 43 ++++++++- languages/translate.en.toml | 148 ++++++++++++++++++++++++++--- languages/translate.kk.toml | 148 ++++++++++++++++++++++++++--- main.go | 4 +- 45 files changed, 1735 insertions(+), 48 deletions(-) create mode 100644 encoder/apng/encoder.go create mode 100644 encoder/bmp/encoder.go create mode 100644 encoder/encoder.go create mode 100644 encoder/flv/encoder.go create mode 100644 encoder/gif/encoder.go create mode 100644 encoder/h264_nvenc/encoder.go create mode 100644 encoder/libmp3lame/encoder.go create mode 100644 encoder/libshine/encoder.go create mode 100644 encoder/libtwolame/encoder.go create mode 100644 encoder/libvpx/encoder.go create mode 100644 encoder/libvpx_vp9/encoder.go create mode 100644 encoder/libwebp/encoder.go create mode 100644 encoder/libwebp_anim/encoder.go create mode 100644 encoder/libx264/encoder.go create mode 100644 encoder/libx265/encoder.go create mode 100644 encoder/libxvid/encoder.go create mode 100644 encoder/mjpeg/encoder.go create mode 100644 encoder/mp2/encoder.go create mode 100644 encoder/mp2fixed/encoder.go create mode 100644 encoder/mpeg1video/encoder.go create mode 100644 encoder/mpeg2video/encoder.go create mode 100644 encoder/mpeg4/encoder.go create mode 100644 encoder/msmpeg4/encoder.go create mode 100644 encoder/msmpeg4v2/encoder.go create mode 100644 encoder/msvideo1/encoder.go create mode 100644 encoder/png/encoder.go create mode 100644 encoder/qtrle/encoder.go create mode 100644 encoder/sgi/encoder.go create mode 100644 encoder/tiff/encoder.go create mode 100644 encoder/wmav1/encoder.go create mode 100644 encoder/wmav2/encoder.go create mode 100644 encoder/wmv1/encoder.go create mode 100644 encoder/wmv2/encoder.go create mode 100644 encoder/xbm/encoder.go create mode 100644 kernel/encoder/encoder.go create mode 100644 kernel/encoder/encoders.go diff --git a/convertor/view.go b/convertor/view.go index 0510768..f6376aa 100644 --- a/convertor/view.go +++ b/convertor/view.go @@ -7,7 +7,9 @@ import ( "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/storage" "fyne.io/fyne/v2/widget" + encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel/encoder" "github.com/nicksnyder/go-i18n/v2/i18n" "image/color" "path/filepath" @@ -16,6 +18,7 @@ import ( type ViewContract interface { Main( runConvert func(setting HandleConvertSetting), + formats encoder.ConvertorFormatsContract, ) SelectFFPath( ffmpegPath string, @@ -34,6 +37,8 @@ type HandleConvertSetting struct { VideoFileInput kernel.File DirectoryForSave string OverwriteOutputFiles bool + Format string + Encoder encoder2.EncoderContract } type enableFormConversionStruct struct { @@ -50,6 +55,7 @@ func NewView(app kernel.AppContract) *View { func (v View) Main( runConvert func(setting HandleConvertSetting), + formats encoder.ConvertorFormatsContract, ) { form := &widget.Form{} @@ -68,9 +74,11 @@ func (v View) Main( isOverwriteOutputFiles = b }) + selectEncoder := v.getSelectFormat(formats) + form.Items = []*widget.FormItem{ { - Text: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "fileVideoForConversionTitle"}), + Text: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "fileForConversionTitle"}), Widget: fileVideoForConversion, }, { @@ -86,6 +94,17 @@ func (v View) Main( { Widget: checkboxOverwriteOutputFiles, }, + { + Widget: selectEncoder.SelectFileType, + }, + { + Text: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "selectFormat"}), + Widget: selectEncoder.SelectFormat, + }, + { + Text: v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "selectEncoder"}), + Widget: selectEncoder.SelectEncoder, + }, } form.SubmitText = v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ MessageID: "converterVideoFilesSubmitTitle", @@ -105,6 +124,18 @@ func (v View) Main( enableFormConversion(enableFormConversionStruct) return } + if len(selectEncoder.SelectFormat.Selected) == 0 { + showConversionMessage(conversionMessage, errors.New(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ + MessageID: "errorSelectedFormat", + }))) + return + } + if selectEncoder.Encoder == nil { + showConversionMessage(conversionMessage, errors.New(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ + MessageID: "errorSelectedEncoder", + }))) + return + } conversionMessage.Text = "" fileVideoForConversion.Disable() @@ -115,6 +146,8 @@ func (v View) Main( VideoFileInput: *fileInput, DirectoryForSave: *pathToSaveDirectory, OverwriteOutputFiles: isOverwriteOutputFiles, + Format: selectEncoder.SelectFormat.Selected, + Encoder: selectEncoder.Encoder, } runConvert(setting) enableFormConversion(enableFormConversionStruct) @@ -209,6 +242,68 @@ func (v View) getButtonForSelectingDirectoryForSaving() (button *widget.Button, return } +type selectEncoder struct { + SelectFileType *widget.RadioGroup + SelectFormat *widget.Select + SelectEncoder *widget.Select + Encoder encoder2.EncoderContract +} + +func (v View) getSelectFormat(formats encoder.ConvertorFormatsContract) *selectEncoder { + selectEncoder := &selectEncoder{} + + encoders := map[int]encoder2.EncoderDataContract{} + selectEncoder.SelectEncoder = widget.NewSelect([]string{}, func(s string) { + if encoders[selectEncoder.SelectEncoder.SelectedIndex()] == nil { + return + } + selectEncoder.Encoder = encoders[selectEncoder.SelectEncoder.SelectedIndex()].NewEncoder() + }) + + formatSelected := "" + selectEncoder.SelectFormat = widget.NewSelect([]string{}, func(s string) { + if formatSelected == s { + return + } + formatSelected = s + format, err := formats.GetFormat(s) + if err != nil { + return + } + encoderOptions := []string{} + encoders = format.GetEncoders() + for _, e := range encoders { + encoderOptions = append(encoderOptions, v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{MessageID: "encoder_" + e.GetTitle()})) + } + selectEncoder.SelectEncoder.SetOptions(encoderOptions) + selectEncoder.SelectEncoder.SetSelectedIndex(0) + }) + + fileTypeOptions := []string{} + for _, fileType := range encoder2.GetListFileType() { + fileTypeOptions = append(fileTypeOptions, fileType.Name()) + } + selectEncoder.SelectFileType = widget.NewRadioGroup([]string{"video", "audio", "image"}, func(s string) { + formatOptions := []string{} + for _, f := range formats.GetFormats() { + if s != f.GetFileType().Name() { + continue + } + formatOptions = append(formatOptions, f.GetTitle()) + } + selectEncoder.SelectFormat.SetOptions(formatOptions) + if s == encoder2.FileType(encoder2.Video).Name() { + selectEncoder.SelectFormat.SetSelected("mp4") + } else { + selectEncoder.SelectFormat.SetSelectedIndex(0) + } + }) + selectEncoder.SelectFileType.Horizontal = true + selectEncoder.SelectFileType.SetSelected("video") + + return selectEncoder +} + func setStringErrorStyle(text *canvas.Text) { text.Color = color.RGBA{R: 255, G: 0, B: 0, A: 255} text.Refresh() diff --git a/encoder/apng/encoder.go b/encoder/apng/encoder.go new file mode 100644 index 0000000..670f568 --- /dev/null +++ b/encoder/apng/encoder.go @@ -0,0 +1,21 @@ +package apng + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "apng"} +} + +func NewData() encoder2.EncoderDataContract { + title := "apng" + formats := []string{"apng"} + fileType := encoder2.FileType(encoder2.Image) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/bmp/encoder.go b/encoder/bmp/encoder.go new file mode 100644 index 0000000..8a3ed28 --- /dev/null +++ b/encoder/bmp/encoder.go @@ -0,0 +1,21 @@ +package bmp + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "bmp"} +} + +func NewData() encoder2.EncoderDataContract { + title := "bmp" + formats := []string{"bmp"} + fileType := encoder2.FileType(encoder2.Image) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/encoder.go b/encoder/encoder.go new file mode 100644 index 0000000..4bcf835 --- /dev/null +++ b/encoder/encoder.go @@ -0,0 +1,79 @@ +package encoder + +type EncoderContract interface { + GetParams() []string +} + +type EncoderDataContract interface { + GetTitle() string + GetFormats() []string + GetFileType() FileTypeContract + NewEncoder() EncoderContract +} + +type Data struct { + title string + formats []string + fileType FileTypeContract + encoder func() EncoderContract +} + +func NewData(title string, formats []string, fileType FileTypeContract, encoder func() EncoderContract) *Data { + return &Data{ + title: title, + formats: formats, + fileType: fileType, + encoder: encoder, + } +} + +func (data Data) GetTitle() string { + return data.title +} + +func (data Data) GetFormats() []string { + return data.formats +} + +func (data Data) NewEncoder() EncoderContract { + return data.encoder() +} + +func (data Data) GetFileType() FileTypeContract { + return data.fileType +} + +type FileTypeContract interface { + Name() string + Ordinal() int +} + +const ( + Video = iota + Audio + Image +) + +type FileType uint + +var fileTypeStrings = []string{ + "video", + "audio", + "image", +} + +func (fileType FileType) Name() string { + return fileTypeStrings[fileType] +} + +func (fileType FileType) Ordinal() int { + return int(fileType) +} + +func GetListFileType() []FileTypeContract { + return []FileTypeContract{ + FileType(Video), + FileType(Audio), + FileType(Image), + } +} diff --git a/encoder/flv/encoder.go b/encoder/flv/encoder.go new file mode 100644 index 0000000..c581f7c --- /dev/null +++ b/encoder/flv/encoder.go @@ -0,0 +1,21 @@ +package flv + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "flv"} +} + +func NewData() encoder2.EncoderDataContract { + title := "flv" + formats := []string{"flv"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/gif/encoder.go b/encoder/gif/encoder.go new file mode 100644 index 0000000..b08eaa8 --- /dev/null +++ b/encoder/gif/encoder.go @@ -0,0 +1,21 @@ +package gif + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "gif"} +} + +func NewData() encoder2.EncoderDataContract { + title := "gif" + formats := []string{"gif"} + fileType := encoder2.FileType(encoder2.Image) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/h264_nvenc/encoder.go b/encoder/h264_nvenc/encoder.go new file mode 100644 index 0000000..d01e6d1 --- /dev/null +++ b/encoder/h264_nvenc/encoder.go @@ -0,0 +1,23 @@ +package h264_nvenc + +import ( + encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" +) + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "h264_nvenc"} +} + +func NewData() encoder2.EncoderDataContract { + title := "h264_nvenc" + formats := []string{"mp4"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/libmp3lame/encoder.go b/encoder/libmp3lame/encoder.go new file mode 100644 index 0000000..0c1d047 --- /dev/null +++ b/encoder/libmp3lame/encoder.go @@ -0,0 +1,21 @@ +package libmp3lame + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:a", "libmp3lame"} +} + +func NewData() encoder2.EncoderDataContract { + title := "libmp3lame" + formats := []string{"mp3"} + fileType := encoder2.FileType(encoder2.Audio) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/libshine/encoder.go b/encoder/libshine/encoder.go new file mode 100644 index 0000000..9db1a6c --- /dev/null +++ b/encoder/libshine/encoder.go @@ -0,0 +1,21 @@ +package libshine + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:a", "libshine"} +} + +func NewData() encoder2.EncoderDataContract { + title := "libshine" + formats := []string{"mp3"} + fileType := encoder2.FileType(encoder2.Audio) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/libtwolame/encoder.go b/encoder/libtwolame/encoder.go new file mode 100644 index 0000000..958e601 --- /dev/null +++ b/encoder/libtwolame/encoder.go @@ -0,0 +1,21 @@ +package libtwolame + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:a", "libtwolame"} +} + +func NewData() encoder2.EncoderDataContract { + title := "libtwolame" + formats := []string{"mp2"} + fileType := encoder2.FileType(encoder2.Audio) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/libvpx/encoder.go b/encoder/libvpx/encoder.go new file mode 100644 index 0000000..2573e72 --- /dev/null +++ b/encoder/libvpx/encoder.go @@ -0,0 +1,21 @@ +package libvpx + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "libvpx"} +} + +func NewData() encoder2.EncoderDataContract { + title := "libvpx" + formats := []string{"webm", "mkv"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/libvpx_vp9/encoder.go b/encoder/libvpx_vp9/encoder.go new file mode 100644 index 0000000..657b8c2 --- /dev/null +++ b/encoder/libvpx_vp9/encoder.go @@ -0,0 +1,21 @@ +package libvpx_vp9 + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "libvpx-vp9"} +} + +func NewData() encoder2.EncoderDataContract { + title := "libvpx-vp9" + formats := []string{"webm", "mkv"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/libwebp/encoder.go b/encoder/libwebp/encoder.go new file mode 100644 index 0000000..b181f90 --- /dev/null +++ b/encoder/libwebp/encoder.go @@ -0,0 +1,21 @@ +package libwebp + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "libwebp"} +} + +func NewData() encoder2.EncoderDataContract { + title := "libwebp" + formats := []string{"webp"} + fileType := encoder2.FileType(encoder2.Image) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/libwebp_anim/encoder.go b/encoder/libwebp_anim/encoder.go new file mode 100644 index 0000000..ce3fd2d --- /dev/null +++ b/encoder/libwebp_anim/encoder.go @@ -0,0 +1,21 @@ +package libwebp_anim + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "libwebp_anim"} +} + +func NewData() encoder2.EncoderDataContract { + title := "libwebp_anim" + formats := []string{"webp"} + fileType := encoder2.FileType(encoder2.Image) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/libx264/encoder.go b/encoder/libx264/encoder.go new file mode 100644 index 0000000..fad2501 --- /dev/null +++ b/encoder/libx264/encoder.go @@ -0,0 +1,21 @@ +package libx264 + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "libx264"} +} + +func NewData() encoder2.EncoderDataContract { + title := "libx264" + formats := []string{"mp4"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/libx265/encoder.go b/encoder/libx265/encoder.go new file mode 100644 index 0000000..2179c22 --- /dev/null +++ b/encoder/libx265/encoder.go @@ -0,0 +1,21 @@ +package libx265 + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "libx265"} +} + +func NewData() encoder2.EncoderDataContract { + title := "libx265" + formats := []string{"mp4"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/libxvid/encoder.go b/encoder/libxvid/encoder.go new file mode 100644 index 0000000..3f7c135 --- /dev/null +++ b/encoder/libxvid/encoder.go @@ -0,0 +1,21 @@ +package libxvid + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "libxvid"} +} + +func NewData() encoder2.EncoderDataContract { + title := "libxvid" + formats := []string{"avi"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/mjpeg/encoder.go b/encoder/mjpeg/encoder.go new file mode 100644 index 0000000..ba44bdb --- /dev/null +++ b/encoder/mjpeg/encoder.go @@ -0,0 +1,21 @@ +package mjpeg + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "mjpeg"} +} + +func NewData() encoder2.EncoderDataContract { + title := "mjpeg" + formats := []string{"jpg"} + fileType := encoder2.FileType(encoder2.Image) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/mp2/encoder.go b/encoder/mp2/encoder.go new file mode 100644 index 0000000..2e976c9 --- /dev/null +++ b/encoder/mp2/encoder.go @@ -0,0 +1,21 @@ +package mp2 + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:a", "mp2"} +} + +func NewData() encoder2.EncoderDataContract { + title := "mp2" + formats := []string{"mp2"} + fileType := encoder2.FileType(encoder2.Audio) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/mp2fixed/encoder.go b/encoder/mp2fixed/encoder.go new file mode 100644 index 0000000..f9bbcb8 --- /dev/null +++ b/encoder/mp2fixed/encoder.go @@ -0,0 +1,21 @@ +package mp2fixed + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:a", "mp2fixed"} +} + +func NewData() encoder2.EncoderDataContract { + title := "mp2fixed" + formats := []string{"mp2"} + fileType := encoder2.FileType(encoder2.Audio) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/mpeg1video/encoder.go b/encoder/mpeg1video/encoder.go new file mode 100644 index 0000000..4ee5eb8 --- /dev/null +++ b/encoder/mpeg1video/encoder.go @@ -0,0 +1,21 @@ +package mpeg1video + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "mpeg1video"} +} + +func NewData() encoder2.EncoderDataContract { + title := "mpeg1video" + formats := []string{"mpg", "mpeg"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/mpeg2video/encoder.go b/encoder/mpeg2video/encoder.go new file mode 100644 index 0000000..0f2eee4 --- /dev/null +++ b/encoder/mpeg2video/encoder.go @@ -0,0 +1,21 @@ +package mpeg2video + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "mpeg2video"} +} + +func NewData() encoder2.EncoderDataContract { + title := "mpeg2video" + formats := []string{"mpg", "mpeg"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/mpeg4/encoder.go b/encoder/mpeg4/encoder.go new file mode 100644 index 0000000..b57fe31 --- /dev/null +++ b/encoder/mpeg4/encoder.go @@ -0,0 +1,21 @@ +package mpeg4 + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "mpeg4"} +} + +func NewData() encoder2.EncoderDataContract { + title := "mpeg4" + formats := []string{"avi"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/msmpeg4/encoder.go b/encoder/msmpeg4/encoder.go new file mode 100644 index 0000000..5f792a0 --- /dev/null +++ b/encoder/msmpeg4/encoder.go @@ -0,0 +1,21 @@ +package msmpeg4 + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "msmpeg4"} +} + +func NewData() encoder2.EncoderDataContract { + title := "msmpeg4" + formats := []string{"avi"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/msmpeg4v2/encoder.go b/encoder/msmpeg4v2/encoder.go new file mode 100644 index 0000000..5d5a420 --- /dev/null +++ b/encoder/msmpeg4v2/encoder.go @@ -0,0 +1,21 @@ +package msmpeg4v2 + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "msmpeg4v2"} +} + +func NewData() encoder2.EncoderDataContract { + title := "msmpeg4v2" + formats := []string{"avi"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/msvideo1/encoder.go b/encoder/msvideo1/encoder.go new file mode 100644 index 0000000..ef9c1a1 --- /dev/null +++ b/encoder/msvideo1/encoder.go @@ -0,0 +1,21 @@ +package msvideo1 + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "msvideo1"} +} + +func NewData() encoder2.EncoderDataContract { + title := "msvideo1" + formats := []string{"avi"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/png/encoder.go b/encoder/png/encoder.go new file mode 100644 index 0000000..ec6d6d7 --- /dev/null +++ b/encoder/png/encoder.go @@ -0,0 +1,21 @@ +package png + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "png"} +} + +func NewData() encoder2.EncoderDataContract { + title := "png" + formats := []string{"png"} + fileType := encoder2.FileType(encoder2.Image) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/qtrle/encoder.go b/encoder/qtrle/encoder.go new file mode 100644 index 0000000..f055e8c --- /dev/null +++ b/encoder/qtrle/encoder.go @@ -0,0 +1,21 @@ +package qtrle + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "qtrle"} +} + +func NewData() encoder2.EncoderDataContract { + title := "qtrle" + formats := []string{"mov"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/sgi/encoder.go b/encoder/sgi/encoder.go new file mode 100644 index 0000000..ee29bc9 --- /dev/null +++ b/encoder/sgi/encoder.go @@ -0,0 +1,21 @@ +package sgi + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "sgi"} +} + +func NewData() encoder2.EncoderDataContract { + title := "sgi" + formats := []string{"sgi"} + fileType := encoder2.FileType(encoder2.Image) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/tiff/encoder.go b/encoder/tiff/encoder.go new file mode 100644 index 0000000..0d920bf --- /dev/null +++ b/encoder/tiff/encoder.go @@ -0,0 +1,21 @@ +package tiff + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "tiff"} +} + +func NewData() encoder2.EncoderDataContract { + title := "tiff" + formats := []string{"tiff"} + fileType := encoder2.FileType(encoder2.Image) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/wmav1/encoder.go b/encoder/wmav1/encoder.go new file mode 100644 index 0000000..f158823 --- /dev/null +++ b/encoder/wmav1/encoder.go @@ -0,0 +1,21 @@ +package wmav1 + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:a", "wmav1"} +} + +func NewData() encoder2.EncoderDataContract { + title := "wmav1" + formats := []string{"wma"} + fileType := encoder2.FileType(encoder2.Audio) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/wmav2/encoder.go b/encoder/wmav2/encoder.go new file mode 100644 index 0000000..0a73f36 --- /dev/null +++ b/encoder/wmav2/encoder.go @@ -0,0 +1,21 @@ +package wmav2 + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:a", "wmav2"} +} + +func NewData() encoder2.EncoderDataContract { + title := "wmav2" + formats := []string{"wma"} + fileType := encoder2.FileType(encoder2.Audio) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/wmv1/encoder.go b/encoder/wmv1/encoder.go new file mode 100644 index 0000000..a3c4587 --- /dev/null +++ b/encoder/wmv1/encoder.go @@ -0,0 +1,21 @@ +package wmv1 + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "wmv1"} +} + +func NewData() encoder2.EncoderDataContract { + title := "wmv1" + formats := []string{"wmv"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/wmv2/encoder.go b/encoder/wmv2/encoder.go new file mode 100644 index 0000000..4ab35e2 --- /dev/null +++ b/encoder/wmv2/encoder.go @@ -0,0 +1,21 @@ +package wmv2 + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "wmv2"} +} + +func NewData() encoder2.EncoderDataContract { + title := "wmv2" + formats := []string{"wmv"} + fileType := encoder2.FileType(encoder2.Video) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/encoder/xbm/encoder.go b/encoder/xbm/encoder.go new file mode 100644 index 0000000..dff7699 --- /dev/null +++ b/encoder/xbm/encoder.go @@ -0,0 +1,21 @@ +package xbm + +import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + +type encoder struct { +} + +func NewEncoder() encoder2.EncoderContract { + return &encoder{} +} + +func (e encoder) GetParams() []string { + return []string{"-c:v", "xbm"} +} + +func NewData() encoder2.EncoderDataContract { + title := "xbm" + formats := []string{"xbm"} + fileType := encoder2.FileType(encoder2.Image) + return encoder2.NewData(title, formats, fileType, NewEncoder) +} diff --git a/handler/convertor.go b/handler/convertor.go index 909e908..559d357 100644 --- a/handler/convertor.go +++ b/handler/convertor.go @@ -3,6 +3,7 @@ package handler import ( "errors" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor" + error2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/error" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/helper" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" "github.com/nicksnyder/go-i18n/v2/i18n" @@ -18,24 +19,32 @@ type ConvertorHandlerContract interface { type ConvertorHandler struct { app kernel.AppContract convertorView convertor.ViewContract + errorView error2.ViewContract convertorRepository convertor.RepositoryContract } func NewConvertorHandler( app kernel.AppContract, convertorView convertor.ViewContract, + errorView error2.ViewContract, convertorRepository convertor.RepositoryContract, ) *ConvertorHandler { return &ConvertorHandler{ app: app, convertorView: convertorView, + errorView: errorView, convertorRepository: convertorRepository, } } func (h ConvertorHandler) MainConvertor() { if h.checkingFFPathUtilities() == true { - h.convertorView.Main(h.runConvert) + formats, err := h.app.GetConvertorService().GetSupportFormats() + if err != nil { + h.errorView.PanicError(err) + return + } + h.convertorView.Main(h.runConvert, formats) return } h.convertorView.SelectFFPath("", "", h.saveSettingFFPath, nil, h.downloadFFmpeg) @@ -59,11 +68,12 @@ func (h ConvertorHandler) runConvert(setting convertor.HandleConvertSetting) { h.app.GetQueue().Add(&kernel.ConvertSetting{ VideoFileInput: setting.VideoFileInput, VideoFileOut: kernel.File{ - Path: setting.DirectoryForSave + helper.PathSeparator() + setting.VideoFileInput.Name + ".mp4", + Path: setting.DirectoryForSave + helper.PathSeparator() + setting.VideoFileInput.Name + "." + setting.Format, Name: setting.VideoFileInput.Name, - Ext: ".mp4", + Ext: "." + setting.Format, }, OverwriteOutputFiles: setting.OverwriteOutputFiles, + Encoder: setting.Encoder, }) } diff --git a/kernel/convertor.go b/kernel/convertor.go index 0aa24e4..f0843bc 100644 --- a/kernel/convertor.go +++ b/kernel/convertor.go @@ -1,8 +1,11 @@ package kernel import ( + "bufio" "errors" + encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" "git.kor-elf.net/kor-elf/gui-for-ffmpeg/helper" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel/encoder" "io" "os/exec" "regexp" @@ -20,6 +23,7 @@ type ConvertSetting struct { VideoFileInput File VideoFileOut File OverwriteOutputFiles bool + Encoder encoder2.EncoderContract } type ConvertorContract interface { @@ -30,6 +34,7 @@ type ConvertorContract interface { ChangeFFmpegPath(path string) (bool, error) ChangeFFprobePath(path string) (bool, error) GetRunningProcesses() map[int]*exec.Cmd + GetSupportFormats() (encoder.ConvertorFormatsContract, error) } type ProgressContract interface { @@ -68,7 +73,9 @@ func (s Convertor) RunConvert(setting ConvertSetting, progress ProgressContract) if setting.OverwriteOutputFiles == true { overwriteOutputFiles = "-y" } - args := []string{overwriteOutputFiles, "-i", setting.VideoFileInput.Path, "-c:v", "libx264", "-progress", progress.GetProtocole(), setting.VideoFileOut.Path} + args := []string{overwriteOutputFiles, "-i", setting.VideoFileInput.Path} + args = append(args, setting.Encoder.GetParams()...) + args = append(args, "-progress", progress.GetProtocole(), setting.VideoFileOut.Path) cmd := exec.Command(s.ffPathUtilities.FFmpeg, args...) helper.PrepareBackgroundCommand(cmd) @@ -115,7 +122,30 @@ func (s Convertor) GetTotalDuration(file *File) (duration float64, err error) { } return 0, err } - return strconv.ParseFloat(strings.TrimSpace(string(out)), 64) + frames := strings.TrimSpace(string(out)) + if len(frames) == 0 { + return s.getAlternativeTotalDuration(file) + } + return strconv.ParseFloat(frames, 64) +} + +func (s Convertor) getAlternativeTotalDuration(file *File) (duration float64, err error) { + args := []string{"-v", "error", "-select_streams", "a:0", "-count_packets", "-show_entries", "stream=nb_read_packets", "-of", "csv=p=0", file.Path} + cmd := exec.Command(s.ffPathUtilities.FFprobe, args...) + helper.PrepareBackgroundCommand(cmd) + out, err := cmd.CombinedOutput() + if err != nil { + errString := strings.TrimSpace(string(out)) + if len(errString) > 1 { + return 0, errors.New(errString) + } + return 0, err + } + frames := strings.TrimSpace(string(out)) + if len(frames) == 0 { + return 0, errors.New("error getting number of frames") + } + return strconv.ParseFloat(frames, 64) } func (s Convertor) GetFFmpegVesrion() (string, error) { @@ -168,6 +198,45 @@ func (s Convertor) ChangeFFprobePath(path string) (bool, error) { return true, nil } +func (s Convertor) GetSupportFormats() (encoder.ConvertorFormatsContract, error) { + formats := encoder.NewConvertorFormats() + cmd := exec.Command(s.ffPathUtilities.FFmpeg, "-encoders") + + stdOut, err := cmd.StdoutPipe() + if err != nil { + return formats, err + } + + err = cmd.Start() + if err != nil { + return formats, err + } + + scannerErr := bufio.NewReader(stdOut) + for { + line, _, err := scannerErr.ReadLine() + if err != nil { + if err == io.EOF { + break + } + continue + } + text := strings.Split(strings.TrimSpace(string(line)), " ") + encoderType := string(text[0][0]) + if len(text) < 2 || (encoderType != "V" && encoderType != "A") { + continue + } + formats.NewEncoder(text[1]) + } + + err = cmd.Wait() + if err != nil { + return formats, err + } + + return formats, nil +} + func (s Convertor) GetRunningProcesses() map[int]*exec.Cmd { return s.runningProcesses.items } diff --git a/kernel/encoder/encoder.go b/kernel/encoder/encoder.go new file mode 100644 index 0000000..db4e25f --- /dev/null +++ b/kernel/encoder/encoder.go @@ -0,0 +1,84 @@ +package encoder + +import ( + "errors" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" +) + +type ConvertorFormatContract interface { + GetTitle() string + AddEncoder(encoder encoder.EncoderDataContract) + GetFileType() encoder.FileTypeContract + GetEncoders() map[int]encoder.EncoderDataContract +} + +type ConvertorFormat struct { + title string + fileType encoder.FileTypeContract + encoders map[int]encoder.EncoderDataContract +} + +func NewConvertorFormat(title string, fileType encoder.FileTypeContract) *ConvertorFormat { + return &ConvertorFormat{ + title: title, + fileType: fileType, + encoders: map[int]encoder.EncoderDataContract{}, + } +} + +func (f ConvertorFormat) GetTitle() string { + return f.title +} + +func (f ConvertorFormat) AddEncoder(encoder encoder.EncoderDataContract) { + f.encoders[len(f.encoders)] = encoder +} + +func (f ConvertorFormat) GetEncoders() map[int]encoder.EncoderDataContract { + return f.encoders +} + +func (f ConvertorFormat) GetFileType() encoder.FileTypeContract { + return f.fileType +} + +type ConvertorFormatsContract interface { + NewEncoder(encoderName string) bool + GetFormats() map[string]ConvertorFormatContract + GetFormat(format string) (ConvertorFormatContract, error) +} + +type ConvertorFormats struct { + formats map[string]ConvertorFormatContract +} + +func NewConvertorFormats() *ConvertorFormats { + return &ConvertorFormats{ + formats: map[string]ConvertorFormatContract{}, + } +} + +func (f ConvertorFormats) NewEncoder(encoderName string) bool { + if supportEncoders[encoderName] == nil { + return false + } + data := supportEncoders[encoderName]() + for _, format := range data.GetFormats() { + if f.formats[format] == nil { + f.formats[format] = NewConvertorFormat(format, data.GetFileType()) + } + f.formats[format].AddEncoder(data) + } + return true +} + +func (f ConvertorFormats) GetFormats() map[string]ConvertorFormatContract { + return f.formats +} + +func (f ConvertorFormats) GetFormat(format string) (ConvertorFormatContract, error) { + if f.formats[format] == nil { + return ConvertorFormat{}, errors.New("not found ConvertorFormat") + } + return f.formats[format], nil +} diff --git a/kernel/encoder/encoders.go b/kernel/encoder/encoders.go new file mode 100644 index 0000000..d9330f4 --- /dev/null +++ b/kernel/encoder/encoders.go @@ -0,0 +1,74 @@ +package encoder + +import ( + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/apng" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/bmp" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/flv" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/gif" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/h264_nvenc" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libmp3lame" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libshine" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libtwolame" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libvpx" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libvpx_vp9" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libwebp" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libwebp_anim" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libx264" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libx265" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libxvid" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/mjpeg" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/mp2" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/mp2fixed" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/mpeg1video" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/mpeg2video" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/mpeg4" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/msmpeg4" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/msmpeg4v2" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/msvideo1" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/png" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/qtrle" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/sgi" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/tiff" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/wmav1" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/wmav2" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/wmv1" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/wmv2" + "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/xbm" +) + +var supportEncoders = map[string]func() encoder.EncoderDataContract{ + "libx264": libx264.NewData, + "h264_nvenc": h264_nvenc.NewData, + "libx265": libx265.NewData, + "png": png.NewData, + "gif": gif.NewData, + "flv": flv.NewData, + "apng": apng.NewData, + "bmp": bmp.NewData, + "mjpeg": mjpeg.NewData, + "mpeg1video": mpeg1video.NewData, + "mpeg2video": mpeg2video.NewData, + "mpeg4": mpeg4.NewData, + "libxvid": libxvid.NewData, + "msmpeg4v2": msmpeg4v2.NewData, + "msmpeg4": msmpeg4.NewData, + "msvideo1": msvideo1.NewData, + "qtrle": qtrle.NewData, + "tiff": tiff.NewData, + "sgi": sgi.NewData, + "libvpx": libvpx.NewData, + "libvpx-vp9": libvpx_vp9.NewData, + "libwebp_anim": libwebp_anim.NewData, + "libwebp": libwebp.NewData, + "wmv1": wmv1.NewData, + "wmv2": wmv2.NewData, + "xbm": xbm.NewData, + "mp2": mp2.NewData, + "mp2fixed": mp2fixed.NewData, + "libtwolame": libtwolame.NewData, + "libmp3lame": libmp3lame.NewData, + "libshine": libshine.NewData, + "wmav1": wmav1.NewData, + "wmav2": wmav2.NewData, +} diff --git a/languages/active.en.toml b/languages/active.en.toml index 357f1c0..7d573b0 100644 --- a/languages/active.en.toml +++ b/languages/active.en.toml @@ -47,8 +47,8 @@ hash = "sha1-7ac460f3c24c9952082f2db6e4d62f752598709c" other = "Convert" [converterVideoFilesTitle] -hash = "sha1-4d972809e4c7f9c9ff2c110a126bbc183c9429ce" -other = "Converter video files to mp4" +hash = "sha1-1ab29597cc9dfefab08e54ea5442e7ffa15f0394" +other = "Video, audio and picture converter" [download] hash = "sha1-fe8f79f29da457de2f6bc9531de6e536e0c426ad" @@ -62,6 +62,138 @@ other = "Will be downloaded from the site:" hash = "sha1-55f87f114628fa2d5d8e67d1e1cda22c0e4f9271" other = "Downloading..." +[encoder_apng] +hash = "sha1-1cbd9abfef96d5614a7e569161b41bd6ad87bbaf" +other = "APNG image" + +[encoder_bmp] +hash = "sha1-e0b9c16b016961a5abdc2217e8ffd1ba7ddebc40" +other = "BMP image" + +[encoder_flv] +hash = "sha1-3602bbf1cc90e48254f81975c7879b5fc0c4d602" +other = "FLV" + +[encoder_gif] +hash = "sha1-d092a779172291b5215aa095390a5b11659128a4" +other = "GIF image" + +[encoder_h264_nvenc] +hash = "sha1-169389f8c4a2518410159c363378ab5c978c32e5" +other = "H.264 with NVIDIA support" + +[encoder_libmp3lame] +hash = "sha1-cd2c8d6f246c8bc18554b7105cb50b78d3cb2b98" +other = "libmp3lame MP3 (MPEG audio layer 3)" + +[encoder_libshine] +hash = "sha1-891d56c85857e5d83ef5a1fe077c1f1540788f49" +other = "libshine MP3 (MPEG audio layer 3)" + +[encoder_libtwolame] +hash = "sha1-b2f53be810b74edc3c454ac75de7ddecfee322ca" +other = "libtwolame MP2 (MPEG audio layer 2)" + +[encoder_libvpx] +hash = "sha1-b85c923aecfb48de0e87e71b6a21bfc2c547c70e" +other = "libvpx VP8 (codec vp8)" + +[encoder_libvpx-vp9] +hash = "sha1-3106417bd89bee87daa691e87614caf78cb934fe" +other = "libvpx VP9 (codec vp9)" + +[encoder_libwebp] +hash = "sha1-1d590d47d46f7880246061fce0e0de6d743db39e" +other = "libwebp WebP image" + +[encoder_libwebp_anim] +hash = "sha1-f141a9c8f23d79c13d44c30d8f34e05b363771ad" +other = "libwebp_anim WebP image" + +[encoder_libx264] +hash = "sha1-6d764ac459c0bf3c819d76618418cdfbb7a749eb" +other = "H.264 libx264" + +[encoder_libx265] +hash = "sha1-55544c166b1e15fd71a58096518e528109599eea" +other = "H.265 libx265" + +[encoder_libxvid] +hash = "sha1-d4bed46d6cdd2bfa8fd1689801164a83ab10c3f5" +other = "libxvidcore MPEG-4 part 2" + +[encoder_mjpeg] +hash = "sha1-94ba63a322b493a04da65e566781fe1cf8bb0d50" +other = "MJPEG (Motion JPEG)" + +[encoder_mp2] +hash = "sha1-a9154b7203349e5d6fbfd67d1ea97715f54b2065" +other = "MP2 (MPEG audio layer 2)" + +[encoder_mp2fixed] +hash = "sha1-dd2ee670d8bc8a60a96a717ebd26f16b5748cf3f" +other = "MP2 fixed point (MPEG audio layer 2)" + +[encoder_mpeg1video] +hash = "sha1-30043660719a3cb19dab5c33450665a8a9cc1c01" +other = "MPEG-1" + +[encoder_mpeg2video] +hash = "sha1-ccb2dcd8510cfdc9d52e5258af1863e5f2c51e77" +other = "MPEG-2" + +[encoder_mpeg4] +hash = "sha1-67fe42f18421b2f6c90fcdc579f9199bfca4b182" +other = "MPEG-4 part 2" + +[encoder_msmpeg4] +hash = "sha1-313ee597e4f0d9bd63a2bc6ac1618f028aef76f4" +other = "MPEG-4 part 2 Microsoft variant version 3" + +[encoder_msmpeg4v2] +hash = "sha1-adc442ce88f2717693b2da3010a1937d77ee522f" +other = "MPEG-4 part 2 Microsoft variant version 2" + +[encoder_msvideo1] +hash = "sha1-00f43ac0dc162bca10e0d98d6b70c0c6a902f66f" +other = "Microsoft Video-1" + +[encoder_png] +hash = "sha1-6715d4b82f5d9dfe3e53e30b402ffa1a6fbf30a5" +other = "PNG image" + +[encoder_qtrle] +hash = "sha1-31bf155cffaf6842ebc54084e4337ca08fdd9848" +other = "QuickTime Animation (RLE) video" + +[encoder_sgi] +hash = "sha1-f4510e237f7fc3c02caa728f9e500f4b069f9c11" +other = "SGI image" + +[encoder_tiff] +hash = "sha1-ed09d78c38e0b17ed695f35740c756dd7340eeac" +other = "TIFF image" + +[encoder_wmav1] +hash = "sha1-cd4a4c5eeac694b6699d55d0f9b477b3b50f18c7" +other = "Windows Media Audio 1" + +[encoder_wmav2] +hash = "sha1-eb2e5306cb33a702577ecfbdca0461862c66c053" +other = "Windows Media Audio 2" + +[encoder_wmv1] +hash = "sha1-f9b748554c590c36a56bcba2cd317196b7bdeddb" +other = "Windows Media Video 7" + +[encoder_wmv2] +hash = "sha1-5b21c87f5c6104797ead60b488b2948428f6b1b7" +other = "Windows Media Video 8" + +[encoder_xbm] +hash = "sha1-2dfc35881da62e9a1379d8238cf7839b24f79566" +other = "XBM (X BitMap) image" + [error] hash = "sha1-a7df8f8b5d754f226ac4cb320577fe692b33e483" other = "An error has occurred!" @@ -94,9 +226,17 @@ other = "Failed to determine FFprobe version" hash = "sha1-72aecd9ad85642d84d62dbbf3cf70953c5f696c7" other = "Error" +[errorSelectedEncoder] +hash = "sha1-33ed1aaf4cb3c2ee9d8f8c325b9b75d16ddf9979" +other = "Converter not selected" + [errorSelectedFolderSave] -hash = "sha1-83da899677cdc90e4344e3b94ee03c46b51bee4c" -other = "You haven't selected a folder to save!" +hash = "sha1-16f3ef93ee36813fdd79d8fb9bb7fc02acbb94a8" +other = "No save folder selected!" + +[errorSelectedFormat] +hash = "sha1-cda92c56a1ef1aabc92bbfc405ede8ab13087e66" +other = "File extension not selected" [exit] hash = "sha1-c42457057d1ab7950cea00719cbe0b078891775f" @@ -110,9 +250,9 @@ other = "This software uses libraries from the **FFmpeg** project under the **[L hash = "sha1-45f772b2eca5098cd6d31f2d1dc6edec1987a617" other = "**FFmpeg** is a trademark of **[Fabrice Bellard](http://bellard.org/)**, originator of the **[FFmpeg](https://ffmpeg.org/about.html)** project." -[fileVideoForConversionTitle] -hash = "sha1-5e727d4a2ff3f21080e51e81641595b2e668f3be" -other = "File for conversion:" +[fileForConversionTitle] +hash = "sha1-981bf090072a487e538d00780d337b47ca877372" +other = "File to convert:" [help] hash = "sha1-6a45cef900c668effcb2ab10da05855c1fd10f6f" @@ -162,10 +302,18 @@ other = "Queue" hash = "sha1-4864057d626a868fa60f999bed3191d61d045ddc" other = "Save" +[selectEncoder] +hash = "sha1-07beb734a090830bedf8e038e3b45c73d64b5696" +other = "Select a converter" + [selectFFPathTitle] hash = "sha1-95581446a28d968ff1a027c623159a7eb08654cf" other = "Specify the path to FFmpeg and FFprobe" +[selectFormat] +hash = "sha1-5e59b9376d321a49e73063eb7355b555d89bdd55" +other = "Select file extension" + [settings] hash = "sha1-7f17c7c62a7fd8d1a508481f4778688927734c2f" other = "Settings" diff --git a/languages/active.kk.toml b/languages/active.kk.toml index 0b2e21b..6785d10 100644 --- a/languages/active.kk.toml +++ b/languages/active.kk.toml @@ -47,8 +47,8 @@ hash = "sha1-7ac460f3c24c9952082f2db6e4d62f752598709c" other = "Файлды түрлендіру" [converterVideoFilesTitle] -hash = "sha1-4d972809e4c7f9c9ff2c110a126bbc183c9429ce" -other = "Бейне файлдарын mp4 форматына түрлендіру" +hash = "sha1-1ab29597cc9dfefab08e54ea5442e7ffa15f0394" +other = "Бейне, аудио және суретті түрлендіргіш" [download] hash = "sha1-fe8f79f29da457de2f6bc9531de6e536e0c426ad" @@ -62,6 +62,138 @@ other = "Сайттан жүктеледі:" hash = "sha1-55f87f114628fa2d5d8e67d1e1cda22c0e4f9271" other = "Жүктеп алынуда..." +[encoder_apng] +hash = "sha1-1cbd9abfef96d5614a7e569161b41bd6ad87bbaf" +other = "APNG image" + +[encoder_bmp] +hash = "sha1-e0b9c16b016961a5abdc2217e8ffd1ba7ddebc40" +other = "BMP image" + +[encoder_flv] +hash = "sha1-3602bbf1cc90e48254f81975c7879b5fc0c4d602" +other = "FLV" + +[encoder_gif] +hash = "sha1-d092a779172291b5215aa095390a5b11659128a4" +other = "GIF image" + +[encoder_h264_nvenc] +hash = "sha1-169389f8c4a2518410159c363378ab5c978c32e5" +other = "NVIDIA қолдауымен H.264" + +[encoder_libmp3lame] +hash = "sha1-cd2c8d6f246c8bc18554b7105cb50b78d3cb2b98" +other = "libmp3lame MP3 (MPEG audio layer 3)" + +[encoder_libshine] +hash = "sha1-891d56c85857e5d83ef5a1fe077c1f1540788f49" +other = "libshine MP3 (MPEG audio layer 3)" + +[encoder_libtwolame] +hash = "sha1-b2f53be810b74edc3c454ac75de7ddecfee322ca" +other = "libtwolame MP2 (MPEG audio layer 2)" + +[encoder_libvpx] +hash = "sha1-b85c923aecfb48de0e87e71b6a21bfc2c547c70e" +other = "libvpx VP8 (codec vp8)" + +[encoder_libvpx-vp9] +hash = "sha1-3106417bd89bee87daa691e87614caf78cb934fe" +other = "libvpx VP9 (codec vp9)" + +[encoder_libwebp] +hash = "sha1-1d590d47d46f7880246061fce0e0de6d743db39e" +other = "libwebp WebP image" + +[encoder_libwebp_anim] +hash = "sha1-f141a9c8f23d79c13d44c30d8f34e05b363771ad" +other = "libwebp_anim WebP image" + +[encoder_libx264] +hash = "sha1-6d764ac459c0bf3c819d76618418cdfbb7a749eb" +other = "H.264 libx264" + +[encoder_libx265] +hash = "sha1-55544c166b1e15fd71a58096518e528109599eea" +other = "H.265 libx265" + +[encoder_libxvid] +hash = "sha1-d4bed46d6cdd2bfa8fd1689801164a83ab10c3f5" +other = "libxvidcore MPEG-4 part 2" + +[encoder_mjpeg] +hash = "sha1-94ba63a322b493a04da65e566781fe1cf8bb0d50" +other = "MJPEG (Motion JPEG)" + +[encoder_mp2] +hash = "sha1-a9154b7203349e5d6fbfd67d1ea97715f54b2065" +other = "MP2 (MPEG audio layer 2)" + +[encoder_mp2fixed] +hash = "sha1-dd2ee670d8bc8a60a96a717ebd26f16b5748cf3f" +other = "MP2 fixed point (MPEG audio layer 2)" + +[encoder_mpeg1video] +hash = "sha1-30043660719a3cb19dab5c33450665a8a9cc1c01" +other = "MPEG-1" + +[encoder_mpeg2video] +hash = "sha1-ccb2dcd8510cfdc9d52e5258af1863e5f2c51e77" +other = "MPEG-2" + +[encoder_mpeg4] +hash = "sha1-67fe42f18421b2f6c90fcdc579f9199bfca4b182" +other = "MPEG-4 part 2" + +[encoder_msmpeg4] +hash = "sha1-313ee597e4f0d9bd63a2bc6ac1618f028aef76f4" +other = "MPEG-4 part 2 Microsoft variant version 3" + +[encoder_msmpeg4v2] +hash = "sha1-adc442ce88f2717693b2da3010a1937d77ee522f" +other = "MPEG-4 part 2 Microsoft variant version 2" + +[encoder_msvideo1] +hash = "sha1-00f43ac0dc162bca10e0d98d6b70c0c6a902f66f" +other = "Microsoft Video-1" + +[encoder_png] +hash = "sha1-6715d4b82f5d9dfe3e53e30b402ffa1a6fbf30a5" +other = "PNG image" + +[encoder_qtrle] +hash = "sha1-31bf155cffaf6842ebc54084e4337ca08fdd9848" +other = "QuickTime Animation (RLE) video" + +[encoder_sgi] +hash = "sha1-f4510e237f7fc3c02caa728f9e500f4b069f9c11" +other = "SGI image" + +[encoder_tiff] +hash = "sha1-ed09d78c38e0b17ed695f35740c756dd7340eeac" +other = "TIFF image" + +[encoder_wmav1] +hash = "sha1-cd4a4c5eeac694b6699d55d0f9b477b3b50f18c7" +other = "Windows Media Audio 1" + +[encoder_wmav2] +hash = "sha1-eb2e5306cb33a702577ecfbdca0461862c66c053" +other = "Windows Media Audio 2" + +[encoder_wmv1] +hash = "sha1-f9b748554c590c36a56bcba2cd317196b7bdeddb" +other = "Windows Media Video 7" + +[encoder_wmv2] +hash = "sha1-5b21c87f5c6104797ead60b488b2948428f6b1b7" +other = "Windows Media Video 8" + +[encoder_xbm] +hash = "sha1-2dfc35881da62e9a1379d8238cf7839b24f79566" +other = "XBM (X BitMap) image" + [error] hash = "sha1-a7df8f8b5d754f226ac4cb320577fe692b33e483" other = "Қате орын алды!" @@ -94,9 +226,17 @@ other = "FFprobe нұсқасын анықтау мүмкін болмады" hash = "sha1-72aecd9ad85642d84d62dbbf3cf70953c5f696c7" other = "Қате" +[errorSelectedEncoder] +hash = "sha1-33ed1aaf4cb3c2ee9d8f8c325b9b75d16ddf9979" +other = "Түрлендіргіш таңдалмаған" + [errorSelectedFolderSave] -hash = "sha1-83da899677cdc90e4344e3b94ee03c46b51bee4c" -other = "Сіз сақталатын қалтаны таңдамадыңыз!" +hash = "sha1-16f3ef93ee36813fdd79d8fb9bb7fc02acbb94a8" +other = "Сақтау қалтасы таңдалмаған!" + +[errorSelectedFormat] +hash = "sha1-cda92c56a1ef1aabc92bbfc405ede8ab13087e66" +other = "Файл кеңейтімі таңдалмаған" [exit] hash = "sha1-c42457057d1ab7950cea00719cbe0b078891775f" @@ -110,8 +250,8 @@ other = "Бұл бағдарламалық құрал **[LGPLv2.1](http://www.gn hash = "sha1-45f772b2eca5098cd6d31f2d1dc6edec1987a617" other = "FFmpeg — **[FFmpeg](https://ffmpeg.org/about.html)** жобасын жасаушы **[Fabrice Bellard](http://bellard.org/)** сауда белгісі." -[fileVideoForConversionTitle] -hash = "sha1-5e727d4a2ff3f21080e51e81641595b2e668f3be" +[fileForConversionTitle] +hash = "sha1-981bf090072a487e538d00780d337b47ca877372" other = "Түрлендіруге арналған файл:" [help] @@ -162,10 +302,18 @@ other = "Кезек" hash = "sha1-4864057d626a868fa60f999bed3191d61d045ddc" other = "Сақтау" +[selectEncoder] +hash = "sha1-07beb734a090830bedf8e038e3b45c73d64b5696" +other = "Түрлендіргішті таңдаңыз" + [selectFFPathTitle] hash = "sha1-95581446a28d968ff1a027c623159a7eb08654cf" other = "FFmpeg және FFprobe жолын көрсетіңіз" +[selectFormat] +hash = "sha1-5e59b9376d321a49e73063eb7355b555d89bdd55" +other = "Файл кеңейтімін таңдаңыз" + [settings] hash = "sha1-7f17c7c62a7fd8d1a508481f4778688927734c2f" other = "Параметрлер" diff --git a/languages/active.ru.toml b/languages/active.ru.toml index 6053ac2..bc9dd1e 100644 --- a/languages/active.ru.toml +++ b/languages/active.ru.toml @@ -10,10 +10,43 @@ checkboxOverwriteOutputFilesTitle = "Разрешить перезаписать choose = "выбрать" completedQueue = "Готово" converterVideoFilesSubmitTitle = "Конвертировать" -converterVideoFilesTitle = "Конвертор видео файлов в mp4" +converterVideoFilesTitle = "Конвертер видео, аудио и картинок" download = "Скачать" downloadFFmpegFromSite = "Будет скачано с сайта:" downloadRun = "Скачивается..." +encoder_apng = "APNG image" +encoder_bmp = "BMP image" +encoder_flv = "FLV" +encoder_gif = "GIF image" +encoder_h264_nvenc = "H.264 с поддержкой NVIDIA" +encoder_libmp3lame = "libmp3lame MP3 (MPEG audio layer 3)" +encoder_libshine = "libshine MP3 (MPEG audio layer 3)" +encoder_libtwolame = "libtwolame MP2 (MPEG audio layer 2)" +encoder_libvpx = "libvpx VP8 (codec vp8)" +encoder_libvpx-vp9 = "libvpx VP9 (codec vp9)" +encoder_libwebp = "libwebp WebP image" +encoder_libwebp_anim = "libwebp_anim WebP image" +encoder_libx264 = "H.264 libx264" +encoder_libx265 = "H.265 libx265" +encoder_libxvid = "libxvidcore MPEG-4 part 2" +encoder_mjpeg = "MJPEG (Motion JPEG)" +encoder_mp2 = "MP2 (MPEG audio layer 2)" +encoder_mp2fixed = "MP2 fixed point (MPEG audio layer 2)" +encoder_mpeg1video = "MPEG-1" +encoder_mpeg2video = "MPEG-2" +encoder_mpeg4 = "MPEG-4 part 2" +encoder_msmpeg4 = "MPEG-4 part 2 Microsoft variant version 3" +encoder_msmpeg4v2 = "MPEG-4 part 2 Microsoft variant version 2" +encoder_msvideo1 = "Microsoft Video-1" +encoder_png = "PNG image" +encoder_qtrle = "QuickTime Animation (RLE) video" +encoder_sgi = "SGI image" +encoder_tiff = "TIFF image" +encoder_wmav1 = "Windows Media Audio 1" +encoder_wmav2 = "Windows Media Audio 2" +encoder_wmv1 = "Windows Media Video 7" +encoder_wmv2 = "Windows Media Video 8" +encoder_xbm = "XBM (X BitMap) image" error = "Произошла ошибка!" errorConverter = "не смогли отконвертировать видео" errorDatabase = "не смогли создать файл 'database' в папке 'data'" @@ -22,11 +55,13 @@ errorFFmpegVersion = "Не смогли определить версию FFmpeg errorFFprobe = "это не FFprobe" errorFFprobeVersion = "Не смогли определить версию FFprobe" errorQueue = "Ошибка" -errorSelectedFolderSave = "Не выбрали папку для сохранения!" +errorSelectedEncoder = "Конвертер не выбран" +errorSelectedFolderSave = "Папка для сохранения не выбрана!" +errorSelectedFormat = "Расширение файла не выбрана" exit = "Выход" ffmpegLGPL = "Это программное обеспечение использует библиотеки из проекта **FFmpeg** под **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**." ffmpegTrademark = "**FFmpeg** — торговая марка **[Fabrice Bellard](http://bellard.org/)** , создателя проекта **[FFmpeg](https://ffmpeg.org/about.html)**." -fileVideoForConversionTitle = "Файл для ковертации:" +fileForConversionTitle = "Файл для конвертации:" help = "Справка" inProgressQueue = "Выполняется" languageSelectionFormHead = "Переключить язык" @@ -39,7 +74,9 @@ programmLink = "Сайт проекта" programmVersion = "**Версия программы:** {{.Version}}" queue = "Очередь" save = "Сохранить" +selectEncoder = "Выберите конвертер" selectFFPathTitle = "Укажите путь к FFmpeg и к FFprobe" +selectFormat = "Выберите расширение файла" settings = "Настройки" testFF = "Проверка FFmpeg на работоспособность..." titleDownloadLink = "Скачать можно от сюда" diff --git a/languages/translate.en.toml b/languages/translate.en.toml index 5d5b71c..92dc6bc 100644 --- a/languages/translate.en.toml +++ b/languages/translate.en.toml @@ -1,15 +1,139 @@ -[completedQueue] -hash = "sha1-398c7d4f7b0d522afb930769c0fbb1a9f4b61fbe" -other = "Completed" +[encoder_apng] +hash = "sha1-1cbd9abfef96d5614a7e569161b41bd6ad87bbaf" +other = "APNG image" -[errorQueue] -hash = "sha1-72aecd9ad85642d84d62dbbf3cf70953c5f696c7" -other = "Error" +[encoder_bmp] +hash = "sha1-e0b9c16b016961a5abdc2217e8ffd1ba7ddebc40" +other = "BMP image" -[inProgressQueue] -hash = "sha1-eff79c40e2100ae5fadf3a7d99336025edcca8b5" -other = "In Progress" +[encoder_flv] +hash = "sha1-3602bbf1cc90e48254f81975c7879b5fc0c4d602" +other = "FLV" -[waitingQueue] -hash = "sha1-307429dd84150877080c4bbff2b340d1e7dadff2" -other = "Waiting" +[encoder_gif] +hash = "sha1-d092a779172291b5215aa095390a5b11659128a4" +other = "GIF image" + +[encoder_h264_nvenc] +hash = "sha1-169389f8c4a2518410159c363378ab5c978c32e5" +other = "H.264 with NVIDIA support" + +[encoder_libmp3lame] +hash = "sha1-cd2c8d6f246c8bc18554b7105cb50b78d3cb2b98" +other = "libmp3lame MP3 (MPEG audio layer 3)" + +[encoder_libshine] +hash = "sha1-891d56c85857e5d83ef5a1fe077c1f1540788f49" +other = "libshine MP3 (MPEG audio layer 3)" + +[encoder_libtwolame] +hash = "sha1-b2f53be810b74edc3c454ac75de7ddecfee322ca" +other = "libtwolame MP2 (MPEG audio layer 2)" + +[encoder_libvpx] +hash = "sha1-b85c923aecfb48de0e87e71b6a21bfc2c547c70e" +other = "libvpx VP8 (codec vp8)" + +[encoder_libvpx-vp9] +hash = "sha1-3106417bd89bee87daa691e87614caf78cb934fe" +other = "libvpx VP9 (codec vp9)" + +[encoder_libwebp] +hash = "sha1-1d590d47d46f7880246061fce0e0de6d743db39e" +other = "libwebp WebP image" + +[encoder_libwebp_anim] +hash = "sha1-f141a9c8f23d79c13d44c30d8f34e05b363771ad" +other = "libwebp_anim WebP image" + +[encoder_libx264] +hash = "sha1-6d764ac459c0bf3c819d76618418cdfbb7a749eb" +other = "H.264 libx264" + +[encoder_libx265] +hash = "sha1-55544c166b1e15fd71a58096518e528109599eea" +other = "H.265 libx265" + +[encoder_libxvid] +hash = "sha1-d4bed46d6cdd2bfa8fd1689801164a83ab10c3f5" +other = "libxvidcore MPEG-4 part 2" + +[encoder_mjpeg] +hash = "sha1-94ba63a322b493a04da65e566781fe1cf8bb0d50" +other = "MJPEG (Motion JPEG)" + +[encoder_mp2] +hash = "sha1-a9154b7203349e5d6fbfd67d1ea97715f54b2065" +other = "MP2 (MPEG audio layer 2)" + +[encoder_mp2fixed] +hash = "sha1-dd2ee670d8bc8a60a96a717ebd26f16b5748cf3f" +other = "MP2 fixed point (MPEG audio layer 2)" + +[encoder_mpeg1video] +hash = "sha1-30043660719a3cb19dab5c33450665a8a9cc1c01" +other = "MPEG-1" + +[encoder_mpeg2video] +hash = "sha1-ccb2dcd8510cfdc9d52e5258af1863e5f2c51e77" +other = "MPEG-2" + +[encoder_mpeg4] +hash = "sha1-67fe42f18421b2f6c90fcdc579f9199bfca4b182" +other = "MPEG-4 part 2" + +[encoder_msmpeg4] +hash = "sha1-313ee597e4f0d9bd63a2bc6ac1618f028aef76f4" +other = "MPEG-4 part 2 Microsoft variant version 3" + +[encoder_msmpeg4v2] +hash = "sha1-adc442ce88f2717693b2da3010a1937d77ee522f" +other = "MPEG-4 part 2 Microsoft variant version 2" + +[encoder_msvideo1] +hash = "sha1-00f43ac0dc162bca10e0d98d6b70c0c6a902f66f" +other = "Microsoft Video-1" + +[encoder_png] +hash = "sha1-6715d4b82f5d9dfe3e53e30b402ffa1a6fbf30a5" +other = "PNG image" + +[encoder_qtrle] +hash = "sha1-31bf155cffaf6842ebc54084e4337ca08fdd9848" +other = "QuickTime Animation (RLE) video" + +[encoder_sgi] +hash = "sha1-f4510e237f7fc3c02caa728f9e500f4b069f9c11" +other = "SGI image" + +[encoder_tiff] +hash = "sha1-ed09d78c38e0b17ed695f35740c756dd7340eeac" +other = "TIFF image" + +[encoder_wmav1] +hash = "sha1-cd4a4c5eeac694b6699d55d0f9b477b3b50f18c7" +other = "Windows Media Audio 1" + +[encoder_wmav2] +hash = "sha1-eb2e5306cb33a702577ecfbdca0461862c66c053" +other = "Windows Media Audio 2" + +[encoder_wmv1] +hash = "sha1-f9b748554c590c36a56bcba2cd317196b7bdeddb" +other = "Windows Media Video 7" + +[encoder_wmv2] +hash = "sha1-5b21c87f5c6104797ead60b488b2948428f6b1b7" +other = "Windows Media Video 8" + +[encoder_xbm] +hash = "sha1-2dfc35881da62e9a1379d8238cf7839b24f79566" +other = "XBM (X BitMap) image" + +[errorSelectedFormat] +hash = "sha1-cda92c56a1ef1aabc92bbfc405ede8ab13087e66" +other = "File extension not selected" + +[selectFormat] +hash = "sha1-5e59b9376d321a49e73063eb7355b555d89bdd55" +other = "Select file extension" diff --git a/languages/translate.kk.toml b/languages/translate.kk.toml index 24640fa..fc61d08 100644 --- a/languages/translate.kk.toml +++ b/languages/translate.kk.toml @@ -1,15 +1,139 @@ -[completedQueue] -hash = "sha1-398c7d4f7b0d522afb930769c0fbb1a9f4b61fbe" -other = "Дайын" +[encoder_apng] +hash = "sha1-1cbd9abfef96d5614a7e569161b41bd6ad87bbaf" +other = "APNG image" -[errorQueue] -hash = "sha1-72aecd9ad85642d84d62dbbf3cf70953c5f696c7" -other = "Қате" +[encoder_bmp] +hash = "sha1-e0b9c16b016961a5abdc2217e8ffd1ba7ddebc40" +other = "BMP image" -[inProgressQueue] -hash = "sha1-eff79c40e2100ae5fadf3a7d99336025edcca8b5" -other = "Орындалуда" +[encoder_flv] +hash = "sha1-3602bbf1cc90e48254f81975c7879b5fc0c4d602" +other = "FLV" -[waitingQueue] -hash = "sha1-307429dd84150877080c4bbff2b340d1e7dadff2" -other = "Күту" +[encoder_gif] +hash = "sha1-d092a779172291b5215aa095390a5b11659128a4" +other = "GIF image" + +[encoder_h264_nvenc] +hash = "sha1-169389f8c4a2518410159c363378ab5c978c32e5" +other = "NVIDIA қолдауымен H.264" + +[encoder_libmp3lame] +hash = "sha1-cd2c8d6f246c8bc18554b7105cb50b78d3cb2b98" +other = "libmp3lame MP3 (MPEG audio layer 3)" + +[encoder_libshine] +hash = "sha1-891d56c85857e5d83ef5a1fe077c1f1540788f49" +other = "libshine MP3 (MPEG audio layer 3)" + +[encoder_libtwolame] +hash = "sha1-b2f53be810b74edc3c454ac75de7ddecfee322ca" +other = "libtwolame MP2 (MPEG audio layer 2)" + +[encoder_libvpx] +hash = "sha1-b85c923aecfb48de0e87e71b6a21bfc2c547c70e" +other = "libvpx VP8 (codec vp8)" + +[encoder_libvpx-vp9] +hash = "sha1-3106417bd89bee87daa691e87614caf78cb934fe" +other = "libvpx VP9 (codec vp9)" + +[encoder_libwebp] +hash = "sha1-1d590d47d46f7880246061fce0e0de6d743db39e" +other = "libwebp WebP image" + +[encoder_libwebp_anim] +hash = "sha1-f141a9c8f23d79c13d44c30d8f34e05b363771ad" +other = "libwebp_anim WebP image" + +[encoder_libx264] +hash = "sha1-6d764ac459c0bf3c819d76618418cdfbb7a749eb" +other = "H.264 libx264" + +[encoder_libx265] +hash = "sha1-55544c166b1e15fd71a58096518e528109599eea" +other = "H.265 libx265" + +[encoder_libxvid] +hash = "sha1-d4bed46d6cdd2bfa8fd1689801164a83ab10c3f5" +other = "libxvidcore MPEG-4 part 2" + +[encoder_mjpeg] +hash = "sha1-94ba63a322b493a04da65e566781fe1cf8bb0d50" +other = "MJPEG (Motion JPEG)" + +[encoder_mp2] +hash = "sha1-a9154b7203349e5d6fbfd67d1ea97715f54b2065" +other = "MP2 (MPEG audio layer 2)" + +[encoder_mp2fixed] +hash = "sha1-dd2ee670d8bc8a60a96a717ebd26f16b5748cf3f" +other = "MP2 fixed point (MPEG audio layer 2)" + +[encoder_mpeg1video] +hash = "sha1-30043660719a3cb19dab5c33450665a8a9cc1c01" +other = "MPEG-1" + +[encoder_mpeg2video] +hash = "sha1-ccb2dcd8510cfdc9d52e5258af1863e5f2c51e77" +other = "MPEG-2" + +[encoder_mpeg4] +hash = "sha1-67fe42f18421b2f6c90fcdc579f9199bfca4b182" +other = "MPEG-4 part 2" + +[encoder_msmpeg4] +hash = "sha1-313ee597e4f0d9bd63a2bc6ac1618f028aef76f4" +other = "MPEG-4 part 2 Microsoft variant version 3" + +[encoder_msmpeg4v2] +hash = "sha1-adc442ce88f2717693b2da3010a1937d77ee522f" +other = "MPEG-4 part 2 Microsoft variant version 2" + +[encoder_msvideo1] +hash = "sha1-00f43ac0dc162bca10e0d98d6b70c0c6a902f66f" +other = "Microsoft Video-1" + +[encoder_png] +hash = "sha1-6715d4b82f5d9dfe3e53e30b402ffa1a6fbf30a5" +other = "PNG image" + +[encoder_qtrle] +hash = "sha1-31bf155cffaf6842ebc54084e4337ca08fdd9848" +other = "QuickTime Animation (RLE) video" + +[encoder_sgi] +hash = "sha1-f4510e237f7fc3c02caa728f9e500f4b069f9c11" +other = "SGI image" + +[encoder_tiff] +hash = "sha1-ed09d78c38e0b17ed695f35740c756dd7340eeac" +other = "TIFF image" + +[encoder_wmav1] +hash = "sha1-cd4a4c5eeac694b6699d55d0f9b477b3b50f18c7" +other = "Windows Media Audio 1" + +[encoder_wmav2] +hash = "sha1-eb2e5306cb33a702577ecfbdca0461862c66c053" +other = "Windows Media Audio 2" + +[encoder_wmv1] +hash = "sha1-f9b748554c590c36a56bcba2cd317196b7bdeddb" +other = "Windows Media Video 7" + +[encoder_wmv2] +hash = "sha1-5b21c87f5c6104797ead60b488b2948428f6b1b7" +other = "Windows Media Video 8" + +[encoder_xbm] +hash = "sha1-2dfc35881da62e9a1379d8238cf7839b24f79566" +other = "XBM (X BitMap) image" + +[errorSelectedFormat] +hash = "sha1-cda92c56a1ef1aabc92bbfc405ede8ab13087e66" +other = "Файл кеңейтімі таңдалмаған" + +[selectFormat] +hash = "sha1-5e59b9376d321a49e73063eb7355b555d89bdd55" +other = "Файл кеңейтімін таңдаңыз" diff --git a/main.go b/main.go index 0c21671..35624bb 100644 --- a/main.go +++ b/main.go @@ -26,7 +26,7 @@ func init() { appMetadata := &fyne.AppMetadata{ ID: "net.kor-elf.projects.gui-for-ffmpeg", Name: "GUI for FFmpeg", - Version: "0.4.0", + Version: "0.5.0", Icon: iconResource, } @@ -95,7 +95,7 @@ func main() { localizerView := localizer.NewView(application) convertorView := convertor.NewView(application) - convertorHandler := handler.NewConvertorHandler(application, convertorView, convertorRepository) + convertorHandler := handler.NewConvertorHandler(application, convertorView, errorView, convertorRepository) localizerRepository := localizer.NewRepository(settingRepository) menuView := menu.NewView(application)