diff options
author | Grail Finder <wohilas@gmail.com> | 2023-02-17 12:14:21 +0600 |
---|---|---|
committer | Grail Finder <wohilas@gmail.com> | 2023-02-17 12:14:21 +0600 |
commit | df498c756b1cb0e3f045bc88396223272b713a4c (patch) | |
tree | 9f7725adfdd87c592aac10a03e516f0f88087404 | |
parent | 520aae362ecdac0b60c9aca19b83cac1061813de (diff) |
Feat: add time check and test
-rw-r--r-- | main.go | 41 | ||||
-rw-r--r-- | main_test.go | 67 | ||||
-rw-r--r-- | workers.go | 13 |
3 files changed, 107 insertions, 14 deletions
@@ -76,8 +76,7 @@ func linesToUtterances(lines []string, fd *FileData) []*Utterance { u.OutPath = fmt.Sprintf("%s/%s_%s_%s.opus", outdir, fd.AudioBase, u.LeftTime, u.RightTime) - // todo: compare and filter time - if u.LeftTime == u.RightTime { + if !adequateTimes(u.LeftTime, u.RightTime) { continue } resp = append(resp, u) @@ -86,6 +85,27 @@ func linesToUtterances(lines []string, fd *FileData) []*Utterance { return resp } +func adequateTimes(left, right string) bool { + if len(left) == len("06:18.240") { + left = "00:" + left + } + if len(right) == len("06:18.240") { + right = "00:" + right + } + lts, err := time.Parse("15:04:05.000", left) + if err != nil { + fmt.Println(left, right, err) + } + rts, err := time.Parse("15:04:05.000", right) + if err != nil { + fmt.Println(left, right, err) + } + if rts.After(lts) { + return true + } + return false +} + func buildFFmpegCall(ut *Utterance) string { return fmt.Sprintf( `yes no | ffmpeg -i "%s" -ss %s -to %s \ @@ -163,11 +183,11 @@ func main() { panic(err) } - // filteredUtterances := []*Utterance{} + filteredUtterances := []*Utterance{} // === concurrent === queue := make(chan *Utterance, len(utterances)) - done := make(chan bool, 1) + geshaft := make(chan *Utterance, len(utterances)) for _, ut := range utterances { if _, err := os.Stat(ut.OutPath); os.IsNotExist(err) { @@ -175,6 +195,8 @@ func main() { // if err := cutoutClipAndTranscode(ut); err == nil { // filteredUtterances = append(filteredUtterances, ut) // } + } else if err == nil { + geshaft <- ut } } @@ -182,20 +204,23 @@ func main() { workers := 100 for i := 0; i < workers; i++ { - go worker(queue, i, done) + go worker(queue, i, geshaft) } for { if len(queue) == 0 { // give time for workers to finish time.Sleep(3 * time.Second) - done <- true - close(done) close(queue) break } time.Sleep(1 * time.Second) } - newMeta := utterancesToFileTextMap(utterances) + + for ut := range geshaft { + filteredUtterances = append(filteredUtterances, ut) + } + close(geshaft) + newMeta := utterancesToFileTextMap(filteredUtterances) writeCSV(mapToCSV(newMeta)) } diff --git a/main_test.go b/main_test.go new file mode 100644 index 0000000..e494dc6 --- /dev/null +++ b/main_test.go @@ -0,0 +1,67 @@ +package main + +import ( + "fmt" + "testing" +) + +func TestFullyIncludes(t *testing.T) { + cases := []struct { + LeftTime string + RightTime string + Want bool + Description string + }{ + { + LeftTime: "06:12.240", + RightTime: "06:16.040", + Want: true, + Description: "right time is bigger", + }, + { + LeftTime: "06:18.240", + RightTime: "06:16.040", + Want: false, + Description: "left time is bigger: inadequate", + }, + { + LeftTime: "06:18.240", + RightTime: "06:18.240", + Want: false, + Description: "left == right: inadequate", + }, + { + LeftTime: "01:00:08.000", + RightTime: "59:37.800", + Want: false, + Description: "with hours: left time is bigger: inadequate", + }, + { + LeftTime: "59:37.800", + RightTime: "01:00:08.000", + Want: true, + Description: "with hours: right time is bigger", + }, + { + LeftTime: "01:00:04.900", + RightTime: "01:02:08.000", + Want: true, + Description: "with hours: right time is bigger", + }, + { + LeftTime: "01:02:08.000", + RightTime: "01:00:04.900", + Want: false, + Description: "with hours: left time is bigger", + }, + } + for i, tc := range cases { + t.Run(fmt.Sprintf("run: #%d; %q", i, tc.Description), func(t *testing.T) { + got := adequateTimes(tc.LeftTime, tc.RightTime) + if got != tc.Want { + t.Errorf("want: %v; got: %v", tc.Want, got) + } + }) + } + +} @@ -2,14 +2,15 @@ package main import "fmt" -func worker(queue chan *Utterance, worknumber int, done chan bool) { +func worker(queue chan *Utterance, worknumber int, geshaft chan *Utterance) { for { - select { - case ut := <-queue: - cutoutClipAndTranscode(ut) - case <-done: - fmt.Println("worker stoped, number", worknumber) + if len(queue) == 0 { + fmt.Println("empty queue, number", worknumber) return } + ut := <-queue + if err := cutoutClipAndTranscode(ut); err == nil { + geshaft <- ut + } } } |