mirror of
https://github.com/yattee/yattee.git
synced 2026-10-23 21:22:53 +00:00
b9170492435c64aec47938af1ead032f85eae9ca
The refresh captured its account generation before hopping onto the detached task it runs in. That hop is a suspension point: a context handler running in the gap - the wake-time status flap bumps the generation there - left the request carrying a stale generation. Its completion was then fenced out, and the fenced return deliberately leaves isLoading alone, so nothing current owned the flag: it stayed true, every later refresh skipped itself as already loading, and the retry paths only watch for errors - the feed sat on a spinner nothing would ever finish. The generation and context are now read at dispatch time, so the request that claims isLoading always carries the generation current at that moment and its completion is the one that releases it. The stateless-server poller's terminal writes get the same fence: a stale poller must not hand a newer request's spinner an early ready.
Yattee 2 is in the works! A new version of the app is being built with a refreshed experience. It pairs with the new Yattee Server — a self-hosted backend powered by yt-dlp that supports 1000+ sites. Join the TestFlight beta to try early builds, and check the new documentation site at docs.yattee.stream for guides, roadmap and changelog.
Features
- Native user interface built with SwiftUI with customization settings
- Player queue and history
- Player component with custom controls, gestures and support for 4K playback
- Fullscreen, Picture in Picture and background audio playback
- SponsorBlock, configurable categories to skip
License
Yattee and its components is shared on AGPL v3 license.
Languages
Swift
96.9%
Ruby
2.7%
C
0.3%
