mirror of
https://github.com/yattee/yattee.git
synced 2026-08-06 07:11:28 +00:00
Apply thumbnail fallback everywhere a single URL was rendered
The previous fix rebuilt the quality chain when converting persisted models back to videos, but many consumers discarded it again by rendering bestThumbnail (usually a maxresdefault.jpg that 404s for older videos) as a single URL with no fallback. Extract the retry logic from VideoThumbnailView into FallbackLazyImage and use it at every in-app site that can iterate: player thumbnails (mini bar, expanded sheet loaders, autoplay previews, tvOS audio-mode artwork - previously a silent black screen), video info card and tvOS header, and the tvOS playlist cover. Sites that fetch or send exactly one URL are rewritten to the always-available hqdefault variant via Thumbnail.reliableURL (exposed as Video.reliableThumbnailURL): Now Playing artwork, Top Shelf snapshots, remote control state, the frozen transition thumbnail, blurred info background, navigation covers, and playlist covers derived from a video's first thumbnail in Invidious/Yattee Server responses. Also invert RecentPlaylist's upgrade helper, which rewrote covers *to* maxresdefault, walk the quality chain when caching download thumbnails for offline artwork instead of giving up after one 404, and expand the remaining single-thumbnail Piped conversions into full chains.
This commit is contained in:
@@ -100,7 +100,7 @@ private extension TopShelfSnapshotWriter {
|
||||
title: bookmark.title,
|
||||
authorName: bookmark.authorName,
|
||||
duration: bookmark.duration,
|
||||
thumbnailURL: bookmark.thumbnailURLString,
|
||||
thumbnailURL: reliableThumbnailURLString(bookmark.thumbnailURLString),
|
||||
deepLinkURL: deepLink,
|
||||
progressSeconds: nil
|
||||
)
|
||||
@@ -118,7 +118,7 @@ private extension TopShelfSnapshotWriter {
|
||||
title: entry.title,
|
||||
authorName: entry.authorName,
|
||||
duration: entry.duration,
|
||||
thumbnailURL: entry.thumbnailURLString,
|
||||
thumbnailURL: reliableThumbnailURLString(entry.thumbnailURLString),
|
||||
deepLinkURL: deepLink,
|
||||
progressSeconds: entry.watchedSeconds
|
||||
)
|
||||
@@ -190,8 +190,17 @@ private extension TopShelfSnapshotWriter {
|
||||
}
|
||||
}
|
||||
|
||||
/// The Top Shelf extension sets a single image URL with no failure fallback,
|
||||
/// so rewrite to the always-available `hqdefault` variant: the best advertised
|
||||
/// variant is often `maxresdefault`, which 404s for many older videos and
|
||||
/// would leave an empty tile.
|
||||
static func bestThumbnailURL(from thumbnails: [Thumbnail]) -> String? {
|
||||
thumbnails.max(by: { $0.quality < $1.quality })?.url.absoluteString
|
||||
Thumbnail.reliableURL(for: thumbnails.max(by: { $0.quality < $1.quality })?.url)?.absoluteString
|
||||
}
|
||||
|
||||
static func reliableThumbnailURLString(_ urlString: String?) -> String? {
|
||||
guard let urlString else { return nil }
|
||||
return Thumbnail.reliableURL(for: URL(string: urlString))?.absoluteString ?? urlString
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user