Default author output path without dialogs

This commit is contained in:
Stu Leak 2025-12-23 21:06:49 -05:00
parent 1da9317d73
commit ec7649aee8

View File

@ -620,6 +620,9 @@ func authorSummary(state *appState) string {
summary += fmt.Sprintf("Disc Size: %s\n", state.authorDiscSize)
summary += fmt.Sprintf("Region: %s\n", state.authorRegion)
summary += fmt.Sprintf("Aspect Ratio: %s\n", state.authorAspectRatio)
if outPath := authorDefaultOutputPath(state.authorOutputType, state.authorTitle, authorSummaryPaths(state)); outPath != "" {
summary += fmt.Sprintf("Output Path: %s\n", outPath)
}
if state.authorTitle != "" {
summary += fmt.Sprintf("DVD Title: %s\n", state.authorTitle)
}
@ -696,6 +699,20 @@ func authorTotalDuration(state *appState) float64 {
return 0
}
func authorSummaryPaths(state *appState) []string {
if len(state.authorClips) > 0 {
paths := make([]string, 0, len(state.authorClips))
for _, clip := range state.authorClips {
paths = append(paths, clip.Path)
}
return paths
}
if state.authorFile != nil {
return []string{state.authorFile.Path}
}
return nil
}
func authorTargetBitrateKbps(discSize string, totalSeconds float64) int {
if totalSeconds <= 0 {
return 0
@ -1046,28 +1063,12 @@ func (s *appState) promptAuthorOutput(paths []string, region, aspect, title stri
outputType = "dvd"
}
outputPath := authorDefaultOutputPath(outputType, title, paths)
if outputType == "iso" {
dialog.ShowFileSave(func(writer fyne.URIWriteCloser, err error) {
if err != nil || writer == nil {
return
}
path := writer.URI().Path()
writer.Close()
if !strings.HasSuffix(strings.ToLower(path), ".iso") {
path += ".iso"
}
s.generateAuthoring(paths, region, aspect, title, path, true)
}, s.window)
s.generateAuthoring(paths, region, aspect, title, outputPath, true)
return
}
dialog.ShowFolderOpen(func(uri fyne.ListableURI, err error) {
if err != nil || uri == nil {
return
}
discRoot := filepath.Join(uri.Path(), authorOutputFolderName(title, paths))
s.generateAuthoring(paths, region, aspect, title, discRoot, false)
}, s.window)
s.generateAuthoring(paths, region, aspect, title, outputPath, false)
}
func authorWarnings(state *appState) []string {
@ -1167,6 +1168,66 @@ func authorOutputFolderName(title string, paths []string) string {
return name
}
func authorDefaultOutputDir(outputType string) string {
home, err := os.UserHomeDir()
if err != nil || home == "" {
home = "."
}
dir := filepath.Join(home, "Videos")
if strings.EqualFold(outputType, "iso") {
return filepath.Join(dir, "ISO_Convert")
}
return filepath.Join(dir, "DVD_Convert")
}
func authorDefaultOutputPath(outputType, title string, paths []string) string {
outputType = strings.ToLower(strings.TrimSpace(outputType))
if outputType == "" {
outputType = "dvd"
}
baseDir := authorDefaultOutputDir(outputType)
name := strings.TrimSpace(title)
if name == "" {
name = defaultAuthorTitle(paths)
}
name = sanitizeForPath(name)
if name == "" {
name = "dvd_output"
}
if outputType == "iso" {
return uniqueFilePath(filepath.Join(baseDir, name+".iso"))
}
return uniqueFolderPath(filepath.Join(baseDir, name))
}
func uniqueFolderPath(path string) string {
if _, err := os.Stat(path); os.IsNotExist(err) {
return path
}
for i := 1; i < 1000; i++ {
tryPath := fmt.Sprintf("%s-%d", path, i)
if _, err := os.Stat(tryPath); os.IsNotExist(err) {
return tryPath
}
}
return fmt.Sprintf("%s-%d", path, time.Now().Unix())
}
func uniqueFilePath(path string) string {
if _, err := os.Stat(path); os.IsNotExist(err) {
return path
}
ext := filepath.Ext(path)
base := strings.TrimSuffix(path, ext)
for i := 1; i < 1000; i++ {
tryPath := fmt.Sprintf("%s-%d%s", base, i, ext)
if _, err := os.Stat(tryPath); os.IsNotExist(err) {
return tryPath
}
}
return fmt.Sprintf("%s-%d%s", base, time.Now().Unix(), ext)
}
func (s *appState) generateAuthoring(paths []string, region, aspect, title, outputPath string, makeISO bool) {
if err := s.addAuthorToQueue(paths, region, aspect, title, outputPath, makeISO, true); err != nil {
dialog.ShowError(err, s.window)