Compare commits
2 Commits
d2f0466aae
...
bd5ae006a1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bd5ae006a1 | ||
|
|
11b215d026 |
5
go.mod
5
go.mod
@@ -2,7 +2,10 @@ module show-rss
|
|||||||
|
|
||||||
go 1.23.3
|
go 1.23.3
|
||||||
|
|
||||||
require modernc.org/sqlite v1.37.0
|
require (
|
||||||
|
golang.org/x/time v0.11.0
|
||||||
|
modernc.org/sqlite v1.37.0
|
||||||
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/PuerkitoBio/goquery v1.8.0 // indirect
|
github.com/PuerkitoBio/goquery v1.8.0 // indirect
|
||||||
|
|||||||
2
go.sum
2
go.sum
@@ -59,6 +59,8 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn
|
|||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
|
golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
|
||||||
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
|
golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
|
||||||
|
golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU=
|
golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU=
|
||||||
golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ=
|
golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ=
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"show-rss/src/slow"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -31,7 +32,7 @@ func One(ctx context.Context, p string) error {
|
|||||||
|
|
||||||
if err := func() error {
|
if err := func() error {
|
||||||
if len(last.Cksum) > 0 {
|
if len(last.Cksum) > 0 {
|
||||||
cksum, err := Cksum(p)
|
cksum, err := Cksum(ctx, p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -52,7 +53,7 @@ func One(ctx context.Context, p string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
cksum, err := Cksum(p)
|
cksum, err := Cksum(ctx, p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -63,7 +64,7 @@ func One(ctx context.Context, p string) error {
|
|||||||
return checked(ctx, p, cksum, stat.ModTime())
|
return checked(ctx, p, cksum, stat.ModTime())
|
||||||
}
|
}
|
||||||
|
|
||||||
func Cksum(p string) (string, error) {
|
func Cksum(ctx context.Context, p string) (string, error) {
|
||||||
f, err := os.Open(p)
|
f, err := os.Open(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
@@ -71,6 +72,6 @@ func Cksum(p string) (string, error) {
|
|||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
hasher := md5.New()
|
hasher := md5.New()
|
||||||
_, err = io.Copy(hasher, f)
|
_, err = io.Copy(hasher, slow.NewReader(ctx, 10_000_000, f))
|
||||||
return base64.StdEncoding.EncodeToString(hasher.Sum(nil)), err
|
return base64.StdEncoding.EncodeToString(hasher.Sum(nil)), err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ func TestOne(t *testing.T) {
|
|||||||
p := path.Join(d, "f.mkv")
|
p := path.Join(d, "f.mkv")
|
||||||
os.WriteFile(p, b, os.ModePerm)
|
os.WriteFile(p, b, os.ModePerm)
|
||||||
|
|
||||||
cksum, _ := asses.Cksum(p)
|
cksum, _ := asses.Cksum(context.Background(), p)
|
||||||
|
|
||||||
if err := asses.One(ctx, p); err != nil {
|
if err := asses.One(ctx, p); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
@@ -31,7 +31,7 @@ func TestOne(t *testing.T) {
|
|||||||
t.Fatalf("no new srt: %v", err)
|
t.Fatalf("no new srt: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
newCksum, _ := asses.Cksum(p)
|
newCksum, _ := asses.Cksum(context.Background(), p)
|
||||||
if cksum == newCksum {
|
if cksum == newCksum {
|
||||||
t.Fatalf("cksum unchanged")
|
t.Fatalf("cksum unchanged")
|
||||||
}
|
}
|
||||||
|
|||||||
39
src/slow/reader.go
Normal file
39
src/slow/reader.go
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package slow
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"golang.org/x/time/rate"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Reader struct {
|
||||||
|
ctx context.Context
|
||||||
|
limiter *rate.Limiter
|
||||||
|
r io.Reader
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ io.Reader = Reader{}
|
||||||
|
|
||||||
|
func NewReader(ctx context.Context, bps rate.Limit, r io.Reader) Reader {
|
||||||
|
return Reader{
|
||||||
|
ctx: ctx,
|
||||||
|
limiter: rate.NewLimiter(bps, 8192),
|
||||||
|
r: r,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r Reader) Read(b []byte) (int, error) {
|
||||||
|
n, err := r.r.Read(b)
|
||||||
|
|
||||||
|
m := 0
|
||||||
|
burst := r.limiter.Burst()
|
||||||
|
for m < n {
|
||||||
|
if err := r.limiter.WaitN(r.ctx, burst); err != nil {
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
m += burst
|
||||||
|
}
|
||||||
|
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
20
src/slow/reader_test.go
Normal file
20
src/slow/reader_test.go
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package slow_test
|
||||||
|
|
||||||
|
import "show-rss/src/slow"
|
||||||
|
import "testing"
|
||||||
|
import "context"
|
||||||
|
import "bytes"
|
||||||
|
import "io"
|
||||||
|
|
||||||
|
func TestReader(t *testing.T) {
|
||||||
|
junk := bytes.NewReader(bytes.Repeat([]byte("1"), 256_000))
|
||||||
|
|
||||||
|
slowReader := slow.NewReader(context.Background(), 300_000, junk)
|
||||||
|
|
||||||
|
buff := bytes.NewBuffer(nil)
|
||||||
|
if n, err := io.Copy(buff, slowReader); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else if n != 256_000 {
|
||||||
|
t.Fatal(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user