Compare commits
2 Commits
f262d5f931
...
0.6.0
Author | SHA1 | Date | |
---|---|---|---|
f17104595d | |||
24d80779ee |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,2 +1 @@
|
|||||||
fyne-cross/*
|
fyne-cross/*
|
||||||
ffmpeg/*
|
|
@@ -2,15 +2,11 @@ package form_items
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fyne.io/fyne/v2/widget"
|
"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/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/encoder"
|
||||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel"
|
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel"
|
||||||
)
|
)
|
||||||
|
|
||||||
var Views = map[string]func(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem{
|
var Views = map[string]func(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem{
|
||||||
"libx264": libx264.View,
|
"libx264": libx264.View,
|
||||||
"h264_nvenc": h264_nvenc.View,
|
|
||||||
"libx265": libx265.View,
|
|
||||||
}
|
}
|
||||||
|
@@ -1,65 +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"
|
|
||||||
"github.com/nicksnyder/go-i18n/v2/i18n"
|
|
||||||
)
|
|
||||||
|
|
||||||
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(&i18n.LocalizeConfig{MessageID: "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(&i18n.LocalizeConfig{MessageID: "formPreset"}),
|
|
||||||
Widget: container.NewVBox(elementCheckbox, elementSelect),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,65 +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"
|
|
||||||
"github.com/nicksnyder/go-i18n/v2/i18n"
|
|
||||||
)
|
|
||||||
|
|
||||||
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(&i18n.LocalizeConfig{MessageID: "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(&i18n.LocalizeConfig{MessageID: "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(&i18n.LocalizeConfig{MessageID: "formPreset"}),
|
|
||||||
Widget: container.NewVBox(elementCheckbox, elementSelect),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,5 +1,5 @@
|
|||||||
//go:build !windows && !linux
|
//go:build !windows
|
||||||
// +build !windows,!linux
|
// +build !windows
|
||||||
|
|
||||||
package convertor
|
package convertor
|
||||||
|
|
||||||
|
@@ -1,63 +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"
|
|
||||||
"github.com/nicksnyder/go-i18n/v2/i18n"
|
|
||||||
"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(&i18n.LocalizeConfig{
|
|
||||||
MessageID: "download",
|
|
||||||
}), func() {
|
|
||||||
buttonDownloadFFmpeg.Disable()
|
|
||||||
|
|
||||||
err := donwloadFFmpeg(progressBar, progressDownloadFFmpegMessage)
|
|
||||||
if err != nil {
|
|
||||||
errorDownloadFFmpegMessage.Text = err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
buttonDownloadFFmpeg.Enable()
|
|
||||||
})
|
|
||||||
|
|
||||||
downloadFFmpegFromSiteMessage := v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
|
|
||||||
MessageID: "downloadFFmpegFromSite",
|
|
||||||
})
|
|
||||||
|
|
||||||
return container.NewVBox(
|
|
||||||
canvas.NewLine(colornames.Darkgreen),
|
|
||||||
widget.NewCard(v.app.GetLocalizerService().GetMessage(&i18n.LocalizeConfig{
|
|
||||||
MessageID: "buttonDownloadFFmpeg",
|
|
||||||
}), "", container.NewVBox(
|
|
||||||
widget.NewRichTextFromMarkdown(
|
|
||||||
downloadFFmpegFromSiteMessage+" [https://github.com/BtbN/FFmpeg-Builds/releases](https://github.com/BtbN/FFmpeg-Builds/releases)",
|
|
||||||
),
|
|
||||||
buttonDownloadFFmpeg,
|
|
||||||
errorDownloadFFmpegMessage,
|
|
||||||
progressDownloadFFmpegMessage,
|
|
||||||
progressBar,
|
|
||||||
)),
|
|
||||||
)
|
|
||||||
}
|
|
@@ -1,37 +1,13 @@
|
|||||||
package h264_nvenc
|
package h264_nvenc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder"
|
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 {
|
func NewEncoder() encoder2.EncoderContract {
|
||||||
parameters := map[string]encoder2.ParameterContract{
|
parameters := map[string]encoder2.ParameterContract{}
|
||||||
"preset": newParameterPreset(),
|
|
||||||
}
|
|
||||||
getParams := func(parameters map[string]encoder2.ParameterContract) []string {
|
getParams := func(parameters map[string]encoder2.ParameterContract) []string {
|
||||||
params := []string{"-c:v", "h264_nvenc"}
|
return []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)
|
return encoder2.NewEncoder("h264_nvenc", parameters, getParams)
|
||||||
@@ -43,16 +19,3 @@ func NewData() encoder2.EncoderDataContract {
|
|||||||
fileType := encoder2.FileType(encoder2.Video)
|
fileType := encoder2.FileType(encoder2.Video)
|
||||||
return encoder2.NewData(title, formats, fileType, NewEncoder)
|
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)
|
|
||||||
}
|
|
||||||
|
@@ -1,35 +1,11 @@
|
|||||||
package libx265
|
package libx265
|
||||||
|
|
||||||
import (
|
import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder"
|
||||||
"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 {
|
func NewEncoder() encoder2.EncoderContract {
|
||||||
parameters := map[string]encoder2.ParameterContract{
|
parameters := map[string]encoder2.ParameterContract{}
|
||||||
"preset": newParameterPreset(),
|
|
||||||
}
|
|
||||||
getParams := func(parameters map[string]encoder2.ParameterContract) []string {
|
getParams := func(parameters map[string]encoder2.ParameterContract) []string {
|
||||||
params := []string{"-c:v", "libx265"}
|
return []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)
|
return encoder2.NewEncoder("libx265", parameters, getParams)
|
||||||
@@ -41,16 +17,3 @@ func NewData() encoder2.EncoderDataContract {
|
|||||||
fileType := encoder2.FileType(encoder2.Video)
|
fileType := encoder2.FileType(encoder2.Video)
|
||||||
return encoder2.NewData(title, formats, fileType, NewEncoder)
|
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)
|
|
||||||
}
|
|
||||||
|
1
go.mod
1
go.mod
@@ -34,7 +34,6 @@ require (
|
|||||||
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect
|
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect
|
||||||
github.com/stretchr/testify v1.8.4 // indirect
|
github.com/stretchr/testify v1.8.4 // indirect
|
||||||
github.com/tevino/abool v1.2.0 // indirect
|
github.com/tevino/abool v1.2.0 // indirect
|
||||||
github.com/ulikunitz/xz v0.5.12 // indirect
|
|
||||||
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
|
||||||
|
2
go.sum
2
go.sum
@@ -288,8 +288,6 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl
|
|||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||||
github.com/tevino/abool v1.2.0 h1:heAkClL8H6w+mK5md9dzsuohKeXHUpY7Vw0ZCKW+huA=
|
github.com/tevino/abool v1.2.0 h1:heAkClL8H6w+mK5md9dzsuohKeXHUpY7Vw0ZCKW+huA=
|
||||||
github.com/tevino/abool v1.2.0/go.mod h1:qc66Pna1RiIsPa7O4Egxxs9OqkuxDX55zznh9K07Tzg=
|
github.com/tevino/abool v1.2.0/go.mod h1:qc66Pna1RiIsPa7O4Egxxs9OqkuxDX55zznh9K07Tzg=
|
||||||
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
|
|
||||||
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
|
||||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
//go:build !windows && !linux
|
//go:build !windows
|
||||||
// +build !windows,!linux
|
// +build !windows
|
||||||
|
|
||||||
package handler
|
package handler
|
||||||
|
|
||||||
|
@@ -1,208 +0,0 @@
|
|||||||
//go:build linux
|
|
||||||
// +build linux
|
|
||||||
|
|
||||||
package handler
|
|
||||||
|
|
||||||
import (
|
|
||||||
"archive/tar"
|
|
||||||
"errors"
|
|
||||||
"fyne.io/fyne/v2/canvas"
|
|
||||||
"fyne.io/fyne/v2/widget"
|
|
||||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel"
|
|
||||||
"github.com/nicksnyder/go-i18n/v2/i18n"
|
|
||||||
"github.com/ulikunitz/xz"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
)
|
|
||||||
|
|
||||||
func getPathsToFF() []kernel.FFPathUtilities {
|
|
||||||
return []kernel.FFPathUtilities{{"ffmpeg/bin/ffmpeg", "ffmpeg/bin/ffprobe"}, {"ffmpeg", "ffprobe"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
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(&i18n.LocalizeConfig{
|
|
||||||
MessageID: "downloadRun",
|
|
||||||
})
|
|
||||||
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(&i18n.LocalizeConfig{
|
|
||||||
MessageID: "unzipRun",
|
|
||||||
})
|
|
||||||
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(&i18n.LocalizeConfig{
|
|
||||||
MessageID: "testFF",
|
|
||||||
})
|
|
||||||
progressMessage.Refresh()
|
|
||||||
|
|
||||||
err = h.saveSettingFFPath("ffmpeg/ffmpeg-master-latest-linux64-gpl/bin/ffmpeg", "ffmpeg/ffmpeg-master-latest-linux64-gpl/bin/ffprobe")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
progressBar.Refresh()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func unTarXz(fileTar string, directory string, progressBar *widget.ProgressBar) error {
|
|
||||||
progressBar.Value = 0
|
|
||||||
progressBar.Max = 100
|
|
||||||
|
|
||||||
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
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isDirectory(path string) bool {
|
|
||||||
fileInfo, err := os.Stat(path)
|
|
||||||
if err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return fileInfo.IsDir()
|
|
||||||
}
|
|
@@ -42,7 +42,7 @@ func (h ConvertorHandler) downloadFFmpeg(progressBar *widget.ProgressBar, progre
|
|||||||
MessageID: "unzipRun",
|
MessageID: "unzipRun",
|
||||||
})
|
})
|
||||||
progressMessage.Refresh()
|
progressMessage.Refresh()
|
||||||
err = unZip("ffmpeg/ffmpeg.zip", "ffmpeg", progressBar)
|
err = unZip("ffmpeg/ffmpeg.zip", "ffmpeg")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -100,23 +100,13 @@ func downloadFile(filepath string, url string, progressBar *widget.ProgressBar)
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func unZip(fileZip string, directory string, progressBar *widget.ProgressBar) error {
|
func unZip(fileZip string, directory string) error {
|
||||||
progressBar.Value = 0
|
|
||||||
progressBar.Max = 100
|
|
||||||
|
|
||||||
archive, err := zip.OpenReader(fileZip)
|
archive, err := zip.OpenReader(fileZip)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer archive.Close()
|
defer archive.Close()
|
||||||
|
|
||||||
totalBytes := int64(0)
|
|
||||||
for _, f := range archive.File {
|
|
||||||
totalBytes += int64(f.UncompressedSize64)
|
|
||||||
}
|
|
||||||
|
|
||||||
unpackedBytes := int64(0)
|
|
||||||
|
|
||||||
for _, f := range archive.File {
|
for _, f := range archive.File {
|
||||||
filePath := filepath.Join(directory, f.Name)
|
filePath := filepath.Join(directory, f.Name)
|
||||||
|
|
||||||
@@ -142,15 +132,10 @@ func unZip(fileZip string, directory string, progressBar *widget.ProgressBar) er
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
bytesRead, err := io.Copy(dstFile, fileInArchive)
|
if _, err := io.Copy(dstFile, fileInArchive); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
unpackedBytes += bytesRead
|
|
||||||
progressBar.Value = float64(unpackedBytes) / float64(totalBytes) * 100
|
|
||||||
progressBar.Refresh()
|
|
||||||
|
|
||||||
dstFile.Close()
|
dstFile.Close()
|
||||||
fileInArchive.Close()
|
fileInArchive.Close()
|
||||||
}
|
}
|
||||||
|
2
main.go
2
main.go
@@ -26,7 +26,7 @@ func init() {
|
|||||||
appMetadata := &fyne.AppMetadata{
|
appMetadata := &fyne.AppMetadata{
|
||||||
ID: "net.kor-elf.projects.gui-for-ffmpeg",
|
ID: "net.kor-elf.projects.gui-for-ffmpeg",
|
||||||
Name: "GUI for FFmpeg",
|
Name: "GUI for FFmpeg",
|
||||||
Version: "0.7.0",
|
Version: "0.6.0",
|
||||||
Icon: iconResource,
|
Icon: iconResource,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user