Compare commits
3 Commits
99c1061a18
...
4bdfbd1f06
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4bdfbd1f06 | ||
|
|
44bcc0ba2e | ||
|
|
b17801060e |
@@ -46,82 +46,28 @@ 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 {
|
||||
if err := BestAssToSRT(ctx, p); 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
|
||||
}
|
||||
base := path.Base(p)
|
||||
withoutExt := strings.TrimSuffix(base, path.Ext(base))
|
||||
p2 := path.Join(path.Dir(p), fmt.Sprintf("%s.subless.mkv", withoutExt))
|
||||
args := []string{
|
||||
"-i", p,
|
||||
"-map", "0",
|
||||
}
|
||||
|
||||
srts, err := filepath.Glob(path.Join(
|
||||
path.Dir(p),
|
||||
fmt.Sprintf(".%s.*.srt", path.Base(p)),
|
||||
))
|
||||
if err != nil {
|
||||
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
|
||||
}
|
||||
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
|
||||
@@ -186,3 +132,94 @@ 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 {
|
||||
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 = SRTsByGoodness(srts)
|
||||
|
||||
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
|
||||
}
|
||||
} 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(srts []string) []string {
|
||||
/*
|
||||
1 lat.*amer Lat.*Amer \
|
||||
2 signs \
|
||||
3 rus Rus \
|
||||
4 por Por \
|
||||
5 ita Ita \
|
||||
6 fre Fre \
|
||||
7 spa Spa \
|
||||
8 ger Ger \
|
||||
9 ara Ara \
|
||||
10 jpn Jpn \
|
||||
11 Europ \
|
||||
12 Brazil \
|
||||
13 Deu \
|
||||
*/
|
||||
panic("NOT IMPL")
|
||||
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
|
||||
}
|
||||
|
||||
29
src/asses/deport_test.go
Normal file
29
src/asses/deport_test.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package asses_test
|
||||
|
||||
import (
|
||||
"show-rss/src/asses"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestSRTsByGoodness(t *testing.T) {
|
||||
cases := map[string]struct {
|
||||
given []string
|
||||
want string
|
||||
}{
|
||||
"eng": {
|
||||
given: []string{"a", "eng"},
|
||||
want: "eng",
|
||||
},
|
||||
}
|
||||
|
||||
for name, d := range cases {
|
||||
name := name
|
||||
c := d
|
||||
t.Run(name, func(t *testing.T) {
|
||||
got := asses.SRTsByGoodness(c.given)
|
||||
if got[0] != c.want {
|
||||
t.Errorf("expected %s but got %s (%+v)", c.want, got[0], got)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user