fix media workflows and download organization

This commit is contained in:
ShukeBta
2026-06-26 08:42:16 +08:00
parent 0da96f7e4e
commit 65adca04df
102 changed files with 4063 additions and 437 deletions
@@ -117,9 +117,15 @@ func (s *SubscriptionService) searchSubscriptionSites(ctx context.Context, sub *
fields = append(fields, zap.Error(err))
s.log.Warn("site-search subscription search failed", fields...)
}
if subscriptionSiteSearchShouldStopOnError(err) {
return nil, err
}
continue
}
results = append(results, found...)
if hasUsableSubscriptionSearchResult(found, sub) {
break
}
}
results = dedupeSiteSearchResults(results)
if len(results) == 0 && lastSearchErr != nil && searchErrors == len(keywords) {
@@ -128,6 +134,51 @@ func (s *SubscriptionService) searchSubscriptionSites(ctx context.Context, sub *
return results, nil
}
func subscriptionSiteSearchShouldStopOnError(err error) bool {
if err == nil {
return false
}
var limited *siteAPIRateLimitError
if errors.As(err, &limited) {
return true
}
if errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) {
return true
}
var timeout interface{ Timeout() bool }
if errors.As(err, &timeout) && timeout.Timeout() {
return true
}
msg := strings.ToLower(err.Error())
return strings.Contains(msg, "rate limit") ||
strings.Contains(msg, "quota") ||
strings.Contains(msg, "too many requests") ||
strings.Contains(msg, "status 429") ||
strings.Contains(msg, "context deadline exceeded") ||
strings.Contains(msg, "tls handshake timeout") ||
strings.Contains(msg, "i/o timeout") ||
strings.Contains(msg, "unexpected eof") ||
strings.Contains(msg, "connection reset") ||
strings.Contains(msg, "connection refused") ||
strings.Contains(msg, "no such host") ||
strings.Contains(msg, "temporary failure")
}
func hasUsableSubscriptionSearchResult(results []SearchResult, sub *model.Subscription) bool {
for _, item := range results {
if !subscriptionSearchResultMatchesQuery(sub, item) {
continue
}
if !matchesSubscriptionRules(sub, subscriptionSearchResultText(item)) {
continue
}
if strings.TrimSpace(firstNonEmpty(item.DownloadURL, item.TorrentURL)) != "" {
return true
}
}
return false
}
func (s *SubscriptionService) finishSiteSearchNoResults(sub *model.Subscription, keyword string) (int, error) {
if s.log != nil {
fields := subscriptionSiteSearchLogFields(sub, keyword)