summaryrefslogtreecommitdiff
path: root/server/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'server/cmd')
-rw-r--r--server/cmd/listend/main.go18
1 files changed, 14 insertions, 4 deletions
diff --git a/server/cmd/listend/main.go b/server/cmd/listend/main.go
index 04c933f..3e5c65a 100644
--- a/server/cmd/listend/main.go
+++ b/server/cmd/listend/main.go
@@ -278,6 +278,7 @@ func (w *worker) pollOne(ctx context.Context, feedURL string) {
// over weeks and lost it whenever retention reclaimed the file it was holding.
func (w *worker) detect(ctx context.Context, show *store.Show, candidates []*store.Episode) {
var episodes []skips.Episode
+ var ids []string
byID := map[string]*store.Episode{}
for _, e := range candidates {
if !e.Mirrored() {
@@ -288,11 +289,15 @@ func (w *worker) detect(ctx context.Context, show *store.Show, candidates []*sto
Path: filepath.Join(w.mirror.AudioDir, e.Path),
DeclaredDurationMs: e.DeclaredDurationMs,
})
+ ids = append(ids, e.ID)
byID[e.ID] = e
}
if len(episodes) < skips.DefaultConfirmThreshold || ctx.Err() != nil {
return
}
+ if !show.NeedsDetection(ids) {
+ return
+ }
started := time.Now()
result, err := skips.Detect(ctx, w.decoder, episodes, skips.DefaultConfig())
@@ -323,7 +328,9 @@ func (w *worker) detect(ctx context.Context, show *store.Show, candidates []*sto
result.OutroConfirmedOn, len(episodes), checkNote(result.OutroCheck),
time.Since(started).Round(time.Second))
- w.detectAds(ctx, show, episodes, byID)
+ if w.detectAds(ctx, show, episodes, byID) {
+ show.RecordDetected(ids)
+ }
}
// detectAds finds the advertising a batch of episodes shares, which is what simultaneous
@@ -334,20 +341,22 @@ func (w *worker) detect(ctx context.Context, show *store.Show, candidates []*sto
// is how it came to confirm an advertisement as an intro. This uses that dependence rather than
// being defeated by it -- and reports what it found against the declared-versus-served length
// gap, a figure it did not produce and which can therefore contradict it.
+// Reports whether the scan completed, so an interrupted or failed pass is examined again rather
+// than written off as done.
func (w *worker) detectAds(
ctx context.Context,
show *store.Show,
episodes []skips.Episode,
byID map[string]*store.Episode,
-) {
+) bool {
if ctx.Err() != nil {
- return
+ return false
}
started := time.Now()
ads, err := skips.DetectAds(ctx, w.decoder, episodes, skips.DefaultAdConfig())
if err != nil {
log.Printf("%s: ad scan failed: %v", show.Title, err)
- return
+ return false
}
var withBreaks, refused int
@@ -381,6 +390,7 @@ func (w *worker) detectAds(
log.Printf("%s: ads on %d/%d episode(s)%s, accounted %s of %s inserted, took %s",
show.Title, withBreaks, len(episodes), refusedNote(refused),
clock(foundTotal), clock(insertedTotal), time.Since(started).Round(time.Second))
+ return true
}
func refusedNote(refused int) string {