Compare commits

...

8 Commits

Author SHA1 Message Date
bel
18ac13fd57 should not execute feed if version.url=="" 2025-12-10 08:40:28 -07:00
bel
375fc1000a feeds for each runs all and returns all errs 2025-12-10 08:38:59 -07:00
bel
47c7aa74d3 uncap retries on main 2025-12-10 08:23:54 -07:00
bel
a6aad2820d cap retries 2025-12-10 08:13:45 -07:00
bel
b26afcb325 log 2025-12-02 16:30:10 -07:00
bel
613bfdf96e transcode entrypoint 2025-12-02 16:28:55 -07:00
Bel LaPointe
81507319dd disable by default 2025-12-02 16:25:15 -07:00
bel
50ad3bb3db install_scratch.sh 2025-11-30 09:00:47 -07:00
7 changed files with 135 additions and 42 deletions

3
install_scratch.sh Normal file
View File

@@ -0,0 +1,3 @@
#! /usr/bin/env bash
CGO_ENABLED=1 CC=x86_64-linux-musl-gcc go install -ldflags="-linkmode external -extldflags '-static'"

View File

@@ -12,8 +12,9 @@ import (
"path" "path"
"show-rss/src/slow" "show-rss/src/slow"
"strconv" "strconv"
"golang.org/x/time/rate"
"time" "time"
"golang.org/x/time/rate"
) )
var EnvCksumBPS = func() int { var EnvCksumBPS = func() int {
@@ -36,7 +37,7 @@ func One(ctx context.Context, p string) error {
return err return err
} }
threshold := 20 + rand.New(rand.NewSource(func() int64{ threshold := 20 + rand.New(rand.NewSource(func() int64 {
b := md5.New().Sum([]byte(p)) b := md5.New().Sum([]byte(p))
var sum int64 var sum int64
for _, c := range b { for _, c := range b {
@@ -45,7 +46,7 @@ func One(ctx context.Context, p string) error {
} }
return sum return sum
}())).Int()%10 }())).Int()%10
if daysSince := int(time.Since(last.T).Hours()/24); daysSince > threshold { if daysSince := int(time.Since(last.T).Hours() / 24); daysSince > threshold {
log.Printf("asses.One(%s) // no modified check as %vd since last check", shortp, daysSince) log.Printf("asses.One(%s) // no modified check as %vd since last check", shortp, daysSince)
} else if stat, err := os.Stat(p); err != nil { } else if stat, err := os.Stat(p); err != nil {
return fmt.Errorf("cannot stat %s: %w", p, err) return fmt.Errorf("cannot stat %s: %w", p, err)
@@ -81,6 +82,11 @@ func One(ctx context.Context, p string) error {
return err return err
} }
log.Printf("asses.transcode(%s)...", shortp)
if err := transcode(ctx, p); err != nil {
return err
}
return nil return nil
}(); err != nil { }(); err != nil {
return err return err

View File

@@ -12,6 +12,8 @@ import (
func TestOne(t *testing.T) { func TestOne(t *testing.T) {
ctx := db.Test(t, context.Background()) ctx := db.Test(t, context.Background())
os.Setenv("DO_TRANSCODE", "true")
d := t.TempDir() d := t.TempDir()
b, _ := os.ReadFile(path.Join("testdata", "survivor_au_S11E12.smoller.mkv")) b, _ := os.ReadFile(path.Join("testdata", "survivor_au_S11E12.smoller.mkv"))
p := path.Join(d, "f.mkv") p := path.Join(d, "f.mkv")

64
src/asses/transcode.go Normal file
View File

@@ -0,0 +1,64 @@
package asses
import (
"context"
"fmt"
"log"
"os"
"path"
"slices"
"strings"
)
func EntrypointTranscode(ctx context.Context, p string) error {
return transcode(ctx, p)
}
func transcode(ctx context.Context, p string) error {
if os.Getenv("NO_TRANSCODE") != "" || os.Getenv("DO_TRANSCODE") == "" {
log.Printf("would transcode %s but $NO_TRANSCODE=x or $DO_TRANSCODE=", p)
return nil
}
output, err := ffprobe(ctx, "-i", p)
if err != nil {
return err
}
h264 := slices.ContainsFunc(strings.Split(output, "\n"), func(line string) bool {
return strings.Contains(line, "tream #") && strings.Contains(line, "Video: ") && strings.Contains(line, "h264")
})
aac := slices.ContainsFunc(strings.Split(output, "\n"), func(line string) bool {
return strings.Contains(line, "tream #") && strings.Contains(line, "Audio: ") && strings.Contains(line, "aac")
})
if h264 && aac {
return nil
}
p2 := p + ".en" + path.Ext(p)
if err := ffmpeg(ctx, "-y",
"-i", p,
"-vcodec", "libx264",
"-acodec", "aac",
p2,
); err != nil {
return err
}
output2, err := ffprobe(ctx, "-i", p)
if err != nil {
return err
}
df := func(line string) bool {
return !strings.Contains(line, "tream #")
}
originalStreams := slices.DeleteFunc(strings.Split(output, "\n"), df)
newStreams := slices.DeleteFunc(strings.Split(output2, "\n"), df)
if len(originalStreams) != len(newStreams) {
return fmt.Errorf("stream count changed from transcode")
}
return os.Rename(p2, p)
}

View File

@@ -60,6 +60,14 @@ func Main(ctx context.Context, args []string) error {
return fmt.Errorf("errors: %+v", errs) return fmt.Errorf("errors: %+v", errs)
} }
return nil return nil
case Transcode:
for _, pos := range flags.Pos {
log.Printf("transcoding %q...", pos)
if err := inass.EntrypointTranscode(ctx, pos); err != nil {
return err
}
}
return nil
default: default:
panic(flags.Entrypoint.String()) panic(flags.Entrypoint.String())
} }
@@ -72,6 +80,7 @@ const (
Defacto Entrypoint = iota Defacto Entrypoint = iota
DeportAss DeportAss
BestAssToSRT BestAssToSRT
Transcode
) )
func (e *Entrypoint) Set(s string) error { func (e *Entrypoint) Set(s string) error {
@@ -82,11 +91,14 @@ func (e *Entrypoint) Set(s string) error {
*e = DeportAss *e = DeportAss
case BestAssToSRT.String(): case BestAssToSRT.String():
*e = BestAssToSRT *e = BestAssToSRT
case Transcode.String():
*e = Transcode
default: default:
return fmt.Errorf("%s nin (%s)", s, strings.Join([]string{ return fmt.Errorf("%s nin (%s)", s, strings.Join([]string{
Defacto.String(), Defacto.String(),
DeportAss.String(), DeportAss.String(),
BestAssToSRT.String(), BestAssToSRT.String(),
Transcode.String(),
}, ", ")) }, ", "))
} }
return nil return nil
@@ -100,6 +112,8 @@ func (e Entrypoint) String() string {
return "deport-ass" return "deport-ass"
case BestAssToSRT: case BestAssToSRT:
return "best-ass-to-srt" return "best-ass-to-srt"
case Transcode:
return "transcode"
} }
panic("cannot serialize entrypoint") panic("cannot serialize entrypoint")
} }
@@ -118,6 +132,5 @@ func runner(ctx context.Context, k string, foo func(context.Context) error) func
case <-time.After(time.Second): case <-time.After(time.Second):
} }
} }
return err
} }
} }

View File

@@ -72,15 +72,20 @@ func ForEach(ctx context.Context, cb func(Feed) error) error {
return err return err
} }
var errs []string
for _, id := range ids { for _, id := range ids {
feed, err := Get(ctx, id.ID) feed, err := Get(ctx, id.ID)
if err != nil { if err != nil {
return err return err
} else if err := cb(feed); err != nil { } else if err := cb(feed); err != nil {
return err errs = append(errs, fmt.Sprintf(`failed to fetch %s: %v`, id.ID, err))
} }
} }
if len(errs) > 0 {
return fmt.Errorf("failed some callbacks: %+v", errs)
}
return nil return nil
} }

View File

@@ -28,7 +28,7 @@ var (
) )
func (feed Feed) ShouldExecute() (bool, error) { func (feed Feed) ShouldExecute() (bool, error) {
if !feed.Entry.Deleted.IsZero() { if !feed.Entry.Deleted.IsZero() || feed.Version.URL == "" {
return false, nil return false, nil
} }
next, err := feed.Next() next, err := feed.Next()