Версия 0.5.0 #6
| @@ -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() | ||||
|   | ||||
							
								
								
									
										21
									
								
								encoder/apng/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/apng/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/bmp/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/bmp/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										79
									
								
								encoder/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								encoder/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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), | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/flv/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/flv/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/gif/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/gif/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										23
									
								
								encoder/h264_nvenc/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								encoder/h264_nvenc/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/libmp3lame/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/libmp3lame/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/libshine/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/libshine/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/libtwolame/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/libtwolame/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/libvpx/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/libvpx/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/libvpx_vp9/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/libvpx_vp9/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/libwebp/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/libwebp/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/libwebp_anim/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/libwebp_anim/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/libx264/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/libx264/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/libx265/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/libx265/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/libxvid/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/libxvid/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/mjpeg/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/mjpeg/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/mp2/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/mp2/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/mp2fixed/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/mp2fixed/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/mpeg1video/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/mpeg1video/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/mpeg2video/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/mpeg2video/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/mpeg4/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/mpeg4/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/msmpeg4/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/msmpeg4/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/msmpeg4v2/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/msmpeg4v2/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/msvideo1/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/msvideo1/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/png/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/png/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/qtrle/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/qtrle/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/sgi/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/sgi/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/tiff/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/tiff/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/wmav1/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/wmav1/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/wmav2/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/wmav2/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/wmv1/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/wmv1/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/wmv2/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/wmv2/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
							
								
								
									
										21
									
								
								encoder/xbm/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								encoder/xbm/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
| @@ -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, | ||||
| 	}) | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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() | ||||
| 	} | ||||
| } | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 64 KiB | 
| @@ -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 | ||||
| } | ||||
|   | ||||
							
								
								
									
										84
									
								
								kernel/encoder/encoder.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								kernel/encoder/encoder.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||
| } | ||||
							
								
								
									
										74
									
								
								kernel/encoder/encoders.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								kernel/encoder/encoders.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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, | ||||
| } | ||||
							
								
								
									
										304
									
								
								kernel/layout.go
									
									
									
									
									
								
							
							
						
						
									
										304
									
								
								kernel/layout.go
									
									
									
									
									
								
							| @@ -65,7 +65,7 @@ type QueueLayoutObject struct { | ||||
| 	container             *fyne.Container | ||||
| 	items                 map[int]QueueLayoutItem | ||||
| 	localizerService      LocalizerContract | ||||
| 	layoutLocalizerListener LayoutLocalizerListenerContract | ||||
| 	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{}, | ||||
| 		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, | ||||
| 		layoutLocalizerListener: layoutLocalizerListener, | ||||
| 		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() | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
| 	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) | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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) | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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" | ||||
|   | ||||
| @@ -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 = "Күту" | ||||
|   | ||||
| @@ -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 = "В очереди" | ||||
|   | ||||
| @@ -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" | ||||
|   | ||||
| @@ -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 = "Файл кеңейтімін таңдаңыз" | ||||
|   | ||||
							
								
								
									
										12
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								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() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user