import 'package:equatable/equatable.dart'; import 'package:uuid/uuid.dart'; import '../local_storage/sqflite_localpodcast.dart'; import 'episodebrief.dart'; class PlaylistEntity { final String? name; final String? id; final bool? isLocal; final List episodeList; PlaylistEntity(this.name, this.id, this.isLocal, this.episodeList); Map toJson() { return { 'name': name, 'id': id, 'isLocal': isLocal, 'episodeList': episodeList }; } static PlaylistEntity fromJson(Map json) { var list = List.from(json['episodeList'] as Iterable); return PlaylistEntity(json['name'] as String?, json['id'] as String?, json['isLocal'] == null ? false : json['isLocal'] as bool?, list); } } class Playlist extends Equatable { /// Playlist name. the default playlist is named "Playlist". final String? name; /// Unique id for playlist. final String id; final bool? isLocal; /// Episode url list for playlist. final List episodeList; /// Eposides in playlist. final List episodes; bool get isEmpty => episodeList.isEmpty; bool get isNotEmpty => episodeList.isNotEmpty; int get length => episodeList.length; bool get isQueue => name == 'Queue'; bool contains(EpisodeBrief episode) => episodes.contains(episode); Playlist(this.name, {String? id, this.isLocal = false, List? episodeList, List? episodes}) : id = id ?? Uuid().v4(), assert(name != ''), episodeList = episodeList ?? [], episodes = episodes ?? []; PlaylistEntity toEntity() { return PlaylistEntity(name, id, isLocal, episodeList.toSet().toList()); } static Playlist fromEntity(PlaylistEntity entity) { return Playlist( entity.name, id: entity.id, isLocal: entity.isLocal, episodeList: entity.episodeList, ); } final DBHelper _dbHelper = DBHelper(); // final KeyValueStorage _playlistStorage = KeyValueStorage(playlistKey); Future getPlaylist() async { episodes.clear(); var error = []; if (episodeList.isNotEmpty) { for (var url in episodeList) { var episode = await _dbHelper.getRssItemWithUrl(url); if (episode != null) { episodes.add(episode); } else { error.add(url); } } } if (error.isNotEmpty) { for (var u in error) { episodeList.remove(u); } } } // Future savePlaylist() async { // var urls = []; // urls.addAll(_playlist.map((e) => e.enclosureUrl)); // await _playlistStorage.saveStringList(urls.toSet().toList()); // } void addToPlayList(EpisodeBrief episodeBrief) { if (!episodes.contains(episodeBrief)) { episodes.add(episodeBrief); episodeList.add(episodeBrief.enclosureUrl); } } void addToPlayListAt(EpisodeBrief episodeBrief, int index, {bool existed = true}) { if (existed) { episodes.removeWhere((episode) => episode == episodeBrief); episodeList.removeWhere((url) => url == episodeBrief.enclosureUrl); } episodes.insert(index, episodeBrief); episodeList.insert(index, episodeBrief.enclosureUrl); } void updateEpisode(EpisodeBrief? episode) { var index = episodes.indexOf(episode); if (index != -1) episodes[index] = episode; } int delFromPlaylist(EpisodeBrief? episodeBrief) { var index = episodes.indexOf(episodeBrief); episodes.removeWhere( (episode) => episode!.enclosureUrl == episodeBrief!.enclosureUrl); episodeList.removeWhere((url) => url == episodeBrief!.enclosureUrl); if (isLocal!) { _dbHelper.deleteLocalEpisodes([episodeBrief!.enclosureUrl]); } return index; } void reorderPlaylist(int oldIndex, int newIndex) { if (newIndex > oldIndex) { newIndex -= 1; } final episode = episodes.removeAt(oldIndex)!; episodes.insert(newIndex, episode); episodeList.removeAt(oldIndex); episodeList.insert(newIndex, episode.enclosureUrl); } void clear() { episodeList.clear(); episodes.clear(); } @override List get props => [id, name]; }