Fix after closing the program so that ffmpeg would also stop if it was running.

This commit is contained in:
Leonid Nikitin 2024-01-20 14:58:16 +06:00
parent 2596e822bd
commit fc38a1b20c
Signed by: kor-elf
GPG Key ID: 7DE8F80C5CEC2C0D
2 changed files with 27 additions and 4 deletions

View File

@ -17,6 +17,7 @@ type ServiceContract interface {
GetFFprobeVersion() (string, error) GetFFprobeVersion() (string, error)
ChangeFFmpegPath(path string) (bool, error) ChangeFFmpegPath(path string) (bool, error)
ChangeFFprobePath(path string) (bool, error) ChangeFFprobePath(path string) (bool, error)
GetRunningProcesses() map[int]*exec.Cmd
} }
type ProgressContract interface { type ProgressContract interface {
@ -29,8 +30,14 @@ type FFPathUtilities struct {
FFprobe string FFprobe string
} }
type runningProcesses struct {
items map[int]*exec.Cmd
numberOfStarts int
}
type Service struct { type Service struct {
ffPathUtilities *FFPathUtilities ffPathUtilities *FFPathUtilities
runningProcesses runningProcesses
} }
type File struct { type File struct {
@ -51,7 +58,8 @@ type ConvertData struct {
func NewService(ffPathUtilities FFPathUtilities) *Service { func NewService(ffPathUtilities FFPathUtilities) *Service {
return &Service{ return &Service{
ffPathUtilities: &ffPathUtilities, ffPathUtilities: &ffPathUtilities,
runningProcesses: runningProcesses{items: map[int]*exec.Cmd{}, numberOfStarts: 0},
} }
} }
@ -77,10 +85,14 @@ func (s Service) RunConvert(setting ConvertSetting, progress ProgressContract) e
if err != nil { if err != nil {
return err return err
} }
index := s.runningProcesses.numberOfStarts
s.runningProcesses.numberOfStarts++
s.runningProcesses.items[index] = cmd
errProgress := progress.Run(stdOut, stdErr) errProgress := progress.Run(stdOut, stdErr)
err = cmd.Wait() err = cmd.Wait()
delete(s.runningProcesses.items, index)
if errProgress != nil { if errProgress != nil {
return errProgress return errProgress
} }
@ -155,3 +167,7 @@ func (s Service) ChangeFFprobePath(path string) (bool, error) {
s.ffPathUtilities.FFprobe = path s.ffPathUtilities.FFprobe = path
return true, nil return true, nil
} }
func (s Service) GetRunningProcesses() map[int]*exec.Cmd {
return s.runningProcesses.items
}

View File

@ -38,7 +38,7 @@ func main() {
return return
} }
defer appClose(db) defer appCloseWithDb(db)
err = migration.Run(db) err = migration.Run(db)
if err != nil { if err != nil {
@ -66,6 +66,7 @@ func main() {
convertorView := convertor.NewView(w) convertorView := convertor.NewView(w)
settingView := setting.NewView(w) settingView := setting.NewView(w)
convertorService := convertor.NewService(ffPathUtilities) convertorService := convertor.NewService(ffPathUtilities)
defer appCloseWithConvert(convertorService)
mainHandler := handler.NewConvertorHandler(convertorService, convertorView, settingView, settingRepository) mainHandler := handler.NewConvertorHandler(convertorService, convertorView, settingView, settingRepository)
mainHandler.GetConvertor() mainHandler.GetConvertor()
@ -73,13 +74,19 @@ func main() {
w.ShowAndRun() w.ShowAndRun()
} }
func appClose(db *gorm.DB) { func appCloseWithDb(db *gorm.DB) {
sqlDB, err := db.DB() sqlDB, err := db.DB()
if err == nil { if err == nil {
_ = sqlDB.Close() _ = sqlDB.Close()
} }
} }
func appCloseWithConvert(convertorService convertor.ServiceContract) {
for _, cmd := range convertorService.GetRunningProcesses() {
_ = cmd.Process.Kill()
}
}
func canCreateFile(path string) bool { func canCreateFile(path string) bool {
file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0666) file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0666)
if err != nil { if err != nil {