v3.7.0: roll back from v4, remove internal player — v3 is already complete

Version rolled back from v4.x to v3.7.0. After extensive work on v4's
internal streaming engine, smart queue, DASH pipeline, and media controls,
we realized v3 was already feature-complete. Adding more big features
only made maintenance increasingly difficult and the developer's life
miserable. Stripped back to what works: external player only, cleaner
codebase, sustainable long-term.

- Remove just_audio, audio_service, audio_session and entire internal
  playback engine (smart queue, notification, shuffle/repeat, prefetch)
- Remove PlaybackItem model, MiniPlayerBar widget, notification drawables
- Remove playerMode setting (external-only now)
- Migrate MainActivity from AudioServiceFragmentActivity to
  FlutterFragmentActivity
- Migrate Qobuz to MusicDL API
- Update changelog with v3.7.0 rollback explanation
This commit is contained in:
zarzet committed 2026-03-04 02:02:25 +07:00
1 parent 4747119a7f
commit 98abaf6635
56 files changed
+687 -10106

No files matched your search

+4
View File
@@ -142,6 +142,10 @@ class PlatformBridge {
});
}
static Future<void> exitApp() async {
await _channel.invokeMethod('exitApp');
}
static Future<void> initItemProgress(String itemId) async {
await _channel.invokeMethod('initItemProgress', {'item_id': itemId});
}
+15
View File
@@ -74,6 +74,13 @@ class UpdateChecker {
return null;
}
// Ignore releases from a different major version (e.g. v4.x when we
// rolled back to v3.x). Only offer updates within the same major line.
if (_majorVersion(latestVersion) != _majorVersion(AppInfo.version)) {
_log.i('Skipping update from different major version (current: ${AppInfo.version}, latest: $latestVersion)');
return null;
}
final body = releaseData['body'] as String? ?? 'No changelog available';
final htmlUrl = releaseData['html_url'] as String? ?? '${AppInfo.githubUrl}/releases';
final publishedAt = DateTime.tryParse(releaseData['published_at'] as String? ?? '') ?? DateTime.now();
@@ -118,6 +125,14 @@ class UpdateChecker {
}
}
static int _majorVersion(String version) {
try {
return int.parse(version.split('-').first.split('.').first);
} catch (_) {
return -1;
}
}
static bool _isNewerVersion(String latest, String current) {
try {
final latestBase = latest.split('-').first;