import 'dart:async'; import 'dart:convert'; import 'package:audio_service/audio_service.dart'; import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hive/hive.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/entities/CacheTrack.dart'; import 'package:spotube/extensions/yt-video-from-cache-track.dart'; import 'package:spotube/models/CurrentPlaylist.dart'; import 'package:spotube/models/Logger.dart'; import 'package:spotube/models/SpotubeTrack.dart'; import 'package:spotube/provider/AudioPlayer.dart'; import 'package:spotube/provider/UserPreferences.dart'; import 'package:spotube/provider/YouTube.dart'; import 'package:spotube/services/LinuxAudioService.dart'; import 'package:spotube/services/MobileAudioService.dart'; import 'package:spotube/utils/PersistedChangeNotifier.dart'; import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/primitive_utils.dart'; import 'package:spotube/utils/service_utils.dart'; import 'package:spotube/utils/type_conversion_utils.dart'; import 'package:tuple/tuple.dart'; import 'package:youtube_explode_dart/youtube_explode_dart.dart' hide Playlist; import 'package:collection/collection.dart'; import 'package:spotube/extensions/list-sort-multiple.dart'; import 'package:http/http.dart' as http; enum PlaybackStatus { playing, loading, idle, } enum AudioQuality { high, low, } enum PlaybackMode { repeat, shuffle, normal, } class Playback extends PersistedChangeNotifier { // player properties PlaybackMode playbackMode; bool isPlaying; Duration currentDuration; double volume; // class dependencies LinuxAudioService? _linuxAudioService; MobileAudioService? mobileAudioService; // foreign/passed properties AudioPlayer player; YoutubeExplode youtube; Ref ref; UserPreferences get preferences => ref.read(userPreferencesProvider); // playlist & track list properties late LazyBox cache; CurrentPlaylist? playlist; SpotubeTrack? track; List