refactor for fix the world
parent
99c1061a18
commit
b17801060e
|
|
@ -46,85 +46,7 @@ func deport(ctx context.Context, p string) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
asses, err := filepath.Glob(path.Join(
|
return BestAssToSRT(ctx, p)
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type stream struct {
|
type stream struct {
|
||||||
|
|
@ -186,3 +108,104 @@ func execc(ctx context.Context, bin string, args ...string) (string, error) {
|
||||||
err := cmd.Run()
|
err := cmd.Run()
|
||||||
return string(stdout.Bytes()), err
|
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
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue