72 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package app | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"os" | ||
|  | 	"strconv" | ||
|  | 
 | ||
|  | 	"codeberg.org/danjones000/strip-beats/media" | ||
|  | 	"github.com/rivo/tview" | ||
|  | ) | ||
|  | 
 | ||
|  | func validateNumber(input string, lastChar rune) bool { | ||
|  | 	num, err := strconv.ParseFloat(input, 64) | ||
|  | 	if err != nil { | ||
|  | 		return false | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if num < 0 { | ||
|  | 		return false | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if file == nil { | ||
|  | 		return true | ||
|  | 	} | ||
|  | 
 | ||
|  | 	st := file.WantedAudioStream() | ||
|  | 	if st == nil { | ||
|  | 		return true | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return num <= st.Duration | ||
|  | } | ||
|  | 
 | ||
|  | func fadeFile() error { | ||
|  | 	tmp, err := os.CreateTemp("", "audio.*.mka") | ||
|  | 	if err != nil { | ||
|  | 		return err | ||
|  | 	} | ||
|  | 	tmp.Close() | ||
|  | 
 | ||
|  | 	var start, stop, up, down float64 | ||
|  | 
 | ||
|  | 	cont := tview.NewApplication() | ||
|  | 	form := tview.NewForm(). | ||
|  | 		AddInputField("Beginning time?", "0", 0, validateNumber, func(input string) { | ||
|  | 			start, _ = strconv.ParseFloat(input, 64) | ||
|  | 		}). | ||
|  | 		AddInputField("Ending time? (leave 0 for full time)", "0", 0, validateNumber, func(input string) { | ||
|  | 			stop, _ = strconv.ParseFloat(input, 64) | ||
|  | 		}). | ||
|  | 		AddInputField("Fade in duration?", "0", 0, validateNumber, func(input string) { | ||
|  | 			up, _ = strconv.ParseFloat(input, 64) | ||
|  | 		}). | ||
|  | 		AddInputField("Fade out duration?", "0", 0, validateNumber, func(input string) { | ||
|  | 			down, _ = strconv.ParseFloat(input, 64) | ||
|  | 		}). | ||
|  | 		AddButton("Start", func() { | ||
|  | 			cont.Stop() | ||
|  | 		}) | ||
|  | 
 | ||
|  | 	form.SetBorder(true).SetTitleAlign(tview.AlignLeft) | ||
|  | 	if err := cont.SetRoot(form, true).EnableMouse(true).Run(); err != nil { | ||
|  | 		return err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	err = media.TrimWithFade(*file, tmp.Name(), start, stop, up, down) | ||
|  | 	if err != nil { | ||
|  | 		return err | ||
|  | 	} | ||
|  | 	SetTmpFile(tmp.Name()) | ||
|  | 	return nil | ||
|  | } |