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/handler/menu.go b/handler/menu.go index ca38d52..5ec2ebd 100644 --- a/handler/menu.go +++ b/handler/menu.go @@ -19,7 +19,6 @@ type MenuHandler struct { menuView menu.ViewContract localizerView localizer.ViewContract localizerRepository localizer.RepositoryContract - localizerListener localizerListenerContract } func NewMenuHandler( @@ -28,7 +27,6 @@ func NewMenuHandler( menuView menu.ViewContract, localizerView localizer.ViewContract, localizerRepository localizer.RepositoryContract, - localizerListener localizerListenerContract, ) *MenuHandler { return &MenuHandler{ app: app, @@ -36,7 +34,6 @@ func NewMenuHandler( menuView: menuView, localizerView: localizerView, localizerRepository: localizerRepository, - localizerListener: localizerListener, } } @@ -52,22 +49,31 @@ func (h MenuHandler) getMenuSettings() *fyne.Menu { MessageID: "exit", }), nil) quit.IsQuit = true - h.localizerListener.AddMenuItem("exit", quit) + h.app.GetLocalizerService().AddChangeCallback("exit", func(text string) { + quit.Label = text + }) languageSelection := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ MessageID: "changeLanguage", }), h.LanguageSelection) - h.localizerListener.AddMenuItem("changeLanguage", languageSelection) + h.app.GetLocalizerService().AddChangeCallback("changeLanguage", func(text string) { + languageSelection.Label = text + }) ffPathSelection := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ MessageID: "changeFFPath", }), h.convertorHandler.FfPathSelection) - h.localizerListener.AddMenuItem("changeFFPath", ffPathSelection) + h.app.GetLocalizerService().AddChangeCallback("changeFFPath", func(text string) { + ffPathSelection.Label = text + }) settings := fyne.NewMenu(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ MessageID: "settings", }), languageSelection, ffPathSelection, quit) - h.localizerListener.AddMenu("settings", settings) + h.app.GetLocalizerService().AddChangeCallback("settings", func(text string) { + settings.Label = text + settings.Refresh() + }) return settings } @@ -76,12 +82,17 @@ func (h MenuHandler) getMenuHelp() *fyne.Menu { about := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ MessageID: "about", }), h.openAbout) - h.localizerListener.AddMenuItem("about", about) + h.app.GetLocalizerService().AddChangeCallback("about", func(text string) { + about.Label = text + }) help := fyne.NewMenu(h.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{ MessageID: "help", }), about) - h.localizerListener.AddMenu("help", help) + h.app.GetLocalizerService().AddChangeCallback("help", func(text string) { + help.Label = text + help.Refresh() + }) return help } @@ -109,41 +120,3 @@ func (h MenuHandler) LanguageSelection() { h.convertorHandler.MainConvertor() }) } - -type menuItems struct { - menuItem map[string]*fyne.MenuItem - menu map[string]*fyne.Menu -} - -type LocalizerListener struct { - menuItems *menuItems -} - -type localizerListenerContract interface { - AddMenu(messageID string, menu *fyne.Menu) - AddMenuItem(messageID string, menuItem *fyne.MenuItem) -} - -func NewLocalizerListener() *LocalizerListener { - return &LocalizerListener{ - &menuItems{menuItem: map[string]*fyne.MenuItem{}, menu: map[string]*fyne.Menu{}}, - } -} - -func (l LocalizerListener) AddMenu(messageID string, menu *fyne.Menu) { - l.menuItems.menu[messageID] = menu -} - -func (l LocalizerListener) AddMenuItem(messageID string, menuItem *fyne.MenuItem) { - l.menuItems.menuItem[messageID] = menuItem -} - -func (l LocalizerListener) Change(localizerService kernel.LocalizerContract) { - for messageID, menu := range l.menuItems.menuItem { - menu.Label = localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: messageID}) - } - for messageID, menu := range l.menuItems.menu { - menu.Label = localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: messageID}) - menu.Refresh() - } -} diff --git a/images/screenshot-gui-for-ffmpeg.png b/images/screenshot-gui-for-ffmpeg.png index 2183563..fba50e6 100644 Binary files a/images/screenshot-gui-for-ffmpeg.png and b/images/screenshot-gui-for-ffmpeg.png differ diff --git a/kernel/convertor.go b/kernel/convertor.go index 8441fa1..6754874 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" @@ -10,6 +13,19 @@ import ( "strings" ) +type File struct { + Path string + Name string + Ext string +} + +type ConvertSetting struct { + VideoFileInput File + VideoFileOut File + OverwriteOutputFiles bool + Encoder encoder2.EncoderContract +} + type ConvertorContract interface { RunConvert(setting ConvertSetting, progress ProgressContract) error GetTotalDuration(file *File) (float64, error) @@ -18,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 { @@ -56,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) @@ -103,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) { @@ -156,6 +198,46 @@ 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") + helper.PrepareBackgroundCommand(cmd) + + 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/kernel/layout.go b/kernel/layout.go index 4b740d4..db691cf 100644 --- a/kernel/layout.go +++ b/kernel/layout.go @@ -61,11 +61,11 @@ type QueueLayoutObjectContract interface { type QueueLayoutObject struct { QueueListContract QueueListContract - queue QueueListContract - container *fyne.Container - items map[int]QueueLayoutItem - localizerService LocalizerContract - layoutLocalizerListener LayoutLocalizerListenerContract + queue QueueListContract + container *fyne.Container + items map[int]QueueLayoutItem + localizerService LocalizerContract + queueStatisticsFormat *queueStatisticsFormat } type QueueLayoutItem struct { @@ -73,20 +73,31 @@ type QueueLayoutItem struct { ProgressBar *widget.ProgressBar StatusMessage *canvas.Text MessageError *canvas.Text + + status *StatusContract } -func NewQueueLayoutObject(queue QueueListContract, localizerService LocalizerContract, layoutLocalizerListener LayoutLocalizerListenerContract) *QueueLayoutObject { - title := widget.NewLabel(localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: "queue"}) + ":") +func NewQueueLayoutObject(queue QueueListContract, localizerService LocalizerContract) *QueueLayoutObject { + title := widget.NewLabel(localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: "queue"})) title.TextStyle.Bold = true - layoutLocalizerListener.AddItem("queue", title) + localizerService.AddChangeCallback("queue", func(text string) { + title.Text = text + title.Refresh() + }) + + items := map[int]QueueLayoutItem{} + queueStatisticsFormat := newQueueStatisticsFormat(localizerService, &items) queueLayoutObject := &QueueLayoutObject{ - queue: queue, - container: container.NewVBox(title), - items: map[int]QueueLayoutItem{}, - localizerService: localizerService, - layoutLocalizerListener: layoutLocalizerListener, + queue: queue, + container: container.NewVBox( + container.NewHBox(title, queueStatisticsFormat.completed.widget, queueStatisticsFormat.error.widget), + container.NewHBox(queueStatisticsFormat.inProgress.widget, queueStatisticsFormat.waiting.widget, queueStatisticsFormat.total.widget), + ), + items: items, + localizerService: localizerService, + queueStatisticsFormat: queueStatisticsFormat, } queue.AddListener(queueLayoutObject) @@ -118,11 +129,18 @@ func (o QueueLayoutObject) Add(id int, queue *Queue) { canvas.NewLine(theme.FocusColor()), container.NewPadded(), ) + + o.queueStatisticsFormat.addQueue() + if o.queueStatisticsFormat.isChecked(queue.Status) == false { + content.Hide() + } + o.items[id] = QueueLayoutItem{ CanvasObject: content, ProgressBar: progressBar, StatusMessage: statusMessage, MessageError: messageError, + status: &queue.Status, } o.container.Add(content) } @@ -130,6 +148,7 @@ func (o QueueLayoutObject) Add(id int, queue *Queue) { func (o QueueLayoutObject) Remove(id int) { if item, ok := o.items[id]; ok { o.container.Remove(item.CanvasObject) + o.queueStatisticsFormat.removeQueue(*item.status) o.items[id] = QueueLayoutItem{} } } @@ -145,6 +164,12 @@ func (o QueueLayoutObject) ChangeQueueStatus(queueId int, queue *Queue) { item.MessageError.Color = statusColor item.MessageError.Refresh() } + if o.queueStatisticsFormat.isChecked(queue.Status) == false && item.CanvasObject.Visible() == true { + item.CanvasObject.Hide() + } else if item.CanvasObject.Visible() == false { + item.CanvasObject.Show() + } + o.queueStatisticsFormat.changeQueue(queue.Status) } } @@ -161,7 +186,7 @@ func (o QueueLayoutObject) getStatusColor(status StatusContract) color.Color { } func (o QueueLayoutObject) getStatusTitle(status StatusContract) string { - return o.localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: status.name()}) + return o.localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: status.Name() + "Queue"}) } type Progress struct { @@ -254,35 +279,256 @@ func (p Progress) Run(stdOut io.ReadCloser, stdErr io.ReadCloser) error { return nil } -type LayoutLocalizerItem struct { - messageID string - object *widget.Label +type queueStatistics struct { + widget *widget.Check + title string + count *int64 +} +type queueStatisticsFormat struct { + waiting *queueStatistics + inProgress *queueStatistics + completed *queueStatistics + error *queueStatistics + total *queueStatistics } -type LayoutLocalizerListener struct { - itemCurrentId int - items map[int]*LayoutLocalizerItem +func newQueueStatisticsFormat(localizerService LocalizerContract, queueItems *map[int]QueueLayoutItem) *queueStatisticsFormat { + checkWaiting := newQueueStatistics("waitingQueue", localizerService) + checkInProgress := newQueueStatistics("inProgressQueue", localizerService) + checkCompleted := newQueueStatistics("completedQueue", localizerService) + checkError := newQueueStatistics("errorQueue", localizerService) + checkTotal := newQueueStatistics("total", localizerService) + + queueStatisticsFormat := &queueStatisticsFormat{ + waiting: checkWaiting, + inProgress: checkInProgress, + completed: checkCompleted, + error: checkError, + total: checkTotal, + } + + checkTotal.widget.OnChanged = func(b bool) { + if b == true { + queueStatisticsFormat.allCheckboxChecked() + } else { + queueStatisticsFormat.allUnCheckboxChecked() + } + queueStatisticsFormat.redrawingQueueItems(queueItems) + } + + queueStatisticsFormat.waiting.widget.OnChanged = func(b bool) { + if b == true { + queueStatisticsFormat.checkboxChecked() + } else { + queueStatisticsFormat.unCheckboxChecked() + } + queueStatisticsFormat.redrawingQueueItems(queueItems) + } + + queueStatisticsFormat.inProgress.widget.OnChanged = func(b bool) { + if b == true { + queueStatisticsFormat.checkboxChecked() + } else { + queueStatisticsFormat.unCheckboxChecked() + } + queueStatisticsFormat.redrawingQueueItems(queueItems) + } + + queueStatisticsFormat.completed.widget.OnChanged = func(b bool) { + if b == true { + queueStatisticsFormat.checkboxChecked() + } else { + queueStatisticsFormat.unCheckboxChecked() + } + queueStatisticsFormat.redrawingQueueItems(queueItems) + } + + queueStatisticsFormat.error.widget.OnChanged = func(b bool) { + if b == true { + queueStatisticsFormat.checkboxChecked() + } else { + queueStatisticsFormat.unCheckboxChecked() + } + queueStatisticsFormat.redrawingQueueItems(queueItems) + } + + return queueStatisticsFormat } -type LayoutLocalizerListenerContract interface { - AddItem(messageID string, object *widget.Label) -} - -func NewLayoutLocalizerListener() *LayoutLocalizerListener { - return &LayoutLocalizerListener{ - itemCurrentId: 0, - items: map[int]*LayoutLocalizerItem{}, +func (f queueStatisticsFormat) redrawingQueueItems(queueItems *map[int]QueueLayoutItem) { + for _, item := range *queueItems { + if f.isChecked(*item.status) == true && item.CanvasObject.Visible() == false { + item.CanvasObject.Show() + continue + } + if f.isChecked(*item.status) == false && item.CanvasObject.Visible() == true { + item.CanvasObject.Hide() + } } } -func (l LayoutLocalizerListener) AddItem(messageID string, object *widget.Label) { - l.itemCurrentId += 1 - l.items[l.itemCurrentId] = &LayoutLocalizerItem{messageID: messageID, object: object} +func (f queueStatisticsFormat) isChecked(status StatusContract) bool { + if status == StatusType(InProgress) { + return f.inProgress.widget.Checked + } + if status == StatusType(Completed) { + return f.completed.widget.Checked + } + if status == StatusType(Error) { + return f.error.widget.Checked + } + if status == StatusType(Waiting) { + return f.waiting.widget.Checked + } + + return true } -func (l LayoutLocalizerListener) Change(localizerService LocalizerContract) { - for _, item := range l.items { - item.object.Text = localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: item.messageID}) - item.object.Refresh() +func (f queueStatisticsFormat) addQueue() { + f.waiting.add() + f.total.add() +} + +func (f queueStatisticsFormat) changeQueue(status StatusContract) { + if status == StatusType(InProgress) { + f.waiting.remove() + f.inProgress.add() + return + } + + if status == StatusType(Completed) { + f.inProgress.remove() + f.completed.add() + return + } + + if status == StatusType(Error) { + f.inProgress.remove() + f.error.add() + return + } +} + +func (f queueStatisticsFormat) removeQueue(status StatusContract) { + f.total.remove() + + if status == StatusType(Completed) { + f.completed.remove() + return + } + + if status == StatusType(Error) { + f.error.remove() + return + } + + if status == StatusType(InProgress) { + f.inProgress.remove() + return + } + + if status == StatusType(Waiting) { + f.waiting.remove() + return + } +} + +func (f queueStatisticsFormat) checkboxChecked() { + if f.total.widget.Checked == true { + return + } + + if f.waiting.widget.Checked == false { + return + } + + if f.inProgress.widget.Checked == false { + return + } + + if f.completed.widget.Checked == false { + return + } + + if f.error.widget.Checked == false { + return + } + + f.total.widget.Checked = true + f.total.widget.Refresh() +} + +func (f queueStatisticsFormat) unCheckboxChecked() { + if f.total.widget.Checked == false { + return + } + + f.total.widget.Checked = false + f.total.widget.Refresh() +} + +func (f queueStatisticsFormat) allCheckboxChecked() { + f.waiting.widget.Checked = true + f.waiting.widget.Refresh() + f.inProgress.widget.Checked = true + f.inProgress.widget.Refresh() + f.completed.widget.Checked = true + f.completed.widget.Refresh() + f.error.widget.Checked = true + f.error.widget.Refresh() +} + +func (f queueStatisticsFormat) allUnCheckboxChecked() { + f.waiting.widget.Checked = false + f.waiting.widget.Refresh() + f.inProgress.widget.Checked = false + f.inProgress.widget.Refresh() + f.completed.widget.Checked = false + f.completed.widget.Refresh() + f.error.widget.Checked = false + f.error.widget.Refresh() +} + +func newQueueStatistics(messaigeID string, localizerService LocalizerContract) *queueStatistics { + checkbox := widget.NewCheck("", nil) + checkbox.Checked = true + + count := int64(0) + + title := localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: messaigeID}) + queueStatistics := &queueStatistics{ + widget: checkbox, + title: strings.ToLower(title), + count: &count, + } + + queueStatistics.formatText(false) + + localizerService.AddChangeCallback(messaigeID, func(text string) { + queueStatistics.title = strings.ToLower(text) + queueStatistics.formatText(true) + queueStatistics.widget.Refresh() + }) + + return queueStatistics +} + +func (s queueStatistics) add() { + *s.count += 1 + s.formatText(true) +} + +func (s queueStatistics) remove() { + if *s.count == 0 { + return + } + *s.count -= 1 + s.formatText(true) +} + +func (s queueStatistics) formatText(refresh bool) { + s.widget.Text = s.title + ": " + strconv.FormatInt(*s.count, 10) + if refresh == true { + s.widget.Refresh() } } diff --git a/kernel/localizer.go b/kernel/localizer.go index e002125..3823c7d 100644 --- a/kernel/localizer.go +++ b/kernel/localizer.go @@ -16,11 +16,7 @@ type LocalizerContract interface { SetCurrentLanguage(lang Lang) error SetCurrentLanguageByCode(code string) error GetCurrentLanguage() *CurrentLanguage - AddListener(listener LocalizerListenerContract) -} - -type LocalizerListenerContract interface { - Change(localizerService LocalizerContract) + AddChangeCallback(messageID string, callback func(text string)) } type Lang struct { @@ -34,11 +30,16 @@ type CurrentLanguage struct { localizerDefault *i18n.Localizer } +type changeCallback struct { + messageID string + callback func(text string) +} + type Localizer struct { - bundle *i18n.Bundle - languages []Lang - currentLanguage *CurrentLanguage - localizerListener map[int]LocalizerListenerContract + bundle *i18n.Bundle + languages []Lang + currentLanguage *CurrentLanguage + changeCallbacks map[int]*changeCallback } func NewLocalizer(directory string, languageDefault language.Tag) (*Localizer, error) { @@ -63,7 +64,7 @@ func NewLocalizer(directory string, languageDefault language.Tag) (*Localizer, e localizer: localizerDefault, localizerDefault: localizerDefault, }, - localizerListener: map[int]LocalizerListenerContract{}, + changeCallbacks: map[int]*changeCallback{}, }, nil } @@ -123,13 +124,14 @@ func (l Localizer) GetCurrentLanguage() *CurrentLanguage { return l.currentLanguage } -func (l Localizer) AddListener(listener LocalizerListenerContract) { - l.localizerListener[len(l.localizerListener)] = listener +func (l Localizer) AddChangeCallback(messageID string, callback func(text string)) { + l.changeCallbacks[len(l.changeCallbacks)] = &changeCallback{messageID: messageID, callback: callback} } func (l Localizer) eventSetCurrentLanguage() { - for _, listener := range l.localizerListener { - listener.Change(l) + for _, changeCallback := range l.changeCallbacks { + text := l.GetMessage(&i18n.LocalizeConfig{MessageID: changeCallback.messageID}) + changeCallback.callback(text) } } diff --git a/kernel/queue.go b/kernel/queue.go index d820fa6..6d2f6c4 100644 --- a/kernel/queue.go +++ b/kernel/queue.go @@ -10,21 +10,9 @@ type Queue struct { Error error } -type File struct { - Path string - Name string - Ext string -} - -type ConvertSetting struct { - VideoFileInput File - VideoFileOut File - OverwriteOutputFiles bool -} - type StatusContract interface { - name() string - ordinal() int + Name() string + Ordinal() int } const ( @@ -43,11 +31,11 @@ var statusTypeStrings = []string{ "error", } -func (status StatusType) name() string { +func (status StatusType) Name() string { return statusTypeStrings[status] } -func (status StatusType) ordinal() int { +func (status StatusType) Ordinal() int { return int(status) } diff --git a/languages/active.en.toml b/languages/active.en.toml index 499b140..7d573b0 100644 --- a/languages/active.en.toml +++ b/languages/active.en.toml @@ -38,7 +38,7 @@ other = "Allow file to be overwritten" hash = "sha1-f60bb5f761024d973834b5e9d25ceebce2c85f94" other = "choose" -[completed] +[completedQueue] hash = "sha1-398c7d4f7b0d522afb930769c0fbb1a9f4b61fbe" other = "Completed" @@ -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!" @@ -90,9 +222,21 @@ other = "this is not FFprobe" hash = "sha1-da7b37d7df3fafbd153665b13888413d52b24c17" other = "Failed to determine FFprobe version" +[errorQueue] +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" @@ -106,15 +250,15 @@ 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" other = "Help" -[inProgress] +[inProgressQueue] hash = "sha1-eff79c40e2100ae5fadf3a7d99336025edcca8b5" other = "In Progress" @@ -158,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" @@ -174,10 +326,14 @@ other = "Checking FFmpeg for serviceability..." hash = "sha1-92df86371f6c3a06ca1e4754f113142776a32d49" other = "You can download it from here" +[total] +hash = "sha1-3b5143902e0c5c84459aedf918e17604d9735b94" +other = "Total" + [unzipRun] hash = "sha1-c554dad13026668a1f6adf3171837c5d51bbac36" other = "Unpacked..." -[waiting] +[waitingQueue] hash = "sha1-307429dd84150877080c4bbff2b340d1e7dadff2" other = "Waiting" diff --git a/languages/active.kk.toml b/languages/active.kk.toml index d443d8a..6785d10 100644 --- a/languages/active.kk.toml +++ b/languages/active.kk.toml @@ -38,7 +38,7 @@ other = "Файлды қайта жазуға рұқсат беріңіз" hash = "sha1-f60bb5f761024d973834b5e9d25ceebce2c85f94" other = "таңдау" -[completed] +[completedQueue] hash = "sha1-398c7d4f7b0d522afb930769c0fbb1a9f4b61fbe" other = "Дайын" @@ -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 = "Қате орын алды!" @@ -90,9 +222,21 @@ other = "бұл FFprobe емес" hash = "sha1-da7b37d7df3fafbd153665b13888413d52b24c17" other = "FFprobe нұсқасын анықтау мүмкін болмады" +[errorQueue] +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" @@ -106,15 +250,15 @@ 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] hash = "sha1-6a45cef900c668effcb2ab10da05855c1fd10f6f" other = "Анықтама" -[inProgress] +[inProgressQueue] hash = "sha1-eff79c40e2100ae5fadf3a7d99336025edcca8b5" other = "Орындалуда" @@ -158,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 = "Параметрлер" @@ -174,10 +326,14 @@ other = "FFmpeg функционалдығы тексерілуде..." hash = "sha1-92df86371f6c3a06ca1e4754f113142776a32d49" other = "Сіз оны осы жерден жүктей аласыз" +[total] +hash = "sha1-3b5143902e0c5c84459aedf918e17604d9735b94" +other = "Барлығы" + [unzipRun] hash = "sha1-c554dad13026668a1f6adf3171837c5d51bbac36" other = "Орамнан шығарылуда..." -[waiting] +[waitingQueue] hash = "sha1-307429dd84150877080c4bbff2b340d1e7dadff2" other = "Күту" diff --git a/languages/active.ru.toml b/languages/active.ru.toml index b163e1b..bc9dd1e 100644 --- a/languages/active.ru.toml +++ b/languages/active.ru.toml @@ -8,12 +8,45 @@ changeFFPath = "FFmpeg и FFprobe" changeLanguage = "Поменять язык" checkboxOverwriteOutputFilesTitle = "Разрешить перезаписать файл" choose = "выбрать" -completed = "Готово" +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'" @@ -21,13 +54,16 @@ errorFFmpeg = "это не FFmpeg" errorFFmpegVersion = "Не смогли определить версию FFmpeg" errorFFprobe = "это не FFprobe" errorFFprobeVersion = "Не смогли определить версию FFprobe" -errorSelectedFolderSave = "Не выбрали папку для сохранения!" +errorQueue = "Ошибка" +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 = "Справка" -inProgress = "Выполняется" +inProgressQueue = "Выполняется" languageSelectionFormHead = "Переключить язык" languageSelectionHead = "Выберите язык" licenseLink = "Сведения о лицензии" @@ -38,9 +74,12 @@ programmLink = "Сайт проекта" programmVersion = "**Версия программы:** {{.Version}}" queue = "Очередь" save = "Сохранить" +selectEncoder = "Выберите конвертер" selectFFPathTitle = "Укажите путь к FFmpeg и к FFprobe" +selectFormat = "Выберите расширение файла" settings = "Настройки" testFF = "Проверка FFmpeg на работоспособность..." titleDownloadLink = "Скачать можно от сюда" +total = "Всего" unzipRun = "Распаковывается..." -waiting = "В очереди" +waitingQueue = "В очереди" diff --git a/languages/translate.en.toml b/languages/translate.en.toml index acb16ac..92dc6bc 100644 --- a/languages/translate.en.toml +++ b/languages/translate.en.toml @@ -1,15 +1,139 @@ -[completed] -hash = "sha1-398c7d4f7b0d522afb930769c0fbb1a9f4b61fbe" -other = "Completed" +[encoder_apng] +hash = "sha1-1cbd9abfef96d5614a7e569161b41bd6ad87bbaf" +other = "APNG image" -[inProgress] -hash = "sha1-eff79c40e2100ae5fadf3a7d99336025edcca8b5" -other = "In Progress" +[encoder_bmp] +hash = "sha1-e0b9c16b016961a5abdc2217e8ffd1ba7ddebc40" +other = "BMP image" -[queue] -hash = "sha1-aec93b16baeaf55fed871075c9494a460e4a91b8" -other = "Queue" +[encoder_flv] +hash = "sha1-3602bbf1cc90e48254f81975c7879b5fc0c4d602" +other = "FLV" -[waiting] -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 93b8581..fc61d08 100644 --- a/languages/translate.kk.toml +++ b/languages/translate.kk.toml @@ -1,15 +1,139 @@ -[completed] -hash = "sha1-398c7d4f7b0d522afb930769c0fbb1a9f4b61fbe" -other = "Дайын" +[encoder_apng] +hash = "sha1-1cbd9abfef96d5614a7e569161b41bd6ad87bbaf" +other = "APNG image" -[inProgress] -hash = "sha1-eff79c40e2100ae5fadf3a7d99336025edcca8b5" -other = "Орындалуда" +[encoder_bmp] +hash = "sha1-e0b9c16b016961a5abdc2217e8ffd1ba7ddebc40" +other = "BMP image" -[queue] -hash = "sha1-aec93b16baeaf55fed871075c9494a460e4a91b8" -other = "Кезек" +[encoder_flv] +hash = "sha1-3602bbf1cc90e48254f81975c7879b5fc0c4d602" +other = "FLV" -[waiting] -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 5b98be8..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, } @@ -37,15 +37,13 @@ func init() { ffPathUtilities = &kernel.FFPathUtilities{FFmpeg: "", FFprobe: ""} convertorService := kernel.NewService(ffPathUtilities) - layoutLocalizerListener := kernel.NewLayoutLocalizerListener() - localizerService.AddListener(layoutLocalizerListener) queue := kernel.NewQueueList() application = kernel.NewApp( appMetadata, localizerService, queue, - kernel.NewQueueLayoutObject(queue, localizerService, layoutLocalizerListener), + kernel.NewQueueLayoutObject(queue, localizerService), convertorService, ) } @@ -97,13 +95,11 @@ 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) - localizerListener := handler.NewLocalizerListener() - application.GetLocalizerService().AddListener(localizerListener) - mainMenu := handler.NewMenuHandler(application, convertorHandler, menuView, localizerView, localizerRepository, localizerListener) + mainMenu := handler.NewMenuHandler(application, convertorHandler, menuView, localizerView, localizerRepository) mainHandler := handler.NewMainHandler(application, convertorHandler, mainMenu, localizerRepository) mainHandler.Start()