{"record":{"id":"b7bb80af476a61a5","repo":"glanceapp/glance","slug":"w-missing-videos-from-d-channels","errorCode":null,"errorMessage":"%w: missing videos from %d channels","messagePattern":"%w: missing videos from (.+?) channels","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"internal/glance/widget-videos.go","lineNumber":212,"sourceCode":"\t\t\tvideos = append(videos, video{\n\t\t\t\tThumbnailUrl: v.Group.Thumbnail.Url,\n\t\t\t\tTitle:        v.Title,\n\t\t\t\tUrl:          videoUrl,\n\t\t\t\tAuthor:       response.Channel,\n\t\t\t\tAuthorUrl:    response.ChannelLink + \"/videos\",\n\t\t\t\tTimePosted:   parseYoutubeFeedTime(v.Published),\n\t\t\t})\n\t\t}\n\t}\n\n\tif len(videos) == 0 {\n\t\treturn nil, errNoContent\n\t}\n\n\tvideos.sortByNewest()\n\n\tif failed > 0 {\n\t\treturn videos, fmt.Errorf(\"%w: missing videos from %d channels\", errPartialContent, failed)\n\t}\n\n\treturn videos, nil\n}\n","sourceCodeStart":194,"sourceCodeEnd":217,"githubUrl":"https://github.com/glanceapp/glance/blob/91324e8de762702e97b0ac5c8e36271d644d8642/internal/glance/widget-videos.go#L194-L217","documentation":"After successfully fetching at least some YouTube feeds, one or more channels failed, so the widget returns the videos it has wrapped in errPartialContent with the count of failed channels. Rendering degrades to partial content instead of a hard failure.","triggerScenarios":"At least one errs[i] != nil in the per-feed loop while at least one feed succeeded: a bad channel ID, a 429 on one feed, or a deleted playlist among the configured channels.","commonSituations":"One stale channel ID in a long channels list; YouTube rate-limiting a subset of burst requests (30 workers hitting feeds at once).","solutions":["Find the 'Failed to fetch youtube feed' log lines to identify which channel IDs failed","Remove or correct the failing channel/playlist IDs in the videos widget config","Lengthen cache time so the 30-worker burst is less frequent"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":"func isPartialContent(err error) bool { return errors.Is(err, errPartialContent) }","tryCatchPattern":"videos, err := widget.getVideos()\nif errors.Is(err, errPartialContent) {\n    // videos still contains the successful feeds; render them\n    renderVideos(videos)\n    slog.Warn(\"some youtube feeds failed\", \"err\", err)\n    return nil\n}","preventionTips":["Validate channel/playlist IDs when adding them, and remove ones flagged in logs","Check errors.Is(err, errPartialContent) before treating the result as a failure","Space out fetches via longer cache times to avoid per-feed 429s"],"tags":["youtube","partial-content","feed","widget"],"backgroundTag":null,"analyzedSha":"91324e8de762702e97b0ac5c8e36271d644d8642","analyzedAt":"2026-08-15T14:12:54.279Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}