diff --git a/lib/state/playlist_state.dart b/lib/state/playlist_state.dart new file mode 100644 index 0000000..4ec131e --- /dev/null +++ b/lib/state/playlist_state.dart @@ -0,0 +1,18 @@ +import 'package:state_notifier/state_notifier.dart'; + +import '../local_storage/key_value_storage.dart'; +import '../type/playlist.dart'; + +class PlaylistProvider extends StateNotifier> { + PlaylistProvider() : super([]); + + Future loadPlaylist() async { + var storage = KeyValueStorage(playlistsAllKey); + var playlistEntities = await storage.getPlaylists(); + var initState = [...playlistEntities.map(Playlist.fromEntity).toList()]; + for (var playlist in initState) { + await playlist.getPlaylist(); + } + state = initState; + } +} diff --git a/lib/state/podcast_group.dart b/lib/state/podcast_group.dart index 3d56851..4f22454 100644 --- a/lib/state/podcast_group.dart +++ b/lib/state/podcast_group.dart @@ -66,28 +66,22 @@ class PodcastGroup extends Equatable { final String color; /// Id lists of podcasts in group. - List _podcastList; - - List get podcastList => _podcastList; - - set podcastList(list) { - _podcastList = list; - } + List podcastList; PodcastGroup(this.name, {this.color = '#000000', String id, List podcastList}) : id = id ?? Uuid().v4(), - _podcastList = podcastList ?? []; + podcastList = podcastList ?? []; Future getPodcasts() async { var dbHelper = DBHelper(); - if (_podcastList != []) { + if (podcastList != []) { try { - _podcasts = await dbHelper.getPodcastLocal(_podcastList); + _podcasts = await dbHelper.getPodcastLocal(podcastList); } catch (e) { await Future.delayed(Duration(milliseconds: 200)); try { - _podcasts = await dbHelper.getPodcastLocal(_podcastList); + _podcasts = await dbHelper.getPodcastLocal(podcastList); } catch (e) { developer.log(e.toString()); } @@ -526,13 +520,14 @@ class GroupList extends ChangeNotifier { _isLoading = false; notifyListeners(); } - + + /// Delete podcsat from device. Future removePodcast( PodcastLocal podcast, ) async { _syncRemove(podcast.rssUrl); - final id = podcast.id; - await _unsubscribe(id); + await _unsubscribe(podcast.id); + await File(podcast.imagePath)?.delete(); } Future saveOrder(PodcastGroup group) async { diff --git a/lib/type/playlist.dart b/lib/type/playlist.dart index 99c1be8..61c514a 100644 --- a/lib/type/playlist.dart +++ b/lib/type/playlist.dart @@ -1,16 +1,60 @@ +import 'package:uuid/uuid.dart'; + import '../local_storage/key_value_storage.dart'; import '../local_storage/sqflite_localpodcast.dart'; import 'episodebrief.dart'; +class PlaylistEntity { + final String name; + final String id; + final List episodeList; + + PlaylistEntity(this.name, this.id, this.episodeList); + + Map toJson() { + return {'name': name, 'id': id, 'episodeList': episodeList}; + } + + static PlaylistEntity fromJson(Map json) { + var list = List.from(json['episodeList']); + return PlaylistEntity(json['name'] as String, json['id'] as String, list); + } +} + class Playlist { - String name; + /// Playlist name. the default playlist is named "Playlist". + final String name; + + /// Unique id for playlist. + final String id; + + /// Episode url list for playlist. + final List episodeList; + + Playlist(this.name, {String id, List episodeList}) + : id = id ?? Uuid().v4(), + episodeList = episodeList ?? []; + + PlaylistEntity toEntity() { + return PlaylistEntity(name, id, episodeList); + } + + static Playlist fromEntity(PlaylistEntity entity) { + return Playlist( + entity.name, + id: entity.id, + episodeList: entity.episodeList, + ); + } + final DBHelper _dbHelper = DBHelper(); - List _playlist; + List _playlist = []; List get playlist => _playlist; final KeyValueStorage _playlistStorage = KeyValueStorage(playlistKey); Future getPlaylist() async { var urls = await _playlistStorage.getStringList(); + episodeList.addAll(urls); if (urls.length == 0) { _playlist = []; } else {