mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-08-13 22:50:20 +02:00
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:
@@ -1,91 +0,0 @@
|
||||
import 'package:spotiflac_android/models/track.dart';
|
||||
|
||||
class PlaybackItem {
|
||||
final String id;
|
||||
final String title;
|
||||
final String artist;
|
||||
final String album;
|
||||
final String coverUrl;
|
||||
final String sourceUri;
|
||||
final bool isLocal;
|
||||
final String service;
|
||||
final int durationMs;
|
||||
|
||||
// Stream quality metadata
|
||||
final String format;
|
||||
final int bitDepth;
|
||||
final int sampleRate;
|
||||
final int bitrate;
|
||||
|
||||
// Original track reference for queue operations
|
||||
final Track? track;
|
||||
|
||||
const PlaybackItem({
|
||||
required this.id,
|
||||
required this.title,
|
||||
required this.artist,
|
||||
this.album = '',
|
||||
this.coverUrl = '',
|
||||
required this.sourceUri,
|
||||
this.isLocal = false,
|
||||
this.service = '',
|
||||
this.durationMs = 0,
|
||||
this.format = '',
|
||||
this.bitDepth = 0,
|
||||
this.sampleRate = 0,
|
||||
this.bitrate = 0,
|
||||
this.track,
|
||||
});
|
||||
|
||||
PlaybackItem copyWith({
|
||||
String? sourceUri,
|
||||
String? service,
|
||||
String? format,
|
||||
int? bitDepth,
|
||||
int? sampleRate,
|
||||
int? bitrate,
|
||||
}) {
|
||||
return PlaybackItem(
|
||||
id: id,
|
||||
title: title,
|
||||
artist: artist,
|
||||
album: album,
|
||||
coverUrl: coverUrl,
|
||||
sourceUri: sourceUri ?? this.sourceUri,
|
||||
isLocal: isLocal,
|
||||
service: service ?? this.service,
|
||||
durationMs: durationMs,
|
||||
format: format ?? this.format,
|
||||
bitDepth: bitDepth ?? this.bitDepth,
|
||||
sampleRate: sampleRate ?? this.sampleRate,
|
||||
bitrate: bitrate ?? this.bitrate,
|
||||
track: track,
|
||||
);
|
||||
}
|
||||
|
||||
/// Human-readable quality label for UI display
|
||||
String get qualityLabel {
|
||||
final parts = <String>[];
|
||||
|
||||
if (format.isNotEmpty) {
|
||||
parts.add(format.toUpperCase());
|
||||
}
|
||||
|
||||
if (bitDepth > 0 && sampleRate > 0) {
|
||||
final srKhz = sampleRate >= 1000
|
||||
? '${(sampleRate / 1000).toStringAsFixed(sampleRate % 1000 == 0 ? 0 : 1)}kHz'
|
||||
: '${sampleRate}Hz';
|
||||
parts.add('$bitDepth-bit / $srKhz');
|
||||
} else if (bitrate > 0) {
|
||||
parts.add('${bitrate}kbps');
|
||||
}
|
||||
|
||||
return parts.join(' ');
|
||||
}
|
||||
|
||||
/// Whether this item has cover art that is a local file path
|
||||
bool get hasLocalCover {
|
||||
if (coverUrl.isEmpty) return false;
|
||||
return !coverUrl.startsWith('http://') && !coverUrl.startsWith('https://');
|
||||
}
|
||||
}
|
||||
@@ -11,9 +11,6 @@ class AppSettings {
|
||||
final String storageMode; // 'app' or 'saf'
|
||||
final String downloadTreeUri; // SAF persistable tree URI
|
||||
final bool autoFallback;
|
||||
final bool autoSkipUnavailableTracks;
|
||||
final String playerMode; // 'internal' or 'external'
|
||||
final bool smartQueueEnabled; // Enable smart curated autoplay queue
|
||||
final bool embedMetadata; // Master switch for metadata/cover/lyrics embedding
|
||||
final bool embedLyrics;
|
||||
final bool maxQualityCover;
|
||||
@@ -92,9 +89,6 @@ class AppSettings {
|
||||
this.storageMode = 'app',
|
||||
this.downloadTreeUri = '',
|
||||
this.autoFallback = true,
|
||||
this.autoSkipUnavailableTracks = true,
|
||||
this.playerMode = 'internal',
|
||||
this.smartQueueEnabled = true,
|
||||
this.embedMetadata = true,
|
||||
this.embedLyrics = true,
|
||||
this.maxQualityCover = true,
|
||||
@@ -160,10 +154,7 @@ class AppSettings {
|
||||
String? downloadDirectory,
|
||||
String? storageMode,
|
||||
String? downloadTreeUri,
|
||||
bool? autoFallback,
|
||||
bool? autoSkipUnavailableTracks,
|
||||
String? playerMode,
|
||||
bool? smartQueueEnabled,
|
||||
bool? autoFallback,
|
||||
bool? embedMetadata,
|
||||
bool? embedLyrics,
|
||||
bool? maxQualityCover,
|
||||
@@ -223,10 +214,6 @@ class AppSettings {
|
||||
storageMode: storageMode ?? this.storageMode,
|
||||
downloadTreeUri: downloadTreeUri ?? this.downloadTreeUri,
|
||||
autoFallback: autoFallback ?? this.autoFallback,
|
||||
autoSkipUnavailableTracks:
|
||||
autoSkipUnavailableTracks ?? this.autoSkipUnavailableTracks,
|
||||
playerMode: playerMode ?? this.playerMode,
|
||||
smartQueueEnabled: smartQueueEnabled ?? this.smartQueueEnabled,
|
||||
embedMetadata: embedMetadata ?? this.embedMetadata,
|
||||
embedLyrics: embedLyrics ?? this.embedLyrics,
|
||||
maxQualityCover: maxQualityCover ?? this.maxQualityCover,
|
||||
|
||||
@@ -14,9 +14,6 @@ AppSettings _$AppSettingsFromJson(Map<String, dynamic> json) => AppSettings(
|
||||
storageMode: json['storageMode'] as String? ?? 'app',
|
||||
downloadTreeUri: json['downloadTreeUri'] as String? ?? '',
|
||||
autoFallback: json['autoFallback'] as bool? ?? true,
|
||||
autoSkipUnavailableTracks: json['autoSkipUnavailableTracks'] as bool? ?? true,
|
||||
playerMode: json['playerMode'] as String? ?? 'internal',
|
||||
smartQueueEnabled: json['smartQueueEnabled'] as bool? ?? true,
|
||||
embedMetadata: json['embedMetadata'] as bool? ?? true,
|
||||
embedLyrics: json['embedLyrics'] as bool? ?? true,
|
||||
maxQualityCover: json['maxQualityCover'] as bool? ?? true,
|
||||
@@ -93,9 +90,6 @@ Map<String, dynamic> _$AppSettingsToJson(
|
||||
'storageMode': instance.storageMode,
|
||||
'downloadTreeUri': instance.downloadTreeUri,
|
||||
'autoFallback': instance.autoFallback,
|
||||
'autoSkipUnavailableTracks': instance.autoSkipUnavailableTracks,
|
||||
'playerMode': instance.playerMode,
|
||||
'smartQueueEnabled': instance.smartQueueEnabled,
|
||||
'embedMetadata': instance.embedMetadata,
|
||||
'embedLyrics': instance.embedLyrics,
|
||||
'maxQualityCover': instance.maxQualityCover,
|
||||
|
||||
Reference in New Issue
Block a user