From 850cbbaf7081d122f793ae98398cd2a55d502017 Mon Sep 17 00:00:00 2001 From: Leonid Nikitin Date: Mon, 9 Jun 2025 23:42:09 +0500 Subject: [PATCH] Removed the old program structure. --- convertor/repository.go | 46 -- convertor/view.go | 60 -- convertor/view/conversion.go | 515 ------------ convertor/view/form_items/form.go | 16 - convertor/view/form_items/h264_nvenc/view.go | 64 -- convertor/view/form_items/libx264/view.go | 64 -- convertor/view/form_items/libx265/view.go | 64 -- convertor/view_setting.go | 128 --- ...ew_setting_button_download_ffmpeg_anyos.go | 17 - ...ew_setting_button_download_ffmpeg_linux.go | 61 -- ..._setting_button_download_ffmpeg_windows.go | 61 -- encoder/apng/encoder.go | 19 - encoder/bmp/encoder.go | 19 - encoder/encoder.go | 169 ---- encoder/flv/encoder.go | 19 - encoder/gif/encoder.go | 19 - encoder/h264_nvenc/encoder.go | 58 -- encoder/libmp3lame/encoder.go | 19 - encoder/libshine/encoder.go | 19 - encoder/libtwolame/encoder.go | 19 - encoder/libvpx/encoder.go | 19 - encoder/libvpx_vp9/encoder.go | 19 - encoder/libwebp/encoder.go | 19 - encoder/libwebp_anim/encoder.go | 19 - encoder/libx264/encoder.go | 56 -- encoder/libx265/encoder.go | 56 -- encoder/libxvid/encoder.go | 19 - encoder/mjpeg/encoder.go | 19 - encoder/mp2/encoder.go | 19 - encoder/mp2fixed/encoder.go | 19 - encoder/mpeg1video/encoder.go | 19 - encoder/mpeg2video/encoder.go | 19 - encoder/mpeg4/encoder.go | 19 - encoder/msmpeg4/encoder.go | 19 - encoder/msmpeg4v2/encoder.go | 19 - encoder/msvideo1/encoder.go | 19 - encoder/png/encoder.go | 19 - encoder/qtrle/encoder.go | 19 - encoder/sgi/encoder.go | 19 - encoder/tiff/encoder.go | 19 - encoder/wmav1/encoder.go | 19 - encoder/wmav2/encoder.go | 19 - encoder/wmv1/encoder.go | 19 - encoder/wmv2/encoder.go | 19 - encoder/xbm/encoder.go | 19 - error/view.go | 39 - handler/convertor.go | 178 ---- handler/convertor_anyos.go | 18 - handler/convertor_linux.go | 231 ------ handler/convertor_windows.go | 185 ----- handler/main.go | 32 - handler/menu.go | 143 ---- helper/helper.go | 11 - helper/path_separator.go | 8 - helper/path_separator_window.go | 8 - helper/prepare_background_command.go | 12 - helper/prepare_background_command_windows.go | 13 - kernel/app.go | 132 --- kernel/convertor.go | 290 ------- kernel/encoder/encoder.go | 84 -- kernel/encoder/encoders.go | 74 -- kernel/error.go | 17 - kernel/ffplay.go | 28 - kernel/items_to_convert.go | 152 ---- kernel/layout.go | 481 ----------- kernel/localizer.go | 194 ----- kernel/progressbar.go | 245 ------ kernel/queue.go | 125 --- kernel/right_tabs.go | 75 -- kernel/translations/app.en.json | 143 ---- kernel/translations/app.kk.json | 143 ---- kernel/translations/app.ru.json | 143 ---- kernel/translations/base.en.json | 45 - kernel/translations/base.kk.json | 45 - kernel/translations/base.ru.json | 45 - kernel/window.go | 89 -- localizer/view.go | 69 -- menu/view.go | 774 ------------------ menu/view_setting.go | 101 --- setting/directory_for_saving.go | 22 - setting/entity.go | 6 - setting/repository.go | 39 - theme/repository.go | 28 - theme/theme.go | 148 ---- 84 files changed, 6620 deletions(-) delete mode 100644 convertor/repository.go delete mode 100644 convertor/view.go delete mode 100644 convertor/view/conversion.go delete mode 100644 convertor/view/form_items/form.go delete mode 100644 convertor/view/form_items/h264_nvenc/view.go delete mode 100644 convertor/view/form_items/libx264/view.go delete mode 100644 convertor/view/form_items/libx265/view.go delete mode 100644 convertor/view_setting.go delete mode 100644 convertor/view_setting_button_download_ffmpeg_anyos.go delete mode 100644 convertor/view_setting_button_download_ffmpeg_linux.go delete mode 100644 convertor/view_setting_button_download_ffmpeg_windows.go delete mode 100644 encoder/apng/encoder.go delete mode 100644 encoder/bmp/encoder.go delete mode 100644 encoder/encoder.go delete mode 100644 encoder/flv/encoder.go delete mode 100644 encoder/gif/encoder.go delete mode 100644 encoder/h264_nvenc/encoder.go delete mode 100644 encoder/libmp3lame/encoder.go delete mode 100644 encoder/libshine/encoder.go delete mode 100644 encoder/libtwolame/encoder.go delete mode 100644 encoder/libvpx/encoder.go delete mode 100644 encoder/libvpx_vp9/encoder.go delete mode 100644 encoder/libwebp/encoder.go delete mode 100644 encoder/libwebp_anim/encoder.go delete mode 100644 encoder/libx264/encoder.go delete mode 100644 encoder/libx265/encoder.go delete mode 100644 encoder/libxvid/encoder.go delete mode 100644 encoder/mjpeg/encoder.go delete mode 100644 encoder/mp2/encoder.go delete mode 100644 encoder/mp2fixed/encoder.go delete mode 100644 encoder/mpeg1video/encoder.go delete mode 100644 encoder/mpeg2video/encoder.go delete mode 100644 encoder/mpeg4/encoder.go delete mode 100644 encoder/msmpeg4/encoder.go delete mode 100644 encoder/msmpeg4v2/encoder.go delete mode 100644 encoder/msvideo1/encoder.go delete mode 100644 encoder/png/encoder.go delete mode 100644 encoder/qtrle/encoder.go delete mode 100644 encoder/sgi/encoder.go delete mode 100644 encoder/tiff/encoder.go delete mode 100644 encoder/wmav1/encoder.go delete mode 100644 encoder/wmav2/encoder.go delete mode 100644 encoder/wmv1/encoder.go delete mode 100644 encoder/wmv2/encoder.go delete mode 100644 encoder/xbm/encoder.go delete mode 100644 error/view.go delete mode 100644 handler/convertor.go delete mode 100644 handler/convertor_anyos.go delete mode 100644 handler/convertor_linux.go delete mode 100644 handler/convertor_windows.go delete mode 100644 handler/main.go delete mode 100644 handler/menu.go delete mode 100644 helper/helper.go delete mode 100644 helper/path_separator.go delete mode 100644 helper/path_separator_window.go delete mode 100644 helper/prepare_background_command.go delete mode 100644 helper/prepare_background_command_windows.go delete mode 100644 kernel/app.go delete mode 100644 kernel/convertor.go delete mode 100644 kernel/encoder/encoder.go delete mode 100644 kernel/encoder/encoders.go delete mode 100644 kernel/error.go delete mode 100644 kernel/ffplay.go delete mode 100644 kernel/items_to_convert.go delete mode 100644 kernel/layout.go delete mode 100644 kernel/localizer.go delete mode 100644 kernel/progressbar.go delete mode 100644 kernel/queue.go delete mode 100644 kernel/right_tabs.go delete mode 100644 kernel/translations/app.en.json delete mode 100644 kernel/translations/app.kk.json delete mode 100644 kernel/translations/app.ru.json delete mode 100644 kernel/translations/base.en.json delete mode 100644 kernel/translations/base.kk.json delete mode 100644 kernel/translations/base.ru.json delete mode 100644 kernel/window.go delete mode 100644 localizer/view.go delete mode 100644 menu/view.go delete mode 100644 menu/view_setting.go delete mode 100644 setting/directory_for_saving.go delete mode 100644 setting/entity.go delete mode 100644 setting/repository.go delete mode 100644 theme/repository.go delete mode 100644 theme/theme.go diff --git a/convertor/repository.go b/convertor/repository.go deleted file mode 100644 index d052ff3..0000000 --- a/convertor/repository.go +++ /dev/null @@ -1,46 +0,0 @@ -package convertor - -import ( - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/setting" -) - -type RepositoryContract interface { - GetPathFfmpeg() string - SavePathFfmpeg(code string) setting.Setting - GetPathFfprobe() string - SavePathFfprobe(code string) setting.Setting - GetPathFfplay() string - SavePathFfplay(code string) setting.Setting -} - -type Repository struct { - settingRepository setting.RepositoryContract -} - -func NewRepository(settingRepository setting.RepositoryContract) *Repository { - return &Repository{settingRepository: settingRepository} -} - -func (r Repository) GetPathFfmpeg() string { - return r.settingRepository.GetValue("ffmpeg") -} - -func (r Repository) SavePathFfmpeg(path string) setting.Setting { - return r.settingRepository.CreateOrUpdate("ffmpeg", path) -} - -func (r Repository) GetPathFfprobe() string { - return r.settingRepository.GetValue("ffprobe") -} - -func (r Repository) SavePathFfprobe(path string) setting.Setting { - return r.settingRepository.CreateOrUpdate("ffprobe", path) -} - -func (r Repository) GetPathFfplay() string { - return r.settingRepository.GetValue("ffplay") -} - -func (r Repository) SavePathFfplay(path string) setting.Setting { - return r.settingRepository.CreateOrUpdate("ffplay", path) -} diff --git a/convertor/view.go b/convertor/view.go deleted file mode 100644 index e3dcb14..0000000 --- a/convertor/view.go +++ /dev/null @@ -1,60 +0,0 @@ -package convertor - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor/view" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "image/color" -) - -type ViewContract interface { - Main( - formConversion view.ConversionContract, - ) - SelectFFPath( - ffmpegPath string, - ffprobePath string, - ffplayPath string, - save func(ffmpegPath string, ffprobePath string, ffplayPath string) error, - cancel func(), - donwloadFFmpeg func(progressBar *widget.ProgressBar, progressMessage *canvas.Text) error, - ) -} - -type View struct { - app kernel.AppContract - downloadFFmpeg *downloadFFmpeg -} - -type downloadFFmpeg struct { - isDownloadFFmpeg bool - blockDownloadFFmpegContainer *fyne.Container -} - -func NewView(app kernel.AppContract) *View { - return &View{ - app: app, - downloadFFmpeg: &downloadFFmpeg{ - blockDownloadFFmpegContainer: nil, - }, - } -} - -func (v View) Main(formConversion view.ConversionContract) { - converterVideoFilesTitle := v.app.GetLocalizerService().GetMessage("converterVideoFilesTitle") - v.app.GetWindow().SetContent(widget.NewCard(converterVideoFilesTitle, "", container.NewVScroll(formConversion.GetContent()))) - formConversion.AfterViewContent() -} - -func setStringErrorStyle(text *canvas.Text) { - text.Color = color.RGBA{R: 255, G: 0, B: 0, A: 255} - text.Refresh() -} - -func setStringSuccessStyle(text *canvas.Text) { - text.Color = color.RGBA{R: 49, G: 127, B: 114, A: 255} - text.Refresh() -} diff --git a/convertor/view/conversion.go b/convertor/view/conversion.go deleted file mode 100644 index 1ceeafa..0000000 --- a/convertor/view/conversion.go +++ /dev/null @@ -1,515 +0,0 @@ -package view - -import ( - "errors" - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/storage" - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor/view/form_items" - 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" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/setting" - "image/color" - "os" - "path/filepath" -) - -type ConversionContract interface { - GetContent() fyne.CanvasObject - AfterViewContent() -} - -type Conversion struct { - app kernel.AppContract - form *form - conversionMessage *canvas.Text - fileForConversion *fileForConversion - directoryForSaving *directoryForSaving - overwriteOutputFiles *overwriteOutputFiles - selectEncoder *selectEncoder - runConvert func(setting HandleConvertSetting) - itemsToConvertService kernel.ItemsToConvertContract -} - -type HandleConvertSetting struct { - DirectoryForSave string - OverwriteOutputFiles bool - Format string - Encoder encoder2.EncoderContract -} - -func NewConversion(app kernel.AppContract, formats encoder.ConvertorFormatsContract, runConvert func(setting HandleConvertSetting), settingDirectoryForSaving setting.DirectoryForSavingContract, itemsToConvertService kernel.ItemsToConvertContract) *Conversion { - conversionMessage := canvas.NewText("", color.RGBA{R: 255, G: 0, B: 0, A: 255}) - conversionMessage.TextSize = 16 - conversionMessage.TextStyle = fyne.TextStyle{Bold: true} - - fileForConversion := newFileForConversion(app, itemsToConvertService) - directoryForSaving := newDirectoryForSaving(app, settingDirectoryForSaving) - overwriteOutputFiles := newOverwriteOutputFiles(app) - selectEncoder := newSelectEncoder(app, formats) - - items := []*widget.FormItem{ - { - Text: app.GetLocalizerService().GetMessage("fileForConversionTitle"), - Widget: fileForConversion.button, - }, - { - Widget: container.NewHScroll(fileForConversion.message), - }, - { - Text: app.GetLocalizerService().GetMessage("buttonForSelectedDirTitle"), - Widget: directoryForSaving.button, - }, - { - Widget: container.NewHScroll(directoryForSaving.message), - }, - { - Widget: overwriteOutputFiles.checkbox, - }, - { - Widget: selectEncoder.SelectFileType, - }, - { - Text: app.GetLocalizerService().GetMessage("selectFormat"), - Widget: selectEncoder.SelectFormat, - }, - { - Text: app.GetLocalizerService().GetMessage("selectEncoder"), - Widget: selectEncoder.SelectEncoder, - }, - } - form := newForm(app, items) - - return &Conversion{ - app: app, - form: form, - conversionMessage: conversionMessage, - fileForConversion: fileForConversion, - directoryForSaving: directoryForSaving, - overwriteOutputFiles: overwriteOutputFiles, - selectEncoder: selectEncoder, - runConvert: runConvert, - itemsToConvertService: itemsToConvertService, - } -} - -func (c Conversion) GetContent() fyne.CanvasObject { - c.form.form.OnSubmit = c.submit - c.fileForConversion.AddChangeCallback(c.selectFileForConversion) - c.selectEncoder.AddChangeCallback(c.changeEncoder) - if c.selectEncoder.Encoder != nil { - c.selectEncoder.SelectEncoder.SetSelectedIndex(c.selectEncoder.SelectEncoder.SelectedIndex()) - } - - return container.NewVBox( - c.form.form, - c.conversionMessage, - ) -} - -func (c Conversion) changeEncoder(encoder encoder2.EncoderContract) { - items := []*widget.FormItem{} - - if form_items.Views[encoder.GetName()] != nil { - items = form_items.Views[encoder.GetName()](encoder, c.app) - } - - c.form.ChangeItems(items) -} - -func (c Conversion) AfterViewContent() { - if len(c.itemsToConvertService.GetItems()) == 0 { - c.form.form.Disable() - } -} - -func (c Conversion) selectFileForConversion(err error) { - c.conversionMessage.Text = "" - if len(c.itemsToConvertService.GetItems()) == 0 { - if err != nil { - c.form.form.Disable() - return - } - } - - c.form.form.Enable() -} - -func (c Conversion) submit() { - if len(c.itemsToConvertService.GetItems()) == 0 { - showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage("errorNoFilesAddedForConversion"))) - c.enableFormConversion() - return - } - - if len(c.directoryForSaving.path) == 0 { - showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage("errorSelectedFolderSave"))) - c.enableFormConversion() - return - } - if len(c.selectEncoder.SelectFormat.Selected) == 0 { - showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage("errorSelectedFormat"))) - return - } - if c.selectEncoder.Encoder == nil { - showConversionMessage(c.conversionMessage, errors.New(c.app.GetLocalizerService().GetMessage("errorSelectedEncoder"))) - return - } - c.conversionMessage.Text = "" - - c.fileForConversion.button.Disable() - c.directoryForSaving.button.Disable() - c.form.form.Disable() - - c.runConvert(HandleConvertSetting{ - DirectoryForSave: c.directoryForSaving.path, - OverwriteOutputFiles: c.overwriteOutputFiles.IsChecked(), - Format: c.selectEncoder.SelectFormat.Selected, - Encoder: c.selectEncoder.Encoder, - }) - c.enableFormConversion() - - if len(c.itemsToConvertService.GetItems()) == 0 { - c.form.form.Disable() - } -} - -func (c Conversion) enableFormConversion() { - c.fileForConversion.button.Enable() - c.directoryForSaving.button.Enable() - c.form.form.Enable() -} - -type fileForConversion struct { - button *widget.Button - message *canvas.Text - file *kernel.File - - changeCallbacks map[int]func(err error) -} - -func newFileForConversion(app kernel.AppContract, itemsToConvertService kernel.ItemsToConvertContract) *fileForConversion { - message := canvas.NewText("", color.RGBA{R: 255, G: 0, B: 0, A: 255}) - fileForConversion := &fileForConversion{ - message: message, - - changeCallbacks: map[int]func(err error){}, - } - - buttonTitle := app.GetLocalizerService().GetMessage("choose") + "\n" + - app.GetLocalizerService().GetMessage("or") + "\n" + - app.GetLocalizerService().GetMessage("dragAndDropFiles") - - var locationURI fyne.ListableURI - - fileForConversion.button = widget.NewButton(buttonTitle, func() { - app.GetWindow().NewFileOpen(func(r fyne.URIReadCloser, err error) { - fyne.Do(func() { - fileForConversion.message.Text = "" - fileForConversion.message.Refresh() - }) - - if err != nil { - fyne.Do(func() { - fileForConversion.message.Text = err.Error() - fileForConversion.message.Refresh() - }) - fileForConversion.eventSelectFile(err) - return - } - if r == nil { - return - } - app.GetWindow().GetLayout().GetRightTabs().SelectAddedFilesTab() - - itemsToConvertService.Add(&kernel.File{ - Path: r.URI().Path(), - Name: r.URI().Name(), - Ext: r.URI().Extension(), - }) - - fileForConversion.eventSelectFile(nil) - - listableURI := storage.NewFileURI(filepath.Dir(r.URI().Path())) - locationURI, _ = storage.ListerForURI(listableURI) - }, locationURI) - }) - - app.GetWindow().SetOnDropped(func(position fyne.Position, uris []fyne.URI) { - if len(uris) == 0 { - return - } - - isError := false - for _, uri := range uris { - info, err := os.Stat(uri.Path()) - if err != nil { - isError = true - continue - } - if info.IsDir() { - isError = true - continue - } - - itemsToConvertService.Add(&kernel.File{ - Path: uri.Path(), - Name: uri.Name(), - Ext: uri.Extension(), - }) - - fileForConversion.eventSelectFile(nil) - - listableURI := storage.NewFileURI(filepath.Dir(uri.Path())) - locationURI, _ = storage.ListerForURI(listableURI) - } - app.GetWindow().GetLayout().GetRightTabs().SelectAddedFilesTab() - if isError { - fileForConversion.message.Text = app.GetLocalizerService().GetMessage("errorDragAndDropFile") - setStringErrorStyle(fileForConversion.message) - fileForConversion.eventSelectFile(errors.New(fileForConversion.message.Text)) - } else { - fyne.Do(func() { - fileForConversion.message.Text = "" - fileForConversion.message.Refresh() - }) - } - }) - - return fileForConversion -} - -func (c fileForConversion) AddChangeCallback(callback func(err error)) { - c.changeCallbacks[len(c.changeCallbacks)] = callback -} - -func (c fileForConversion) eventSelectFile(err error) { - for _, changeCallback := range c.changeCallbacks { - changeCallback(err) - } -} - -type directoryForSaving struct { - button *widget.Button - message *canvas.Text - path string -} - -func newDirectoryForSaving(app kernel.AppContract, settingDirectoryForSaving setting.DirectoryForSavingContract) *directoryForSaving { - directoryForSaving := &directoryForSaving{ - path: "", - } - - directoryForSaving.message = canvas.NewText("", color.RGBA{R: 255, G: 0, B: 0, A: 255}) - directoryForSaving.message.TextSize = 16 - directoryForSaving.message.TextStyle = fyne.TextStyle{Bold: true} - - buttonTitle := app.GetLocalizerService().GetMessage("choose") - - var locationURI fyne.ListableURI - - location, err := getDirectoryForSaving(settingDirectoryForSaving) - if err == nil { - directoryForSaving.path = location.Path() - directoryForSaving.message.Text = location.Path() - setStringSuccessStyle(directoryForSaving.message) - } - - directoryForSaving.button = widget.NewButton(buttonTitle, func() { - app.GetWindow().NewFolderOpen(func(r fyne.ListableURI, err error) { - if err != nil { - directoryForSaving.message.Text = err.Error() - setStringErrorStyle(directoryForSaving.message) - return - } - if r == nil { - return - } - - directoryForSaving.path = r.Path() - - directoryForSaving.message.Text = r.Path() - setStringSuccessStyle(directoryForSaving.message) - locationURI, err = storage.ListerForURI(r) - - if err == nil { - _ = settingDirectoryForSaving.SaveDirectoryForSaving(locationURI.Path()) - } - - }, locationURI) - }) - - return directoryForSaving -} - -func getDirectoryForSaving(settingDirectoryForSaving setting.DirectoryForSavingContract) (fyne.ListableURI, error) { - path := settingDirectoryForSaving.GetDirectoryForSaving() - - if len(path) > 0 { - path = "file://" + path - } - - uri, err := storage.ParseURI(path) - if err != nil { - return nil, err - } - - return storage.ListerForURI(uri) -} - -type overwriteOutputFiles struct { - checkbox *widget.Check - isChecked bool -} - -func newOverwriteOutputFiles(app kernel.AppContract) *overwriteOutputFiles { - overwriteOutputFiles := &overwriteOutputFiles{ - isChecked: false, - } - checkboxOverwriteOutputFilesTitle := app.GetLocalizerService().GetMessage("checkboxOverwriteOutputFilesTitle") - overwriteOutputFiles.checkbox = widget.NewCheck(checkboxOverwriteOutputFilesTitle, func(b bool) { - overwriteOutputFiles.isChecked = b - }) - - return overwriteOutputFiles -} - -func (receiver overwriteOutputFiles) IsChecked() bool { - return receiver.isChecked -} - -type selectEncoder struct { - SelectFileType *widget.RadioGroup - SelectFormat *widget.Select - SelectEncoder *widget.Select - Encoder encoder2.EncoderContract - - changeCallbacks map[int]func(encoder encoder2.EncoderContract) -} - -func newSelectEncoder(app kernel.AppContract, formats encoder.ConvertorFormatsContract) *selectEncoder { - selectEncoder := &selectEncoder{ - changeCallbacks: map[int]func(encoder encoder2.EncoderContract){}, - } - - encoders := map[int]encoder2.EncoderDataContract{} - selectEncoder.SelectEncoder = widget.NewSelect([]string{}, func(s string) { - if encoders[selectEncoder.SelectEncoder.SelectedIndex()] == nil { - return - } - selectEncoderData := encoders[selectEncoder.SelectEncoder.SelectedIndex()] - selectEncoder.ChangeEncoder(selectEncoderData.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 = map[int]encoder2.EncoderDataContract{} - for _, e := range format.GetEncoders() { - encoders[len(encoders)] = e - encoderOptions = append(encoderOptions, app.GetLocalizerService().GetMessage("encoder_"+e.GetTitle())) - } - selectEncoder.SelectEncoder.SetOptions(encoderOptions) - selectEncoder.SelectEncoder.SetSelectedIndex(0) - }) - - fileTypeOptions := []string{} - for _, fileType := range encoder2.GetListFileType() { - fileTypeOptions = append(fileTypeOptions, fileType.Name()) - } - - encoderGroupVideo := app.GetLocalizerService().GetMessage("encoderGroupVideo") - encoderGroupAudio := app.GetLocalizerService().GetMessage("encoderGroupAudio") - encoderGroupImage := app.GetLocalizerService().GetMessage("encoderGroupImage") - encoderGroup := map[string]string{ - encoderGroupVideo: "video", - encoderGroupAudio: "audio", - encoderGroupImage: "image", - } - selectEncoder.SelectFileType = widget.NewRadioGroup([]string{encoderGroupVideo, encoderGroupAudio, encoderGroupImage}, func(s string) { - groupCode := encoderGroup[s] - - formatOptions := []string{} - for _, f := range formats.GetFormats() { - if groupCode != f.GetFileType().Name() { - continue - } - formatOptions = append(formatOptions, f.GetTitle()) - } - selectEncoder.SelectFormat.SetOptions(formatOptions) - if groupCode == encoder2.FileType(encoder2.Video).Name() { - selectEncoder.SelectFormat.SetSelected("mp4") - } else { - selectEncoder.SelectFormat.SetSelectedIndex(0) - } - }) - selectEncoder.SelectFileType.Horizontal = true - selectEncoder.SelectFileType.Required = true - selectEncoder.SelectFileType.SetSelected(encoderGroupVideo) - - return selectEncoder -} - -func (e *selectEncoder) ChangeEncoder(encoder encoder2.EncoderContract) { - e.Encoder = encoder - e.eventSelectEncoder(e.Encoder) -} - -func (e *selectEncoder) AddChangeCallback(callback func(encoder encoder2.EncoderContract)) { - e.changeCallbacks[len(e.changeCallbacks)] = callback -} - -func (e *selectEncoder) eventSelectEncoder(encoder encoder2.EncoderContract) { - for _, changeCallback := range e.changeCallbacks { - changeCallback(encoder) - } -} - -func setStringErrorStyle(text *canvas.Text) { - text.Color = color.RGBA{R: 255, G: 0, B: 0, A: 255} - text.Refresh() -} - -func setStringSuccessStyle(text *canvas.Text) { - text.Color = color.RGBA{R: 49, G: 127, B: 114, A: 255} - text.Refresh() -} - -func showConversionMessage(conversionMessage *canvas.Text, err error) { - conversionMessage.Text = err.Error() - setStringErrorStyle(conversionMessage) -} - -type form struct { - form *widget.Form - items []*widget.FormItem -} - -func newForm(app kernel.AppContract, items []*widget.FormItem) *form { - f := widget.NewForm() - f.SubmitText = app.GetLocalizerService().GetMessage("converterVideoFilesSubmitTitle") - f.Items = items - - return &form{ - form: f, - items: items, - } -} - -func (f form) ChangeItems(items []*widget.FormItem) { - f.form.Items = f.items - f.form.Refresh() - f.form.Items = append(f.form.Items, items...) - f.form.Refresh() -} diff --git a/convertor/view/form_items/form.go b/convertor/view/form_items/form.go deleted file mode 100644 index c0d1a7d..0000000 --- a/convertor/view/form_items/form.go +++ /dev/null @@ -1,16 +0,0 @@ -package form_items - -import ( - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor/view/form_items/h264_nvenc" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor/view/form_items/libx264" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor/view/form_items/libx265" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" -) - -var Views = map[string]func(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem{ - "libx264": libx264.View, - "h264_nvenc": h264_nvenc.View, - "libx265": libx265.View, -} diff --git a/convertor/view/form_items/h264_nvenc/view.go b/convertor/view/form_items/h264_nvenc/view.go deleted file mode 100644 index 2f92333..0000000 --- a/convertor/view/form_items/h264_nvenc/view.go +++ /dev/null @@ -1,64 +0,0 @@ -package h264_nvenc - -import ( - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/h264_nvenc" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" -) - -func View(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem { - items := []*widget.FormItem{} - - items = append(items, presetParameter(encoder, app)...) - - return items -} - -func presetParameter(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem { - parameter, err := encoder.GetParameter("preset") - if err != nil { - return nil - } - - presets := map[string]string{} - presetsForSelect := []string{} - presetDefault := "" - - for _, name := range h264_nvenc.Presets { - title := name - presetsForSelect = append(presetsForSelect, name) - presets[title] = name - if name == parameter.Get() { - presetDefault = title - } - } - - elementSelect := widget.NewSelect(presetsForSelect, func(s string) { - if presets[s] == "" { - return - } - parameter.Set(presets[s]) - }) - elementSelect.SetSelected(presetDefault) - elementSelect.Hide() - - checkboxTitle := app.GetLocalizerService().GetMessage("parameterCheckbox") - elementCheckbox := widget.NewCheck(checkboxTitle, func(b bool) { - if b == true { - parameter.SetEnable() - elementSelect.Show() - return - } - parameter.SetDisable() - elementSelect.Hide() - }) - - return []*widget.FormItem{ - { - Text: app.GetLocalizerService().GetMessage("formPreset"), - Widget: container.NewVBox(elementCheckbox, elementSelect), - }, - } -} diff --git a/convertor/view/form_items/libx264/view.go b/convertor/view/form_items/libx264/view.go deleted file mode 100644 index dd8ae34..0000000 --- a/convertor/view/form_items/libx264/view.go +++ /dev/null @@ -1,64 +0,0 @@ -package libx264 - -import ( - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libx264" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" -) - -func View(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem { - items := []*widget.FormItem{} - - items = append(items, presetParameter(encoder, app)...) - - return items -} - -func presetParameter(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem { - parameter, err := encoder.GetParameter("preset") - if err != nil { - return nil - } - - presets := map[string]string{} - presetsForSelect := []string{} - presetDefault := "" - - for _, name := range libx264.Presets { - title := app.GetLocalizerService().GetMessage("preset_" + name) - presetsForSelect = append(presetsForSelect, title) - presets[title] = name - if name == parameter.Get() { - presetDefault = title - } - } - - elementSelect := widget.NewSelect(presetsForSelect, func(s string) { - if presets[s] == "" { - return - } - parameter.Set(presets[s]) - }) - elementSelect.SetSelected(presetDefault) - elementSelect.Hide() - - checkboxTitle := app.GetLocalizerService().GetMessage("parameterCheckbox") - elementCheckbox := widget.NewCheck(checkboxTitle, func(b bool) { - if b == true { - parameter.SetEnable() - elementSelect.Show() - return - } - parameter.SetDisable() - elementSelect.Hide() - }) - - return []*widget.FormItem{ - { - Text: app.GetLocalizerService().GetMessage("formPreset"), - Widget: container.NewVBox(elementCheckbox, elementSelect), - }, - } -} diff --git a/convertor/view/form_items/libx265/view.go b/convertor/view/form_items/libx265/view.go deleted file mode 100644 index ae71d4d..0000000 --- a/convertor/view/form_items/libx265/view.go +++ /dev/null @@ -1,64 +0,0 @@ -package libx265 - -import ( - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libx265" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" -) - -func View(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem { - items := []*widget.FormItem{} - - items = append(items, presetParameter(encoder, app)...) - - return items -} - -func presetParameter(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem { - parameter, err := encoder.GetParameter("preset") - if err != nil { - return nil - } - - presets := map[string]string{} - presetsForSelect := []string{} - presetDefault := "" - - for _, name := range libx265.Presets { - title := app.GetLocalizerService().GetMessage("preset_" + name) - presetsForSelect = append(presetsForSelect, title) - presets[title] = name - if name == parameter.Get() { - presetDefault = title - } - } - - elementSelect := widget.NewSelect(presetsForSelect, func(s string) { - if presets[s] == "" { - return - } - parameter.Set(presets[s]) - }) - elementSelect.SetSelected(presetDefault) - elementSelect.Hide() - - checkboxTitle := app.GetLocalizerService().GetMessage("parameterCheckbox") - elementCheckbox := widget.NewCheck(checkboxTitle, func(b bool) { - if b == true { - parameter.SetEnable() - elementSelect.Show() - return - } - parameter.SetDisable() - elementSelect.Hide() - }) - - return []*widget.FormItem{ - { - Text: app.GetLocalizerService().GetMessage("formPreset"), - Widget: container.NewVBox(elementCheckbox, elementSelect), - }, - } -} diff --git a/convertor/view_setting.go b/convertor/view_setting.go deleted file mode 100644 index b18a070..0000000 --- a/convertor/view_setting.go +++ /dev/null @@ -1,128 +0,0 @@ -package convertor - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/storage" - "fyne.io/fyne/v2/widget" - "image/color" - "net/url" - "path/filepath" -) - -func (v View) SelectFFPath( - currentPathFfmpeg string, - currentPathFfprobe string, - currentPathFfplay string, - save func(ffmpegPath string, ffprobePath string, ffplayPath string) error, - cancel func(), - donwloadFFmpeg func(progressBar *widget.ProgressBar, progressMessage *canvas.Text) error, -) { - errorMessage := canvas.NewText("", color.RGBA{R: 255, G: 0, B: 0, A: 255}) - errorMessage.TextSize = 16 - errorMessage.TextStyle = fyne.TextStyle{Bold: true} - - ffmpegPath, buttonFFmpeg, buttonFFmpegMessage := v.getButtonSelectFile(currentPathFfmpeg) - ffprobePath, buttonFFprobe, buttonFFprobeMessage := v.getButtonSelectFile(currentPathFfprobe) - ffplayPath, buttonFFplay, buttonFFplayMessage := v.getButtonSelectFile(currentPathFfplay) - - link := widget.NewHyperlink("https://ffmpeg.org/download.html", &url.URL{ - Scheme: "https", - Host: "ffmpeg.org", - Path: "download.html", - }) - - form := &widget.Form{ - Items: []*widget.FormItem{ - { - Text: v.app.GetLocalizerService().GetMessage("titleDownloadLink"), - Widget: link, - }, - { - Text: v.app.GetLocalizerService().GetMessage("pathToFfmpeg"), - Widget: buttonFFmpeg, - }, - { - Widget: container.NewHScroll(buttonFFmpegMessage), - }, - { - Text: v.app.GetLocalizerService().GetMessage("pathToFfprobe"), - Widget: buttonFFprobe, - }, - { - Widget: container.NewHScroll(buttonFFprobeMessage), - }, - { - Text: v.app.GetLocalizerService().GetMessage("pathToFfplay"), - Widget: buttonFFplay, - }, - { - Widget: container.NewHScroll(buttonFFplayMessage), - }, - { - Widget: errorMessage, - }, - }, - SubmitText: v.app.GetLocalizerService().GetMessage("save"), - OnSubmit: func() { - err := save(*ffmpegPath, *ffprobePath, *ffplayPath) - if err != nil { - errorMessage.Text = err.Error() - } - }, - } - if cancel != nil { - form.OnCancel = cancel - form.CancelText = v.app.GetLocalizerService().GetMessage("cancel") - } - selectFFPathTitle := v.app.GetLocalizerService().GetMessage("selectFFPathTitle") - - if v.downloadFFmpeg.blockDownloadFFmpegContainer == nil { - v.downloadFFmpeg.blockDownloadFFmpegContainer = v.blockDownloadFFmpeg(donwloadFFmpeg) - } - - v.app.GetWindow().SetContent(widget.NewCard(selectFFPathTitle, "", container.NewVBox( - form, - v.downloadFFmpeg.blockDownloadFFmpegContainer, - ))) -} - -func (v View) getButtonSelectFile(path string) (filePath *string, button *widget.Button, buttonMessage *canvas.Text) { - filePath = &path - - buttonMessage = canvas.NewText(path, color.RGBA{R: 49, G: 127, B: 114, A: 255}) - buttonMessage.TextSize = 16 - buttonMessage.TextStyle = fyne.TextStyle{Bold: true} - - buttonTitle := v.app.GetLocalizerService().GetMessage("choose") - - var locationURI fyne.ListableURI - if len(path) > 0 { - listableURI := storage.NewFileURI(filepath.Dir(path)) - locationURI, _ = storage.ListerForURI(listableURI) - } - - button = widget.NewButton(buttonTitle, func() { - v.app.GetWindow().NewFileOpen(func(r fyne.URIReadCloser, err error) { - if err != nil { - buttonMessage.Text = err.Error() - setStringErrorStyle(buttonMessage) - return - } - if r == nil { - return - } - - path = r.URI().Path() - - buttonMessage.Text = r.URI().Path() - setStringSuccessStyle(buttonMessage) - - listableURI := storage.NewFileURI(filepath.Dir(r.URI().Path())) - locationURI, _ = storage.ListerForURI(listableURI) - }, locationURI) - }) - - return -} diff --git a/convertor/view_setting_button_download_ffmpeg_anyos.go b/convertor/view_setting_button_download_ffmpeg_anyos.go deleted file mode 100644 index 794fd91..0000000 --- a/convertor/view_setting_button_download_ffmpeg_anyos.go +++ /dev/null @@ -1,17 +0,0 @@ -//go:build !windows && !linux -// +build !windows,!linux - -package convertor - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/widget" -) - -func (v View) blockDownloadFFmpeg( - donwloadFFmpeg func(progressBar *widget.ProgressBar, progressMessage *canvas.Text) error, -) *fyne.Container { - return container.NewVBox() -} diff --git a/convertor/view_setting_button_download_ffmpeg_linux.go b/convertor/view_setting_button_download_ffmpeg_linux.go deleted file mode 100644 index d08900c..0000000 --- a/convertor/view_setting_button_download_ffmpeg_linux.go +++ /dev/null @@ -1,61 +0,0 @@ -//go:build linux -// +build linux - -package convertor - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/widget" - "golang.org/x/image/colornames" - "image/color" -) - -func (v View) blockDownloadFFmpeg( - donwloadFFmpeg func(progressBar *widget.ProgressBar, progressMessage *canvas.Text) error, -) *fyne.Container { - - errorDownloadFFmpegMessage := canvas.NewText("", color.RGBA{R: 255, G: 0, B: 0, A: 255}) - errorDownloadFFmpegMessage.TextSize = 16 - errorDownloadFFmpegMessage.TextStyle = fyne.TextStyle{Bold: true} - - progressDownloadFFmpegMessage := canvas.NewText("", color.RGBA{R: 49, G: 127, B: 114, A: 255}) - progressDownloadFFmpegMessage.TextSize = 16 - progressDownloadFFmpegMessage.TextStyle = fyne.TextStyle{Bold: true} - - progressBar := widget.NewProgressBar() - - var buttonDownloadFFmpeg *widget.Button - - buttonDownloadFFmpeg = widget.NewButton(v.app.GetLocalizerService().GetMessage("download"), func() { - fyne.Do(func() { - buttonDownloadFFmpeg.Disable() - }) - go func() { - err := donwloadFFmpeg(progressBar, progressDownloadFFmpegMessage) - if err != nil { - errorDownloadFFmpegMessage.Text = err.Error() - } - fyne.Do(func() { - buttonDownloadFFmpeg.Enable() - }) - }() - - }) - - downloadFFmpegFromSiteMessage := v.app.GetLocalizerService().GetMessage("downloadFFmpegFromSite") - - return container.NewVBox( - canvas.NewLine(colornames.Darkgreen), - widget.NewCard(v.app.GetLocalizerService().GetMessage("buttonDownloadFFmpeg"), "", container.NewVBox( - widget.NewRichTextFromMarkdown( - downloadFFmpegFromSiteMessage+" [https://github.com/BtbN/FFmpeg-Builds/releases](https://github.com/BtbN/FFmpeg-Builds/releases)", - ), - buttonDownloadFFmpeg, - errorDownloadFFmpegMessage, - progressDownloadFFmpegMessage, - progressBar, - )), - ) -} diff --git a/convertor/view_setting_button_download_ffmpeg_windows.go b/convertor/view_setting_button_download_ffmpeg_windows.go deleted file mode 100644 index b71deef..0000000 --- a/convertor/view_setting_button_download_ffmpeg_windows.go +++ /dev/null @@ -1,61 +0,0 @@ -//go:build windows -// +build windows - -package convertor - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/widget" - "golang.org/x/image/colornames" - "image/color" -) - -func (v View) blockDownloadFFmpeg( - donwloadFFmpeg func(progressBar *widget.ProgressBar, progressMessage *canvas.Text) error, -) *fyne.Container { - - errorDownloadFFmpegMessage := canvas.NewText("", color.RGBA{R: 255, G: 0, B: 0, A: 255}) - errorDownloadFFmpegMessage.TextSize = 16 - errorDownloadFFmpegMessage.TextStyle = fyne.TextStyle{Bold: true} - - progressDownloadFFmpegMessage := canvas.NewText("", color.RGBA{R: 49, G: 127, B: 114, A: 255}) - progressDownloadFFmpegMessage.TextSize = 16 - progressDownloadFFmpegMessage.TextStyle = fyne.TextStyle{Bold: true} - - progressBar := widget.NewProgressBar() - - var buttonDownloadFFmpeg *widget.Button - - buttonDownloadFFmpeg = widget.NewButton(v.app.GetLocalizerService().GetMessage("download"), func() { - - go func() { - fyne.Do(func() { - buttonDownloadFFmpeg.Disable() - }) - err := donwloadFFmpeg(progressBar, progressDownloadFFmpegMessage) - if err != nil { - errorDownloadFFmpegMessage.Text = err.Error() - } - fyne.Do(func() { - buttonDownloadFFmpeg.Enable() - }) - }() - }) - - downloadFFmpegFromSiteMessage := v.app.GetLocalizerService().GetMessage("downloadFFmpegFromSite") - - return container.NewVBox( - canvas.NewLine(colornames.Darkgreen), - widget.NewCard(v.app.GetLocalizerService().GetMessage("buttonDownloadFFmpeg"), "", container.NewVBox( - widget.NewRichTextFromMarkdown( - downloadFFmpegFromSiteMessage+" [https://github.com/BtbN/FFmpeg-Builds/releases](https://github.com/BtbN/FFmpeg-Builds/releases)", - ), - buttonDownloadFFmpeg, - errorDownloadFFmpegMessage, - progressDownloadFFmpegMessage, - progressBar, - )), - ) -} diff --git a/encoder/apng/encoder.go b/encoder/apng/encoder.go deleted file mode 100644 index c43b48a..0000000 --- a/encoder/apng/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package apng - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "apng"} - } - - return encoder2.NewEncoder("apng", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "apng" - formats := []string{"apng"} - fileType := encoder2.FileType(encoder2.Image) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/bmp/encoder.go b/encoder/bmp/encoder.go deleted file mode 100644 index f72a6d9..0000000 --- a/encoder/bmp/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package bmp - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "bmp"} - } - - return encoder2.NewEncoder("bmp", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "bmp" - formats := []string{"bmp"} - fileType := encoder2.FileType(encoder2.Image) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/encoder.go b/encoder/encoder.go deleted file mode 100644 index 7aedf47..0000000 --- a/encoder/encoder.go +++ /dev/null @@ -1,169 +0,0 @@ -package encoder - -import "errors" - -type EncoderContract interface { - GetName() string - GetParams() []string - GetParameter(name string) (ParameterContract, error) -} - -type ParameterContract interface { - GetName() string - Set(string) error - Get() string - IsEnabled() bool - SetEnable() - SetDisable() -} - -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), - } -} - -type Encoder struct { - name string - parameters map[string]ParameterContract - getParams func(parameters map[string]ParameterContract) []string -} - -func NewEncoder(name string, parameters map[string]ParameterContract, getParams func(parameters map[string]ParameterContract) []string) *Encoder { - return &Encoder{ - name: name, - parameters: parameters, - getParams: getParams, - } -} - -func (e *Encoder) GetName() string { - return e.name -} - -func (e *Encoder) GetParams() []string { - return e.getParams(e.parameters) -} - -func (e *Encoder) GetParameter(name string) (ParameterContract, error) { - if e.parameters[name] == nil { - return nil, errors.New("parameter not found") - } - - return e.parameters[name], nil -} - -type Parameter struct { - name string - isEnabled bool - parameter string - setParameter func(string) (string, error) -} - -func NewParameter(name string, isEnabled bool, defaultParameter string, setParameter func(string) (string, error)) *Parameter { - return &Parameter{ - name: name, - isEnabled: isEnabled, - parameter: defaultParameter, - setParameter: setParameter, - } -} - -func (p *Parameter) GetName() string { - return p.name -} - -func (p *Parameter) Set(s string) (err error) { - if p.setParameter != nil { - s, err = p.setParameter(s) - if err != nil { - return err - } - } - p.parameter = s - return nil -} - -func (p *Parameter) Get() string { - return p.parameter -} - -func (p *Parameter) IsEnabled() bool { - return p.isEnabled -} - -func (p *Parameter) SetEnable() { - p.isEnabled = true -} - -func (p *Parameter) SetDisable() { - p.isEnabled = false -} diff --git a/encoder/flv/encoder.go b/encoder/flv/encoder.go deleted file mode 100644 index 7c2c8e4..0000000 --- a/encoder/flv/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package flv - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "flv"} - } - - return encoder2.NewEncoder("flv", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "flv" - formats := []string{"flv"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/gif/encoder.go b/encoder/gif/encoder.go deleted file mode 100644 index d138ae1..0000000 --- a/encoder/gif/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package gif - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "gif"} - } - - return encoder2.NewEncoder("gif", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "gif" - formats := []string{"gif"} - fileType := encoder2.FileType(encoder2.Image) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/h264_nvenc/encoder.go b/encoder/h264_nvenc/encoder.go deleted file mode 100644 index b064975..0000000 --- a/encoder/h264_nvenc/encoder.go +++ /dev/null @@ -1,58 +0,0 @@ -package h264_nvenc - -import ( - "errors" - encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" -) - -var Presets = []string{ - "default", - "slow", - "medium", - "fast", - "hp", - "hq", - "bd", - "ll", - "llhq", - "llhp", - "lossless", - "losslesshp", -} - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{ - "preset": newParameterPreset(), - } - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - params := []string{"-c:v", "h264_nvenc"} - - if parameters["preset"] != nil && parameters["preset"].IsEnabled() { - params = append(params, "-preset", parameters["preset"].Get()) - } - - return params - } - - return encoder2.NewEncoder("h264_nvenc", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "h264_nvenc" - formats := []string{"mp4"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} - -func newParameterPreset() encoder2.ParameterContract { - setParameter := func(s string) (string, error) { - for _, value := range Presets { - if value == s { - return value, nil - } - } - - return "", errors.New("preset not found") - } - return encoder2.NewParameter("preset", false, "default", setParameter) -} diff --git a/encoder/libmp3lame/encoder.go b/encoder/libmp3lame/encoder.go deleted file mode 100644 index 33c2f1a..0000000 --- a/encoder/libmp3lame/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package libmp3lame - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:a", "libmp3lame"} - } - - return encoder2.NewEncoder("libmp3lame", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "libmp3lame" - formats := []string{"mp3"} - fileType := encoder2.FileType(encoder2.Audio) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/libshine/encoder.go b/encoder/libshine/encoder.go deleted file mode 100644 index d7859b4..0000000 --- a/encoder/libshine/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package libshine - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:a", "libshine"} - } - - return encoder2.NewEncoder("libshine", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "libshine" - formats := []string{"mp3"} - fileType := encoder2.FileType(encoder2.Audio) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/libtwolame/encoder.go b/encoder/libtwolame/encoder.go deleted file mode 100644 index 87f5ba4..0000000 --- a/encoder/libtwolame/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package libtwolame - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:a", "libtwolame"} - } - - return encoder2.NewEncoder("libtwolame", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "libtwolame" - formats := []string{"mp2"} - fileType := encoder2.FileType(encoder2.Audio) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/libvpx/encoder.go b/encoder/libvpx/encoder.go deleted file mode 100644 index 86ab780..0000000 --- a/encoder/libvpx/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package libvpx - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "libvpx"} - } - - return encoder2.NewEncoder("libvpx", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "libvpx" - formats := []string{"webm", "mkv"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/libvpx_vp9/encoder.go b/encoder/libvpx_vp9/encoder.go deleted file mode 100644 index 00cecc3..0000000 --- a/encoder/libvpx_vp9/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package libvpx_vp9 - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "libvpx-vp9"} - } - - return encoder2.NewEncoder("libvpx_vp9", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "libvpx-vp9" - formats := []string{"webm", "mkv"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/libwebp/encoder.go b/encoder/libwebp/encoder.go deleted file mode 100644 index b324503..0000000 --- a/encoder/libwebp/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package libwebp - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "libwebp"} - } - - return encoder2.NewEncoder("libwebp", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "libwebp" - formats := []string{"webp"} - fileType := encoder2.FileType(encoder2.Image) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/libwebp_anim/encoder.go b/encoder/libwebp_anim/encoder.go deleted file mode 100644 index 0a6fcc5..0000000 --- a/encoder/libwebp_anim/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package libwebp_anim - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "libwebp_anim"} - } - - return encoder2.NewEncoder("libwebp_anim", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "libwebp_anim" - formats := []string{"webp"} - fileType := encoder2.FileType(encoder2.Image) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/libx264/encoder.go b/encoder/libx264/encoder.go deleted file mode 100644 index 5543570..0000000 --- a/encoder/libx264/encoder.go +++ /dev/null @@ -1,56 +0,0 @@ -package libx264 - -import ( - "errors" - encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" -) - -var Presets = []string{ - "ultrafast", - "superfast", - "veryfast", - "faster", - "fast", - "medium", - "slow", - "slower", - "veryslow", - "placebo", -} - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{ - "preset": newParameterPreset(), - } - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - params := []string{"-c:v", "libx264"} - - if parameters["preset"] != nil && parameters["preset"].IsEnabled() { - params = append(params, "-preset", parameters["preset"].Get()) - } - - return params - } - - return encoder2.NewEncoder("libx264", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "libx264" - formats := []string{"mp4"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} - -func newParameterPreset() encoder2.ParameterContract { - setParameter := func(s string) (string, error) { - for _, value := range Presets { - if value == s { - return value, nil - } - } - - return "", errors.New("preset not found") - } - return encoder2.NewParameter("preset", false, "medium", setParameter) -} diff --git a/encoder/libx265/encoder.go b/encoder/libx265/encoder.go deleted file mode 100644 index 1d4a1f3..0000000 --- a/encoder/libx265/encoder.go +++ /dev/null @@ -1,56 +0,0 @@ -package libx265 - -import ( - "errors" - encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" -) - -var Presets = []string{ - "ultrafast", - "superfast", - "veryfast", - "faster", - "fast", - "medium", - "slow", - "slower", - "veryslow", - "placebo", -} - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{ - "preset": newParameterPreset(), - } - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - params := []string{"-c:v", "libx265"} - - if parameters["preset"] != nil && parameters["preset"].IsEnabled() { - params = append(params, "-preset", parameters["preset"].Get()) - } - - return params - } - - return encoder2.NewEncoder("libx265", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "libx265" - formats := []string{"mp4"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} - -func newParameterPreset() encoder2.ParameterContract { - setParameter := func(s string) (string, error) { - for _, value := range Presets { - if value == s { - return value, nil - } - } - - return "", errors.New("preset not found") - } - return encoder2.NewParameter("preset", false, "medium", setParameter) -} diff --git a/encoder/libxvid/encoder.go b/encoder/libxvid/encoder.go deleted file mode 100644 index fca496a..0000000 --- a/encoder/libxvid/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package libxvid - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "libxvid"} - } - - return encoder2.NewEncoder("libxvid", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "libxvid" - formats := []string{"avi"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/mjpeg/encoder.go b/encoder/mjpeg/encoder.go deleted file mode 100644 index be934e7..0000000 --- a/encoder/mjpeg/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package mjpeg - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "mjpeg"} - } - - return encoder2.NewEncoder("mjpeg", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "mjpeg" - formats := []string{"jpg"} - fileType := encoder2.FileType(encoder2.Image) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/mp2/encoder.go b/encoder/mp2/encoder.go deleted file mode 100644 index 3d1a98e..0000000 --- a/encoder/mp2/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package mp2 - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:a", "mp2"} - } - - return encoder2.NewEncoder("mp2", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "mp2" - formats := []string{"mp2"} - fileType := encoder2.FileType(encoder2.Audio) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/mp2fixed/encoder.go b/encoder/mp2fixed/encoder.go deleted file mode 100644 index c235bee..0000000 --- a/encoder/mp2fixed/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package mp2fixed - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:a", "mp2fixed"} - } - - return encoder2.NewEncoder("mp2fixed", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "mp2fixed" - formats := []string{"mp2"} - fileType := encoder2.FileType(encoder2.Audio) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/mpeg1video/encoder.go b/encoder/mpeg1video/encoder.go deleted file mode 100644 index 11c43e3..0000000 --- a/encoder/mpeg1video/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package mpeg1video - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "mpeg1video"} - } - - return encoder2.NewEncoder("mpeg1video", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "mpeg1video" - formats := []string{"mpg", "mpeg"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/mpeg2video/encoder.go b/encoder/mpeg2video/encoder.go deleted file mode 100644 index 05192ef..0000000 --- a/encoder/mpeg2video/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package mpeg2video - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "mpeg2video"} - } - - return encoder2.NewEncoder("mpeg2video", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "mpeg2video" - formats := []string{"mpg", "mpeg"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/mpeg4/encoder.go b/encoder/mpeg4/encoder.go deleted file mode 100644 index 5943f35..0000000 --- a/encoder/mpeg4/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package mpeg4 - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "mpeg4"} - } - - return encoder2.NewEncoder("mpeg4", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "mpeg4" - formats := []string{"avi"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/msmpeg4/encoder.go b/encoder/msmpeg4/encoder.go deleted file mode 100644 index 246683d..0000000 --- a/encoder/msmpeg4/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package msmpeg4 - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "msmpeg4"} - } - - return encoder2.NewEncoder("msmpeg4", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "msmpeg4" - formats := []string{"avi"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/msmpeg4v2/encoder.go b/encoder/msmpeg4v2/encoder.go deleted file mode 100644 index cc2cd5f..0000000 --- a/encoder/msmpeg4v2/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package msmpeg4v2 - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "msmpeg4v2"} - } - - return encoder2.NewEncoder("msmpeg4v2", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "msmpeg4v2" - formats := []string{"avi"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/msvideo1/encoder.go b/encoder/msvideo1/encoder.go deleted file mode 100644 index e9bd448..0000000 --- a/encoder/msvideo1/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package msvideo1 - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "msvideo1"} - } - - return encoder2.NewEncoder("msvideo1", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "msvideo1" - formats := []string{"avi"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/png/encoder.go b/encoder/png/encoder.go deleted file mode 100644 index 3166e58..0000000 --- a/encoder/png/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package png - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "png"} - } - - return encoder2.NewEncoder("png", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "png" - formats := []string{"png"} - fileType := encoder2.FileType(encoder2.Image) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/qtrle/encoder.go b/encoder/qtrle/encoder.go deleted file mode 100644 index befac18..0000000 --- a/encoder/qtrle/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package qtrle - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "qtrle"} - } - - return encoder2.NewEncoder("qtrle", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "qtrle" - formats := []string{"mov"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/sgi/encoder.go b/encoder/sgi/encoder.go deleted file mode 100644 index b666b9b..0000000 --- a/encoder/sgi/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package sgi - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "sgi"} - } - - return encoder2.NewEncoder("sgi", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "sgi" - formats := []string{"sgi"} - fileType := encoder2.FileType(encoder2.Image) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/tiff/encoder.go b/encoder/tiff/encoder.go deleted file mode 100644 index 788d743..0000000 --- a/encoder/tiff/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package tiff - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "tiff"} - } - - return encoder2.NewEncoder("tiff", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "tiff" - formats := []string{"tiff"} - fileType := encoder2.FileType(encoder2.Image) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/wmav1/encoder.go b/encoder/wmav1/encoder.go deleted file mode 100644 index a2b9239..0000000 --- a/encoder/wmav1/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package wmav1 - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:a", "wmav1"} - } - - return encoder2.NewEncoder("wmav1", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "wmav1" - formats := []string{"wma"} - fileType := encoder2.FileType(encoder2.Audio) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/wmav2/encoder.go b/encoder/wmav2/encoder.go deleted file mode 100644 index 66f490c..0000000 --- a/encoder/wmav2/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package wmav2 - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:a", "wmav2"} - } - - return encoder2.NewEncoder("wmav2", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "wmav2" - formats := []string{"wma"} - fileType := encoder2.FileType(encoder2.Audio) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/wmv1/encoder.go b/encoder/wmv1/encoder.go deleted file mode 100644 index e5cf873..0000000 --- a/encoder/wmv1/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package wmv1 - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "wmv1"} - } - - return encoder2.NewEncoder("wmv1", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "wmv1" - formats := []string{"wmv"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/wmv2/encoder.go b/encoder/wmv2/encoder.go deleted file mode 100644 index 4ca9797..0000000 --- a/encoder/wmv2/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package wmv2 - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "wmv2"} - } - - return encoder2.NewEncoder("wmv2", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "wmv2" - formats := []string{"wmv"} - fileType := encoder2.FileType(encoder2.Video) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/encoder/xbm/encoder.go b/encoder/xbm/encoder.go deleted file mode 100644 index d23f4a8..0000000 --- a/encoder/xbm/encoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package xbm - -import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - -func NewEncoder() encoder2.EncoderContract { - parameters := map[string]encoder2.ParameterContract{} - getParams := func(parameters map[string]encoder2.ParameterContract) []string { - return []string{"-c:v", "xbm"} - } - - return encoder2.NewEncoder("xbm", parameters, getParams) -} - -func NewData() encoder2.EncoderDataContract { - title := "xbm" - formats := []string{"xbm"} - fileType := encoder2.FileType(encoder2.Image) - return encoder2.NewData(title, formats, fileType, NewEncoder) -} diff --git a/error/view.go b/error/view.go deleted file mode 100644 index f2becd4..0000000 --- a/error/view.go +++ /dev/null @@ -1,39 +0,0 @@ -package error - -import ( - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/localizer" -) - -type ViewContract interface { - PanicError(err error) -} - -type View struct { - app kernel.AppContract -} - -func NewView(app kernel.AppContract) *View { - return &View{ - app: app, - } -} - -func (v View) PanicError(err error) { - messageHead := v.app.GetLocalizerService().GetMessage("error") - - v.app.GetWindow().SetContent(container.NewBorder( - container.NewVBox( - widget.NewLabel(messageHead), - widget.NewLabel(err.Error()), - ), - nil, - nil, - nil, - localizer.LanguageSelectionForm(v.app.GetLocalizerService(), func(lang kernel.Lang) { - v.PanicError(err) - }), - )) -} diff --git a/handler/convertor.go b/handler/convertor.go deleted file mode 100644 index 2bc81fe..0000000 --- a/handler/convertor.go +++ /dev/null @@ -1,178 +0,0 @@ -package handler - -import ( - "errors" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor/view" - 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" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/setting" -) - -type ConvertorHandlerContract interface { - MainConvertor() - FfPathSelection() - GetFfmpegVersion() (string, error) - GetFfprobeVersion() (string, error) - GetFfplayVersion() (string, error) -} - -type ConvertorHandler struct { - app kernel.AppContract - convertorView convertor.ViewContract - errorView error2.ViewContract - convertorRepository convertor.RepositoryContract - settingDirectoryForSaving setting.DirectoryForSavingContract - itemsToConvertService kernel.ItemsToConvertContract -} - -func NewConvertorHandler( - app kernel.AppContract, - convertorView convertor.ViewContract, - errorView error2.ViewContract, - convertorRepository convertor.RepositoryContract, - settingDirectoryForSaving setting.DirectoryForSavingContract, - itemsToConvertService kernel.ItemsToConvertContract, -) *ConvertorHandler { - return &ConvertorHandler{ - app: app, - convertorView: convertorView, - errorView: errorView, - convertorRepository: convertorRepository, - settingDirectoryForSaving: settingDirectoryForSaving, - itemsToConvertService: itemsToConvertService, - } -} - -func (h ConvertorHandler) MainConvertor() { - if h.checkingFFPathUtilities() == true { - formats, err := h.app.GetConvertorService().GetSupportFormats() - if err != nil { - h.errorView.PanicError(err) - return - } - conversion := view.NewConversion(h.app, formats, h.runConvert, h.settingDirectoryForSaving, h.itemsToConvertService) - h.convertorView.Main(conversion) - return - } - h.convertorView.SelectFFPath("", "", "", h.saveSettingFFPath, nil, h.downloadFFmpeg) -} - -func (h ConvertorHandler) FfPathSelection() { - ffmpeg := h.convertorRepository.GetPathFfmpeg() - ffprobe := h.convertorRepository.GetPathFfprobe() - ffplay := h.convertorRepository.GetPathFfplay() - h.convertorView.SelectFFPath(ffmpeg, ffprobe, ffplay, h.saveSettingFFPath, h.MainConvertor, h.downloadFFmpeg) -} - -func (h ConvertorHandler) GetFfmpegVersion() (string, error) { - return h.app.GetConvertorService().GetFFmpegVesrion() -} - -func (h ConvertorHandler) GetFfprobeVersion() (string, error) { - return h.app.GetConvertorService().GetFFprobeVersion() -} - -func (h ConvertorHandler) GetFfplayVersion() (string, error) { - return h.app.GetConvertorService().GetFFplayVersion() -} - -func (h ConvertorHandler) runConvert(setting view.HandleConvertSetting) { - h.app.GetWindow().GetLayout().GetRightTabs().SelectFileQueueTab() - - for _, item := range h.itemsToConvertService.GetItems() { - file := item.GetFile() - if file == nil { - continue - } - - h.app.GetQueue().Add(&kernel.ConvertSetting{ - VideoFileInput: *file, - VideoFileOut: kernel.File{ - Path: setting.DirectoryForSave + helper.PathSeparator() + file.Name + "." + setting.Format, - Name: file.Name, - Ext: "." + setting.Format, - }, - OverwriteOutputFiles: setting.OverwriteOutputFiles, - Encoder: setting.Encoder, - }) - } - h.itemsToConvertService.AfterAddingQueue() -} - -func (h ConvertorHandler) checkingFFPathUtilities() bool { - if h.checkingFFPath() == true { - return true - } - - pathsToFF := getPathsToFF() - for _, item := range pathsToFF { - ffmpegChecking, _ := h.app.GetConvertorService().ChangeFFmpegPath(item.FFmpeg) - if ffmpegChecking == false { - continue - } - ffprobeChecking, _ := h.app.GetConvertorService().ChangeFFprobePath(item.FFprobe) - if ffprobeChecking == false { - continue - } - - ffplayChecking, _ := h.app.GetConvertorService().ChangeFFplayPath(item.FFplay) - if ffplayChecking == false { - continue - } - _ = h.convertorRepository.SavePathFfmpeg(item.FFmpeg) - _ = h.convertorRepository.SavePathFfprobe(item.FFprobe) - _ = h.convertorRepository.SavePathFfplay(item.FFplay) - return true - } - - return false -} - -func (h ConvertorHandler) saveSettingFFPath(ffmpegPath string, ffprobePath string, ffplayPath string) error { - ffmpegChecking, _ := h.app.GetConvertorService().ChangeFFmpegPath(ffmpegPath) - if ffmpegChecking == false { - errorText := h.app.GetLocalizerService().GetMessage("errorFFmpeg") - return errors.New(errorText) - } - - ffprobeChecking, _ := h.app.GetConvertorService().ChangeFFprobePath(ffprobePath) - if ffprobeChecking == false { - errorText := h.app.GetLocalizerService().GetMessage("errorFFprobe") - return errors.New(errorText) - } - - ffplayChecking, _ := h.app.GetConvertorService().ChangeFFplayPath(ffplayPath) - if ffplayChecking == false { - errorText := h.app.GetLocalizerService().GetMessage("errorFFplay") - return errors.New(errorText) - } - - _ = h.convertorRepository.SavePathFfmpeg(ffmpegPath) - _ = h.convertorRepository.SavePathFfprobe(ffprobePath) - _ = h.convertorRepository.SavePathFfplay(ffplayPath) - - h.MainConvertor() - - return nil -} - -func (h ConvertorHandler) checkingFFPath() bool { - _, err := h.app.GetConvertorService().GetFFmpegVesrion() - if err != nil { - return false - } - - _, err = h.app.GetConvertorService().GetFFprobeVersion() - if err != nil { - return false - } - - _, err = h.app.GetConvertorService().GetFFplayVersion() - if err != nil { - return false - } - - return true -} diff --git a/handler/convertor_anyos.go b/handler/convertor_anyos.go deleted file mode 100644 index 76daa45..0000000 --- a/handler/convertor_anyos.go +++ /dev/null @@ -1,18 +0,0 @@ -//go:build !windows && !linux -// +build !windows,!linux - -package handler - -import ( - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" -) - -func getPathsToFF() []kernel.FFPathUtilities { - return []kernel.FFPathUtilities{{FFmpeg: "ffmpeg/bin/ffmpeg", FFprobe: "ffmpeg/bin/ffprobe", FFplay: "ffmpeg/bin/ffplay"}, {FFmpeg: "ffmpeg", FFprobe: "ffprobe", FFplay: "ffplay"}} -} - -func (h ConvertorHandler) downloadFFmpeg(progressBar *widget.ProgressBar, progressMessage *canvas.Text) (err error) { - return nil -} diff --git a/handler/convertor_linux.go b/handler/convertor_linux.go deleted file mode 100644 index 1c87a3c..0000000 --- a/handler/convertor_linux.go +++ /dev/null @@ -1,231 +0,0 @@ -//go:build linux -// +build linux - -package handler - -import ( - "archive/tar" - "errors" - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "github.com/ulikunitz/xz" - "io" - "net/http" - "os" - "path/filepath" -) - -func getPathsToFF() []kernel.FFPathUtilities { - return []kernel.FFPathUtilities{{FFmpeg: "ffmpeg/bin/ffmpeg", FFprobe: "ffmpeg/bin/ffprobe", FFplay: "ffmpeg/bin/ffplay"}, {FFmpeg: "ffmpeg", FFprobe: "ffprobe", FFplay: "ffplay"}} -} - -func (h ConvertorHandler) downloadFFmpeg(progressBar *widget.ProgressBar, progressMessage *canvas.Text) (err error) { - isDirectoryFFmpeg := isDirectory("ffmpeg") - if isDirectoryFFmpeg == false { - err = os.Mkdir("ffmpeg", 0777) - if err != nil { - return err - } - } - progressMessage.Text = h.app.GetLocalizerService().GetMessage("downloadRun") - fyne.Do(func() { - progressMessage.Refresh() - }) - err = downloadFile("ffmpeg/ffmpeg.tar.xz", "https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linux64-gpl.tar.xz", progressBar) - if err != nil { - return err - } - - progressMessage.Text = h.app.GetLocalizerService().GetMessage("unzipRun") - fyne.Do(func() { - progressMessage.Refresh() - }) - err = unTarXz("ffmpeg/ffmpeg.tar.xz", "ffmpeg", progressBar) - if err != nil { - return err - } - _ = os.Remove("ffmpeg/ffmpeg.tar.xz") - - progressMessage.Text = h.app.GetLocalizerService().GetMessage("testFF") - fyne.Do(func() { - progressMessage.Refresh() - }) - - err = h.saveSettingFFPath( - "ffmpeg/ffmpeg-master-latest-linux64-gpl/bin/ffmpeg", - "ffmpeg/ffmpeg-master-latest-linux64-gpl/bin/ffprobe", - "ffmpeg/ffmpeg-master-latest-linux64-gpl/bin/ffplay", - ) - if err != nil { - return err - } - - progressMessage.Text = h.app.GetLocalizerService().GetMessage("completedQueue") - fyne.Do(func() { - progressMessage.Refresh() - }) - - return nil -} - -func downloadFile(filepath string, url string, progressBar *widget.ProgressBar) (err error) { - progressBar.Value = 0 - progressBar.Max = 100 - - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return err - } - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - f, err := os.OpenFile(filepath, os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - return err - } - defer f.Close() - - buf := make([]byte, 32*1024) - var downloaded int64 - for { - n, err := resp.Body.Read(buf) - if err != nil { - if err == io.EOF { - break - } - return err - } - if n > 0 { - f.Write(buf[:n]) - downloaded += int64(n) - progressBar.Value = float64(downloaded) / float64(resp.ContentLength) * 100 - fyne.Do(func() { - progressBar.Refresh() - }) - } - } - return nil -} - -func unTarXz(fileTar string, directory string, progressBar *widget.ProgressBar) error { - progressBar.Value = 0 - progressBar.Max = 100 - - fyne.Do(func() { - progressBar.Refresh() - }) - - f, err := os.Open(fileTar) - if err != nil { - return err - } - defer f.Close() - - xzReader, err := xz.NewReader(f) - if err != nil { - return err - } - - tarReader := tar.NewReader(xzReader) - - totalFiles := 0 - for { - _, err := tarReader.Next() - if err == io.EOF { - break - } - if err != nil { - return err - } - totalFiles++ - } - - // Rewind back to the beginning of the file to re-process - _, err = f.Seek(0, 0) - if err != nil { - return err - } - - xzReader, err = xz.NewReader(f) - if err != nil { - return err - } - - tarReader = tar.NewReader(xzReader) - - // We count the number of files already unpacked - unpackedFiles := 0 - - for { - header, err := tarReader.Next() - if err == io.EOF { - break - } - if err != nil { - return err - } - - targetPath := filepath.Join(directory, header.Name) - switch header.Typeflag { - case tar.TypeDir: - err := os.MkdirAll(targetPath, 0755) - if err != nil { - return err - } - case tar.TypeReg: - outFile, err := os.Create(targetPath) - if err != nil { - return err - } - defer outFile.Close() - - _, err = io.Copy(outFile, tarReader) - - if err != nil { - return err - } - default: - return errors.New("unsupported file type") - } - - unpackedFiles++ - progressBar.Value = float64(unpackedFiles) / float64(totalFiles) * 100 - fyne.Do(func() { - progressBar.Refresh() - }) - } - - ffmpegPath := filepath.Join(directory, "ffmpeg-master-latest-linux64-gpl", "bin", "ffmpeg") - err = os.Chmod(ffmpegPath, 0755) - if err != nil { - return err - } - - ffprobePath := filepath.Join(directory, "ffmpeg-master-latest-linux64-gpl", "bin", "ffprobe") - err = os.Chmod(ffprobePath, 0755) - if err != nil { - return err - } - - ffplayPath := filepath.Join(directory, "ffmpeg-master-latest-linux64-gpl", "bin", "ffplay") - err = os.Chmod(ffplayPath, 0755) - if err != nil { - return err - } - - return nil -} - -func isDirectory(path string) bool { - fileInfo, err := os.Stat(path) - if err != nil { - return false - } - - return fileInfo.IsDir() -} diff --git a/handler/convertor_windows.go b/handler/convertor_windows.go deleted file mode 100644 index 206aa57..0000000 --- a/handler/convertor_windows.go +++ /dev/null @@ -1,185 +0,0 @@ -//go:build windows -// +build windows - -package handler - -import ( - "archive/zip" - "errors" - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "io" - "net/http" - "os" - "path/filepath" - "strings" -) - -func getPathsToFF() []kernel.FFPathUtilities { - return []kernel.FFPathUtilities{{FFmpeg: "ffmpeg\\bin\\ffmpeg.exe", FFprobe: "ffmpeg\\bin\\ffprobe.exe", FFplay: "ffmpeg\\bin\\ffplay.exe"}} -} - -func (h ConvertorHandler) downloadFFmpeg(progressBar *widget.ProgressBar, progressMessage *canvas.Text) (err error) { - isDirectoryFFmpeg := isDirectory("ffmpeg") - if isDirectoryFFmpeg == false { - err = os.Mkdir("ffmpeg", 0777) - if err != nil { - return err - } - } - progressMessage.Text = h.app.GetLocalizerService().GetMessage("downloadRun") - fyne.Do(func() { - progressMessage.Refresh() - }) - err = downloadFile("ffmpeg/ffmpeg.zip", "https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip", progressBar) - if err != nil { - return err - } - - progressMessage.Text = h.app.GetLocalizerService().GetMessage("unzipRun") - fyne.Do(func() { - progressMessage.Refresh() - }) - err = unZip("ffmpeg/ffmpeg.zip", "ffmpeg", progressBar) - if err != nil { - return err - } - _ = os.Remove("ffmpeg/ffmpeg.zip") - - progressMessage.Text = h.app.GetLocalizerService().GetMessage("testFF") - fyne.Do(func() { - progressMessage.Refresh() - }) - err = h.saveSettingFFPath( - "ffmpeg/ffmpeg-master-latest-win64-gpl/bin/ffmpeg.exe", - "ffmpeg/ffmpeg-master-latest-win64-gpl/bin/ffprobe.exe", - "ffmpeg/ffmpeg-master-latest-win64-gpl/bin/ffplay.exe", - ) - if err != nil { - return err - } - - progressMessage.Text = h.app.GetLocalizerService().GetMessage("completedQueue") - fyne.Do(func() { - progressMessage.Refresh() - }) - - return nil -} - -func downloadFile(filepath string, url string, progressBar *widget.ProgressBar) (err error) { - progressBar.Value = 0 - progressBar.Max = 100 - - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return err - } - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - f, err := os.OpenFile(filepath, os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - return err - } - defer f.Close() - - buf := make([]byte, 32*1024) - var downloaded int64 - for { - n, err := resp.Body.Read(buf) - if err != nil { - if err == io.EOF { - break - } - return err - } - if n > 0 { - f.Write(buf[:n]) - downloaded += int64(n) - progressBar.Value = float64(downloaded) / float64(resp.ContentLength) * 100 - fyne.Do(func() { - progressBar.Refresh() - }) - } - } - return nil -} - -func unZip(fileZip string, directory string, progressBar *widget.ProgressBar) error { - progressBar.Value = 0 - progressBar.Max = 100 - - fyne.Do(func() { - progressBar.Refresh() - }) - - archive, err := zip.OpenReader(fileZip) - if err != nil { - return err - } - defer archive.Close() - - totalBytes := int64(0) - for _, f := range archive.File { - totalBytes += int64(f.UncompressedSize64) - } - - unpackedBytes := int64(0) - - for _, f := range archive.File { - filePath := filepath.Join(directory, f.Name) - - if !strings.HasPrefix(filePath, filepath.Clean(directory)+string(os.PathSeparator)) { - return errors.New("invalid file path") - } - if f.FileInfo().IsDir() { - os.MkdirAll(filePath, os.ModePerm) - continue - } - - if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil { - return err - } - - dstFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) - if err != nil { - return err - } - - fileInArchive, err := f.Open() - if err != nil { - return err - } - - bytesRead, err := io.Copy(dstFile, fileInArchive) - if err != nil { - return err - } - - unpackedBytes += bytesRead - progressBar.Value = float64(unpackedBytes) / float64(totalBytes) * 100 - fyne.Do(func() { - progressBar.Refresh() - }) - - dstFile.Close() - fileInArchive.Close() - } - - return nil -} - -func isDirectory(path string) bool { - fileInfo, err := os.Stat(path) - if err != nil { - return false - } - - return fileInfo.IsDir() -} diff --git a/handler/main.go b/handler/main.go deleted file mode 100644 index 09d4fa8..0000000 --- a/handler/main.go +++ /dev/null @@ -1,32 +0,0 @@ -package handler - -import ( - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" -) - -type MainHandler struct { - app kernel.AppContract - convertorHandler ConvertorHandlerContract - menuHandler MenuHandlerContract -} - -func NewMainHandler( - app kernel.AppContract, - convertorHandler ConvertorHandlerContract, - menuHandler MenuHandlerContract, -) *MainHandler { - return &MainHandler{ - app: app, - convertorHandler: convertorHandler, - menuHandler: menuHandler, - } -} - -func (h MainHandler) Start() { - if h.app.GetLocalizerService().IsStartWithLanguageSelection() { - h.menuHandler.LanguageSelection() - return - } - - h.convertorHandler.MainConvertor() -} diff --git a/handler/menu.go b/handler/menu.go deleted file mode 100644 index 932a0ed..0000000 --- a/handler/menu.go +++ /dev/null @@ -1,143 +0,0 @@ -package handler - -import ( - "fyne.io/fyne/v2" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/localizer" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/menu" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/theme" -) - -type MenuHandlerContract interface { - GetMainMenu() *fyne.MainMenu - LanguageSelection() -} - -type MenuHandler struct { - app kernel.AppContract - convertorHandler ConvertorHandlerContract - menuView menu.ViewContract - menuViewSetting menu.ViewSettingContract - localizerView localizer.ViewContract - themeService theme.ThemeContract -} - -func NewMenuHandler( - app kernel.AppContract, - convertorHandler ConvertorHandlerContract, - menuView menu.ViewContract, - menuViewSetting menu.ViewSettingContract, - localizerView localizer.ViewContract, - themeService theme.ThemeContract, -) *MenuHandler { - return &MenuHandler{ - app: app, - convertorHandler: convertorHandler, - menuView: menuView, - menuViewSetting: menuViewSetting, - localizerView: localizerView, - themeService: themeService, - } -} - -func (h MenuHandler) GetMainMenu() *fyne.MainMenu { - settings := h.getMenuSettings() - help := h.getMenuHelp() - - return fyne.NewMainMenu(settings, help) -} - -func (h MenuHandler) getMenuSettings() *fyne.Menu { - quit := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage("exit"), nil) - quit.IsQuit = true - h.app.GetLocalizerService().AddChangeCallback("exit", func(text string) { - quit.Label = text - }) - - settingsSelection := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage("settings"), h.settingsSelection) - h.app.GetLocalizerService().AddChangeCallback("settings", func(text string) { - settingsSelection.Label = text - }) - - ffPathSelection := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage("changeFFPath"), h.convertorHandler.FfPathSelection) - h.app.GetLocalizerService().AddChangeCallback("changeFFPath", func(text string) { - ffPathSelection.Label = text - }) - - settings := fyne.NewMenu(h.app.GetLocalizerService().GetMessage("settings"), settingsSelection, ffPathSelection, quit) - h.app.GetLocalizerService().AddChangeCallback("settings", func(text string) { - settings.Label = text - settings.Refresh() - }) - - return settings -} - -func (h MenuHandler) getMenuHelp() *fyne.Menu { - about := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage("about"), h.openAbout) - h.app.GetLocalizerService().AddChangeCallback("about", func(text string) { - about.Label = text - }) - - gratitude := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage("gratitude"), h.menuView.Gratitude) - h.app.GetLocalizerService().AddChangeCallback("gratitude", func(text string) { - gratitude.Label = text - }) - - helpFFplay := fyne.NewMenuItem(h.app.GetLocalizerService().GetMessage("helpFFplay"), h.menuView.HelpFFplay) - h.app.GetLocalizerService().AddChangeCallback("helpFFplay", func(text string) { - helpFFplay.Label = text - }) - - help := fyne.NewMenu(h.app.GetLocalizerService().GetMessage("help"), helpFFplay, about, gratitude) - h.app.GetLocalizerService().AddChangeCallback("help", func(text string) { - help.Label = text - help.Refresh() - }) - - return help -} - -func (h MenuHandler) openAbout() { - ffmpeg, err := h.convertorHandler.GetFfmpegVersion() - if err != nil { - ffmpeg = h.app.GetLocalizerService().GetMessage("errorFFmpegVersion") - } - ffprobe, err := h.convertorHandler.GetFfprobeVersion() - if err != nil { - ffprobe = h.app.GetLocalizerService().GetMessage("errorFFprobeVersion") - } - ffplay, err := h.convertorHandler.GetFfplayVersion() - if err != nil { - ffplay = h.app.GetLocalizerService().GetMessage("errorFFplayVersion") - } - - h.menuView.About(ffmpeg, ffprobe, ffplay) -} - -func (h MenuHandler) LanguageSelection() { - h.localizerView.LanguageSelection(func(lang kernel.Lang) { - h.convertorHandler.MainConvertor() - }) -} - -func (h MenuHandler) settingsSelection() { - save := func(setting *menu.SettingForm) error { - err := h.app.GetLocalizerService().SetCurrentLanguage(setting.Language, true) - if err != nil { - return err - } - - err = h.themeService.SetCurrentTheme(setting.ThemeInfo) - if err != nil { - return err - } - - h.convertorHandler.MainConvertor() - return nil - } - cancel := func() { - h.convertorHandler.MainConvertor() - } - h.menuViewSetting.Main(save, cancel) -} diff --git a/helper/helper.go b/helper/helper.go deleted file mode 100644 index 682704c..0000000 --- a/helper/helper.go +++ /dev/null @@ -1,11 +0,0 @@ -package helper - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/dialog" -) - -func FileDialogResize(fileDialog *dialog.FileDialog, w fyne.Window) { - contentSize := w.Content().Size() - fileDialog.Resize(fyne.Size{Width: contentSize.Width - 50, Height: contentSize.Height - 50}) -} diff --git a/helper/path_separator.go b/helper/path_separator.go deleted file mode 100644 index 905b935..0000000 --- a/helper/path_separator.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build !windows -// +build !windows - -package helper - -func PathSeparator() string { - return "/" -} diff --git a/helper/path_separator_window.go b/helper/path_separator_window.go deleted file mode 100644 index 433e550..0000000 --- a/helper/path_separator_window.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build windows -// +build windows - -package helper - -func PathSeparator() string { - return "\\" -} diff --git a/helper/prepare_background_command.go b/helper/prepare_background_command.go deleted file mode 100644 index f8aab96..0000000 --- a/helper/prepare_background_command.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build !windows -// +build !windows - -package helper - -import ( - "os/exec" -) - -func PrepareBackgroundCommand(cmd *exec.Cmd) { - -} diff --git a/helper/prepare_background_command_windows.go b/helper/prepare_background_command_windows.go deleted file mode 100644 index 3e3ebbc..0000000 --- a/helper/prepare_background_command_windows.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build windows -// +build windows - -package helper - -import ( - "os/exec" - "syscall" -) - -func PrepareBackgroundCommand(cmd *exec.Cmd) { - cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} -} diff --git a/kernel/app.go b/kernel/app.go deleted file mode 100644 index 242ea8c..0000000 --- a/kernel/app.go +++ /dev/null @@ -1,132 +0,0 @@ -package kernel - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/app" - "time" -) - -type AppContract interface { - GetAppFyne() fyne.App - GetWindow() WindowContract - GetQueue() QueueListContract - GetLocalizerService() LocalizerContract - GetConvertorService() ConvertorContract - GetFFplayService() FFplayContract - AfterClosing() - RunConvertor() -} - -type App struct { - AppFyne fyne.App - Window WindowContract - Queue QueueListContract - - localizerService LocalizerContract - convertorService ConvertorContract - blockProgressbarService BlockProgressbarContract - ffplayService FFplayContract -} - -func NewApp( - metadata *fyne.AppMetadata, - queue QueueListContract, - ffplayService FFplayContract, - convertorService ConvertorContract, -) *App { - app.SetMetadata(*metadata) - a := app.New() - - localizerService, err := newLocalizer(a) - if err != nil { - panicErrorLang(a, err) - return nil - } - - statusesText := GetBlockProgressbarStatusesText(localizerService) - blockProgressbarService := NewBlockProgressbar(statusesText, ffplayService) - rightTabsService := NewRightTabs(localizerService) - queueLayoutObject := NewQueueLayoutObject(queue, localizerService, ffplayService, rightTabsService, blockProgressbarService.GetContainer()) - - return &App{ - AppFyne: a, - Window: newWindow(a.NewWindow("GUI for FFmpeg"), NewLayout(queueLayoutObject, localizerService, rightTabsService)), - Queue: queue, - - localizerService: localizerService, - convertorService: convertorService, - blockProgressbarService: blockProgressbarService, - ffplayService: ffplayService, - } -} - -func (a App) GetAppFyne() fyne.App { - return a.AppFyne -} - -func (a App) GetQueue() QueueListContract { - return a.Queue -} - -func (a App) GetWindow() WindowContract { - return a.Window -} - -func (a App) GetLocalizerService() LocalizerContract { - return a.localizerService -} - -func (a App) GetConvertorService() ConvertorContract { - return a.convertorService -} - -func (a App) GetFFplayService() FFplayContract { - return a.ffplayService -} - -func (a App) AfterClosing() { - for _, cmd := range a.convertorService.GetRunningProcesses() { - _ = cmd.Process.Kill() - } -} - -func (a App) RunConvertor() { - go func() { - for { - time.Sleep(time.Millisecond * 3000) - queueId, queue := a.Queue.Next() - if queue == nil { - continue - } - queue.Status = StatusType(InProgress) - a.Window.GetLayout().ChangeQueueStatus(queueId, queue) - if a.blockProgressbarService.GetContainer().Hidden { - a.blockProgressbarService.GetContainer().Show() - } - - totalDuration, err := a.convertorService.GetTotalDuration(&queue.Setting.VideoFileInput) - if err != nil { - totalDuration = 0 - } - - progress := a.blockProgressbarService.GetProgressbar( - totalDuration, - queue.Setting.VideoFileInput.Path, - a.localizerService, - ) - - err = a.convertorService.RunConvert(*queue.Setting, progress) - if err != nil { - queue.Status = StatusType(Error) - queue.Error = err - a.Window.GetLayout().ChangeQueueStatus(queueId, queue) - a.blockProgressbarService.ProcessEndedWithError(err.Error()) - - continue - } - queue.Status = StatusType(Completed) - a.Window.GetLayout().ChangeQueueStatus(queueId, queue) - a.blockProgressbarService.ProcessEndedWithSuccess(queue.Setting.VideoFileOut.Path) - } - }() -} diff --git a/kernel/convertor.go b/kernel/convertor.go deleted file mode 100644 index 179cff3..0000000 --- a/kernel/convertor.go +++ /dev/null @@ -1,290 +0,0 @@ -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" - "strconv" - "strings" - "unicode" -) - -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) - GetFFmpegVesrion() (string, error) - GetFFprobeVersion() (string, error) - GetFFplayVersion() (string, error) - ChangeFFmpegPath(path string) (bool, error) - ChangeFFprobePath(path string) (bool, error) - ChangeFFplayPath(path string) (bool, error) - GetRunningProcesses() map[int]*exec.Cmd - GetSupportFormats() (encoder.ConvertorFormatsContract, error) -} - -type ProgressContract interface { - GetProtocole() string - Run(stdOut io.ReadCloser, stdErr io.ReadCloser) error -} - -type FFPathUtilities struct { - FFmpeg string - FFprobe string - FFplay string -} - -type runningProcesses struct { - items map[int]*exec.Cmd - numberOfStarts int -} - -type Convertor struct { - ffPathUtilities *FFPathUtilities - runningProcesses runningProcesses -} - -type ConvertData struct { - totalDuration float64 -} - -func NewService(ffPathUtilities *FFPathUtilities) *Convertor { - return &Convertor{ - ffPathUtilities: ffPathUtilities, - runningProcesses: runningProcesses{items: map[int]*exec.Cmd{}, numberOfStarts: 0}, - } -} - -func (s Convertor) RunConvert(setting ConvertSetting, progress ProgressContract) error { - overwriteOutputFiles := "-n" - if setting.OverwriteOutputFiles == true { - overwriteOutputFiles = "-y" - } - 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) - - stdOut, err := cmd.StdoutPipe() - if err != nil { - return err - } - stdErr, err := cmd.StderrPipe() - if err != nil { - return err - } - - err = cmd.Start() - if err != nil { - return err - } - index := s.runningProcesses.numberOfStarts - s.runningProcesses.numberOfStarts++ - s.runningProcesses.items[index] = cmd - - errProgress := progress.Run(stdOut, stdErr) - - err = cmd.Wait() - delete(s.runningProcesses.items, index) - if errProgress != nil { - return errProgress - } - if err != nil { - return err - } - - return nil -} - -func (s Convertor) GetTotalDuration(file *File) (duration float64, err error) { - args := []string{"-v", "error", "-select_streams", "v: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 s.getAlternativeTotalDuration(file) - } - - duration, err = strconv.ParseFloat(frames, 64) - if err != nil { - // fix .mts duration - return strconv.ParseFloat(getFirstDigits(frames), 64) - } - return duration, err -} - -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) { - cmd := exec.Command(s.ffPathUtilities.FFmpeg, "-version") - helper.PrepareBackgroundCommand(cmd) - out, err := cmd.CombinedOutput() - if err != nil { - return "", err - } - text := regexp.MustCompile("\r?\n").Split(strings.TrimSpace(string(out)), -1) - return text[0], nil -} - -func (s Convertor) GetFFprobeVersion() (string, error) { - cmd := exec.Command(s.ffPathUtilities.FFprobe, "-version") - helper.PrepareBackgroundCommand(cmd) - out, err := cmd.CombinedOutput() - if err != nil { - return "", err - } - text := regexp.MustCompile("\r?\n").Split(strings.TrimSpace(string(out)), -1) - return text[0], nil -} - -func (s Convertor) GetFFplayVersion() (string, error) { - cmd := exec.Command(s.ffPathUtilities.FFplay, "-version") - helper.PrepareBackgroundCommand(cmd) - out, err := cmd.CombinedOutput() - if err != nil { - return "", err - } - text := regexp.MustCompile("\r?\n").Split(strings.TrimSpace(string(out)), -1) - return text[0], nil -} - -func (s Convertor) ChangeFFmpegPath(path string) (bool, error) { - cmd := exec.Command(path, "-version") - helper.PrepareBackgroundCommand(cmd) - out, err := cmd.CombinedOutput() - if err != nil { - return false, err - } - if strings.Contains(strings.TrimSpace(string(out)), "ffmpeg") == false { - return false, nil - } - s.ffPathUtilities.FFmpeg = path - return true, nil -} - -func (s Convertor) ChangeFFprobePath(path string) (bool, error) { - cmd := exec.Command(path, "-version") - helper.PrepareBackgroundCommand(cmd) - out, err := cmd.CombinedOutput() - if err != nil { - return false, err - } - if strings.Contains(strings.TrimSpace(string(out)), "ffprobe") == false { - return false, nil - } - s.ffPathUtilities.FFprobe = path - return true, nil -} - -func (s Convertor) ChangeFFplayPath(path string) (bool, error) { - cmd := exec.Command(path, "-version") - helper.PrepareBackgroundCommand(cmd) - out, err := cmd.CombinedOutput() - if err != nil { - return false, err - } - if strings.Contains(strings.TrimSpace(string(out)), "ffplay") == false { - return false, nil - } - s.ffPathUtilities.FFplay = path - 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 -} - -func getFirstDigits(s string) string { - result := "" - for _, r := range s { - if unicode.IsDigit(r) { - result += string(r) - } else { - break - } - } - return result -} diff --git a/kernel/encoder/encoder.go b/kernel/encoder/encoder.go deleted file mode 100644 index db4e25f..0000000 --- a/kernel/encoder/encoder.go +++ /dev/null @@ -1,84 +0,0 @@ -package encoder - -import ( - "errors" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" -) - -type ConvertorFormatContract interface { - GetTitle() string - AddEncoder(encoder encoder.EncoderDataContract) - GetFileType() encoder.FileTypeContract - GetEncoders() map[int]encoder.EncoderDataContract -} - -type ConvertorFormat struct { - title string - fileType encoder.FileTypeContract - encoders map[int]encoder.EncoderDataContract -} - -func NewConvertorFormat(title string, fileType encoder.FileTypeContract) *ConvertorFormat { - return &ConvertorFormat{ - title: title, - fileType: fileType, - encoders: map[int]encoder.EncoderDataContract{}, - } -} - -func (f ConvertorFormat) GetTitle() string { - return f.title -} - -func (f ConvertorFormat) AddEncoder(encoder encoder.EncoderDataContract) { - f.encoders[len(f.encoders)] = encoder -} - -func (f ConvertorFormat) GetEncoders() map[int]encoder.EncoderDataContract { - return f.encoders -} - -func (f ConvertorFormat) GetFileType() encoder.FileTypeContract { - return f.fileType -} - -type ConvertorFormatsContract interface { - NewEncoder(encoderName string) bool - GetFormats() map[string]ConvertorFormatContract - GetFormat(format string) (ConvertorFormatContract, error) -} - -type ConvertorFormats struct { - formats map[string]ConvertorFormatContract -} - -func NewConvertorFormats() *ConvertorFormats { - return &ConvertorFormats{ - formats: map[string]ConvertorFormatContract{}, - } -} - -func (f ConvertorFormats) NewEncoder(encoderName string) bool { - if supportEncoders[encoderName] == nil { - return false - } - data := supportEncoders[encoderName]() - for _, format := range data.GetFormats() { - if f.formats[format] == nil { - f.formats[format] = NewConvertorFormat(format, data.GetFileType()) - } - f.formats[format].AddEncoder(data) - } - return true -} - -func (f ConvertorFormats) GetFormats() map[string]ConvertorFormatContract { - return f.formats -} - -func (f ConvertorFormats) GetFormat(format string) (ConvertorFormatContract, error) { - if f.formats[format] == nil { - return ConvertorFormat{}, errors.New("not found ConvertorFormat") - } - return f.formats[format], nil -} diff --git a/kernel/encoder/encoders.go b/kernel/encoder/encoders.go deleted file mode 100644 index d9330f4..0000000 --- a/kernel/encoder/encoders.go +++ /dev/null @@ -1,74 +0,0 @@ -package encoder - -import ( - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/apng" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/bmp" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/flv" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/gif" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/h264_nvenc" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libmp3lame" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libshine" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libtwolame" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libvpx" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libvpx_vp9" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libwebp" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libwebp_anim" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libx264" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libx265" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/libxvid" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/mjpeg" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/mp2" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/mp2fixed" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/mpeg1video" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/mpeg2video" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/mpeg4" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/msmpeg4" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/msmpeg4v2" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/msvideo1" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/png" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/qtrle" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/sgi" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/tiff" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/wmav1" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/wmav2" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/wmv1" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/wmv2" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder/xbm" -) - -var supportEncoders = map[string]func() encoder.EncoderDataContract{ - "libx264": libx264.NewData, - "h264_nvenc": h264_nvenc.NewData, - "libx265": libx265.NewData, - "png": png.NewData, - "gif": gif.NewData, - "flv": flv.NewData, - "apng": apng.NewData, - "bmp": bmp.NewData, - "mjpeg": mjpeg.NewData, - "mpeg1video": mpeg1video.NewData, - "mpeg2video": mpeg2video.NewData, - "mpeg4": mpeg4.NewData, - "libxvid": libxvid.NewData, - "msmpeg4v2": msmpeg4v2.NewData, - "msmpeg4": msmpeg4.NewData, - "msvideo1": msvideo1.NewData, - "qtrle": qtrle.NewData, - "tiff": tiff.NewData, - "sgi": sgi.NewData, - "libvpx": libvpx.NewData, - "libvpx-vp9": libvpx_vp9.NewData, - "libwebp_anim": libwebp_anim.NewData, - "libwebp": libwebp.NewData, - "wmv1": wmv1.NewData, - "wmv2": wmv2.NewData, - "xbm": xbm.NewData, - "mp2": mp2.NewData, - "mp2fixed": mp2fixed.NewData, - "libtwolame": libtwolame.NewData, - "libmp3lame": libmp3lame.NewData, - "libshine": libshine.NewData, - "wmav1": wmav1.NewData, - "wmav2": wmav2.NewData, -} diff --git a/kernel/error.go b/kernel/error.go deleted file mode 100644 index cd26e13..0000000 --- a/kernel/error.go +++ /dev/null @@ -1,17 +0,0 @@ -package kernel - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/widget" -) - -func panicErrorLang(a fyne.App, err error) { - window := a.NewWindow("GUI for FFmpeg") - window.SetContent(container.NewVBox( - widget.NewLabel("Произошла ошибка!"), - widget.NewLabel("произошла ошибка при получении языковых переводах. \n\r"+err.Error()), - )) - window.ShowAndRun() - panic(err.Error()) -} diff --git a/kernel/ffplay.go b/kernel/ffplay.go deleted file mode 100644 index 0b5538f..0000000 --- a/kernel/ffplay.go +++ /dev/null @@ -1,28 +0,0 @@ -package kernel - -import ( - "os/exec" -) - -type FFplay struct { - ffPathUtilities *FFPathUtilities -} - -type FFplaySetting struct { - PathToFile string -} - -type FFplayContract interface { - Run(setting FFplaySetting) error -} - -func NewFFplay(ffPathUtilities *FFPathUtilities) *FFplay { - return &FFplay{ffPathUtilities: ffPathUtilities} -} - -func (ffplay FFplay) Run(setting FFplaySetting) error { - args := []string{setting.PathToFile} - cmd := exec.Command(ffplay.ffPathUtilities.FFplay, args...) - - return cmd.Start() -} diff --git a/kernel/items_to_convert.go b/kernel/items_to_convert.go deleted file mode 100644 index 093540c..0000000 --- a/kernel/items_to_convert.go +++ /dev/null @@ -1,152 +0,0 @@ -package kernel - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/theme" - "fyne.io/fyne/v2/widget" -) - -type ItemsToConvertContract interface { - Add(file *File) - GetItems() map[int]ItemToConvertContract - AfterAddingQueue() -} - -type ItemsToConvert struct { - nextId int - items map[int]ItemToConvertContract - itemsContainer *fyne.Container - ffplayService FFplayContract - isAutoRemove bool -} - -func NewItemsToConvert(itemsContainer *fyne.Container, ffplayService FFplayContract, localizerService LocalizerContract) *ItemsToConvert { - containerForItems := container.NewVBox() - ItemsToConvert := &ItemsToConvert{ - nextId: 0, - items: map[int]ItemToConvertContract{}, - itemsContainer: containerForItems, - ffplayService: ffplayService, - isAutoRemove: true, - } - - line := canvas.NewLine(theme.Color(theme.ColorNameFocus)) - line.StrokeWidth = 5 - checkboxAutoRemove := widget.NewCheck( - localizerService.GetMessage("autoClearAfterAddingToQueue"), - func(checked bool) { - ItemsToConvert.isAutoRemove = checked - }, - ) - checkboxAutoRemove.SetChecked(ItemsToConvert.isAutoRemove) - localizerService.AddChangeCallback("autoClearAfterAddingToQueue", func(text string) { - checkboxAutoRemove.Text = text - }) - - buttonClear := widget.NewButton( - localizerService.GetMessage("clearAll"), - func() { - ItemsToConvert.clear() - }, - ) - buttonClear.Importance = widget.DangerImportance - localizerService.AddChangeCallback("clearAll", func(text string) { - buttonClear.Text = text - }) - - itemsContainer.Add(container.NewVBox( - container.NewPadded(), - container.NewBorder(nil, nil, nil, buttonClear, container.NewHScroll(checkboxAutoRemove)), - container.NewPadded(), - line, - container.NewPadded(), - containerForItems, - )) - - return ItemsToConvert -} - -func (items *ItemsToConvert) Add(file *File) { - nextId := items.nextId - var content *fyne.Container - var buttonPlay *widget.Button - - buttonPlay = widget.NewButtonWithIcon("", theme.Icon(theme.IconNameMediaPlay), func() { - buttonPlay.Disable() - go func() { - _ = items.ffplayService.Run(FFplaySetting{ - PathToFile: file.Path, - }) - fyne.Do(func() { - buttonPlay.Enable() - }) - }() - }) - - buttonRemove := widget.NewButtonWithIcon("", theme.Icon(theme.IconNameDelete), func() { - items.itemsContainer.Remove(content) - items.itemsContainer.Refresh() - delete(items.items, nextId) - }) - buttonRemove.Importance = widget.DangerImportance - - content = container.NewVBox( - container.NewBorder( - nil, - nil, - buttonPlay, - buttonRemove, - container.NewHScroll(widget.NewLabel(file.Name)), - ), - container.NewHScroll(widget.NewLabel(file.Path)), - container.NewPadded(), - canvas.NewLine(theme.Color(theme.ColorNameFocus)), - container.NewPadded(), - ) - - items.itemsContainer.Add(content) - items.items[nextId] = NewItemToConvert(file, content) - items.nextId++ -} - -func (items *ItemsToConvert) GetItems() map[int]ItemToConvertContract { - return items.items -} - -func (items *ItemsToConvert) AfterAddingQueue() { - if items.isAutoRemove { - items.clear() - } -} - -func (items *ItemsToConvert) clear() { - items.itemsContainer.RemoveAll() - items.items = map[int]ItemToConvertContract{} -} - -type ItemToConvertContract interface { - GetFile() *File - GetContent() *fyne.Container -} - -type ItemToConvert struct { - file *File - content *fyne.Container -} - -func NewItemToConvert(file *File, content *fyne.Container) *ItemToConvert { - return &ItemToConvert{ - file: file, - content: content, - } -} - -func (item ItemToConvert) GetFile() *File { - return item.file -} - -func (item ItemToConvert) GetContent() *fyne.Container { - return item.content -} diff --git a/kernel/layout.go b/kernel/layout.go deleted file mode 100644 index 7953967..0000000 --- a/kernel/layout.go +++ /dev/null @@ -1,481 +0,0 @@ -package kernel - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/theme" - "fyne.io/fyne/v2/widget" - "image/color" - "strconv" - "strings" -) - -type LayoutContract interface { - SetContent(content fyne.CanvasObject) *fyne.Container - ChangeQueueStatus(queueId int, queue *Queue) - GetRightTabs() RightTabsContract -} - -type Layout struct { - layout *fyne.Container - queueLayoutObject QueueLayoutObjectContract - localizerService LocalizerContract - rightTabsService RightTabsContract -} - -func NewLayout(queueLayoutObject QueueLayoutObjectContract, localizerService LocalizerContract, rightTabsService RightTabsContract) *Layout { - layout := container.NewAdaptiveGrid(2, widget.NewLabel(""), queueLayoutObject.GetCanvasObject()) - - return &Layout{ - layout: layout, - queueLayoutObject: queueLayoutObject, - localizerService: localizerService, - rightTabsService: rightTabsService, - } -} - -func (l Layout) SetContent(content fyne.CanvasObject) *fyne.Container { - l.layout.Objects[0] = content - return l.layout -} - -func (l Layout) ChangeQueueStatus(queueId int, queue *Queue) { - l.queueLayoutObject.ChangeQueueStatus(queueId, queue) -} - -func (l Layout) GetRightTabs() RightTabsContract { - return l.rightTabsService -} - -type QueueLayoutObjectContract interface { - GetCanvasObject() fyne.CanvasObject - ChangeQueueStatus(queueId int, queue *Queue) -} - -type QueueLayoutObject struct { - QueueListContract QueueListContract - - queue QueueListContract - container *fyne.Container - containerItems *fyne.Container - items map[int]QueueLayoutItem - localizerService LocalizerContract - queueStatisticsFormat *queueStatisticsFormat - ffplayService FFplayContract -} - -type QueueLayoutItem struct { - CanvasObject fyne.CanvasObject - BlockMessageError *container.Scroll - StatusMessage *canvas.Text - MessageError *canvas.Text - buttonPlay *widget.Button - - status *StatusContract -} - -func NewQueueLayoutObject(queue QueueListContract, localizerService LocalizerContract, ffplayService FFplayContract, rightTabsService RightTabsContract, blockProgressbar *fyne.Container) *QueueLayoutObject { - title := widget.NewLabel(localizerService.GetMessage("queue")) - title.TextStyle.Bold = true - - localizerService.AddChangeCallback("queue", func(text string) { - title.Text = text - title.Refresh() - }) - - items := map[int]QueueLayoutItem{} - queueStatisticsFormat := newQueueStatisticsFormat(localizerService, &items) - - line := canvas.NewLine(theme.Color(theme.ColorNameFocus)) - line.StrokeWidth = 5 - - rightTabsService.GetFileQueueContainer().Add(container.NewVBox( - container.NewPadded(), - container.NewHBox(title, queueStatisticsFormat.completed.widget, queueStatisticsFormat.error.widget), - container.NewHBox(queueStatisticsFormat.inProgress.widget, queueStatisticsFormat.waiting.widget, queueStatisticsFormat.total.widget), - container.NewPadded(), - line, - container.NewPadded(), - )) - queueLayoutObject := &QueueLayoutObject{ - queue: queue, - container: container.NewBorder( - container.NewVBox( - blockProgressbar, - widget.NewSeparator(), - ), - nil, nil, nil, container.NewVScroll(rightTabsService.GetTabs()), - ), - containerItems: rightTabsService.GetFileQueueContainer(), - items: items, - localizerService: localizerService, - queueStatisticsFormat: queueStatisticsFormat, - ffplayService: ffplayService, - } - - queue.AddListener(queueLayoutObject) - - return queueLayoutObject -} - -func (o QueueLayoutObject) GetCanvasObject() fyne.CanvasObject { - return o.container -} - -func (o QueueLayoutObject) Add(id int, queue *Queue) { - statusMessage := canvas.NewText(o.getStatusTitle(queue.Status), theme.Color(theme.ColorNamePrimary)) - messageError := canvas.NewText("", theme.Color(theme.ColorNameError)) - buttonPlay := widget.NewButtonWithIcon("", theme.Icon(theme.IconNameMediaPlay), func() { - - }) - buttonPlay.Hide() - blockMessageError := container.NewHScroll(messageError) - blockMessageError.Hide() - - content := container.NewVBox( - container.NewHScroll(widget.NewLabel(queue.Setting.VideoFileInput.Name)), - container.NewHBox( - buttonPlay, - statusMessage, - ), - blockMessageError, - container.NewPadded(), - canvas.NewLine(theme.Color(theme.ColorNameFocus)), - container.NewPadded(), - ) - - o.queueStatisticsFormat.addQueue() - if o.queueStatisticsFormat.isChecked(queue.Status) == false { - content.Hide() - } - - o.items[id] = QueueLayoutItem{ - CanvasObject: content, - StatusMessage: statusMessage, - BlockMessageError: blockMessageError, - MessageError: messageError, - buttonPlay: buttonPlay, - status: &queue.Status, - } - o.containerItems.Add(content) -} - -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{} - } -} - -func (o QueueLayoutObject) ChangeQueueStatus(queueId int, queue *Queue) { - if item, ok := o.items[queueId]; ok { - statusColor := o.getStatusColor(queue.Status) - item.StatusMessage.Text = o.getStatusTitle(queue.Status) - item.StatusMessage.Color = statusColor - fyne.Do(func() { - item.StatusMessage.Refresh() - }) - if queue.Error != nil { - item.MessageError.Text = queue.Error.Error() - item.MessageError.Color = statusColor - fyne.Do(func() { - item.BlockMessageError.Show() - item.MessageError.Refresh() - }) - } - if queue.Status == StatusType(Completed) { - item.buttonPlay.Show() - item.buttonPlay.OnTapped = func() { - item.buttonPlay.Disable() - go func() { - _ = o.ffplayService.Run(FFplaySetting{ - PathToFile: queue.Setting.VideoFileOut.Path, - }) - fyne.Do(func() { - item.buttonPlay.Enable() - }) - }() - } - } - 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) - } -} - -func (o QueueLayoutObject) getStatusColor(status StatusContract) color.Color { - if status == StatusType(Error) { - return theme.Color(theme.ColorNameError) - } - - if status == StatusType(Completed) { - return color.RGBA{R: 49, G: 127, B: 114, A: 255} - } - - return theme.Color(theme.ColorNamePrimary) -} - -func (o QueueLayoutObject) getStatusTitle(status StatusContract) string { - return o.localizerService.GetMessage(status.Name() + "Queue") -} - -type queueStatistics struct { - widget *widget.Check - title string - count *int64 -} -type queueStatisticsFormat struct { - waiting *queueStatistics - inProgress *queueStatistics - completed *queueStatistics - error *queueStatistics - total *queueStatistics -} - -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 -} - -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 (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 (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(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 { - fyne.Do(func() { - s.widget.Refresh() - }) - } -} diff --git a/kernel/localizer.go b/kernel/localizer.go deleted file mode 100644 index 085fb69..0000000 --- a/kernel/localizer.go +++ /dev/null @@ -1,194 +0,0 @@ -package kernel - -import ( - "embed" - "encoding/json" - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/lang" - "golang.org/x/text/language" -) - -//go:embed translations -var translations embed.FS - -var supportedLanguages = map[string]Lang{ - "ru": {Code: "ru", Title: "Русский"}, - "kk": {Code: "kk", Title: "Қазақ Тілі"}, - "en": {Code: "en", Title: "English"}, -} - -type LocalizerContract interface { - IsStartWithLanguageSelection() bool - GetMessage(key string, data ...any) string - GetLanguages() []Lang - GetCurrentLanguage() Lang - SetCurrentLanguage(selectLang Lang, isSaveSetting bool) error - AddChangeCallback(messageID string, callback func(text string)) -} - -type Lang struct { - Code string - Title string -} - -type changeCallback struct { - messageID string - callback func(text string) -} - -type Localizer struct { - setting SettingLanguageContract - currentLang Lang - changeCallbacks map[int]*changeCallback - isStartWithLanguageSelection bool -} - -func newLocalizer(app fyne.App) (*Localizer, error) { - setting := newSettingLanguage(app) - currentLanguage, isLanguageNotSupported := setting.GetLang() - - localizer := &Localizer{ - setting: setting, - changeCallbacks: map[int]*changeCallback{}, - isStartWithLanguageSelection: isLanguageNotSupported, - } - - err := localizer.SetCurrentLanguage(currentLanguage, false) - if err != nil { - return nil, err - } - - return localizer, nil -} - -func (l *Localizer) IsStartWithLanguageSelection() bool { - return l.isStartWithLanguageSelection -} - -func (l *Localizer) GetMessage(key string, data ...any) string { - return lang.L(key, data...) -} - -func (l *Localizer) GetLanguages() []Lang { - return getLanguages() -} - -func (l *Localizer) GetCurrentLanguage() Lang { - return l.currentLang -} - -func (l *Localizer) SetCurrentLanguage(selectLang Lang, isSaveSetting bool) error { - l.currentLang = selectLang - - translationsData, err := l.getTranslations(selectLang) - if err != nil { - return err - } - - name := lang.SystemLocale().LanguageString() - err = lang.AddTranslations(fyne.NewStaticResource(name+".json", translationsData)) - if err != nil { - return err - } - - if isSaveSetting { - l.setting.SetLang(selectLang) - } - - l.eventSetCurrentLanguage() - return nil -} - -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 _, changeCallback := range l.changeCallbacks { - text := l.GetMessage(changeCallback.messageID) - changeCallback.callback(text) - } -} - -func (l *Localizer) getTranslations(language Lang) ([]byte, error) { - baseJson, err := translations.ReadFile("translations/base." + language.Code + ".json") - if err != nil { - return nil, err - } - appJson, err := translations.ReadFile("translations/app." + language.Code + ".json") - if err != nil { - return nil, err - } - - return l.mergeTranslations(baseJson, appJson) -} - -func (l *Localizer) mergeTranslations(baseJson []byte, appJson []byte) ([]byte, error) { - base := map[string]interface{}{} - custom := map[string]interface{}{} - err := json.Unmarshal(baseJson, &base) - if err != nil { - return nil, err - } - err = json.Unmarshal(appJson, &custom) - if err != nil { - return nil, err - } - - for k, v := range custom { - base[k] = v - } - return json.Marshal(base) -} - -func getLanguages() []Lang { - items := []Lang{} - for _, item := range supportedLanguages { - items = append(items, item) - } - return items -} - -type SettingLanguageContract interface { - GetLang() (currentLang Lang, isLanguageNotSupported bool) - SetLang(language Lang) -} - -type SettingLanguage struct { - app fyne.App -} - -func newSettingLanguage(app fyne.App) *SettingLanguage { - return &SettingLanguage{ - app: app, - } -} - -func (s *SettingLanguage) GetLang() (currentLang Lang, isLanguageNotSupported bool) { - languageCode := s.app.Preferences().String("language") - currentLang = supportedLanguages["ru"] - - if languageCode == "" { - languageTag, err := language.Parse(lang.SystemLocale().LanguageString()) - if err != nil { - return currentLang, true - } - base, _ := languageTag.Base() - languageCode = base.String() - } - - if findLang, ok := findSupportedLanguage(languageCode); ok { - return findLang, false - } - - return currentLang, true -} - -func (s *SettingLanguage) SetLang(language Lang) { - s.app.Preferences().SetString("language", language.Code) -} - -func findSupportedLanguage(code string) (Lang, bool) { - lang, ok := supportedLanguages[code] - return lang, ok -} diff --git a/kernel/progressbar.go b/kernel/progressbar.go deleted file mode 100644 index 95d4ce5..0000000 --- a/kernel/progressbar.go +++ /dev/null @@ -1,245 +0,0 @@ -package kernel - -import ( - "bufio" - "errors" - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/theme" - "fyne.io/fyne/v2/widget" - "image/color" - "io" - "regexp" - "strconv" - "strings" -) - -type BlockProgressbarContract interface { - GetContainer() *fyne.Container - GetProgressbar(totalDuration float64, filePath string, localizerService LocalizerContract) Progress - ProcessEndedWithError(errorText string) - ProcessEndedWithSuccess(filePath string) -} - -type BlockProgressbar struct { - container *fyne.Container - label *widget.Label - progressbar *widget.ProgressBar - errorBlock *container.Scroll - messageError *canvas.Text - statusMessage *canvas.Text - buttonPlay *widget.Button - statusesText *BlockProgressbarStatusesText - ffplayService FFplayContract -} - -func NewBlockProgressbar(statusesText *BlockProgressbarStatusesText, ffplayService FFplayContract) *BlockProgressbar { - label := widget.NewLabel("") - progressbar := widget.NewProgressBar() - - statusMessage := canvas.NewText("", theme.Color(theme.ColorNamePrimary)) - messageError := canvas.NewText("", theme.Color(theme.ColorNameError)) - buttonPlay := widget.NewButtonWithIcon("", theme.Icon(theme.IconNameMediaPlay), func() { - - }) - buttonPlay.Hide() - - errorBlock := container.NewHScroll(messageError) - errorBlock.Hide() - - content := container.NewVBox( - container.NewHScroll(label), - progressbar, - container.NewHScroll(container.NewHBox( - buttonPlay, - statusMessage, - )), - errorBlock, - ) - content.Hide() - - return &BlockProgressbar{ - container: content, - label: label, - progressbar: progressbar, - errorBlock: errorBlock, - messageError: messageError, - statusMessage: statusMessage, - buttonPlay: buttonPlay, - statusesText: statusesText, - ffplayService: ffplayService, - } -} - -func (block BlockProgressbar) GetContainer() *fyne.Container { - return block.container -} - -func (block BlockProgressbar) GetProgressbar(totalDuration float64, filePath string, localizerService LocalizerContract) Progress { - block.label.Text = filePath - block.statusMessage.Color = theme.Color(theme.ColorNamePrimary) - block.statusMessage.Text = block.statusesText.inProgress - block.messageError.Text = "" - fyne.Do(func() { - block.buttonPlay.Hide() - if block.errorBlock.Visible() { - block.errorBlock.Hide() - } - block.statusMessage.Refresh() - block.container.Refresh() - block.errorBlock.Refresh() - }) - - block.progressbar.Value = 0 - return NewProgress(totalDuration, block.progressbar, localizerService) -} - -func (block BlockProgressbar) ProcessEndedWithError(errorText string) { - fyne.Do(func() { - block.statusMessage.Color = theme.Color(theme.ColorNameError) - block.statusMessage.Text = block.statusesText.error - block.messageError.Text = errorText - block.errorBlock.Show() - }) -} - -func (block BlockProgressbar) ProcessEndedWithSuccess(filePath string) { - fyne.Do(func() { - block.statusMessage.Color = color.RGBA{R: 49, G: 127, B: 114, A: 255} - block.statusMessage.Text = block.statusesText.completed - block.buttonPlay.Show() - block.buttonPlay.OnTapped = func() { - block.buttonPlay.Disable() - go func() { - _ = block.ffplayService.Run(FFplaySetting{ - PathToFile: filePath, - }) - fyne.Do(func() { - block.buttonPlay.Enable() - }) - }() - } - }) -} - -type Progress struct { - totalDuration float64 - progressbar *widget.ProgressBar - protocol string - localizerService LocalizerContract -} - -func NewProgress(totalDuration float64, progressbar *widget.ProgressBar, localizerService LocalizerContract) Progress { - return Progress{ - totalDuration: totalDuration, - progressbar: progressbar, - protocol: "pipe:", - localizerService: localizerService, - } -} - -func (p Progress) GetProtocole() string { - return p.protocol -} - -func (p Progress) Run(stdOut io.ReadCloser, stdErr io.ReadCloser) error { - isProcessCompleted := false - var errorText string - - p.progressbar.Value = 0 - p.progressbar.Max = p.totalDuration - fyne.Do(func() { - p.progressbar.Refresh() - }) - progress := 0.0 - - go func() { - scannerErr := bufio.NewReader(stdErr) - for { - line, _, err := scannerErr.ReadLine() - if err != nil { - if err == io.EOF { - break - } - continue - } - data := strings.TrimSpace(string(line)) - errorText = data - } - }() - - scannerOut := bufio.NewReader(stdOut) - for { - line, _, err := scannerOut.ReadLine() - if err != nil { - if err == io.EOF { - break - } - continue - } - data := strings.TrimSpace(string(line)) - if strings.Contains(data, "progress=end") { - p.progressbar.Value = p.totalDuration - fyne.Do(func() { - p.progressbar.Refresh() - }) - isProcessCompleted = true - break - } - - re := regexp.MustCompile(`frame=(\d+)`) - a := re.FindAllStringSubmatch(data, -1) - - if len(a) > 0 && len(a[len(a)-1]) > 0 { - c, err := strconv.Atoi(a[len(a)-1][len(a[len(a)-1])-1]) - if err != nil { - continue - } - progress = float64(c) - } - if p.progressbar.Value != progress { - p.progressbar.Value = progress - fyne.Do(func() { - p.progressbar.Refresh() - }) - } - } - - if isProcessCompleted == false { - if len(errorText) == 0 { - errorText = p.localizerService.GetMessage("errorConverter") - } - return errors.New(errorText) - } - - return nil -} - -type BlockProgressbarStatusesText struct { - inProgress string - completed string - error string -} - -func GetBlockProgressbarStatusesText(localizerService LocalizerContract) *BlockProgressbarStatusesText { - statusesText := &BlockProgressbarStatusesText{ - inProgress: localizerService.GetMessage("inProgressQueue"), - completed: localizerService.GetMessage("completedQueue"), - error: localizerService.GetMessage("errorQueue"), - } - - localizerService.AddChangeCallback("inProgressQueue", func(text string) { - statusesText.inProgress = text - }) - - localizerService.AddChangeCallback("completedQueue", func(text string) { - statusesText.completed = text - }) - - localizerService.AddChangeCallback("errorQueue", func(text string) { - statusesText.error = text - }) - - return statusesText -} diff --git a/kernel/queue.go b/kernel/queue.go deleted file mode 100644 index 6d2f6c4..0000000 --- a/kernel/queue.go +++ /dev/null @@ -1,125 +0,0 @@ -package kernel - -import ( - "errors" -) - -type Queue struct { - Setting *ConvertSetting - Status StatusContract - Error error -} - -type StatusContract interface { - Name() string - Ordinal() int -} - -const ( - Waiting = iota - InProgress - Completed - Error -) - -type StatusType uint - -var statusTypeStrings = []string{ - "waiting", - "inProgress", - "completed", - "error", -} - -func (status StatusType) Name() string { - return statusTypeStrings[status] -} - -func (status StatusType) Ordinal() int { - return int(status) -} - -type QueueListenerContract interface { - Add(key int, queue *Queue) - Remove(key int) -} - -type QueueListContract interface { - AddListener(queueListener QueueListenerContract) - GetItems() map[int]*Queue - Add(setting *ConvertSetting) - Remove(key int) - GetItem(key int) (*Queue, error) - Next() (key int, queue *Queue) -} - -type QueueList struct { - currentKey *int - items map[int]*Queue - queueListener map[int]QueueListenerContract -} - -func NewQueueList() *QueueList { - currentKey := 0 - return &QueueList{ - currentKey: ¤tKey, - items: map[int]*Queue{}, - queueListener: map[int]QueueListenerContract{}, - } -} - -func (l QueueList) GetItems() map[int]*Queue { - return l.items -} - -func (l QueueList) Add(setting *ConvertSetting) { - queue := Queue{ - Setting: setting, - Status: StatusType(Waiting), - } - - *l.currentKey += 1 - l.items[*l.currentKey] = &queue - l.eventAdd(*l.currentKey, &queue) -} - -func (l QueueList) Remove(key int) { - if _, ok := l.items[key]; ok { - delete(l.items, key) - l.eventRemove(key) - } -} - -func (l QueueList) GetItem(key int) (*Queue, error) { - if item, ok := l.items[key]; ok { - return item, nil - } - - return nil, errors.New("key not found") -} - -func (l QueueList) AddListener(queueListener QueueListenerContract) { - l.queueListener[len(l.queueListener)] = queueListener -} - -func (l QueueList) eventAdd(key int, queue *Queue) { - for _, listener := range l.queueListener { - listener.Add(key, queue) - } -} - -func (l QueueList) eventRemove(key int) { - for _, listener := range l.queueListener { - listener.Remove(key) - } -} - -func (l QueueList) Next() (key int, queue *Queue) { - statusWaiting := StatusType(Waiting) - for key, item := range l.items { - if item.Status == statusWaiting { - return key, item - } - } - return -1, nil -} diff --git a/kernel/right_tabs.go b/kernel/right_tabs.go deleted file mode 100644 index 9b41880..0000000 --- a/kernel/right_tabs.go +++ /dev/null @@ -1,75 +0,0 @@ -package kernel - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/container" -) - -type RightTabsContract interface { - GetTabs() *container.AppTabs - GetAddedFilesContainer() *fyne.Container - GetFileQueueContainer() *fyne.Container - SelectFileQueueTab() - SelectAddedFilesTab() -} - -type RightTabs struct { - tabs *container.AppTabs - - addedFilesContainer *fyne.Container - addedFilesTab *container.TabItem - - fileQueueContainer *fyne.Container - fileQueueTab *container.TabItem -} - -func NewRightTabs(localizerService LocalizerContract) *RightTabs { - addedFilesContainer := container.NewVBox() - addedFilesTab := container.NewTabItem(localizerService.GetMessage("addedFilesTitle"), addedFilesContainer) - localizerService.AddChangeCallback("addedFilesTitle", func(text string) { - addedFilesTab.Text = text - }) - - fileQueueContainer := container.NewVBox() - fileQueueTab := container.NewTabItem(localizerService.GetMessage("fileQueueTitle"), fileQueueContainer) - localizerService.AddChangeCallback("fileQueueTitle", func(text string) { - fileQueueTab.Text = text - }) - - tabs := container.NewAppTabs( - addedFilesTab, - fileQueueTab, - ) - - return &RightTabs{ - tabs: tabs, - addedFilesContainer: addedFilesContainer, - addedFilesTab: addedFilesTab, - fileQueueContainer: fileQueueContainer, - fileQueueTab: fileQueueTab, - } -} - -func (t RightTabs) GetTabs() *container.AppTabs { - return t.tabs -} - -func (t RightTabs) GetAddedFilesContainer() *fyne.Container { - return t.addedFilesContainer -} - -func (t RightTabs) GetFileQueueContainer() *fyne.Container { - return t.fileQueueContainer -} - -func (t RightTabs) SelectFileQueueTab() { - fyne.Do(func() { - t.tabs.Select(t.fileQueueTab) - }) -} - -func (t RightTabs) SelectAddedFilesTab() { - fyne.Do(func() { - t.tabs.Select(t.addedFilesTab) - }) -} diff --git a/kernel/translations/app.en.json b/kernel/translations/app.en.json deleted file mode 100644 index 9919f8d..0000000 --- a/kernel/translations/app.en.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "AlsoUsedProgram": "The program also uses:", - "about": "About", - "aboutText": "A simple interface for the FFmpeg console utility. \nBut I am not the author of the FFmpeg utility itself.", - "addedFilesTitle": "Added files", - "autoClearAfterAddingToQueue": "Auto-clear after adding to queue", - "buttonDownloadFFmpeg": "Download FFmpeg automatically", - "buttonForSelectedDirTitle": "Save to folder:", - "cancel": "Cancel", - "changeFFPath": "FFmpeg, FFprobe and FFplay", - "changeLanguage": "Change language", - "checkboxOverwriteOutputFilesTitle": "Allow file to be overwritten", - "choose": "choose", - "clearAll": "Clear List", - "completedQueue": "Completed", - "converterVideoFilesSubmitTitle": "Convert", - "converterVideoFilesTitle": "Video, audio and picture converter", - "download": "Download", - "downloadFFmpegFromSite": "Will be downloaded from the site:", - "downloadRun": "Downloading...", - "dragAndDropFiles": "drag and drop files", - "encoderGroupAudio": "Audio", - "encoderGroupImage": "Images", - "encoderGroupVideo": "Video", - "encoder_apng": "APNG image", - "encoder_bmp": "BMP image", - "encoder_flv": "FLV", - "encoder_gif": "GIF image", - "encoder_h264_nvenc": "H.264 with NVIDIA support", - "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": "An error has occurred!", - "errorConverter": "Couldn't convert video", - "errorDragAndDropFile": "Not all files were added", - "errorFFmpeg": "this is not FFmpeg", - "errorFFmpegVersion": "Could not determine FFmpeg version", - "errorFFplay": "this is not FFplay", - "errorFFplayVersion": "Could not determine FFplay version", - "errorFFprobe": "this is not FFprobe", - "errorFFprobeVersion": "Failed to determine FFprobe version", - "errorNoFilesAddedForConversion": "There are no files to convert", - "errorQueue": "Error", - "errorSelectedEncoder": "Converter not selected", - "errorSelectedFolderSave": "No save folder selected!", - "errorSelectedFormat": "File extension not selected", - "exit": "Exit", - "ffmpegLGPL": "This software uses libraries from the **FFmpeg** project under the **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**.", - "ffmpegTrademark": "**FFmpeg** is a trademark of **[Fabrice Bellard](http://bellard.org/)**, originator of the **[FFmpeg](https://ffmpeg.org/about.html)** project.", - "fileForConversionTitle": "File:", - "fileQueueTitle": "Queue", - "formPreset": "Preset", - "gratitude": "Gratitude", - "gratitudeText": "I sincerely thank you for your invaluable\n\r and timely assistance:", - "help": "Help", - "helpFFplay": "FFplay Player Keys", - "helpFFplayActivateFrameStepMode": "Activate frame-by-frame mode.", - "helpFFplayCycleVideoFiltersOrShowModes": "A cycle of video filters or display modes.", - "helpFFplayDecreaseVolume": "Decrease the volume.", - "helpFFplayDescription": "Description", - "helpFFplayDoubleClickLeftMouseButton": "double click\nleft mouse button", - "helpFFplayIncreaseVolume": "Increase the volume.", - "helpFFplayKeyDown": "down", - "helpFFplayKeyHoldS": "hold S", - "helpFFplayKeyLeft": "left", - "helpFFplayKeyRight": "right", - "helpFFplayKeySpace": "SPACE", - "helpFFplayKeyUp": "up", - "helpFFplayKeys": "Keys", - "helpFFplayPause": "Pause or continue playing.", - "helpFFplayQuit": "Close the player.", - "helpFFplaySeekBForward10Minutes": "Fast forward 10 minutes.", - "helpFFplaySeekBForward1Minute": "Fast forward 1 minute.", - "helpFFplaySeekBackward10Minutes": "Rewind 10 minutes.", - "helpFFplaySeekBackward10Seconds": "Rewind 10 seconds.", - "helpFFplaySeekBackward1Minute": "Rewind 1 minute.", - "helpFFplaySeekForward10Seconds": "Fast forward 10 seconds.", - "helpFFplayToggleFullScreen": "Switch to full screen or exit full screen.", - "helpFFplayToggleMute": "Mute or unmute.", - "inProgressQueue": "In Progress", - "languageSelectionFormHead": "Switch language", - "languageSelectionHead": "Choose language", - "licenseLink": "License information", - "licenseLinkOther": "Licenses from other products used in the program", - "menuSettingsLanguage": "Language", - "menuSettingsTheme": "Theme", - "or": "or", - "parameterCheckbox": "Enable option", - "pathToFfmpeg": "Path to FFmpeg:", - "pathToFfplay": "Path to FFplay:", - "pathToFfprobe": "Path to FFprobe:", - "preset_fast": "fast (slower than \"faster\", but the file will weigh less)", - "preset_faster": "faster (slower than \"veryfast\", but the file will weigh less)", - "preset_medium": "medium (slower than \"fast\", but the file will weigh less)", - "preset_placebo": "placebo (not recommended)", - "preset_slow": "slow (slower than \"medium\", but the file will weigh less)", - "preset_slower": "slower (slower than \"slow\", but the file will weigh less)", - "preset_superfast": "superfast (slower than \"ultrafast\", but the file will weigh less)", - "preset_ultrafast": "ultrafast (fast, but the file will weigh a lot)", - "preset_veryfast": "veryfast (slower than \"superfast\", but the file will weigh less)", - "preset_veryslow": "veryslow (slower than \"slower\", but the file will weigh less)", - "programmLink": "Project website", - "programmVersion": "**Program version:** {{.Version}}", - "queue": "Queue", - "save": "Save", - "selectEncoder": "Encoder:", - "selectFFPathTitle": "Specify the path to FFmpeg and FFprobe", - "selectFormat": "File extension:", - "settings": "Settings", - "testFF": "Checking FFmpeg for serviceability...", - "themesNameDark": "Dark", - "themesNameDefault": "Default", - "themesNameLight": "Light", - "titleDownloadLink": "You can download it from here", - "total": "Total", - "unzipRun": "Unpacked...", - "waitingQueue": "Waiting" -} \ No newline at end of file diff --git a/kernel/translations/app.kk.json b/kernel/translations/app.kk.json deleted file mode 100644 index 6fb1b81..0000000 --- a/kernel/translations/app.kk.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "AlsoUsedProgram": "Бағдарлама сонымен қатар пайдаланады:", - "about": "Бағдарлама туралы", - "aboutText": "FFmpeg консоль утилитасы үшін қарапайым интерфейс. \nБірақ мен FFmpeg утилитасының авторы емеспін.", - "addedFilesTitle": "Қосылған файлдар", - "autoClearAfterAddingToQueue": "Кезекке қосқаннан кейін тазалаңыз", - "buttonDownloadFFmpeg": "FFmpeg автоматты түрде жүктеп алыңыз", - "buttonForSelectedDirTitle": "Қалтаға сақтаңыз:", - "cancel": "Болдырмау", - "changeFFPath": "FFmpeg, FFprobe және FFplay", - "changeLanguage": "Тілді өзгерту", - "checkboxOverwriteOutputFilesTitle": "Файлды қайта жазуға рұқсат беріңіз", - "choose": "таңдау", - "clearAll": "Тізімді өшіру", - "completedQueue": "Дайын", - "converterVideoFilesSubmitTitle": "Файлды түрлендіру", - "converterVideoFilesTitle": "Бейне, аудио және суретті түрлендіргіш", - "download": "Жүктеп алу", - "downloadFFmpegFromSite": "Сайттан жүктеледі:", - "downloadRun": "Жүктеп алынуда...", - "dragAndDropFiles": "файлдарды сүйреп апарыңыз", - "encoderGroupAudio": "Аудио", - "encoderGroupImage": "Суреттер", - "encoderGroupVideo": "Бейне", - "encoder_apng": "APNG image", - "encoder_bmp": "BMP image", - "encoder_flv": "FLV", - "encoder_gif": "GIF image", - "encoder_h264_nvenc": "NVIDIA қолдауымен H.264", - "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": "Бейнені түрлендіру мүмкін болмады", - "errorDragAndDropFile": "Барлық файлдар қосылмаған", - "errorFFmpeg": "бұл FFmpeg емес", - "errorFFmpegVersion": "FFmpeg нұсқасын анықтау мүмкін болмады", - "errorFFplay": "бұл FFplay емес", - "errorFFplayVersion": "FFplay нұсқасын анықтау мүмкін болмады", - "errorFFprobe": "бұл FFprobe емес", - "errorFFprobeVersion": "FFprobe нұсқасын анықтау мүмкін болмады", - "errorNoFilesAddedForConversion": "Түрлендіруге арналған файлдар жоқ", - "errorQueue": "Қате", - "errorSelectedEncoder": "Түрлендіргіш таңдалмаған", - "errorSelectedFolderSave": "Сақтау қалтасы таңдалмаған!", - "errorSelectedFormat": "Файл кеңейтімі таңдалмаған", - "exit": "Шығу", - "ffmpegLGPL": "Бұл бағдарламалық құрал **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)** астында **FFmpeg** жобасының кітапханаларын пайдаланады.", - "ffmpegTrademark": "FFmpeg — **[FFmpeg](https://ffmpeg.org/about.html)** жобасын жасаушы **[Fabrice Bellard](http://bellard.org/)** сауда белгісі.", - "fileForConversionTitle": "Файл:", - "fileQueueTitle": "Кезек", - "formPreset": "Алдын ала орнатылған", - "gratitude": "Алғыс", - "gratitudeText": "Сізге баға жетпес және уақтылы көмектескеніңіз\n\r үшін шын жүректен алғыс айтамын:", - "help": "Анықтама", - "helpFFplay": "FFplay ойнатқышының пернелері", - "helpFFplayActivateFrameStepMode": "Уақыт аралығын іске қосыңыз.", - "helpFFplayCycleVideoFiltersOrShowModes": "Бейне сүзгілерінің немесе дисплей режимдерінің циклі.", - "helpFFplayDecreaseVolume": "Дыбыс деңгейін төмендетіңіз.", - "helpFFplayDescription": "Сипаттама", - "helpFFplayDoubleClickLeftMouseButton": "тінтуірдің сол жақ\nбатырмасын екі рет басу", - "helpFFplayIncreaseVolume": "Дыбыс деңгейін арттыру.", - "helpFFplayKeyDown": "төмен", - "helpFFplayKeyHoldS": "ұстау S", - "helpFFplayKeyLeft": "сол", - "helpFFplayKeyRight": "құқық", - "helpFFplayKeySpace": "SPACE (пробел)", - "helpFFplayKeyUp": "жоғары", - "helpFFplayKeys": "Кілттер", - "helpFFplayPause": "Кідіртіңіз немесе жоғалтуды жалғастырыңыз.", - "helpFFplayQuit": "Ойнатқышты жабыңыз.", - "helpFFplaySeekBForward10Minutes": "10 минутқа алға айналдырыңыз.", - "helpFFplaySeekBForward1Minute": "1 минутқа алға айналдырыңыз.", - "helpFFplaySeekBackward10Minutes": "10 минутқа артқа айналдырыңыз.", - "helpFFplaySeekBackward10Seconds": "10 секундқа артқа айналдырыңыз.", - "helpFFplaySeekBackward1Minute": "1 минутқа артқа айналдырыңыз.", - "helpFFplaySeekForward10Seconds": "10 секунд алға айналдырыңыз.", - "helpFFplayToggleFullScreen": "Толық экранға ауысу немесе толық экраннан шығу.", - "helpFFplayToggleMute": "Дыбысты өшіріңіз немесе дыбысты қосыңыз.", - "inProgressQueue": "Орындалуда", - "languageSelectionFormHead": "Тілді ауыстыру", - "languageSelectionHead": "Тілді таңдаңыз", - "licenseLink": "Лицензия туралы ақпарат", - "licenseLinkOther": "Бағдарламада пайдаланылатын басқа өнімдердің лицензиялары", - "menuSettingsLanguage": "Тіл", - "menuSettingsTheme": "Тақырып", - "or": "немесе", - "parameterCheckbox": "Опцияны қосу", - "pathToFfmpeg": "FFmpeg жол:", - "pathToFfplay": "FFplay жол:", - "pathToFfprobe": "FFprobe жол:", - "preset_fast": "fast («faster» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", - "preset_faster": "faster («veryfast» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", - "preset_medium": "medium («fast» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", - "preset_placebo": "placebo (ұсынылмайды)", - "preset_slow": "slow («medium» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", - "preset_slower": "slower («slow» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", - "preset_superfast": "superfast («ultrafast» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", - "preset_ultrafast": "ultrafast (жылдам, бірақ файлдың салмағы көп болады)", - "preset_veryfast": "veryfast («superfast» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", - "preset_veryslow": "veryslow («slower» қарағанда баяуырақ, бірақ файлдың салмағы аз болады)", - "programmLink": "Жобаның веб-сайты", - "programmVersion": "**Бағдарлама нұсқасы:** {{.Version}}", - "queue": "Кезек", - "save": "Сақтау", - "selectEncoder": "Кодировщик:", - "selectFFPathTitle": "FFmpeg және FFprobe жолын көрсетіңіз", - "selectFormat": "Файл кеңейтімі:", - "settings": "Параметрлер", - "testFF": "FFmpeg функционалдығы тексерілуде...", - "themesNameDark": "Қараңғы тақырып", - "themesNameDefault": "Әдепкі бойынша", - "themesNameLight": "Жеңіл тақырып", - "titleDownloadLink": "Сіз оны осы жерден жүктей аласыз", - "total": "Барлығы", - "unzipRun": "Орамнан шығарылуда...", - "waitingQueue": "Күту" -} \ No newline at end of file diff --git a/kernel/translations/app.ru.json b/kernel/translations/app.ru.json deleted file mode 100644 index 20a5da8..0000000 --- a/kernel/translations/app.ru.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "AlsoUsedProgram": "Также в программе используется:", - "about": "О программе", - "aboutText": "Простенький интерфейс для консольной утилиты FFmpeg. \nНо я не являюсь автором самой утилиты FFmpeg.", - "addedFilesTitle": "Добавленные файлы", - "autoClearAfterAddingToQueue": "Очищать после добавления в очередь", - "buttonDownloadFFmpeg": "Скачать автоматически FFmpeg", - "buttonForSelectedDirTitle": "Сохранить в папку:", - "cancel": "Отмена", - "changeFFPath": "FFmpeg, FFprobe и FFplay", - "changeLanguage": "Поменять язык", - "checkboxOverwriteOutputFilesTitle": "Разрешить перезаписать файл", - "choose": "выбрать", - "clearAll": "Очистить список", - "completedQueue": "Готово", - "converterVideoFilesSubmitTitle": "Конвертировать", - "converterVideoFilesTitle": "Конвертер видео, аудио и картинок", - "download": "Скачать", - "downloadFFmpegFromSite": "Будет скачано с сайта:", - "downloadRun": "Скачивается...", - "dragAndDropFiles": "перетащить файлы", - "encoderGroupAudio": "Аудио", - "encoderGroupImage": "Картинки", - "encoderGroupVideo": "Видео", - "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": "не смогли отконвертировать видео", - "errorDragAndDropFile": "Не все файлы добавились", - "errorFFmpeg": "это не FFmpeg", - "errorFFmpegVersion": "Не смогли определить версию FFmpeg", - "errorFFplay": "это не FFplay", - "errorFFplayVersion": "Не смогли определить версию FFplay", - "errorFFprobe": "это не FFprobe", - "errorFFprobeVersion": "Не смогли определить версию FFprobe", - "errorNoFilesAddedForConversion": "Нет файлов для конвертации", - "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)**.", - "fileForConversionTitle": "Файл:", - "fileQueueTitle": "Очередь", - "formPreset": "Предустановка", - "gratitude": "Благодарность", - "gratitudeText": "Я искренне благодарю вас за неоценимую\n\rи своевременную помощь:", - "help": "Справка", - "helpFFplay": "Клавиши проигрывателя FFplay", - "helpFFplayActivateFrameStepMode": "Активировать покадровый режим.", - "helpFFplayCycleVideoFiltersOrShowModes": "Цикл видеофильтров или режимов показа.", - "helpFFplayDecreaseVolume": "Уменьшить громкость.", - "helpFFplayDescription": "Описание", - "helpFFplayDoubleClickLeftMouseButton": "двойной щелчок\nлевой кнопкой мыши", - "helpFFplayIncreaseVolume": "Увеличить громкость.", - "helpFFplayKeyDown": "вниз", - "helpFFplayKeyHoldS": "держать S", - "helpFFplayKeyLeft": "лево", - "helpFFplayKeyRight": "право", - "helpFFplayKeySpace": "SPACE (пробел)", - "helpFFplayKeyUp": "вверх", - "helpFFplayKeys": "Клавиши", - "helpFFplayPause": "Поставить на паузу или продолжить проигрывать.", - "helpFFplayQuit": "Закрыть проигрыватель.", - "helpFFplaySeekBForward10Minutes": "Перемотать вперёд на 10 минут.", - "helpFFplaySeekBForward1Minute": "Перемотать вперёд на 1 минуту.", - "helpFFplaySeekBackward10Minutes": "Перемотать назад на 10 минут.", - "helpFFplaySeekBackward10Seconds": "Перемотать назад на 10 секунд.", - "helpFFplaySeekBackward1Minute": "Перемотать назад на 1 минуту.", - "helpFFplaySeekForward10Seconds": "Перемотать вперёд на 10 секунд.", - "helpFFplayToggleFullScreen": "Переключиться на полный экран или выйти с полного экрана.", - "helpFFplayToggleMute": "Отключить звук или включить звук.", - "inProgressQueue": "Выполняется", - "languageSelectionFormHead": "Переключить язык", - "languageSelectionHead": "Выберите язык", - "licenseLink": "Сведения о лицензии", - "licenseLinkOther": "Лицензии от других продуктов, которые используются в программе", - "menuSettingsLanguage": "Язык", - "menuSettingsTheme": "Тема", - "or": "или", - "parameterCheckbox": "Включить параметр", - "pathToFfmpeg": "Путь к FFmpeg:", - "pathToFfplay": "Путь к FFplay:", - "pathToFfprobe": "Путь к FFprobe:", - "preset_fast": "fast (медленней чем faster, но будет файл и меньше весить)", - "preset_faster": "faster (медленней чем veryfast, но будет файл и меньше весить)", - "preset_medium": "medium (медленней чем fast, но будет файл и меньше весить)", - "preset_placebo": "placebo (не рекомендуется)", - "preset_slow": "slow (медленней чем medium, но будет файл и меньше весить)", - "preset_slower": "slower (медленней чем slow, но будет файл и меньше весить)", - "preset_superfast": "superfast (медленней чем ultrafast, но будет файл и меньше весить)", - "preset_ultrafast": "ultrafast (быстро, но файл будет много весить)", - "preset_veryfast": "veryfast (медленней чем superfast, но будет файл и меньше весить)", - "preset_veryslow": "veryslow (медленней чем slower, но будет файл и меньше весить)", - "programmLink": "Сайт проекта", - "programmVersion": "**Версия программы:** {{.Version}}", - "queue": "Очередь", - "save": "Сохранить", - "selectEncoder": "Кодировщик:", - "selectFFPathTitle": "Укажите путь к FFmpeg и к FFprobe", - "selectFormat": "Расширение файла:", - "settings": "Настройки", - "testFF": "Проверка FFmpeg на работоспособность...", - "themesNameDark": "Тёмная", - "themesNameDefault": "По умолчанию", - "themesNameLight": "Светлая", - "titleDownloadLink": "Скачать можно от сюда", - "total": "Всего", - "unzipRun": "Распаковывается...", - "waitingQueue": "В очереди" -} \ No newline at end of file diff --git a/kernel/translations/base.en.json b/kernel/translations/base.en.json deleted file mode 100644 index 3f5dd3d..0000000 --- a/kernel/translations/base.en.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "Advanced": "Advanced", - "Cancel": "Cancel", - "Confirm": "Confirm", - "Copy": "Copy", - "Create Folder": "Create Folder", - "Cut": "Cut", - "Enter filename": "Enter filename", - "Error": "Error", - "Favourites": "Favourites", - "File": "File", - "Folder": "Folder", - "New Folder": "New Folder", - "No": "No", - "OK": "OK", - "Open": "Open", - "Paste": "Paste", - "Quit": "Quit", - "Redo": "Redo", - "Save": "Save", - "Select all": "Select all", - "Show Hidden Files": "Show Hidden Files", - "Undo": "Undo", - "Yes": "Yes", - "file.name": { - "other": "Name" - }, - "file.parent": { - "other": "Parent" - }, - "friday": "Friday", - "friday.short": "Fri", - "monday": "Monday", - "monday.short": "Mon", - "saturday": "Saturday", - "saturday.short": "Sat", - "sunday": "Sunday", - "sunday.short": "Sun", - "thursday": "Thursday", - "thursday.short": "Thu", - "tuesday": "Tuesday", - "tuesday.short": "Tue", - "wednesday": "Wednesday", - "wednesday.short": "Wed" -} \ No newline at end of file diff --git a/kernel/translations/base.kk.json b/kernel/translations/base.kk.json deleted file mode 100644 index 469566b..0000000 --- a/kernel/translations/base.kk.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "Advanced": "Кеңейтілген", - "Cancel": "Бас тарту", - "Confirm": "Растау", - "Copy": "Көшіру", - "Create Folder": "Қалта жасау", - "Cut": "Кесу", - "Enter filename": "Файл атауын енгізіңіз", - "Error": "Қате", - "Favourites": "Таңдаулылар", - "File": "Файл", - "Folder": "Қалта", - "New Folder": "Жаңа қалта", - "No": "Жоқ", - "OK": "ОК", - "Open": "Ашу", - "Paste": "Кірістіру", - "Quit": "Шығу", - "Redo": "Қайталау", - "Save": "Сақтау", - "Select all": "Барлығын таңдаңыз", - "Show Hidden Files": "Жасырын файлдарды көрсету", - "Undo": "Бас тарту", - "Yes": "Иә", - "file.name": { - "other": "Аты" - }, - "file.parent": { - "other": "Жоғары" - }, - "friday": "Жұма", - "friday.short": "Жұ", - "monday": "Дүйсенбі", - "monday.short": "Дү", - "saturday": "Сенбі", - "saturday.short": "Сен", - "sunday": "Жексенбі", - "sunday.short": "Же", - "thursday": "Сейсенбі", - "thursday.short": "Се", - "tuesday": "Бейсенбі", - "tuesday.short": "Бе", - "wednesday": "Сәрсенбі", - "wednesday.short": "Сә" -} \ No newline at end of file diff --git a/kernel/translations/base.ru.json b/kernel/translations/base.ru.json deleted file mode 100644 index ac22058..0000000 --- a/kernel/translations/base.ru.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "Advanced": "Расширенные", - "Cancel": "Отмена", - "Confirm": "Подтвердить", - "Copy": "Копировать", - "Create Folder": "Создать папку", - "Cut": "Вырезать", - "Enter filename": "Введите имя файла", - "Error": "Ошибка", - "Favourites": "Избранное", - "File": "Файл", - "Folder": "Папка", - "New Folder": "Новая папка", - "No": "Нет", - "OK": "ОК", - "Open": "Открыть", - "Paste": "Вставить", - "Quit": "Выйти", - "Redo": "Повторить", - "Save": "Сохранить", - "Select all": "Выбрать всё", - "Show Hidden Files": "Показать скрытые файлы", - "Undo": "Отменить", - "Yes": "Да", - "file.name": { - "other": "Имя" - }, - "file.parent": { - "other": "Вверх" - }, - "friday": "Пятница", - "friday.short": "Пт", - "monday": "Понедельник", - "monday.short": "Пн", - "saturday": "Суббота", - "saturday.short": "Сб", - "sunday": "Воскресенье", - "sunday.short": "Вс", - "thursday": "Вторник", - "thursday.short": "Вт", - "tuesday": "Четверг", - "tuesday.short": "Чт", - "wednesday": "Среда", - "wednesday.short": "Ср" -} \ No newline at end of file diff --git a/kernel/window.go b/kernel/window.go deleted file mode 100644 index cec7b5b..0000000 --- a/kernel/window.go +++ /dev/null @@ -1,89 +0,0 @@ -package kernel - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/dialog" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/helper" - "time" -) - -type WindowContract interface { - SetContent(content fyne.CanvasObject) - SetMainMenu(menu *fyne.MainMenu) - NewFileOpen(callback func(fyne.URIReadCloser, error), location fyne.ListableURI) *dialog.FileDialog - NewFolderOpen(callback func(fyne.ListableURI, error), location fyne.ListableURI) *dialog.FileDialog - SetOnDropped(callback func(position fyne.Position, uris []fyne.URI)) - ShowAndRun() - GetLayout() LayoutContract -} - -type Window struct { - windowFyne fyne.Window - layout LayoutContract -} - -func newWindow(w fyne.Window, layout LayoutContract) Window { - windowSize := fyne.Size{Width: 1039, Height: 599} - w.Resize(windowSize) - w.CenterOnScreen() - - fyne.Do(func() { - /** - * Bug fixed. - * When starting the program, sometimes the window was displayed incorrectly. - */ - windowSize.Width += 1 - windowSize.Height += 1 - time.Sleep(time.Millisecond * 500) - w.Resize(windowSize) - }) - - return Window{ - windowFyne: w, - layout: layout, - } -} - -func (w Window) SetContent(content fyne.CanvasObject) { - fyne.Do(func() { - w.windowFyne.SetContent(w.layout.SetContent(content)) - }) -} - -func (w Window) NewFileOpen(callback func(fyne.URIReadCloser, error), location fyne.ListableURI) *dialog.FileDialog { - fileDialog := dialog.NewFileOpen(callback, w.windowFyne) - helper.FileDialogResize(fileDialog, w.windowFyne) - fileDialog.Show() - if location != nil { - fileDialog.SetLocation(location) - } - return fileDialog -} - -func (w Window) NewFolderOpen(callback func(fyne.ListableURI, error), location fyne.ListableURI) *dialog.FileDialog { - fileDialog := dialog.NewFolderOpen(callback, w.windowFyne) - helper.FileDialogResize(fileDialog, w.windowFyne) - fileDialog.Show() - if location != nil { - fileDialog.SetLocation(location) - } - return fileDialog -} - -func (w Window) SetMainMenu(menu *fyne.MainMenu) { - w.windowFyne.SetMainMenu(menu) -} - -func (w Window) ShowAndRun() { - w.windowFyne.ShowAndRun() -} - -func (w Window) GetLayout() LayoutContract { - return w.layout -} - -func (w Window) SetOnDropped(callback func(position fyne.Position, uris []fyne.URI)) { - fyne.Do(func() { - w.windowFyne.SetOnDropped(callback) - }) -} diff --git a/localizer/view.go b/localizer/view.go deleted file mode 100644 index 9233b6d..0000000 --- a/localizer/view.go +++ /dev/null @@ -1,69 +0,0 @@ -package localizer - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" -) - -type ViewContract interface { - LanguageSelection(funcSelected func(lang kernel.Lang)) -} - -type View struct { - app kernel.AppContract -} - -func NewView(app kernel.AppContract) *View { - return &View{ - app: app, - } -} - -func (v View) LanguageSelection(funcSelected func(lang kernel.Lang)) { - languages := v.app.GetLocalizerService().GetLanguages() - listView := widget.NewList( - func() int { - return len(languages) - }, - func() fyne.CanvasObject { - return widget.NewLabel("template") - }, - func(i widget.ListItemID, o fyne.CanvasObject) { - block := o.(*widget.Label) - block.SetText(languages[i].Title) - }) - listView.OnSelected = func(id widget.ListItemID) { - _ = v.app.GetLocalizerService().SetCurrentLanguage(languages[id], true) - funcSelected(languages[id]) - } - - messageHead := v.app.GetLocalizerService().GetMessage("languageSelectionHead") - v.app.GetWindow().SetContent(widget.NewCard(messageHead, "", listView)) -} - -func LanguageSelectionForm(localizerService kernel.LocalizerContract, funcSelected func(lang kernel.Lang)) fyne.CanvasObject { - languages := localizerService.GetLanguages() - currentLanguage := localizerService.GetCurrentLanguage() - listView := widget.NewList( - func() int { - return len(languages) - }, - func() fyne.CanvasObject { - return widget.NewLabel("template") - }, - func(i widget.ListItemID, o fyne.CanvasObject) { - block := o.(*widget.Label) - block.SetText(languages[i].Title) - if languages[i].Code == currentLanguage.Code { - block.TextStyle = fyne.TextStyle{Bold: true} - } - }) - listView.OnSelected = func(id widget.ListItemID) { - _ = localizerService.SetCurrentLanguage(languages[id], true) - funcSelected(languages[id]) - } - - messageHead := localizerService.GetMessage("languageSelectionFormHead") - return widget.NewCard(messageHead, "", listView) -} diff --git a/menu/view.go b/menu/view.go deleted file mode 100644 index be4b4f4..0000000 --- a/menu/view.go +++ /dev/null @@ -1,774 +0,0 @@ -package menu - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/theme" - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/internal/resources" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "golang.org/x/image/colornames" - "net/url" -) - -type ViewContract interface { - About(ffmpegVersion string, ffprobeVersion string, ffplayVersion string) - Gratitude() - HelpFFplay() -} - -type View struct { - app kernel.AppContract -} - -func NewView(app kernel.AppContract) *View { - return &View{ - app: app, - } -} - -func (v View) Gratitude() { - view := v.app.GetAppFyne().NewWindow(v.app.GetLocalizerService().GetMessage("gratitude")) - view.Resize(fyne.Size{Width: 500, Height: 400}) - view.SetFixedSize(true) - - image := canvas.NewImageFromResource(resources.IconAppLogoResource()) - image.SetMinSize(fyne.Size{Width: 100, Height: 100}) - image.FillMode = canvas.ImageFillContain - - gratitude := canvas.NewText(v.app.GetLocalizerService().GetMessage("gratitude"), colornames.Darkgreen) - gratitude.TextStyle = fyne.TextStyle{Bold: true} - gratitude.TextSize = 20 - - view.SetContent( - container.NewScroll(container.NewVBox( - container.NewBorder(nil, nil, container.NewVBox(image), nil, container.NewVBox( - gratitude, - widget.NewLabel(v.app.GetLocalizerService().GetMessage("gratitudeText")), - widget.NewLabel("Екатерина"), - widget.NewLabel("Евгений"), - )), - )), - ) - - view.CenterOnScreen() - view.Show() -} - -func (v View) About(ffmpegVersion string, ffprobeVersion string, ffplayVersion string) { - view := v.app.GetAppFyne().NewWindow(v.app.GetLocalizerService().GetMessage("about")) - view.Resize(fyne.Size{Width: 793, Height: 550}) - view.SetFixedSize(true) - - programmName := canvas.NewText(" GUI for FFmpeg", colornames.Darkgreen) - programmName.TextStyle = fyne.TextStyle{Bold: true} - programmName.TextSize = 20 - - programmLink := widget.NewHyperlink( - v.app.GetLocalizerService().GetMessage("programmLink"), - &url.URL{ - Scheme: "https", - Host: "gui-for-ffmpeg.projects.kor-elf.net", - Path: "/", - }, - ) - - licenseLink := widget.NewHyperlink( - v.app.GetLocalizerService().GetMessage("licenseLink"), - &url.URL{ - Scheme: "https", - Host: "git.kor-elf.net", - Path: "kor-elf/gui-for-ffmpeg/src/branch/main/LICENSE", - }, - ) - - licenseLinkOther := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage( - "licenseLinkOther"), - &url.URL{ - Scheme: "https", - Host: "git.kor-elf.net", - Path: "kor-elf/gui-for-ffmpeg/src/branch/main/LICENSE-3RD-PARTY.txt", - }, - ) - - programmVersion := widget.NewRichTextFromMarkdown( - v.app.GetLocalizerService().GetMessage( - "programmVersion", - map[string]any{"Version": v.app.GetAppFyne().Metadata().Version}, - ), - ) - - aboutText := widget.NewRichText( - &widget.TextSegment{ - Text: v.app.GetLocalizerService().GetMessage("aboutText"), - }, - ) - image := canvas.NewImageFromResource(resources.IconAppLogoResource()) - image.SetMinSize(fyne.Size{Width: 100, Height: 100}) - image.FillMode = canvas.ImageFillContain - - ffmpegTrademark := widget.NewRichTextFromMarkdown(v.app.GetLocalizerService().GetMessage("ffmpegTrademark")) - ffmpegLGPL := widget.NewRichTextFromMarkdown(v.app.GetLocalizerService().GetMessage("ffmpegLGPL")) - - view.SetContent( - container.NewScroll(container.NewVBox( - container.NewBorder(nil, nil, container.NewVBox(image), nil, container.NewVBox( - programmName, - programmVersion, - aboutText, - ffmpegTrademark, - ffmpegLGPL, - v.getCopyright(), - container.NewHBox(programmLink, licenseLink), - container.NewHBox(licenseLinkOther), - )), - v.getAboutFfmpeg(ffmpegVersion), - v.getAboutFfprobe(ffprobeVersion), - v.getAboutFfplay(ffplayVersion), - widget.NewCard(v.app.GetLocalizerService().GetMessage("AlsoUsedProgram"), "", v.getOther()), - )), - ) - view.CenterOnScreen() - view.Show() -} - -func (v View) HelpFFplay() { - view := v.app.GetAppFyne().NewWindow(v.app.GetLocalizerService().GetMessage("helpFFplay")) - view.Resize(fyne.Size{Width: 800, Height: 550}) - view.SetFixedSize(true) - - data := [][]string{ - []string{ - v.app.GetLocalizerService().GetMessage("helpFFplayKeys"), - v.app.GetLocalizerService().GetMessage("helpFFplayDescription"), - }, - []string{ - "Q, ESC", - v.app.GetLocalizerService().GetMessage("helpFFplayQuit"), - }, - []string{ - "F, " + v.app.GetLocalizerService().GetMessage("helpFFplayDoubleClickLeftMouseButton"), - v.app.GetLocalizerService().GetMessage("helpFFplayToggleFullScreen"), - }, - []string{ - "P, " + - v.app.GetLocalizerService().GetMessage("helpFFplayKeySpace"), - v.app.GetLocalizerService().GetMessage("helpFFplayPause"), - }, - []string{ - "M", - v.app.GetLocalizerService().GetMessage("helpFFplayToggleMute"), - }, - []string{ - "9, /", - v.app.GetLocalizerService().GetMessage("helpFFplayDecreaseVolume"), - }, - []string{ - "0, *", - v.app.GetLocalizerService().GetMessage("helpFFplayIncreaseVolume"), - }, - []string{ - v.app.GetLocalizerService().GetMessage("helpFFplayKeyLeft"), - v.app.GetLocalizerService().GetMessage("helpFFplaySeekBackward10Seconds"), - }, - []string{ - v.app.GetLocalizerService().GetMessage("helpFFplayKeyRight"), - v.app.GetLocalizerService().GetMessage("helpFFplaySeekForward10Seconds"), - }, - []string{ - v.app.GetLocalizerService().GetMessage("helpFFplayKeyDown"), - v.app.GetLocalizerService().GetMessage("helpFFplaySeekBackward1Minute"), - }, - []string{ - v.app.GetLocalizerService().GetMessage("helpFFplayKeyUp"), - v.app.GetLocalizerService().GetMessage("helpFFplaySeekBForward1Minute"), - }, - []string{ - "Page Down", - v.app.GetLocalizerService().GetMessage("helpFFplaySeekBackward10Minutes"), - }, - []string{ - "Page Up", - v.app.GetLocalizerService().GetMessage("helpFFplaySeekBForward10Minutes"), - }, - []string{ - "S, " + v.app.GetLocalizerService().GetMessage("helpFFplayKeyHoldS"), - v.app.GetLocalizerService().GetMessage("helpFFplayActivateFrameStepMode"), - }, - []string{ - "W", - v.app.GetLocalizerService().GetMessage("helpFFplayCycleVideoFiltersOrShowModes"), - }, - } - - list := widget.NewTable( - func() (int, int) { - return len(data), len(data[0]) - }, - func() fyne.CanvasObject { - return widget.NewLabel("") - }, - func(i widget.TableCellID, o fyne.CanvasObject) { - if i.Row == 0 { - o.(*widget.Label).TextStyle.Bold = true - o.(*widget.Label).SizeName = theme.SizeNameSubHeadingText - } - if i.Col == 0 { - o.(*widget.Label).TextStyle.Bold = true - } - o.(*widget.Label).SetText(data[i.Row][i.Col]) - }) - list.SetRowHeight(0, 40) - list.SetColumnWidth(0, 200) - list.SetColumnWidth(1, 585) - list.SetRowHeight(2, 55) - view.SetContent( - container.NewScroll(list), - ) - view.CenterOnScreen() - view.Show() -} - -func (v View) getCopyright() *widget.RichText { - return widget.NewRichTextFromMarkdown("Copyright (c) 2024 **[Leonid Nikitin (kor-elf)](https://git.kor-elf.net/kor-elf/)**.") -} - -func (v View) getAboutFfmpeg(version string) *fyne.Container { - programmName := canvas.NewText(" FFmpeg", colornames.Darkgreen) - programmName.TextStyle = fyne.TextStyle{Bold: true} - programmName.TextSize = 20 - - programmLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage("programmLink"), &url.URL{ - Scheme: "https", - Host: "ffmpeg.org", - Path: "", - }) - - licenseLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage("licenseLink"), &url.URL{ - Scheme: "https", - Host: "ffmpeg.org", - Path: "legal.html", - }) - - return container.NewVBox( - programmName, - widget.NewLabel(version), - widget.NewRichTextFromMarkdown("**FFmpeg** is a trademark of **[Fabrice Bellard](http://bellard.org/)**, originator of the **[FFmpeg](https://ffmpeg.org/about.html)** project."), - widget.NewRichTextFromMarkdown("This software uses libraries from the **FFmpeg** project under the **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**."), - container.NewHBox(programmLink, licenseLink), - ) -} - -func (v View) getAboutFfprobe(version string) *fyne.Container { - programmName := canvas.NewText(" FFprobe", colornames.Darkgreen) - programmName.TextStyle = fyne.TextStyle{Bold: true} - programmName.TextSize = 20 - - programmLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage("programmLink"), &url.URL{ - Scheme: "https", - Host: "ffmpeg.org", - Path: "ffprobe.html", - }) - - licenseLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage("licenseLink"), &url.URL{ - Scheme: "https", - Host: "ffmpeg.org", - Path: "legal.html", - }) - - return container.NewVBox( - programmName, - widget.NewLabel(version), - widget.NewRichTextFromMarkdown("**FFmpeg** is a trademark of **[Fabrice Bellard](http://bellard.org/)**, originator of the **[FFmpeg](https://ffmpeg.org/about.html)** project."), - widget.NewRichTextFromMarkdown("This software uses libraries from the **FFmpeg** project under the **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**."), - container.NewHBox(programmLink, licenseLink), - ) -} - -func (v View) getAboutFfplay(version string) *fyne.Container { - programmName := canvas.NewText(" FFplay", colornames.Darkgreen) - programmName.TextStyle = fyne.TextStyle{Bold: true} - programmName.TextSize = 20 - - programmLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage("programmLink"), &url.URL{ - Scheme: "https", - Host: "ffmpeg.org", - Path: "ffplay.html", - }) - - licenseLink := widget.NewHyperlink(v.app.GetLocalizerService().GetMessage("licenseLink"), &url.URL{ - Scheme: "https", - Host: "ffmpeg.org", - Path: "legal.html", - }) - - return container.NewVBox( - programmName, - widget.NewLabel(version), - widget.NewRichTextFromMarkdown("**FFmpeg** is a trademark of **[Fabrice Bellard](http://bellard.org/)**, originator of the **[FFmpeg](https://ffmpeg.org/about.html)** project."), - widget.NewRichTextFromMarkdown("This software uses libraries from the **FFmpeg** project under the **[LGPLv2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)**."), - container.NewHBox(programmLink, licenseLink), - ) -} - -func (v View) getOther() *fyne.Container { - return container.NewVBox( - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("fyne.io/fyne/v2", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fyne-io/fyne", - })), - container.NewHBox(widget.NewHyperlink("BSD 3-Clause License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fyne-io/fyne/blob/master/LICENSE", - })), - widget.NewRichTextFromMarkdown("Copyright (C) 2018 Fyne.io developers (see [AUTHORS](https://github.com/fyne-io/fyne/blob/master/AUTHORS))"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("fyne.io/systray", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fyne-io/systray", - })), - container.NewHBox(widget.NewHyperlink("Apache License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fyne-io/systray/blob/master/LICENSE", - })), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/BurntSushi/toml", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "BurntSushi/toml", - })), - container.NewHBox(widget.NewHyperlink("The MIT License (MIT)", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "BurntSushi/toml/blob/master/COPYING", - })), - widget.NewLabel("Copyright (c) 2013 TOML authors"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/davecgh/go-spew", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "davecgh/go-spew", - })), - container.NewHBox(widget.NewHyperlink("ISC License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "davecgh/go-spew/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2012-2016 Dave Collins "), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/fredbi/uri", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fredbi/uri", - })), - container.NewHBox(widget.NewHyperlink("The MIT License (MIT)", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fredbi/uri/blob/master/LICENSE.md", - })), - widget.NewLabel("Copyright (c) 2018 Frederic Bidon"), - widget.NewLabel("Copyright (c) 2015 Trey Tacon"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/fsnotify/fsnotify", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fsnotify/fsnotify", - })), - container.NewHBox(widget.NewHyperlink("BSD-3-Clause license", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fsnotify/fsnotify/blob/main/LICENSE", - })), - widget.NewLabel("Copyright © 2012 The Go Authors. All rights reserved."), - widget.NewLabel("Copyright © fsnotify Authors. All rights reserved."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/fyne-io/gl-js", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fyne-io/gl-js", - })), - container.NewHBox(widget.NewHyperlink("BSD-3-Clause license", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fyne-io/gl-js/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2009 The Go Authors. All rights reserved."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/fyne-io/glfw-js", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fyne-io/glfw-js", - })), - container.NewHBox(widget.NewHyperlink("MIT License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fyne-io/glfw-js/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2014 Dmitri Shuralyov"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/fyne-io/image", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fyne-io/image", - })), - container.NewHBox(widget.NewHyperlink("BSD 3-Clause License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fyne-io/image/blob/main/LICENSE", - })), - widget.NewLabel("Copyright (c) 2022, Fyne.io"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/fyne-io/oksvg", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fyne-io/oksvg", - })), - container.NewHBox(widget.NewHyperlink("BSD 3-Clause License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "fyne-io/oksvg/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2018, Steven R Wiley. All rights reserved."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/go-gl/gl", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "go-gl/gl", - })), - container.NewHBox(widget.NewHyperlink("The MIT License (MIT)", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "go-gl/gl/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2014 Eric Woroshow"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/go-gl/glfw/v3.3/glfw", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "go-gl/glfw/", - })), - container.NewHBox(widget.NewHyperlink("BSD-3-Clause license", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "go-gl/glfw/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2012 The glfw3-go Authors. All rights reserved."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/go-text/render", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "go-text/render", - })), - container.NewHBox(widget.NewHyperlink("Unlicense OR BSD-3-Clause", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "go-text/render/blob/main/LICENSE", - })), - widget.NewLabel("Copyright 2021 The go-text authors"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/go-text/typesetting", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "go-text/typesetting", - })), - container.NewHBox(widget.NewHyperlink("Unlicense OR BSD-3-Clause", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "go-text/typesetting/blob/main/LICENSE", - })), - widget.NewLabel("Copyright 2021 The go-text authors"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/godbus/dbus/v5", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "godbus/dbus", - })), - container.NewHBox(widget.NewHyperlink("BSD 2-Clause \"Simplified\" License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "godbus/dbus/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2013, Georg Reinke (), Google. All rights reserved."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/hack-pad/go-indexeddb", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "hack-pad/go-indexeddb", - })), - container.NewHBox(widget.NewHyperlink("Apache License 2.0", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "hack-pad/go-indexeddb/blob/main/LICENSE", - })), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/hack-pad/safejs", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "hack-pad/safejs", - })), - container.NewHBox(widget.NewHyperlink("Apache License 2.0", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "hack-pad/safejs/blob/main/LICENSE", - })), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/jeandeaual/go-locale", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "jeandeaual/go-locale", - })), - container.NewHBox(widget.NewHyperlink("MIT License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "jeandeaual/go-locale/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2020 Alexis Jeandeau"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/jsummers/gobmp", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "jsummers/gobmp", - })), - container.NewHBox(widget.NewHyperlink("The MIT License (MIT)", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "jsummers/gobmp/blob/master/COPYING.txt", - })), - widget.NewLabel("Copyright (c) 2012-2015 Jason Summers"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/nfnt/resize", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "nfnt/resize", - })), - container.NewHBox(widget.NewHyperlink("ISC License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "nfnt/resize/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2012, Jan Schlicht "), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/nicksnyder/go-i18n/v2", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "nicksnyder/go-i18n", - })), - container.NewHBox(widget.NewHyperlink("The MIT License (MIT)", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "nicksnyder/go-i18n/blob/main/LICENSE", - })), - widget.NewRichTextFromMarkdown("Copyright (c) 2014 Nick Snyder [https://github.com/nicksnyder](https://github.com/nicksnyder)"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/pmezard/go-difflib", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "pmezard/go-difflib", - })), - container.NewHBox(widget.NewHyperlink("License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "pmezard/go-difflib/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2013, Patrick Mezard. All rights reserved."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/rymdport/portal", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "rymdport/portal", - })), - container.NewHBox(widget.NewHyperlink("Apache License 2.0", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "rymdport/portal/blob/main/LICENSE", - })), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/srwiley/oksvg", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "srwiley/oksvg", - })), - container.NewHBox(widget.NewHyperlink("BSD 3-Clause License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "srwiley/oksvg/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2018, Steven R Wiley. All rights reserved."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/srwiley/rasterx", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "srwiley/rasterx", - })), - container.NewHBox(widget.NewHyperlink("BSD 3-Clause License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "srwiley/rasterx/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2018, Steven R Wiley. All rights reserved."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/stretchr/testify", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "stretchr/testify", - })), - container.NewHBox(widget.NewHyperlink("MIT License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "stretchr/testify/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2012-2020 Mat Ryer, Tyler Bunnell and contributors."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/ulikunitz/xz", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "ulikunitz/xz", - })), - container.NewHBox(widget.NewHyperlink("License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "ulikunitz/xz/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2014-2022 Ulrich Kunitz. All rights reserved."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/yuin/goldmark", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "yuin/goldmark", - })), - container.NewHBox(widget.NewHyperlink("MIT License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "yuin/goldmark/blob/master/LICENSE", - })), - widget.NewLabel("Copyright (c) 2019 Yusuke Inuzuka"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("go.etcd.io/bbolt", &url.URL{ - Scheme: "https", - Host: "pkg.go.dev", - Path: "go.etcd.io/bbolt", - })), - container.NewHBox(widget.NewHyperlink("MIT License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "etcd-io/bbolt/blob/main/LICENSE", - })), - widget.NewLabel("Copyright (c) 2013 Ben Johnson"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("golang.org/x/image", &url.URL{ - Scheme: "https", - Host: "pkg.go.dev", - Path: "golang.org/x/image", - })), - container.NewHBox(widget.NewHyperlink("License", &url.URL{ - Scheme: "https", - Host: "cs.opensource.google", - Path: "go/x/image/+/master:LICENSE", - })), - widget.NewLabel("Copyright 2009 The Go Authors."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("golang.org/x/net", &url.URL{ - Scheme: "https", - Host: "pkg.go.dev", - Path: "golang.org/x/net", - })), - container.NewHBox(widget.NewHyperlink("License", &url.URL{ - Scheme: "https", - Host: "cs.opensource.google", - Path: "go/x/net/+/master:LICENSE", - })), - widget.NewLabel("Copyright 2009 The Go Authors."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("golang.org/x/sys", &url.URL{ - Scheme: "https", - Host: "pkg.go.dev", - Path: "golang.org/x/sys", - })), - container.NewHBox(widget.NewHyperlink("License", &url.URL{ - Scheme: "https", - Host: "cs.opensource.google", - Path: "go/x/sys/+/master:LICENSE", - })), - widget.NewLabel("Copyright 2009 The Go Authors."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("golang.org/x/text", &url.URL{ - Scheme: "https", - Host: "pkg.go.dev", - Path: "golang.org/x/text", - })), - container.NewHBox(widget.NewHyperlink("License", &url.URL{ - Scheme: "https", - Host: "cs.opensource.google", - Path: "go/x/text/+/master:LICENSE", - })), - widget.NewLabel("Copyright 2009 The Go Authors."), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("gopkg.in/yaml.v3", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "go-yaml/yaml/tree/v3.0.1", - })), - container.NewHBox(widget.NewHyperlink("MIT License and Apache License 2.0", &url.URL{ - Scheme: "http", - Host: "github.com", - Path: "go-yaml/yaml/blob/v3.0.1/LICENSE", - })), - widget.NewLabel("Copyright (c) 2006-2010 Kirill Simonov"), - widget.NewLabel("Copyright (c) 2006-2011 Kirill Simonov"), - widget.NewLabel("Copyright (c) 2011-2019 Canonical Ltd"), - canvas.NewLine(colornames.Darkgreen), - - container.NewHBox(widget.NewHyperlink("github.com/golang/go", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "golang/go", - })), - container.NewHBox(widget.NewHyperlink("BSD 3-Clause \"New\" or \"Revised\" License", &url.URL{ - Scheme: "https", - Host: "github.com", - Path: "golang/go/blob/master/LICENSE", - })), - widget.NewLabel("Copyright 2009 The Go Authors."), - canvas.NewLine(colornames.Darkgreen), - ) -} diff --git a/menu/view_setting.go b/menu/view_setting.go deleted file mode 100644 index 02e7fbd..0000000 --- a/menu/view_setting.go +++ /dev/null @@ -1,101 +0,0 @@ -package menu - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/widget" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/theme" - "image/color" -) - -type ViewSettingContract interface { - Main( - save func(*SettingForm) error, - cancel func(), - ) -} - -type SettingForm struct { - Language kernel.Lang - ThemeInfo theme.ThemeInfoContract -} - -type ViewSetting struct { - app kernel.AppContract - themeService theme.ThemeContract -} - -func NewViewSetting(app kernel.AppContract, themeService theme.ThemeContract) *ViewSetting { - return &ViewSetting{ - app: app, - themeService: themeService, - } -} - -func (v ViewSetting) Main(save func(*SettingForm) error, cancel func()) { - errorMessage := canvas.NewText("", color.RGBA{R: 255, G: 0, B: 0, A: 255}) - errorMessage.TextSize = 16 - errorMessage.TextStyle = fyne.TextStyle{Bold: true} - - viewSettingForm := &SettingForm{ - Language: v.app.GetLocalizerService().GetCurrentLanguage(), - ThemeInfo: v.themeService.GetCurrentThemeInfo(), - } - - languageItems := []string{} - langByTitle := map[string]kernel.Lang{} - for _, language := range v.app.GetLocalizerService().GetLanguages() { - languageItems = append(languageItems, language.Title) - langByTitle[language.Title] = language - } - selectLanguage := widget.NewSelect(languageItems, func(s string) { - if lang, ok := langByTitle[s]; ok { - viewSettingForm.Language = lang - } - }) - selectLanguage.Selected = v.app.GetLocalizerService().GetCurrentLanguage().Title - - themeItems := []string{} - themeByTitle := map[string]theme.ThemeInfoContract{} - for _, themeInfo := range v.themeService.List() { - themeItems = append(themeItems, themeInfo.GetTitle()) - themeByTitle[themeInfo.GetTitle()] = themeInfo - } - selectTheme := widget.NewSelect(themeItems, func(s string) { - if themeInfo, ok := themeByTitle[s]; ok { - viewSettingForm.ThemeInfo = themeInfo - } - }) - selectTheme.Selected = v.themeService.GetCurrentThemeInfo().GetTitle() - - form := &widget.Form{ - Items: []*widget.FormItem{ - { - Text: v.app.GetLocalizerService().GetMessage("menuSettingsLanguage"), - Widget: selectLanguage, - }, - { - Text: v.app.GetLocalizerService().GetMessage("menuSettingsTheme"), - Widget: selectTheme, - }, - { - Widget: errorMessage, - }, - }, - SubmitText: v.app.GetLocalizerService().GetMessage("save"), - OnSubmit: func() { - err := save(viewSettingForm) - if err != nil { - errorMessage.Text = err.Error() - } - }, - } - if cancel != nil { - form.OnCancel = cancel - form.CancelText = v.app.GetLocalizerService().GetMessage("cancel") - } - - messageHead := v.app.GetLocalizerService().GetMessage("settings") - v.app.GetWindow().SetContent(widget.NewCard(messageHead, "", form)) -} diff --git a/setting/directory_for_saving.go b/setting/directory_for_saving.go deleted file mode 100644 index c77fde5..0000000 --- a/setting/directory_for_saving.go +++ /dev/null @@ -1,22 +0,0 @@ -package setting - -type DirectoryForSavingContract interface { - GetDirectoryForSaving() string - SaveDirectoryForSaving(path string) Setting -} - -type DirectoryForSaving struct { - settingRepository RepositoryContract -} - -func NewSettingDirectoryForSaving(settingRepository RepositoryContract) *DirectoryForSaving { - return &DirectoryForSaving{settingRepository: settingRepository} -} - -func (setting DirectoryForSaving) GetDirectoryForSaving() string { - return setting.settingRepository.GetValue("directoryForSaving") -} - -func (setting DirectoryForSaving) SaveDirectoryForSaving(path string) Setting { - return setting.settingRepository.CreateOrUpdate("directoryForSaving", path) -} diff --git a/setting/entity.go b/setting/entity.go deleted file mode 100644 index d0c8384..0000000 --- a/setting/entity.go +++ /dev/null @@ -1,6 +0,0 @@ -package setting - -type Setting struct { - Code string - Value string -} diff --git a/setting/repository.go b/setting/repository.go deleted file mode 100644 index 9365670..0000000 --- a/setting/repository.go +++ /dev/null @@ -1,39 +0,0 @@ -package setting - -import ( - "fyne.io/fyne/v2" -) - -type RepositoryContract interface { - Create(setting Setting) Setting - CreateOrUpdate(code string, value string) Setting - GetValue(code string) string -} - -type Repository struct { - app fyne.App -} - -func NewRepository(app fyne.App) *Repository { - return &Repository{ - app: app, - } -} - -func (r Repository) GetValue(code string) string { - return r.app.Preferences().String(code) -} - -func (r Repository) Create(setting Setting) Setting { - r.app.Preferences().SetString(setting.Code, setting.Value) - return setting -} - -func (r Repository) CreateOrUpdate(code string, value string) Setting { - var setting Setting - setting.Code = code - setting.Value = value - - r.app.Preferences().SetString(code, value) - return setting -} diff --git a/theme/repository.go b/theme/repository.go deleted file mode 100644 index 797527b..0000000 --- a/theme/repository.go +++ /dev/null @@ -1,28 +0,0 @@ -package theme - -import "git.kor-elf.net/kor-elf/gui-for-ffmpeg/setting" - -type RepositoryContract interface { - GetCode() string - Save(code string) setting.Setting -} - -type Repository struct { - settingRepository setting.RepositoryContract -} - -func NewRepository(settingRepository setting.RepositoryContract) *Repository { - return &Repository{settingRepository: settingRepository} -} - -func (r Repository) GetCode() string { - name := r.settingRepository.GetValue("theme") - if len(name) == 0 { - return "default" - } - return name -} - -func (r Repository) Save(code string) setting.Setting { - return r.settingRepository.CreateOrUpdate("theme", code) -} diff --git a/theme/theme.go b/theme/theme.go deleted file mode 100644 index 1b4aa8b..0000000 --- a/theme/theme.go +++ /dev/null @@ -1,148 +0,0 @@ -package theme - -import ( - "fyne.io/fyne/v2" - fyneTheme "fyne.io/fyne/v2/theme" - "git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel" - "image/color" -) - -type ThemeContract interface { - List() map[string]ThemeInfoContract - GetCurrentThemeInfo() ThemeInfoContract - SetCurrentTheme(themeInfo ThemeInfoContract) error -} - -type theme struct { - app kernel.AppContract - repository RepositoryContract - list map[string]ThemeInfoContract -} - -func NewTheme(app kernel.AppContract, repository RepositoryContract) ThemeContract { - theme := &theme{ - app: app, - repository: repository, - list: getThemes(app.GetLocalizerService()), - } - - theme.init() - - return theme -} - -func (t theme) init() { - themeInfo := t.GetCurrentThemeInfo() - if themeInfo.GetName() == "default" { - t.app.GetAppFyne().Settings().SetTheme(fyneTheme.DefaultTheme()) - return - } - t.app.GetAppFyne().Settings().SetTheme(&forcedVariant{theme: fyneTheme.DefaultTheme(), variant: themeInfo.GetVariant()}) -} - -func (t theme) GetCurrentThemeInfo() ThemeInfoContract { - themes := t.List() - if themeInfo, ok := themes[t.repository.GetCode()]; ok { - return themeInfo - } - - return themes["default"] -} - -func (t theme) List() map[string]ThemeInfoContract { - return t.list -} - -func (t theme) SetCurrentTheme(themeInfo ThemeInfoContract) error { - _ = t.repository.Save(themeInfo.GetName()) - - if themeInfo.GetName() == "default" { - t.app.GetAppFyne().Settings().SetTheme(fyneTheme.DefaultTheme()) - return nil - } - t.app.GetAppFyne().Settings().SetTheme(&forcedVariant{theme: fyneTheme.DefaultTheme(), variant: themeInfo.GetVariant()}) - - return nil -} - -type ThemeInfoContract interface { - GetName() string - GetTitle() string - GetVariant() fyne.ThemeVariant -} - -type themeInfo struct { - name string - title string - variant fyne.ThemeVariant -} - -func (inf themeInfo) GetName() string { - return inf.name -} - -func (inf themeInfo) GetTitle() string { - return inf.title -} - -func (inf themeInfo) GetVariant() fyne.ThemeVariant { - return inf.variant -} - -func getThemes(localizer kernel.LocalizerContract) map[string]ThemeInfoContract { - themesNameDefault := &themeInfo{ - name: "default", - title: localizer.GetMessage("themesNameDefault"), - } - - themesNameLight := &themeInfo{ - name: "light", - title: localizer.GetMessage("themesNameLight"), - variant: fyneTheme.VariantLight, - } - - themesNameDark := &themeInfo{ - name: "dark", - title: localizer.GetMessage("themesNameDark"), - variant: fyneTheme.VariantDark, - } - - list := map[string]ThemeInfoContract{ - "default": themesNameDefault, - "light": themesNameLight, - "dark": themesNameDark, - } - - localizer.AddChangeCallback("themesNameDefault", func(text string) { - themesNameDefault.title = text - }) - localizer.AddChangeCallback("themesNameLight", func(text string) { - themesNameLight.title = text - }) - localizer.AddChangeCallback("themesNameDark", func(text string) { - themesNameDark.title = text - }) - - return list -} - -type forcedVariant struct { - theme fyne.Theme - variant fyne.ThemeVariant -} - -func (f *forcedVariant) Color(name fyne.ThemeColorName, _ fyne.ThemeVariant) color.Color { - return f.theme.Color(name, f.variant) -} - -func (f *forcedVariant) Font(style fyne.TextStyle) fyne.Resource { - return fyneTheme.DefaultTheme().Font(style) -} - -func (f *forcedVariant) Icon(name fyne.ThemeIconName) fyne.Resource { - return fyneTheme.DefaultTheme().Icon(name) -} - -func (f *forcedVariant) Size(name fyne.ThemeSizeName) float32 { - return fyneTheme.DefaultTheme().Size(name) -}