From b17801060ee4e936db5b25006e9162ff79336fc1 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Sat, 31 May 2025 11:06:59 -0600 Subject: [PATCH] refactor for fix the world --- src/asses/deport.go | 181 +++++++++++++++++++++++++------------------- 1 file changed, 102 insertions(+), 79 deletions(-) diff --git a/src/asses/deport.go b/src/asses/deport.go index d7c6974..51b3ee3 100644 --- a/src/asses/deport.go +++ b/src/asses/deport.go @@ -46,85 +46,7 @@ func deport(ctx context.Context, p string) error { } } - asses, err := filepath.Glob(path.Join( - path.Dir(p), - fmt.Sprintf(".%s.*.ass", path.Base(p)), - )) - if err != nil { - return err - } - for _, ass := range asses { - srt := fmt.Sprintf("%s.srt", strings.TrimSuffix(ass, ".ass")) - if _, err := os.Stat(srt); err == nil { - continue - } - - if err := ffmpeg(ctx, "-y", "-i", ass, srt); err != nil { - if ctx.Err() == nil { - log.Printf("ffmpeg failed to process %s; removing", ass) - os.Remove(ass) - } - return err - } - - b, err := os.ReadFile(srt) - if err != nil { - return err - } - before := len(b) - b = regexp.MustCompile(`size="[^"]*"`).ReplaceAll(b, []byte{}) - if after := len(b); before == after { - } else if err := os.WriteFile(srt, b, os.ModePerm); err != nil { - return err - } - } - - srts, err := filepath.Glob(path.Join( - path.Dir(p), - fmt.Sprintf(".%s.*.srt", path.Base(p)), - )) - if err != nil { - return err - } - slices.SortFunc(srts, func(a, b string) int { - // if skip a { return 1 } - // if skip b { return -1 } - // return -1 * (wc(a) - wc(b)) - return strings.Compare(a, b) - }) - for i := range srts { - if i == 0 { - base := path.Base(p) - withoutExt := strings.TrimSuffix(base, path.Ext(base)) - - srt := path.Join(path.Dir(p), fmt.Sprintf("%s.srt", withoutExt)) - if err := os.Rename(srts[i], srt); err != nil { - return err - } - - p2 := path.Join(path.Dir(p), fmt.Sprintf("%s.subless.mkv", withoutExt)) - args := []string{ - "-i", p, - "-map", "0", - } - for _, assStreamID := range assStreamIDs { - args = append(args, "-map", "-"+assStreamID) - } - args = append(args, - "-c", "copy", - p2, - ) - if err := ffmpeg(ctx, args...); err != nil { - return err - } else if err := os.Rename(p2, p); err != nil { - return err - } - } else { - os.Remove(srts[i]) - } - } - - return nil + return BestAssToSRT(ctx, p) } type stream struct { @@ -186,3 +108,104 @@ func execc(ctx context.Context, bin string, args ...string) (string, error) { err := cmd.Run() return string(stdout.Bytes()), err } + +func BestAssToSRT(ctx context.Context, p string) error { + assStreams, err := assStreams(ctx, p) + if err != nil { + return err + } + + asses, err := filepath.Glob(path.Join( + path.Dir(p), + fmt.Sprintf(".%s.*.ass", path.Base(p)), + )) + if err != nil { + return err + } + + srts := []string{} + for _, ass := range asses { + srt, err := assToSRT(ctx, ass) + if err != nil { + return err + } + srts = append(srts, srt) + } + + srts, err = SRTsByGoodness(ctx, srts) + if err != nil { + return err + } + + for i := range srts { + if i == 0 { + base := path.Base(p) + withoutExt := strings.TrimSuffix(base, path.Ext(base)) + + srt := path.Join(path.Dir(p), fmt.Sprintf("%s.srt", withoutExt)) + if err := os.Rename(srts[i], srt); err != nil { + return err + } + + p2 := path.Join(path.Dir(p), fmt.Sprintf("%s.subless.mkv", withoutExt)) + args := []string{ + "-i", p, + "-map", "0", + } + for _, assStream := range assStreams { + args = append(args, "-map", "-"+assStream.id) + } + args = append(args, + "-c", "copy", + p2, + ) + if err := ffmpeg(ctx, args...); err != nil { + return err + } else if err := os.Rename(p2, p); err != nil { + return err + } + } else { + os.Remove(srts[i]) + } + } + + return nil +} + +func assToSRT(ctx context.Context, ass string) (string, error) { + srt := fmt.Sprintf("%s.srt", strings.TrimSuffix(ass, ".ass")) + if _, err := os.Stat(srt); err == nil { + return srt, nil + } + + if err := ffmpeg(ctx, "-y", "-i", ass, srt); err != nil { + if ctx.Err() == nil { + log.Printf("ffmpeg failed to process %s; removing", ass) + os.Remove(ass) + } + return srt, err + } + + b, err := os.ReadFile(srt) + if err != nil { + return srt, err + } + before := len(b) + b = regexp.MustCompile(`size="[^"]*"`).ReplaceAll(b, []byte{}) + if after := len(b); before == after { + } else if err := os.WriteFile(srt, b, os.ModePerm); err != nil { + return srt, err + } + return srt, nil +} + +func SRTsByGoodness(ctx context.Context, srts []string) ([]string, error) { + srts = slices.Clone(srts) + slices.SortFunc(srts, func(a, b string) int { + // if skip a { return 1 } + // if skip b { return -1 } + // return -1 * (wc(a) - wc(b)) + return strings.Compare(a, b) + }) + return srts, nil +}