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/cache_track.dart'; import 'package:spotube/extensions/video.dart'; import 'package:spotube/models/current_playlist.dart'; import 'package:spotube/models/logger.dart'; import 'package:spotube/models/spotube_track.dart'; import 'package:spotube/provider/audio_player_provider.dart'; import 'package:spotube/provider/user_preferences_provider.dart'; import 'package:spotube/provider/youtube_provider.dart'; import 'package:spotube/services/linux_audio_service.dart'; import 'package:spotube/services/mobile_audio_service.dart'; import 'package:spotube/utils/persisted_change_notifier.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.dart'; import 'package:http/http.dart' as http; enum PlaybackStatus { playing, loading, idle, } enum AudioQuality { high, low, } class Playback extends PersistedChangeNotifier { // player properties bool isShuffled; bool isLoop; 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