Compare commits
2 Commits
f262d5f931
...
0.6.0
Author | SHA1 | Date | |
---|---|---|---|
f17104595d | |||
24d80779ee |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,2 +1 @@
|
||||
fyne-cross/*
|
||||
ffmpeg/*
|
||||
fyne-cross/*
|
@@ -2,15 +2,11 @@ package form_items
|
||||
|
||||
import (
|
||||
"fyne.io/fyne/v2/widget"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor/view/form_items/h264_nvenc"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor/view/form_items/libx264"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/convertor/view/form_items/libx265"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/kernel"
|
||||
)
|
||||
|
||||
var Views = map[string]func(encoder encoder.EncoderContract, app kernel.AppContract) []*widget.FormItem{
|
||||
"libx264": libx264.View,
|
||||
"h264_nvenc": h264_nvenc.View,
|
||||
"libx265": libx265.View,
|
||||
"libx264": libx264.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
|
||||
// +build !windows,!linux
|
||||
//go:build !windows
|
||||
// +build !windows
|
||||
|
||||
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
|
||||
|
||||
import (
|
||||
"errors"
|
||||
encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder"
|
||||
)
|
||||
|
||||
var Presets = []string{
|
||||
"default",
|
||||
"slow",
|
||||
"medium",
|
||||
"fast",
|
||||
"hp",
|
||||
"hq",
|
||||
"bd",
|
||||
"ll",
|
||||
"llhq",
|
||||
"llhp",
|
||||
"lossless",
|
||||
"losslesshp",
|
||||
}
|
||||
|
||||
func NewEncoder() encoder2.EncoderContract {
|
||||
parameters := map[string]encoder2.ParameterContract{
|
||||
"preset": newParameterPreset(),
|
||||
}
|
||||
parameters := map[string]encoder2.ParameterContract{}
|
||||
getParams := func(parameters map[string]encoder2.ParameterContract) []string {
|
||||
params := []string{"-c:v", "h264_nvenc"}
|
||||
|
||||
if parameters["preset"] != nil && parameters["preset"].IsEnabled() {
|
||||
params = append(params, "-preset", parameters["preset"].Get())
|
||||
}
|
||||
|
||||
return params
|
||||
return []string{"-c:v", "h264_nvenc"}
|
||||
}
|
||||
|
||||
return encoder2.NewEncoder("h264_nvenc", parameters, getParams)
|
||||
@@ -43,16 +19,3 @@ func NewData() encoder2.EncoderDataContract {
|
||||
fileType := encoder2.FileType(encoder2.Video)
|
||||
return encoder2.NewData(title, formats, fileType, NewEncoder)
|
||||
}
|
||||
|
||||
func newParameterPreset() encoder2.ParameterContract {
|
||||
setParameter := func(s string) (string, error) {
|
||||
for _, value := range Presets {
|
||||
if value == s {
|
||||
return value, nil
|
||||
}
|
||||
}
|
||||
|
||||
return "", errors.New("preset not found")
|
||||
}
|
||||
return encoder2.NewParameter("preset", false, "default", setParameter)
|
||||
}
|
||||
|
@@ -1,35 +1,11 @@
|
||||
package libx265
|
||||
|
||||
import (
|
||||
"errors"
|
||||
encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder"
|
||||
)
|
||||
|
||||
var Presets = []string{
|
||||
"ultrafast",
|
||||
"superfast",
|
||||
"veryfast",
|
||||
"faster",
|
||||
"fast",
|
||||
"medium",
|
||||
"slow",
|
||||
"slower",
|
||||
"veryslow",
|
||||
"placebo",
|
||||
}
|
||||
import encoder2 "git.kor-elf.net/kor-elf/gui-for-ffmpeg/encoder"
|
||||
|
||||
func NewEncoder() encoder2.EncoderContract {
|
||||
parameters := map[string]encoder2.ParameterContract{
|
||||
"preset": newParameterPreset(),
|
||||
}
|
||||
parameters := map[string]encoder2.ParameterContract{}
|
||||
getParams := func(parameters map[string]encoder2.ParameterContract) []string {
|
||||
params := []string{"-c:v", "libx265"}
|
||||
|
||||
if parameters["preset"] != nil && parameters["preset"].IsEnabled() {
|
||||
params = append(params, "-preset", parameters["preset"].Get())
|
||||
}
|
||||
|
||||
return params
|
||||
return []string{"-c:v", "libx265"}
|
||||
}
|
||||
|
||||
return encoder2.NewEncoder("libx265", parameters, getParams)
|
||||
@@ -41,16 +17,3 @@ func NewData() encoder2.EncoderDataContract {
|
||||
fileType := encoder2.FileType(encoder2.Video)
|
||||
return encoder2.NewData(title, formats, fileType, NewEncoder)
|
||||
}
|
||||
|
||||
func newParameterPreset() encoder2.ParameterContract {
|
||||
setParameter := func(s string) (string, error) {
|
||||
for _, value := range Presets {
|
||||
if value == s {
|
||||
return value, nil
|
||||
}
|
||||
}
|
||||
|
||||
return "", errors.New("preset not found")
|
||||
}
|
||||
return encoder2.NewParameter("preset", false, "medium", setParameter)
|
||||
}
|
||||
|
1
go.mod
1
go.mod
@@ -34,7 +34,6 @@ require (
|
||||
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect
|
||||
github.com/stretchr/testify v1.8.4 // 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
|
||||
golang.org/x/image v0.11.0 // 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/tevino/abool v1.2.0 h1:heAkClL8H6w+mK5md9dzsuohKeXHUpY7Vw0ZCKW+huA=
|
||||
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.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
|
@@ -1,5 +1,5 @@
|
||||
//go:build !windows && !linux
|
||||
// +build !windows,!linux
|
||||
//go:build !windows
|
||||
// +build !windows
|
||||
|
||||
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",
|
||||
})
|
||||
progressMessage.Refresh()
|
||||
err = unZip("ffmpeg/ffmpeg.zip", "ffmpeg", progressBar)
|
||||
err = unZip("ffmpeg/ffmpeg.zip", "ffmpeg")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -100,23 +100,13 @@ func downloadFile(filepath string, url string, progressBar *widget.ProgressBar)
|
||||
return nil
|
||||
}
|
||||
|
||||
func unZip(fileZip string, directory string, progressBar *widget.ProgressBar) error {
|
||||
progressBar.Value = 0
|
||||
progressBar.Max = 100
|
||||
|
||||
func unZip(fileZip string, directory string) error {
|
||||
archive, err := zip.OpenReader(fileZip)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer archive.Close()
|
||||
|
||||
totalBytes := int64(0)
|
||||
for _, f := range archive.File {
|
||||
totalBytes += int64(f.UncompressedSize64)
|
||||
}
|
||||
|
||||
unpackedBytes := int64(0)
|
||||
|
||||
for _, f := range archive.File {
|
||||
filePath := filepath.Join(directory, f.Name)
|
||||
|
||||
@@ -142,15 +132,10 @@ func unZip(fileZip string, directory string, progressBar *widget.ProgressBar) er
|
||||
return err
|
||||
}
|
||||
|
||||
bytesRead, err := io.Copy(dstFile, fileInArchive)
|
||||
if err != nil {
|
||||
if _, err := io.Copy(dstFile, fileInArchive); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
unpackedBytes += bytesRead
|
||||
progressBar.Value = float64(unpackedBytes) / float64(totalBytes) * 100
|
||||
progressBar.Refresh()
|
||||
|
||||
dstFile.Close()
|
||||
fileInArchive.Close()
|
||||
}
|
||||
|
Reference in New Issue
Block a user