Compare commits
11 Commits
0.1.1
...
d86c0d37af
Author | SHA1 | Date | |
---|---|---|---|
d86c0d37af
|
|||
f09dd01b6d
|
|||
6358d5d8cc
|
|||
5025807b14
|
|||
f3e034356b
|
|||
6f0bbf7e29
|
|||
3c563d1966
|
|||
6df775955f
|
|||
d68382e418
|
|||
846986279c
|
|||
adf9bc9c27
|
@@ -2,11 +2,14 @@ package convertor
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"ffmpegGui/helper"
|
||||||
|
"ffmpegGui/localizer"
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
"fyne.io/fyne/v2/canvas"
|
"fyne.io/fyne/v2/canvas"
|
||||||
"fyne.io/fyne/v2/container"
|
"fyne.io/fyne/v2/container"
|
||||||
"fyne.io/fyne/v2/dialog"
|
"fyne.io/fyne/v2/dialog"
|
||||||
"fyne.io/fyne/v2/widget"
|
"fyne.io/fyne/v2/widget"
|
||||||
|
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||||
"image/color"
|
"image/color"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -14,10 +17,14 @@ type ViewContract interface {
|
|||||||
Main(
|
Main(
|
||||||
runConvert func(setting HandleConvertSetting, progressbar *widget.ProgressBar) error,
|
runConvert func(setting HandleConvertSetting, progressbar *widget.ProgressBar) error,
|
||||||
)
|
)
|
||||||
|
SelectFFPath(
|
||||||
|
func(ffmpegPath string, ffprobePath string) error,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
type View struct {
|
type View struct {
|
||||||
w fyne.Window
|
w fyne.Window
|
||||||
|
localizerService localizer.ServiceContract
|
||||||
}
|
}
|
||||||
|
|
||||||
type HandleConvertSetting struct {
|
type HandleConvertSetting struct {
|
||||||
@@ -32,8 +39,11 @@ type enableFormConversionStruct struct {
|
|||||||
form *widget.Form
|
form *widget.Form
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewView(w fyne.Window) *View {
|
func NewView(w fyne.Window, localizerService localizer.ServiceContract) *View {
|
||||||
return &View{w}
|
return &View{
|
||||||
|
w: w,
|
||||||
|
localizerService: localizerService,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v View) Main(
|
func (v View) Main(
|
||||||
@@ -51,18 +61,35 @@ func (v View) Main(
|
|||||||
buttonForSelectedDir, buttonForSelectedDirMessage, pathToSaveDirectory := v.getButtonForSelectingDirectoryForSaving()
|
buttonForSelectedDir, buttonForSelectedDirMessage, pathToSaveDirectory := v.getButtonForSelectingDirectoryForSaving()
|
||||||
|
|
||||||
isOverwriteOutputFiles := false
|
isOverwriteOutputFiles := false
|
||||||
checkboxOverwriteOutputFiles := widget.NewCheck("Разрешить перезаписать файл", func(b bool) {
|
checkboxOverwriteOutputFilesTitle := v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "checkboxOverwriteOutputFilesTitle",
|
||||||
|
})
|
||||||
|
checkboxOverwriteOutputFiles := widget.NewCheck(checkboxOverwriteOutputFilesTitle, func(b bool) {
|
||||||
isOverwriteOutputFiles = b
|
isOverwriteOutputFiles = b
|
||||||
})
|
})
|
||||||
|
|
||||||
form.Items = []*widget.FormItem{
|
form.Items = []*widget.FormItem{
|
||||||
{Text: "Файл для ковертации:", Widget: fileVideoForConversion},
|
{
|
||||||
{Widget: fileVideoForConversionMessage},
|
Text: v.localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: "fileVideoForConversionTitle"}),
|
||||||
{Text: "Папка куда будет сохраняться:", Widget: buttonForSelectedDir},
|
Widget: fileVideoForConversion,
|
||||||
{Widget: buttonForSelectedDirMessage},
|
},
|
||||||
{Widget: checkboxOverwriteOutputFiles},
|
{
|
||||||
|
Widget: fileVideoForConversionMessage,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Text: v.localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: "buttonForSelectedDirTitle"}),
|
||||||
|
Widget: buttonForSelectedDir,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Widget: buttonForSelectedDirMessage,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Widget: checkboxOverwriteOutputFiles,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
form.SubmitText = "Конвертировать"
|
form.SubmitText = v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "converterVideoFilesSubmitTitle",
|
||||||
|
})
|
||||||
|
|
||||||
enableFormConversionStruct := enableFormConversionStruct{
|
enableFormConversionStruct := enableFormConversionStruct{
|
||||||
fileVideoForConversion: fileVideoForConversion,
|
fileVideoForConversion: fileVideoForConversion,
|
||||||
@@ -72,7 +99,9 @@ func (v View) Main(
|
|||||||
|
|
||||||
form.OnSubmit = func() {
|
form.OnSubmit = func() {
|
||||||
if len(*pathToSaveDirectory) == 0 {
|
if len(*pathToSaveDirectory) == 0 {
|
||||||
showConversionMessage(conversionMessage, errors.New("Не выбрали папку для сохранения!"))
|
showConversionMessage(conversionMessage, errors.New(v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "errorSelectedFolderSave",
|
||||||
|
})))
|
||||||
enableFormConversion(enableFormConversionStruct)
|
enableFormConversion(enableFormConversionStruct)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -96,7 +125,10 @@ func (v View) Main(
|
|||||||
enableFormConversion(enableFormConversionStruct)
|
enableFormConversion(enableFormConversionStruct)
|
||||||
}
|
}
|
||||||
|
|
||||||
v.w.SetContent(widget.NewCard("Конвертор видео файлов в mp4", "", container.NewVBox(form, conversionMessage, progress)))
|
converterVideoFilesTitle := v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "converterVideoFilesTitle",
|
||||||
|
})
|
||||||
|
v.w.SetContent(widget.NewCard(converterVideoFilesTitle, "", container.NewVBox(form, conversionMessage, progress)))
|
||||||
form.Disable()
|
form.Disable()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,7 +139,11 @@ func (v View) getButtonFileVideoForConversion(form *widget.Form, progress *widge
|
|||||||
fileVideoForConversionMessage.TextSize = 16
|
fileVideoForConversionMessage.TextSize = 16
|
||||||
fileVideoForConversionMessage.TextStyle = fyne.TextStyle{Bold: true}
|
fileVideoForConversionMessage.TextStyle = fyne.TextStyle{Bold: true}
|
||||||
|
|
||||||
button := widget.NewButton("выбрать", func() {
|
buttonTitle := v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "choose",
|
||||||
|
})
|
||||||
|
|
||||||
|
button := widget.NewButton(buttonTitle, func() {
|
||||||
fileDialog := dialog.NewFileOpen(
|
fileDialog := dialog.NewFileOpen(
|
||||||
func(r fyne.URIReadCloser, err error) {
|
func(r fyne.URIReadCloser, err error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -131,6 +167,7 @@ func (v View) getButtonFileVideoForConversion(form *widget.Form, progress *widge
|
|||||||
progress.Refresh()
|
progress.Refresh()
|
||||||
conversionMessage.Text = ""
|
conversionMessage.Text = ""
|
||||||
}, v.w)
|
}, v.w)
|
||||||
|
helper.FileDialogResize(fileDialog, v.w)
|
||||||
fileDialog.Show()
|
fileDialog.Show()
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -145,7 +182,11 @@ func (v View) getButtonForSelectingDirectoryForSaving() (button *widget.Button,
|
|||||||
path := ""
|
path := ""
|
||||||
dirPath = &path
|
dirPath = &path
|
||||||
|
|
||||||
button = widget.NewButton("выбрать", func() {
|
buttonTitle := v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "choose",
|
||||||
|
})
|
||||||
|
|
||||||
|
button = widget.NewButton(buttonTitle, func() {
|
||||||
fileDialog := dialog.NewFolderOpen(
|
fileDialog := dialog.NewFolderOpen(
|
||||||
func(r fyne.ListableURI, err error) {
|
func(r fyne.ListableURI, err error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -162,6 +203,7 @@ func (v View) getButtonForSelectingDirectoryForSaving() (button *widget.Button,
|
|||||||
buttonMessage.Text = r.Path()
|
buttonMessage.Text = r.Path()
|
||||||
setStringSuccessStyle(buttonMessage)
|
setStringSuccessStyle(buttonMessage)
|
||||||
}, v.w)
|
}, v.w)
|
||||||
|
helper.FileDialogResize(fileDialog, v.w)
|
||||||
fileDialog.Show()
|
fileDialog.Show()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@@ -1,27 +1,17 @@
|
|||||||
package setting
|
package convertor
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"ffmpegGui/helper"
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
"fyne.io/fyne/v2/canvas"
|
"fyne.io/fyne/v2/canvas"
|
||||||
"fyne.io/fyne/v2/container"
|
"fyne.io/fyne/v2/container"
|
||||||
"fyne.io/fyne/v2/dialog"
|
"fyne.io/fyne/v2/dialog"
|
||||||
"fyne.io/fyne/v2/widget"
|
"fyne.io/fyne/v2/widget"
|
||||||
|
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||||
"image/color"
|
"image/color"
|
||||||
"net/url"
|
"net/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ViewContract interface {
|
|
||||||
SelectFFPath(func(ffmpegPath string, ffprobePath string) error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type View struct {
|
|
||||||
w fyne.Window
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewView(w fyne.Window) *View {
|
|
||||||
return &View{w}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v View) SelectFFPath(save func(ffmpegPath string, ffprobePath string) error) {
|
func (v View) SelectFFPath(save func(ffmpegPath string, ffprobePath string) error) {
|
||||||
errorMessage := canvas.NewText("", color.RGBA{255, 0, 0, 255})
|
errorMessage := canvas.NewText("", color.RGBA{255, 0, 0, 255})
|
||||||
errorMessage.TextSize = 16
|
errorMessage.TextSize = 16
|
||||||
@@ -38,14 +28,37 @@ func (v View) SelectFFPath(save func(ffmpegPath string, ffprobePath string) erro
|
|||||||
|
|
||||||
form := &widget.Form{
|
form := &widget.Form{
|
||||||
Items: []*widget.FormItem{
|
Items: []*widget.FormItem{
|
||||||
{Text: "Скачать можно от сюда", Widget: link},
|
{
|
||||||
{Text: "Путь к ffmpeg:", Widget: buttonFFmpeg},
|
Text: v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
{Widget: buttonFFmpegMessage},
|
MessageID: "titleDownloadLink",
|
||||||
{Text: "Путь к ffprobe:", Widget: buttonFFprobe},
|
}),
|
||||||
{Widget: buttonFFprobeMessage},
|
Widget: link,
|
||||||
{Widget: errorMessage},
|
|
||||||
},
|
},
|
||||||
SubmitText: "Сохранить",
|
{
|
||||||
|
Text: v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "pathToFfmpeg",
|
||||||
|
}),
|
||||||
|
Widget: buttonFFmpeg,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Widget: buttonFFmpegMessage,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Text: v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "pathToFfprobe",
|
||||||
|
}),
|
||||||
|
Widget: buttonFFprobe,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Widget: buttonFFprobeMessage,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Widget: errorMessage,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
SubmitText: v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "save",
|
||||||
|
}),
|
||||||
OnSubmit: func() {
|
OnSubmit: func() {
|
||||||
err := save(string(*ffmpegPath), string(*ffprobePath))
|
err := save(string(*ffmpegPath), string(*ffprobePath))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -53,7 +66,10 @@ func (v View) SelectFFPath(save func(ffmpegPath string, ffprobePath string) erro
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
v.w.SetContent(widget.NewCard("Укажите путь к FFmpeg и к FFprobe", "", container.NewVBox(form)))
|
selectFFPathTitle := v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "selectFFPathTitle",
|
||||||
|
})
|
||||||
|
v.w.SetContent(widget.NewCard(selectFFPathTitle, "", container.NewVBox(form)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v View) getButtonSelectFile() (filePath *string, button *widget.Button, buttonMessage *canvas.Text) {
|
func (v View) getButtonSelectFile() (filePath *string, button *widget.Button, buttonMessage *canvas.Text) {
|
||||||
@@ -64,7 +80,11 @@ func (v View) getButtonSelectFile() (filePath *string, button *widget.Button, bu
|
|||||||
buttonMessage.TextSize = 16
|
buttonMessage.TextSize = 16
|
||||||
buttonMessage.TextStyle = fyne.TextStyle{Bold: true}
|
buttonMessage.TextStyle = fyne.TextStyle{Bold: true}
|
||||||
|
|
||||||
button = widget.NewButton("выбрать", func() {
|
buttonTitle := v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "choose",
|
||||||
|
})
|
||||||
|
|
||||||
|
button = widget.NewButton(buttonTitle, func() {
|
||||||
fileDialog := dialog.NewFileOpen(
|
fileDialog := dialog.NewFileOpen(
|
||||||
func(r fyne.URIReadCloser, err error) {
|
func(r fyne.URIReadCloser, err error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -81,18 +101,9 @@ func (v View) getButtonSelectFile() (filePath *string, button *widget.Button, bu
|
|||||||
buttonMessage.Text = r.URI().Path()
|
buttonMessage.Text = r.URI().Path()
|
||||||
setStringSuccessStyle(buttonMessage)
|
setStringSuccessStyle(buttonMessage)
|
||||||
}, v.w)
|
}, v.w)
|
||||||
|
helper.FileDialogResize(fileDialog, v.w)
|
||||||
fileDialog.Show()
|
fileDialog.Show()
|
||||||
})
|
})
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func setStringErrorStyle(text *canvas.Text) {
|
|
||||||
text.Color = color.RGBA{255, 0, 0, 255}
|
|
||||||
text.Refresh()
|
|
||||||
}
|
|
||||||
|
|
||||||
func setStringSuccessStyle(text *canvas.Text) {
|
|
||||||
text.Color = color.RGBA{49, 127, 114, 255}
|
|
||||||
text.Refresh()
|
|
||||||
}
|
|
@@ -1,9 +1,11 @@
|
|||||||
package error
|
package error
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"ffmpegGui/localizer"
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
"fyne.io/fyne/v2/container"
|
"fyne.io/fyne/v2/container"
|
||||||
"fyne.io/fyne/v2/widget"
|
"fyne.io/fyne/v2/widget"
|
||||||
|
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ViewContract interface {
|
type ViewContract interface {
|
||||||
@@ -12,15 +14,53 @@ type ViewContract interface {
|
|||||||
|
|
||||||
type View struct {
|
type View struct {
|
||||||
w fyne.Window
|
w fyne.Window
|
||||||
|
localizerService localizer.ServiceContract
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewView(w fyne.Window) *View {
|
func NewView(w fyne.Window, localizerService localizer.ServiceContract) *View {
|
||||||
return &View{w}
|
return &View{
|
||||||
|
w: w,
|
||||||
|
localizerService: localizerService,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v View) PanicError(err error) {
|
func (v View) PanicError(err error) {
|
||||||
v.w.SetContent(container.NewVBox(
|
messageHead := v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
widget.NewLabel("Произошла ошибка!"),
|
MessageID: "error",
|
||||||
widget.NewLabel("Ошибка: "+err.Error()),
|
})
|
||||||
|
|
||||||
|
v.w.SetContent(container.NewBorder(
|
||||||
|
container.NewVBox(
|
||||||
|
widget.NewLabel(messageHead),
|
||||||
|
widget.NewLabel(err.Error()),
|
||||||
|
),
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
localizer.LanguageSelectionForm(v.localizerService, func(lang localizer.Lang) {
|
||||||
|
v.PanicError(err)
|
||||||
|
}),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v View) PanicErrorWriteDirectoryData() {
|
||||||
|
message := v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "errorDatabase",
|
||||||
|
})
|
||||||
|
messageHead := v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "error",
|
||||||
|
})
|
||||||
|
|
||||||
|
v.w.SetContent(container.NewBorder(
|
||||||
|
container.NewVBox(
|
||||||
|
widget.NewLabel(messageHead),
|
||||||
|
widget.NewLabel(message),
|
||||||
|
),
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
localizer.LanguageSelectionForm(v.localizerService, func(lang localizer.Lang) {
|
||||||
|
v.PanicErrorWriteDirectoryData()
|
||||||
|
}),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
25
src/go.mod
25
src/go.mod
@@ -3,16 +3,25 @@ module ffmpegGui
|
|||||||
go 1.21
|
go 1.21
|
||||||
|
|
||||||
require (
|
require (
|
||||||
fyne.io/fyne/v2 v2.4.3 // indirect
|
fyne.io/fyne/v2 v2.4.3
|
||||||
|
github.com/BurntSushi/toml v1.3.2
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.21
|
||||||
|
github.com/nicksnyder/go-i18n/v2 v2.4.0
|
||||||
|
golang.org/x/text v0.14.0
|
||||||
|
gorm.io/driver/sqlite v1.5.4
|
||||||
|
gorm.io/gorm v1.25.6
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e // indirect
|
fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/fredbi/uri v1.0.0 // indirect
|
github.com/fredbi/uri v1.1.0 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.6.0 // indirect
|
github.com/fsnotify/fsnotify v1.6.0 // indirect
|
||||||
github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect
|
github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect
|
||||||
github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 // indirect
|
github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 // indirect
|
||||||
github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 // indirect
|
github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 // indirect
|
||||||
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
|
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // indirect
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b // indirect
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240118000515-a250818d05e3 // indirect
|
||||||
github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 // indirect
|
github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 // indirect
|
||||||
github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a // indirect
|
github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a // indirect
|
||||||
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
||||||
@@ -20,7 +29,6 @@ require (
|
|||||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
github.com/jinzhu/now v1.1.5 // indirect
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e // indirect
|
github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e // indirect
|
||||||
github.com/mattn/go-sqlite3 v1.14.19 // indirect
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect
|
github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect
|
||||||
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect
|
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect
|
||||||
@@ -29,11 +37,8 @@ require (
|
|||||||
github.com/yuin/goldmark v1.5.5 // indirect
|
github.com/yuin/goldmark v1.5.5 // indirect
|
||||||
golang.org/x/image v0.11.0 // indirect
|
golang.org/x/image v0.11.0 // indirect
|
||||||
golang.org/x/mobile v0.0.0-20230531173138-3c911d8e3eda // indirect
|
golang.org/x/mobile v0.0.0-20230531173138-3c911d8e3eda // indirect
|
||||||
golang.org/x/net v0.17.0 // indirect
|
golang.org/x/net v0.20.0 // indirect
|
||||||
golang.org/x/sys v0.13.0 // indirect
|
golang.org/x/sys v0.16.0 // indirect
|
||||||
golang.org/x/text v0.13.0 // indirect
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
gorm.io/driver/sqlite v1.5.4 // indirect
|
|
||||||
gorm.io/gorm v1.25.5 // indirect
|
|
||||||
honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect
|
honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect
|
||||||
)
|
)
|
||||||
|
32
src/go.sum
32
src/go.sum
@@ -42,6 +42,8 @@ fyne.io/fyne/v2 v2.4.3/go.mod h1:1h3BKxmQYRJlr2g+RGVxedzr6vLVQ/AJmFWcF9CJnoQ=
|
|||||||
fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e h1:Hvs+kW2VwCzNToF3FmnIAzmivNgrclwPgoUdVSrjkP8=
|
fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e h1:Hvs+kW2VwCzNToF3FmnIAzmivNgrclwPgoUdVSrjkP8=
|
||||||
fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE=
|
fyne.io/systray v1.10.1-0.20231115130155-104f5ef7839e/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
|
||||||
|
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||||
@@ -73,6 +75,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
|
|||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
github.com/fredbi/uri v1.0.0 h1:s4QwUAZ8fz+mbTsukND+4V5f+mJ/wjaTokwstGUAemg=
|
github.com/fredbi/uri v1.0.0 h1:s4QwUAZ8fz+mbTsukND+4V5f+mJ/wjaTokwstGUAemg=
|
||||||
github.com/fredbi/uri v1.0.0/go.mod h1:1xC40RnIOGCaQzswaOvrzvG/3M3F0hyDVb3aO/1iGy0=
|
github.com/fredbi/uri v1.0.0/go.mod h1:1xC40RnIOGCaQzswaOvrzvG/3M3F0hyDVb3aO/1iGy0=
|
||||||
|
github.com/fredbi/uri v1.1.0 h1:OqLpTXtyRg9ABReqvDGdJPqZUxs8cyBDOMXBbskCaB8=
|
||||||
|
github.com/fredbi/uri v1.1.0/go.mod h1:aYTUoAXBOq7BLfVJ8GnKmfcuURosB1xyHDIfWeC/iW4=
|
||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||||
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
|
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
|
||||||
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
|
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
|
||||||
@@ -85,16 +89,22 @@ github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2/go.mod h1:eO7W361vml
|
|||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=
|
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=
|
||||||
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
|
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
|
||||||
|
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw2H/zl9nrd3eCZfYV+NfQA=
|
||||||
|
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b h1:GgabKamyOYguHqHjSkDACcgoPIz3w0Dis/zJ1wyHHHU=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b h1:GgabKamyOYguHqHjSkDACcgoPIz3w0Dis/zJ1wyHHHU=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240118000515-a250818d05e3 h1:nanQfMsOs3gnuKRm0E5jXWomedE/9YIFXdmHJNZYeqc=
|
||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240118000515-a250818d05e3/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 h1:VkKnvzbvHqgEfm351rfr8Uclu5fnwq8HP2ximUzJsBM=
|
github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 h1:VkKnvzbvHqgEfm351rfr8Uclu5fnwq8HP2ximUzJsBM=
|
||||||
github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8/go.mod h1:h29xCucjNsDcYb7+0rJokxVwYAq+9kQ19WiFuBKkYtc=
|
github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8/go.mod h1:h29xCucjNsDcYb7+0rJokxVwYAq+9kQ19WiFuBKkYtc=
|
||||||
github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a h1:VjN8ttdfklC0dnAdKbZqGNESdERUxtE3l8a/4Grgarc=
|
github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a h1:VjN8ttdfklC0dnAdKbZqGNESdERUxtE3l8a/4Grgarc=
|
||||||
github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a/go.mod h1:evDBbvNR/KaVFZ2ZlDSOWWXIUKq0wCOEtzLxRM8SG3k=
|
github.com/go-text/typesetting v0.0.0-20230616162802-9c17dd34aa4a/go.mod h1:evDBbvNR/KaVFZ2ZlDSOWWXIUKq0wCOEtzLxRM8SG3k=
|
||||||
|
github.com/go-text/typesetting-utils v0.0.0-20230616150549-2a7df14b6a22 h1:LBQTFxP2MfsyEDqSKmUBZaDuDHN1vpqDyOZjcqS7MYI=
|
||||||
|
github.com/go-text/typesetting-utils v0.0.0-20230616150549-2a7df14b6a22/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o=
|
||||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
||||||
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
@@ -204,14 +214,18 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV
|
|||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
||||||
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
|
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
|
||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI=
|
github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI=
|
||||||
github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.21 h1:IXocQLOykluc3xPE0Lvy8FtggMz1G+U3mEjg+0zGizc=
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.21/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
@@ -226,6 +240,10 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
|
|||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
|
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
|
||||||
github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
|
github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
|
||||||
|
github.com/nicksnyder/go-i18n/v2 v2.3.0 h1:2NPsCsNFCVd7i+Su0xYsBrIhS3bE2XMv5gNTft2O+PQ=
|
||||||
|
github.com/nicksnyder/go-i18n/v2 v2.3.0/go.mod h1:nxYSZE9M0bf3Y70gPQjN9ha7XNHX7gMc814+6wVyEI4=
|
||||||
|
github.com/nicksnyder/go-i18n/v2 v2.4.0 h1:3IcvPOAvnCKwNm0TB0dLDTuawWEj+ax/RERNC+diLMM=
|
||||||
|
github.com/nicksnyder/go-i18n/v2 v2.4.0/go.mod h1:nxYSZE9M0bf3Y70gPQjN9ha7XNHX7gMc814+6wVyEI4=
|
||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||||
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
@@ -385,6 +403,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
|
|||||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
|
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
|
||||||
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||||
|
golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
|
||||||
|
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@@ -461,6 +481,8 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
|
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
|
||||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
|
||||||
|
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
@@ -475,8 +497,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
|
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
@@ -642,12 +664,14 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
|
|||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
@@ -655,10 +679,10 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
|||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gorm.io/driver/sqlite v1.5.4 h1:IqXwXi8M/ZlPzH/947tn5uik3aYQslP9BVveoax0nV0=
|
gorm.io/driver/sqlite v1.5.4 h1:IqXwXi8M/ZlPzH/947tn5uik3aYQslP9BVveoax0nV0=
|
||||||
gorm.io/driver/sqlite v1.5.4/go.mod h1:qxAuCol+2r6PannQDpOP1FP6ag3mKi4esLnB/jHed+4=
|
gorm.io/driver/sqlite v1.5.4/go.mod h1:qxAuCol+2r6PannQDpOP1FP6ag3mKi4esLnB/jHed+4=
|
||||||
gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55 h1:sC1Xj4TYrLqg1n3AN10w871An7wJM0gzgcm8jkIkECQ=
|
|
||||||
gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
|
|
||||||
gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=
|
gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=
|
||||||
gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
|
gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
|
||||||
|
gorm.io/gorm v1.25.6 h1:V92+vVda1wEISSOMtodHVRcUIOPYa2tgQtyF+DfFx+A=
|
||||||
|
gorm.io/gorm v1.25.6/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
|
||||||
honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 h1:oomkgU6VaQDsV6qZby2uz1Lap0eXmku8+2em3A/l700=
|
honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 h1:oomkgU6VaQDsV6qZby2uz1Lap0eXmku8+2em3A/l700=
|
||||||
honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2/go.mod h1:sUMDUKNB2ZcVjt92UnLy3cdGs+wDAcrPdV3JP6sVgA4=
|
honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2/go.mod h1:sUMDUKNB2ZcVjt92UnLy3cdGs+wDAcrPdV3JP6sVgA4=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
@@ -5,42 +5,47 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"ffmpegGui/convertor"
|
"ffmpegGui/convertor"
|
||||||
"ffmpegGui/helper"
|
"ffmpegGui/helper"
|
||||||
|
"ffmpegGui/localizer"
|
||||||
"ffmpegGui/setting"
|
"ffmpegGui/setting"
|
||||||
"fyne.io/fyne/v2/widget"
|
"fyne.io/fyne/v2/widget"
|
||||||
|
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||||
"io"
|
"io"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type ConvertorHandlerContract interface {
|
||||||
|
MainConvertor()
|
||||||
|
}
|
||||||
|
|
||||||
type ConvertorHandler struct {
|
type ConvertorHandler struct {
|
||||||
convertorService convertor.ServiceContract
|
convertorService convertor.ServiceContract
|
||||||
convertorView convertor.ViewContract
|
convertorView convertor.ViewContract
|
||||||
settingView setting.ViewContract
|
|
||||||
settingRepository setting.RepositoryContract
|
settingRepository setting.RepositoryContract
|
||||||
|
localizerService localizer.ServiceContract
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewConvertorHandler(
|
func NewConvertorHandler(
|
||||||
convertorService convertor.ServiceContract,
|
convertorService convertor.ServiceContract,
|
||||||
convertorView convertor.ViewContract,
|
convertorView convertor.ViewContract,
|
||||||
settingView setting.ViewContract,
|
|
||||||
settingRepository setting.RepositoryContract,
|
settingRepository setting.RepositoryContract,
|
||||||
|
localizerService localizer.ServiceContract,
|
||||||
) *ConvertorHandler {
|
) *ConvertorHandler {
|
||||||
return &ConvertorHandler{
|
return &ConvertorHandler{
|
||||||
convertorService,
|
convertorService: convertorService,
|
||||||
convertorView,
|
convertorView: convertorView,
|
||||||
settingView,
|
settingRepository: settingRepository,
|
||||||
settingRepository,
|
localizerService: localizerService,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h ConvertorHandler) GetConvertor() {
|
func (h ConvertorHandler) MainConvertor() {
|
||||||
if h.checkingFFPathUtilities() == true {
|
if h.checkingFFPathUtilities() == true {
|
||||||
h.convertorView.Main(h.runConvert)
|
h.convertorView.Main(h.runConvert)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
h.settingView.SelectFFPath(h.saveSettingFFPath)
|
h.convertorView.SelectFFPath(h.saveSettingFFPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h ConvertorHandler) runConvert(setting convertor.HandleConvertSetting, progressbar *widget.ProgressBar) error {
|
func (h ConvertorHandler) runConvert(setting convertor.HandleConvertSetting, progressbar *widget.ProgressBar) error {
|
||||||
@@ -48,7 +53,7 @@ func (h ConvertorHandler) runConvert(setting convertor.HandleConvertSetting, pro
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
progress := NewProgress(totalDuration, progressbar)
|
progress := NewProgress(totalDuration, progressbar, h.localizerService)
|
||||||
|
|
||||||
return h.convertorService.RunConvert(
|
return h.convertorService.RunConvert(
|
||||||
convertor.ConvertSetting{
|
convertor.ConvertSetting{
|
||||||
@@ -69,12 +74,7 @@ func (h ConvertorHandler) checkingFFPathUtilities() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
var pathsToFF []convertor.FFPathUtilities
|
pathsToFF := getPathsToFF()
|
||||||
if runtime.GOOS == "windows" {
|
|
||||||
pathsToFF = []convertor.FFPathUtilities{{"ffmpeg\\bin\\ffmpeg.exe", "ffmpeg\\bin\\ffprobe.exe"}}
|
|
||||||
} else {
|
|
||||||
pathsToFF = []convertor.FFPathUtilities{{"ffmpeg/bin/ffmpeg", "ffmpeg/bin/ffprobe"}, {"ffmpeg", "ffprobe"}}
|
|
||||||
}
|
|
||||||
for _, item := range pathsToFF {
|
for _, item := range pathsToFF {
|
||||||
ffmpegChecking, _ := h.convertorService.ChangeFFmpegPath(item.FFmpeg)
|
ffmpegChecking, _ := h.convertorService.ChangeFFmpegPath(item.FFmpeg)
|
||||||
if ffmpegChecking == false {
|
if ffmpegChecking == false {
|
||||||
@@ -97,12 +97,18 @@ func (h ConvertorHandler) checkingFFPathUtilities() bool {
|
|||||||
func (h ConvertorHandler) saveSettingFFPath(ffmpegPath string, ffprobePath string) error {
|
func (h ConvertorHandler) saveSettingFFPath(ffmpegPath string, ffprobePath string) error {
|
||||||
ffmpegChecking, _ := h.convertorService.ChangeFFmpegPath(ffmpegPath)
|
ffmpegChecking, _ := h.convertorService.ChangeFFmpegPath(ffmpegPath)
|
||||||
if ffmpegChecking == false {
|
if ffmpegChecking == false {
|
||||||
return errors.New("это не FFmpeg")
|
errorText := h.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "errorFFmpeg",
|
||||||
|
})
|
||||||
|
return errors.New(errorText)
|
||||||
}
|
}
|
||||||
|
|
||||||
ffprobeChecking, _ := h.convertorService.ChangeFFprobePath(ffprobePath)
|
ffprobeChecking, _ := h.convertorService.ChangeFFprobePath(ffprobePath)
|
||||||
if ffprobeChecking == false {
|
if ffprobeChecking == false {
|
||||||
return errors.New("это не FFprobe")
|
errorText := h.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "errorFFprobe",
|
||||||
|
})
|
||||||
|
return errors.New(errorText)
|
||||||
}
|
}
|
||||||
|
|
||||||
ffmpegEntity := setting.Setting{Code: "ffmpeg", Value: ffmpegPath}
|
ffmpegEntity := setting.Setting{Code: "ffmpeg", Value: ffmpegPath}
|
||||||
@@ -110,7 +116,7 @@ func (h ConvertorHandler) saveSettingFFPath(ffmpegPath string, ffprobePath strin
|
|||||||
ffprobeEntity := setting.Setting{Code: "ffprobe", Value: ffprobePath}
|
ffprobeEntity := setting.Setting{Code: "ffprobe", Value: ffprobePath}
|
||||||
_, _ = h.settingRepository.Create(ffprobeEntity)
|
_, _ = h.settingRepository.Create(ffprobeEntity)
|
||||||
|
|
||||||
h.GetConvertor()
|
h.MainConvertor()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -129,25 +135,27 @@ func (h ConvertorHandler) checkingFFPath() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
type progress struct {
|
type Progress struct {
|
||||||
totalDuration float64
|
totalDuration float64
|
||||||
progressbar *widget.ProgressBar
|
progressbar *widget.ProgressBar
|
||||||
protocol string
|
protocol string
|
||||||
|
localizerService localizer.ServiceContract
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewProgress(totalDuration float64, progressbar *widget.ProgressBar) progress {
|
func NewProgress(totalDuration float64, progressbar *widget.ProgressBar, localizerService localizer.ServiceContract) Progress {
|
||||||
return progress{
|
return Progress{
|
||||||
totalDuration: totalDuration,
|
totalDuration: totalDuration,
|
||||||
progressbar: progressbar,
|
progressbar: progressbar,
|
||||||
protocol: "pipe:",
|
protocol: "pipe:",
|
||||||
|
localizerService: localizerService,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p progress) GetProtocole() string {
|
func (p Progress) GetProtocole() string {
|
||||||
return p.protocol
|
return p.protocol
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p progress) Run(stdOut io.ReadCloser, stdErr io.ReadCloser) error {
|
func (p Progress) Run(stdOut io.ReadCloser, stdErr io.ReadCloser) error {
|
||||||
isProcessCompleted := false
|
isProcessCompleted := false
|
||||||
var errorText string
|
var errorText string
|
||||||
|
|
||||||
@@ -169,10 +177,15 @@ func (p progress) Run(stdOut io.ReadCloser, stdErr io.ReadCloser) error {
|
|||||||
|
|
||||||
scannerOut := bufio.NewScanner(stdOut)
|
scannerOut := bufio.NewScanner(stdOut)
|
||||||
for scannerOut.Scan() {
|
for scannerOut.Scan() {
|
||||||
if isProcessCompleted != true {
|
|
||||||
isProcessCompleted = true
|
|
||||||
}
|
|
||||||
data := scannerOut.Text()
|
data := scannerOut.Text()
|
||||||
|
|
||||||
|
if strings.Contains(data, "progress=end") {
|
||||||
|
p.progressbar.Value = p.totalDuration
|
||||||
|
p.progressbar.Refresh()
|
||||||
|
isProcessCompleted = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
re := regexp.MustCompile(`frame=(\d+)`)
|
re := regexp.MustCompile(`frame=(\d+)`)
|
||||||
a := re.FindAllStringSubmatch(data, -1)
|
a := re.FindAllStringSubmatch(data, -1)
|
||||||
|
|
||||||
@@ -183,11 +196,6 @@ func (p progress) Run(stdOut io.ReadCloser, stdErr io.ReadCloser) error {
|
|||||||
}
|
}
|
||||||
progress = float64(c)
|
progress = float64(c)
|
||||||
}
|
}
|
||||||
if strings.Contains(data, "progress=end") {
|
|
||||||
p.progressbar.Value = p.totalDuration
|
|
||||||
p.progressbar.Refresh()
|
|
||||||
isProcessCompleted = true
|
|
||||||
}
|
|
||||||
if p.progressbar.Value != progress {
|
if p.progressbar.Value != progress {
|
||||||
p.progressbar.Value = progress
|
p.progressbar.Value = progress
|
||||||
p.progressbar.Refresh()
|
p.progressbar.Refresh()
|
||||||
@@ -196,7 +204,9 @@ func (p progress) Run(stdOut io.ReadCloser, stdErr io.ReadCloser) error {
|
|||||||
|
|
||||||
if isProcessCompleted == false {
|
if isProcessCompleted == false {
|
||||||
if len(errorText) == 0 {
|
if len(errorText) == 0 {
|
||||||
errorText = "не смогли отконвертировать видео"
|
errorText = p.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "errorConverter",
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return errors.New(errorText)
|
return errors.New(errorText)
|
||||||
}
|
}
|
||||||
|
10
src/handler/convertor_anyos.go
Normal file
10
src/handler/convertor_anyos.go
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
//go:build !windows
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package handler
|
||||||
|
|
||||||
|
import "ffmpegGui/convertor"
|
||||||
|
|
||||||
|
func getPathsToFF() []convertor.FFPathUtilities {
|
||||||
|
return []convertor.FFPathUtilities{{"ffmpeg/bin/ffmpeg", "ffmpeg/bin/ffprobe"}, {"ffmpeg", "ffprobe"}}
|
||||||
|
}
|
10
src/handler/convertor_windows.go
Normal file
10
src/handler/convertor_windows.go
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
|
package handler
|
||||||
|
|
||||||
|
import "ffmpegGui/convertor"
|
||||||
|
|
||||||
|
func getPathsToFF() []convertor.FFPathUtilities {
|
||||||
|
return []convertor.FFPathUtilities{{"ffmpeg\\bin\\ffmpeg.exe", "ffmpeg\\bin\\ffprobe.exe"}}
|
||||||
|
}
|
37
src/handler/main.go
Normal file
37
src/handler/main.go
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"ffmpegGui/localizer"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MainHandler struct {
|
||||||
|
convertorHandler ConvertorHandlerContract
|
||||||
|
menuHandler MenuHandlerContract
|
||||||
|
localizerRepository localizer.RepositoryContract
|
||||||
|
localizerService localizer.ServiceContract
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMainHandler(
|
||||||
|
convertorHandler ConvertorHandlerContract,
|
||||||
|
menuHandler MenuHandlerContract,
|
||||||
|
localizerRepository localizer.RepositoryContract,
|
||||||
|
localizerService localizer.ServiceContract,
|
||||||
|
) *MainHandler {
|
||||||
|
return &MainHandler{
|
||||||
|
convertorHandler: convertorHandler,
|
||||||
|
menuHandler: menuHandler,
|
||||||
|
localizerRepository: localizerRepository,
|
||||||
|
localizerService: localizerService,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h MainHandler) Start() {
|
||||||
|
language, err := h.localizerRepository.GetCode()
|
||||||
|
if err != nil {
|
||||||
|
h.menuHandler.LanguageSelection()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_ = h.localizerService.SetCurrentLanguageByCode(language)
|
||||||
|
|
||||||
|
h.convertorHandler.MainConvertor()
|
||||||
|
}
|
78
src/handler/menu.go
Normal file
78
src/handler/menu.go
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"ffmpegGui/localizer"
|
||||||
|
"fyne.io/fyne/v2"
|
||||||
|
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MenuHandlerContract interface {
|
||||||
|
GetMainMenu() *fyne.MainMenu
|
||||||
|
LanguageSelection()
|
||||||
|
}
|
||||||
|
|
||||||
|
type menuItems struct {
|
||||||
|
menuItem map[string]*fyne.MenuItem
|
||||||
|
menu map[string]*fyne.Menu
|
||||||
|
}
|
||||||
|
|
||||||
|
type MenuHandler struct {
|
||||||
|
convertorHandler ConvertorHandlerContract
|
||||||
|
localizerService localizer.ServiceContract
|
||||||
|
localizerView localizer.ViewContract
|
||||||
|
localizerRepository localizer.RepositoryContract
|
||||||
|
menuItems *menuItems
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMenuHandler(
|
||||||
|
convertorHandler ConvertorHandlerContract,
|
||||||
|
localizerService localizer.ServiceContract,
|
||||||
|
localizerView localizer.ViewContract,
|
||||||
|
localizerRepository localizer.RepositoryContract,
|
||||||
|
) *MenuHandler {
|
||||||
|
return &MenuHandler{
|
||||||
|
convertorHandler: convertorHandler,
|
||||||
|
localizerService: localizerService,
|
||||||
|
localizerView: localizerView,
|
||||||
|
localizerRepository: localizerRepository,
|
||||||
|
menuItems: &menuItems{menuItem: map[string]*fyne.MenuItem{}, menu: map[string]*fyne.Menu{}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h MenuHandler) GetMainMenu() *fyne.MainMenu {
|
||||||
|
quit := fyne.NewMenuItem(h.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "exit",
|
||||||
|
}), nil)
|
||||||
|
quit.IsQuit = true
|
||||||
|
h.menuItems.menuItem["exit"] = quit
|
||||||
|
|
||||||
|
languageSelection := fyne.NewMenuItem(h.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "changeLanguage",
|
||||||
|
}), h.LanguageSelection)
|
||||||
|
h.menuItems.menuItem["changeLanguage"] = languageSelection
|
||||||
|
|
||||||
|
settings := fyne.NewMenu(h.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "settings",
|
||||||
|
}), languageSelection, quit)
|
||||||
|
h.menuItems.menu["settings"] = settings
|
||||||
|
|
||||||
|
return fyne.NewMainMenu(settings)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h MenuHandler) LanguageSelection() {
|
||||||
|
h.localizerView.LanguageSelection(func(lang localizer.Lang) {
|
||||||
|
_, _ = h.localizerRepository.Save(lang.Code)
|
||||||
|
h.menuMessageReload()
|
||||||
|
h.convertorHandler.MainConvertor()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h MenuHandler) menuMessageReload() {
|
||||||
|
for messageID, menu := range h.menuItems.menuItem {
|
||||||
|
menu.Label = h.localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: messageID})
|
||||||
|
}
|
||||||
|
for messageID, menu := range h.menuItems.menu {
|
||||||
|
menu.Label = h.localizerService.GetMessage(&i18n.LocalizeConfig{MessageID: messageID})
|
||||||
|
menu.Refresh()
|
||||||
|
}
|
||||||
|
}
|
@@ -1,10 +1,11 @@
|
|||||||
package helper
|
package helper
|
||||||
|
|
||||||
import "runtime"
|
import (
|
||||||
|
"fyne.io/fyne/v2"
|
||||||
|
"fyne.io/fyne/v2/dialog"
|
||||||
|
)
|
||||||
|
|
||||||
func PathSeparator() string {
|
func FileDialogResize(fileDialog *dialog.FileDialog, w fyne.Window) {
|
||||||
if runtime.GOOS == "windows" {
|
contentSize := w.Content().Size()
|
||||||
return "\\"
|
fileDialog.Resize(fyne.Size{Width: contentSize.Width - 50, Height: contentSize.Height - 50})
|
||||||
}
|
|
||||||
return "/"
|
|
||||||
}
|
}
|
||||||
|
8
src/helper/path_separator.go
Normal file
8
src/helper/path_separator.go
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
//go:build !windows
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package helper
|
||||||
|
|
||||||
|
func PathSeparator() string {
|
||||||
|
return "/"
|
||||||
|
}
|
8
src/helper/path_separator_window.go
Normal file
8
src/helper/path_separator_window.go
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
|
package helper
|
||||||
|
|
||||||
|
func PathSeparator() string {
|
||||||
|
return "\\"
|
||||||
|
}
|
BIN
src/icon.png
Normal file
BIN
src/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
87
src/languages/active.en.toml
Normal file
87
src/languages/active.en.toml
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
[buttonForSelectedDirTitle]
|
||||||
|
hash = "sha1-52b13f1b13e82d22e8c4102332db5d4ec551247b"
|
||||||
|
other = "Folder where it will be saved:"
|
||||||
|
|
||||||
|
[changeLanguage]
|
||||||
|
hash = "sha1-8b276eaf378d485c769fb3d5dcc06dfc25b0c01b"
|
||||||
|
other = "Change language"
|
||||||
|
|
||||||
|
[checkboxOverwriteOutputFilesTitle]
|
||||||
|
hash = "sha1-5860124bb781e7ef680f573fa93977e96328d4e7"
|
||||||
|
other = "Allow file to be overwritten"
|
||||||
|
|
||||||
|
[choose]
|
||||||
|
hash = "sha1-f60bb5f761024d973834b5e9d25ceebce2c85f94"
|
||||||
|
other = "choose"
|
||||||
|
|
||||||
|
[converterVideoFilesSubmitTitle]
|
||||||
|
hash = "sha1-7ac460f3c24c9952082f2db6e4d62f752598709c"
|
||||||
|
other = "Convert"
|
||||||
|
|
||||||
|
[converterVideoFilesTitle]
|
||||||
|
hash = "sha1-4d972809e4c7f9c9ff2c110a126bbc183c9429ce"
|
||||||
|
other = "Converter video files to mp4"
|
||||||
|
|
||||||
|
[error]
|
||||||
|
hash = "sha1-a7df8f8b5d754f226ac4cb320577fe692b33e483"
|
||||||
|
other = "An error has occurred!"
|
||||||
|
|
||||||
|
[errorConverter]
|
||||||
|
hash = "sha1-55ebddceddb8b044e33cc3893ec2eba7bbd9fcf9"
|
||||||
|
other = "Couldn't convert video"
|
||||||
|
|
||||||
|
[errorDatabase]
|
||||||
|
hash = "sha1-531abc3f0d12727e542df6e5a22de91098380fc1"
|
||||||
|
other = "could not create file 'database' in folder 'data'"
|
||||||
|
|
||||||
|
[errorFFmpeg]
|
||||||
|
hash = "sha1-ccf0b95c0d1b392dc215258d917eb4e5d0b88ed0"
|
||||||
|
other = "this is not FFmpeg"
|
||||||
|
|
||||||
|
[errorFFprobe]
|
||||||
|
hash = "sha1-86d1b0b4c4ccd6a4f71e758fc67ce11aff4ba9b8"
|
||||||
|
other = "this is not FFprobe"
|
||||||
|
|
||||||
|
[errorSelectedFolderSave]
|
||||||
|
hash = "sha1-83da899677cdc90e4344e3b94ee03c46b51bee4c"
|
||||||
|
other = "You haven't selected a folder to save!"
|
||||||
|
|
||||||
|
[exit]
|
||||||
|
hash = "sha1-c42457057d1ab7950cea00719cbe0b078891775f"
|
||||||
|
other = "Exit"
|
||||||
|
|
||||||
|
[fileVideoForConversionTitle]
|
||||||
|
hash = "sha1-5e727d4a2ff3f21080e51e81641595b2e668f3be"
|
||||||
|
other = "File for conversion:"
|
||||||
|
|
||||||
|
[languageSelectionFormHead]
|
||||||
|
hash = "sha1-0ff5fa82cf684112660128cba1711297acf11003"
|
||||||
|
other = "Switch language"
|
||||||
|
|
||||||
|
[languageSelectionHead]
|
||||||
|
hash = "sha1-daf1108fc10d3b1a908288d611f749b3cc651e4b"
|
||||||
|
other = "Choose language"
|
||||||
|
|
||||||
|
[pathToFfmpeg]
|
||||||
|
hash = "sha1-2eba439f365640ff77e0ed6a7486fcb662573850"
|
||||||
|
other = "Path to ffmpeg:"
|
||||||
|
|
||||||
|
[pathToFfprobe]
|
||||||
|
hash = "sha1-02ad53337801906f8ebfee4616100dd9f43eabd7"
|
||||||
|
other = "Path to ffprobe:"
|
||||||
|
|
||||||
|
[save]
|
||||||
|
hash = "sha1-4864057d626a868fa60f999bed3191d61d045ddc"
|
||||||
|
other = "Save"
|
||||||
|
|
||||||
|
[selectFFPathTitle]
|
||||||
|
hash = "sha1-95581446a28d968ff1a027c623159a7eb08654cf"
|
||||||
|
other = "Specify the path to FFmpeg and FFprobe"
|
||||||
|
|
||||||
|
[settings]
|
||||||
|
hash = "sha1-7f17c7c62a7fd8d1a508481f4778688927734c2f"
|
||||||
|
other = "Settings"
|
||||||
|
|
||||||
|
[titleDownloadLink]
|
||||||
|
hash = "sha1-92df86371f6c3a06ca1e4754f113142776a32d49"
|
||||||
|
other = "You can download it from here"
|
87
src/languages/active.kk.toml
Normal file
87
src/languages/active.kk.toml
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
[buttonForSelectedDirTitle]
|
||||||
|
hash = "sha1-52b13f1b13e82d22e8c4102332db5d4ec551247b"
|
||||||
|
other = "Файлды сақтауға арналған каталог:"
|
||||||
|
|
||||||
|
[changeLanguage]
|
||||||
|
hash = "sha1-8b276eaf378d485c769fb3d5dcc06dfc25b0c01b"
|
||||||
|
other = "Тілді өзгерту"
|
||||||
|
|
||||||
|
[checkboxOverwriteOutputFilesTitle]
|
||||||
|
hash = "sha1-5860124bb781e7ef680f573fa93977e96328d4e7"
|
||||||
|
other = "Файлды қайта жазуға рұқсат беріңіз"
|
||||||
|
|
||||||
|
[choose]
|
||||||
|
hash = "sha1-f60bb5f761024d973834b5e9d25ceebce2c85f94"
|
||||||
|
other = "таңдау"
|
||||||
|
|
||||||
|
[converterVideoFilesSubmitTitle]
|
||||||
|
hash = "sha1-7ac460f3c24c9952082f2db6e4d62f752598709c"
|
||||||
|
other = "Файлды түрлендіру"
|
||||||
|
|
||||||
|
[converterVideoFilesTitle]
|
||||||
|
hash = "sha1-4d972809e4c7f9c9ff2c110a126bbc183c9429ce"
|
||||||
|
other = "Бейне файлдарын mp4 форматына түрлендіру"
|
||||||
|
|
||||||
|
[error]
|
||||||
|
hash = "sha1-a7df8f8b5d754f226ac4cb320577fe692b33e483"
|
||||||
|
other = "Қате орын алды!"
|
||||||
|
|
||||||
|
[errorConverter]
|
||||||
|
hash = "sha1-55ebddceddb8b044e33cc3893ec2eba7bbd9fcf9"
|
||||||
|
other = "Бейнені түрлендіру мүмкін болмады"
|
||||||
|
|
||||||
|
[errorDatabase]
|
||||||
|
hash = "sha1-531abc3f0d12727e542df6e5a22de91098380fc1"
|
||||||
|
other = "'data' қалтасында 'database' файлын жасау мүмкін болмады"
|
||||||
|
|
||||||
|
[errorFFmpeg]
|
||||||
|
hash = "sha1-ccf0b95c0d1b392dc215258d917eb4e5d0b88ed0"
|
||||||
|
other = "бұл FFmpeg емес"
|
||||||
|
|
||||||
|
[errorFFprobe]
|
||||||
|
hash = "sha1-86d1b0b4c4ccd6a4f71e758fc67ce11aff4ba9b8"
|
||||||
|
other = "бұл FFprobe емес"
|
||||||
|
|
||||||
|
[errorSelectedFolderSave]
|
||||||
|
hash = "sha1-83da899677cdc90e4344e3b94ee03c46b51bee4c"
|
||||||
|
other = "Сіз сақталатын қалтаны таңдамадыңыз!"
|
||||||
|
|
||||||
|
[exit]
|
||||||
|
hash = "sha1-c42457057d1ab7950cea00719cbe0b078891775f"
|
||||||
|
other = "Шығу"
|
||||||
|
|
||||||
|
[fileVideoForConversionTitle]
|
||||||
|
hash = "sha1-5e727d4a2ff3f21080e51e81641595b2e668f3be"
|
||||||
|
other = "Түрлендіруге арналған файл:"
|
||||||
|
|
||||||
|
[languageSelectionFormHead]
|
||||||
|
hash = "sha1-0ff5fa82cf684112660128cba1711297acf11003"
|
||||||
|
other = "Тілді ауыстыру"
|
||||||
|
|
||||||
|
[languageSelectionHead]
|
||||||
|
hash = "sha1-daf1108fc10d3b1a908288d611f749b3cc651e4b"
|
||||||
|
other = "Тілді таңдаңыз"
|
||||||
|
|
||||||
|
[pathToFfmpeg]
|
||||||
|
hash = "sha1-2eba439f365640ff77e0ed6a7486fcb662573850"
|
||||||
|
other = "ffmpeg жол:"
|
||||||
|
|
||||||
|
[pathToFfprobe]
|
||||||
|
hash = "sha1-02ad53337801906f8ebfee4616100dd9f43eabd7"
|
||||||
|
other = "ffprobe жол:"
|
||||||
|
|
||||||
|
[save]
|
||||||
|
hash = "sha1-4864057d626a868fa60f999bed3191d61d045ddc"
|
||||||
|
other = "Сақтау"
|
||||||
|
|
||||||
|
[selectFFPathTitle]
|
||||||
|
hash = "sha1-95581446a28d968ff1a027c623159a7eb08654cf"
|
||||||
|
other = "FFmpeg және FFprobe жолын көрсетіңіз"
|
||||||
|
|
||||||
|
[settings]
|
||||||
|
hash = "sha1-7f17c7c62a7fd8d1a508481f4778688927734c2f"
|
||||||
|
other = "Параметрлер"
|
||||||
|
|
||||||
|
[titleDownloadLink]
|
||||||
|
hash = "sha1-92df86371f6c3a06ca1e4754f113142776a32d49"
|
||||||
|
other = "Сіз оны осы жерден жүктей аласыз"
|
22
src/languages/active.ru.toml
Normal file
22
src/languages/active.ru.toml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
buttonForSelectedDirTitle = "Папка куда будет сохраняться:"
|
||||||
|
changeLanguage = "Поменять язык"
|
||||||
|
checkboxOverwriteOutputFilesTitle = "Разрешить перезаписать файл"
|
||||||
|
choose = "выбрать"
|
||||||
|
converterVideoFilesSubmitTitle = "Конвертировать"
|
||||||
|
converterVideoFilesTitle = "Конвертор видео файлов в mp4"
|
||||||
|
error = "Произошла ошибка!"
|
||||||
|
errorConverter = "не смогли отконвертировать видео"
|
||||||
|
errorDatabase = "не смогли создать файл 'database' в папке 'data'"
|
||||||
|
errorFFmpeg = "это не FFmpeg"
|
||||||
|
errorFFprobe = "это не FFprobe"
|
||||||
|
errorSelectedFolderSave = "Не выбрали папку для сохранения!"
|
||||||
|
exit = "Выход"
|
||||||
|
fileVideoForConversionTitle = "Файл для ковертации:"
|
||||||
|
languageSelectionFormHead = "Переключить язык"
|
||||||
|
languageSelectionHead = "Выберите язык"
|
||||||
|
pathToFfmpeg = "Путь к ffmpeg:"
|
||||||
|
pathToFfprobe = "Путь к ffprobe:"
|
||||||
|
save = "Сохранить"
|
||||||
|
selectFFPathTitle = "Укажите путь к FFmpeg и к FFprobe"
|
||||||
|
settings = "Настройки"
|
||||||
|
titleDownloadLink = "Скачать можно от сюда"
|
11
src/languages/translate.en.toml
Normal file
11
src/languages/translate.en.toml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[changeLanguage]
|
||||||
|
hash = "sha1-8b276eaf378d485c769fb3d5dcc06dfc25b0c01b"
|
||||||
|
other = "Change language"
|
||||||
|
|
||||||
|
[exit]
|
||||||
|
hash = "sha1-c42457057d1ab7950cea00719cbe0b078891775f"
|
||||||
|
other = "Exit"
|
||||||
|
|
||||||
|
[settings]
|
||||||
|
hash = "sha1-7f17c7c62a7fd8d1a508481f4778688927734c2f"
|
||||||
|
other = "Settings"
|
11
src/languages/translate.kk.toml
Normal file
11
src/languages/translate.kk.toml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[changeLanguage]
|
||||||
|
hash = "sha1-8b276eaf378d485c769fb3d5dcc06dfc25b0c01b"
|
||||||
|
other = "Тілді өзгерту"
|
||||||
|
|
||||||
|
[exit]
|
||||||
|
hash = "sha1-c42457057d1ab7950cea00719cbe0b078891775f"
|
||||||
|
other = "Шығу"
|
||||||
|
|
||||||
|
[settings]
|
||||||
|
hash = "sha1-7f17c7c62a7fd8d1a508481f4778688927734c2f"
|
||||||
|
other = "Параметрлер"
|
26
src/localizer/repository.go
Normal file
26
src/localizer/repository.go
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package localizer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"ffmpegGui/setting"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RepositoryContract interface {
|
||||||
|
GetCode() (string, error)
|
||||||
|
Save(code string) (setting.Setting, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Repository struct {
|
||||||
|
settingRepository setting.RepositoryContract
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRepository(settingRepository setting.RepositoryContract) *Repository {
|
||||||
|
return &Repository{settingRepository: settingRepository}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r Repository) GetCode() (string, error) {
|
||||||
|
return r.settingRepository.GetValue("language")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r Repository) Save(code string) (setting.Setting, error) {
|
||||||
|
return r.settingRepository.CreateOrUpdate("language", code)
|
||||||
|
}
|
138
src/localizer/service.go
Normal file
138
src/localizer/service.go
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
package localizer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/BurntSushi/toml"
|
||||||
|
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||||
|
"golang.org/x/text/cases"
|
||||||
|
"golang.org/x/text/language"
|
||||||
|
"golang.org/x/text/language/display"
|
||||||
|
"path/filepath"
|
||||||
|
"sort"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ServiceContract interface {
|
||||||
|
GetLanguages() []Lang
|
||||||
|
GetMessage(localizeConfig *i18n.LocalizeConfig) string
|
||||||
|
SetCurrentLanguage(lang Lang) error
|
||||||
|
SetCurrentLanguageByCode(code string) error
|
||||||
|
GetCurrentLanguage() *CurrentLanguage
|
||||||
|
}
|
||||||
|
|
||||||
|
type Lang struct {
|
||||||
|
Code string
|
||||||
|
Title string
|
||||||
|
}
|
||||||
|
|
||||||
|
type CurrentLanguage struct {
|
||||||
|
Lang Lang
|
||||||
|
localizer *i18n.Localizer
|
||||||
|
localizerDefault *i18n.Localizer
|
||||||
|
}
|
||||||
|
|
||||||
|
type Service struct {
|
||||||
|
bundle *i18n.Bundle
|
||||||
|
languages []Lang
|
||||||
|
currentLanguage *CurrentLanguage
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewService(directory string, languageDefault language.Tag) (*Service, error) {
|
||||||
|
bundle := i18n.NewBundle(languageDefault)
|
||||||
|
bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
|
||||||
|
|
||||||
|
languages, err := initLanguages(directory, bundle)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
localizerDefault := i18n.NewLocalizer(bundle, languageDefault.String())
|
||||||
|
|
||||||
|
return &Service{
|
||||||
|
bundle: bundle,
|
||||||
|
languages: languages,
|
||||||
|
currentLanguage: &CurrentLanguage{
|
||||||
|
Lang: Lang{
|
||||||
|
Code: languageDefault.String(),
|
||||||
|
Title: cases.Title(languageDefault).String(display.Self.Name(languageDefault)),
|
||||||
|
},
|
||||||
|
localizer: localizerDefault,
|
||||||
|
localizerDefault: localizerDefault,
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func initLanguages(directory string, bundle *i18n.Bundle) ([]Lang, error) {
|
||||||
|
var languages []Lang
|
||||||
|
|
||||||
|
files, err := filepath.Glob(directory + "/active.*.toml")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for _, file := range files {
|
||||||
|
lang, err := bundle.LoadMessageFile(file)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
title := cases.Title(lang.Tag).String(display.Self.Name(lang.Tag))
|
||||||
|
languages = append(languages, Lang{Code: lang.Tag.String(), Title: title})
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Sort(languagesSort(languages))
|
||||||
|
|
||||||
|
return languages, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s Service) GetLanguages() []Lang {
|
||||||
|
return s.languages
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s Service) GetMessage(localizeConfig *i18n.LocalizeConfig) string {
|
||||||
|
message, err := s.GetCurrentLanguage().localizer.Localize(localizeConfig)
|
||||||
|
if err != nil {
|
||||||
|
message, err = s.GetCurrentLanguage().localizerDefault.Localize(localizeConfig)
|
||||||
|
if err != nil {
|
||||||
|
return err.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return message
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s Service) SetCurrentLanguage(lang Lang) error {
|
||||||
|
s.currentLanguage.Lang = lang
|
||||||
|
s.currentLanguage.localizer = i18n.NewLocalizer(s.bundle, lang.Code)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s Service) SetCurrentLanguageByCode(code string) error {
|
||||||
|
lang, err := language.Parse(code)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
title := cases.Title(lang).String(display.Self.Name(lang))
|
||||||
|
return s.SetCurrentLanguage(Lang{Code: lang.String(), Title: title})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s Service) GetCurrentLanguage() *CurrentLanguage {
|
||||||
|
return s.currentLanguage
|
||||||
|
}
|
||||||
|
|
||||||
|
type languagesSort []Lang
|
||||||
|
|
||||||
|
func (l languagesSort) Len() int { return len(l) }
|
||||||
|
func (l languagesSort) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
|
||||||
|
func (l languagesSort) Less(i, j int) bool {
|
||||||
|
return languagePriority(l[i]) < languagePriority(l[j])
|
||||||
|
}
|
||||||
|
func languagePriority(l Lang) int {
|
||||||
|
priority := 0
|
||||||
|
|
||||||
|
switch l.Code {
|
||||||
|
case "ru":
|
||||||
|
priority = -3
|
||||||
|
case "kk":
|
||||||
|
priority = -2
|
||||||
|
case "en":
|
||||||
|
priority = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
return priority
|
||||||
|
}
|
76
src/localizer/view.go
Normal file
76
src/localizer/view.go
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
package localizer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fyne.io/fyne/v2"
|
||||||
|
"fyne.io/fyne/v2/widget"
|
||||||
|
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ViewContract interface {
|
||||||
|
LanguageSelection(funcSelected func(lang Lang))
|
||||||
|
}
|
||||||
|
|
||||||
|
type View struct {
|
||||||
|
w fyne.Window
|
||||||
|
localizerService ServiceContract
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewView(w fyne.Window, localizerService ServiceContract) *View {
|
||||||
|
return &View{
|
||||||
|
w: w,
|
||||||
|
localizerService: localizerService,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v View) LanguageSelection(funcSelected func(lang Lang)) {
|
||||||
|
languages := v.localizerService.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.localizerService.SetCurrentLanguage(languages[id])
|
||||||
|
funcSelected(languages[id])
|
||||||
|
}
|
||||||
|
|
||||||
|
messageHead := v.localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "languageSelectionHead",
|
||||||
|
})
|
||||||
|
|
||||||
|
v.w.SetContent(widget.NewCard(messageHead, "", listView))
|
||||||
|
}
|
||||||
|
|
||||||
|
func LanguageSelectionForm(localizerService ServiceContract, funcSelected func(lang 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.Lang.Code {
|
||||||
|
block.TextStyle = fyne.TextStyle{Bold: true}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
listView.OnSelected = func(id widget.ListItemID) {
|
||||||
|
_ = localizerService.SetCurrentLanguage(languages[id])
|
||||||
|
funcSelected(languages[id])
|
||||||
|
}
|
||||||
|
|
||||||
|
messageHead := localizerService.GetMessage(&i18n.LocalizeConfig{
|
||||||
|
MessageID: "languageSelectionFormHead",
|
||||||
|
})
|
||||||
|
return widget.NewCard(messageHead, "", listView)
|
||||||
|
}
|
45
src/main.go
45
src/main.go
@@ -3,30 +3,44 @@ package main
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"ffmpegGui/convertor"
|
"ffmpegGui/convertor"
|
||||||
myError "ffmpegGui/error"
|
error2 "ffmpegGui/error"
|
||||||
"ffmpegGui/handler"
|
"ffmpegGui/handler"
|
||||||
|
"ffmpegGui/localizer"
|
||||||
"ffmpegGui/migration"
|
"ffmpegGui/migration"
|
||||||
"ffmpegGui/setting"
|
"ffmpegGui/setting"
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
"fyne.io/fyne/v2/app"
|
"fyne.io/fyne/v2/app"
|
||||||
|
"fyne.io/fyne/v2/container"
|
||||||
|
"fyne.io/fyne/v2/widget"
|
||||||
_ "github.com/mattn/go-sqlite3"
|
_ "github.com/mattn/go-sqlite3"
|
||||||
|
"golang.org/x/text/language"
|
||||||
"gorm.io/driver/sqlite"
|
"gorm.io/driver/sqlite"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
//const appVersion string = "0.1.1"
|
//const appVersion string = "0.2.0"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
a := app.New()
|
a := app.New()
|
||||||
w := a.NewWindow("GUI FFMpeg!")
|
iconResource, err := fyne.LoadResourceFromPath("icon.png")
|
||||||
|
if err == nil {
|
||||||
|
a.SetIcon(iconResource)
|
||||||
|
}
|
||||||
|
w := a.NewWindow("FFMpeg GUI!")
|
||||||
w.Resize(fyne.Size{Width: 800, Height: 600})
|
w.Resize(fyne.Size{Width: 800, Height: 600})
|
||||||
w.CenterOnScreen()
|
w.CenterOnScreen()
|
||||||
|
|
||||||
errorView := myError.NewView(w)
|
localizerService, err := localizer.NewService("languages", language.Russian)
|
||||||
|
if err != nil {
|
||||||
|
panicErrorLang(w, err)
|
||||||
|
w.ShowAndRun()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
errorView := error2.NewView(w, localizerService)
|
||||||
if canCreateFile("data/database") != true {
|
if canCreateFile("data/database") != true {
|
||||||
errorView.PanicError(errors.New("не смогли создать файл 'database' в папке 'data'"))
|
errorView.PanicErrorWriteDirectoryData()
|
||||||
w.ShowAndRun()
|
w.ShowAndRun()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -63,13 +77,19 @@ func main() {
|
|||||||
|
|
||||||
ffPathUtilities := convertor.FFPathUtilities{FFmpeg: pathFFmpeg, FFprobe: pathFFprobe}
|
ffPathUtilities := convertor.FFPathUtilities{FFmpeg: pathFFmpeg, FFprobe: pathFFprobe}
|
||||||
|
|
||||||
convertorView := convertor.NewView(w)
|
localizerView := localizer.NewView(w, localizerService)
|
||||||
settingView := setting.NewView(w)
|
convertorView := convertor.NewView(w, localizerService)
|
||||||
convertorService := convertor.NewService(ffPathUtilities)
|
convertorService := convertor.NewService(ffPathUtilities)
|
||||||
defer appCloseWithConvert(convertorService)
|
defer appCloseWithConvert(convertorService)
|
||||||
mainHandler := handler.NewConvertorHandler(convertorService, convertorView, settingView, settingRepository)
|
convertorHandler := handler.NewConvertorHandler(convertorService, convertorView, settingRepository, localizerService)
|
||||||
|
|
||||||
mainHandler.GetConvertor()
|
localizerRepository := localizer.NewRepository(settingRepository)
|
||||||
|
mainMenu := handler.NewMenuHandler(convertorHandler, localizerService, localizerView, localizerRepository)
|
||||||
|
|
||||||
|
mainHandler := handler.NewMainHandler(convertorHandler, mainMenu, localizerRepository, localizerService)
|
||||||
|
mainHandler.Start()
|
||||||
|
|
||||||
|
w.SetMainMenu(mainMenu.GetMainMenu())
|
||||||
|
|
||||||
w.ShowAndRun()
|
w.ShowAndRun()
|
||||||
}
|
}
|
||||||
@@ -95,3 +115,10 @@ func canCreateFile(path string) bool {
|
|||||||
_ = file.Close()
|
_ = file.Close()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func panicErrorLang(w fyne.Window, err error) {
|
||||||
|
w.SetContent(container.NewVBox(
|
||||||
|
widget.NewLabel("Произошла ошибка!"),
|
||||||
|
widget.NewLabel("произошла ошибка при получении языковых переводах. \n\r"+err.Error()),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
@@ -1,11 +1,13 @@
|
|||||||
package setting
|
package setting
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
type RepositoryContract interface {
|
type RepositoryContract interface {
|
||||||
Create(setting Setting) (Setting, error)
|
Create(setting Setting) (Setting, error)
|
||||||
|
CreateOrUpdate(code string, value string) (Setting, error)
|
||||||
GetValue(code string) (value string, err error)
|
GetValue(code string) (value string, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,3 +35,21 @@ func (r Repository) Create(setting Setting) (Setting, error) {
|
|||||||
}
|
}
|
||||||
return setting, err
|
return setting, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r Repository) CreateOrUpdate(code string, value string) (Setting, error) {
|
||||||
|
var setting Setting
|
||||||
|
err := r.db.Where("code = ?", code).First(&setting).Error
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, gorm.ErrRecordNotFound) == true {
|
||||||
|
setting = Setting{Code: code, Value: value}
|
||||||
|
return r.Create(setting)
|
||||||
|
} else {
|
||||||
|
return setting, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = r.db.Model(&setting).UpdateColumn("value", value).Error
|
||||||
|
if err != nil {
|
||||||
|
return setting, err
|
||||||
|
}
|
||||||
|
return setting, err
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user