Three related resilience gaps in SourcedTrack.fetchFromTrack and URL
resolution:
- A cached SpotubeAudioSourceMatchObject whose stream resolution now
fails (source removed/changed) was never retried; it now deletes the
stale sourceMatchTable row, fetches fresh siblings, caches the new
match, and retries once.
- fetchSiblings returning empty was treated as a hard TrackNotFoundError;
it now attempts audioSource.auth.authenticate() once and retries
before giving up, via a shared _fetchSiblingsWithRetry helper.
- `url` getter and getUrlOfQuality threw/returned null when the user has
no configured quality presets, or no stream matches the selected
container; both now fall back to sources.firstOrNull?.url instead of
crashing.
Fixes#3091
* feat: add youtube engine abstraction and yt-dlp integration
* chore: add yt-dlp as optional dependency
* feat: implement custom path support for youtube engines
* chore: check for custom path in setting engine select dropdown
* chore: update yt_dlp_dart
* chore: setting video url instead of video id in fetchSiblings
* feat: implement NewPipe engine
* chore: update local path to git url for flutter_new_pipe_extractor package
* chore: fix android build isn't working
* chore: fix routes not working when initially signing in
* refactor: drop fallback support to different sources
* feat: add invidious audio source with automatic track switch even on server playback endpoint
* fix: switching to different source on playback endpoint error not working
* chore: update invidious version
* feat: invidious instances customizability
* feat: add playback history provider
* feat: implement recently played section
* refactor: use route names
* feat: add stats summary and top tracks/artists/albums
* feat: add top date based filtering
* feat: add stream money calculation
* refactor: place search in mobile navbar and settings in home appbar
* feat: add individual minutes and streams page
* feat(stats): add individual minutes and streams page
* chore: default period to 1 month
* feat: add text to explain user how hypothetical fees are calculated
* chore: ensure usage of route names instead of direct paths
* cd: add cache key
* cd: remove media_kit_event_loop from git
* Fix song not playing when m4a or weba is not available (one is available but not the other) for that song
* Update lib/services/sourced_track/sources/youtube.dart
---------
Co-authored-by: Kingkor Roy Tirtho <krtirtho@gmail.com>