Create playlists with new options.
This commit is contained in:
parent
b25093583a
commit
b3e1d4cb42
|
@ -1119,6 +1119,45 @@ class DBHelper {
|
||||||
return episodes;
|
return episodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<List<EpisodeBrief>> getRandomRssItem(int random,
|
||||||
|
{bool hideListened = false}) async {
|
||||||
|
var dbClient = await database;
|
||||||
|
var episodes = <EpisodeBrief>[];
|
||||||
|
var list = <Map>[];
|
||||||
|
if (hideListened) {
|
||||||
|
list = await dbClient.rawQuery(
|
||||||
|
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new,
|
||||||
|
E.milliseconds, P.title as feed_title, E.duration, E.explicit,
|
||||||
|
P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
|
||||||
|
LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url
|
||||||
|
GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
|
||||||
|
OR SUM(H.listen_time) = 0 ORDER BY RANDOM() LIMIT ? """,
|
||||||
|
[random]);
|
||||||
|
} else {
|
||||||
|
list = await dbClient.rawQuery(
|
||||||
|
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new,
|
||||||
|
E.milliseconds, P.title as feed_title, E.duration, E.explicit,
|
||||||
|
P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
|
||||||
|
ORDER BY RANDOM() LIMIT ? """, [random]);
|
||||||
|
}
|
||||||
|
if (list.isNotEmpty) {
|
||||||
|
for (var i in list) {
|
||||||
|
episodes.add(EpisodeBrief(
|
||||||
|
i['title'],
|
||||||
|
i['enclosure_url'],
|
||||||
|
i['enclosure_length'],
|
||||||
|
i['milliseconds'],
|
||||||
|
i['feed_title'],
|
||||||
|
i['primaryColor'],
|
||||||
|
i['duration'],
|
||||||
|
i['explicit'],
|
||||||
|
i['imagePath'],
|
||||||
|
i['is_new']));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return episodes;
|
||||||
|
}
|
||||||
|
|
||||||
Future<List<EpisodeBrief>> getGroupRssItem(int top, List<String> group,
|
Future<List<EpisodeBrief>> getGroupRssItem(int top, List<String> group,
|
||||||
{bool hideListened = false}) async {
|
{bool hideListened = false}) async {
|
||||||
var dbClient = await database;
|
var dbClient = await database;
|
||||||
|
@ -1361,7 +1400,7 @@ class DBHelper {
|
||||||
|
|
||||||
Future<void> removeGroupNewMark(List<String> group) async {
|
Future<void> removeGroupNewMark(List<String> group) async {
|
||||||
var dbClient = await database;
|
var dbClient = await database;
|
||||||
if (group.length > 0) {
|
if (group.isNotEmpty) {
|
||||||
var s = group.map<String>((e) => "'$e'").toList();
|
var s = group.map<String>((e) => "'$e'").toList();
|
||||||
await dbClient.transaction((txn) async {
|
await dbClient.transaction((txn) async {
|
||||||
await txn.rawUpdate(
|
await txn.rawUpdate(
|
||||||
|
|
|
@ -168,7 +168,7 @@ class _PlaylistHomeState extends State<PlaylistHome> {
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
data.item3 != null
|
data.item4 != null
|
||||||
? ClipRRect(
|
? ClipRRect(
|
||||||
borderRadius: BorderRadius.circular(10),
|
borderRadius: BorderRadius.circular(10),
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
|
@ -285,9 +285,10 @@ class __QueueState extends State<_Queue> {
|
||||||
key: ValueKey(episode.enclosureUrl),
|
key: ValueKey(episode.enclosureUrl),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return Container(
|
return EpisodeCard(episode,
|
||||||
key: ValueKey('sd'),
|
key: ValueKey('playing'),
|
||||||
);
|
isPlaying: true,
|
||||||
|
tileColor: context.primaryColorDark);
|
||||||
}
|
}
|
||||||
}).toList()
|
}).toList()
|
||||||
: episodes
|
: episodes
|
||||||
|
@ -301,98 +302,19 @@ class __QueueState extends State<_Queue> {
|
||||||
itemCount: queue.episodeList.length,
|
itemCount: queue.episodeList.length,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final episode = queue.episodes[index];
|
final episode = queue.episodes[index];
|
||||||
final c = episode.backgroudColor(context);
|
|
||||||
final isPlaying =
|
final isPlaying =
|
||||||
data.item3 != null && data.item3 == episode;
|
data.item3 != null && data.item3 == episode;
|
||||||
return SizedBox(
|
return EpisodeCard(
|
||||||
height: 90.0,
|
episode,
|
||||||
child: Column(
|
isPlaying: isPlaying && running,
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
tileColor: isPlaying ? context.primaryColorDark : null,
|
||||||
children: <Widget>[
|
onTap: () async {
|
||||||
Expanded(
|
if (!isPlaying) {
|
||||||
child: ListTile(
|
await context
|
||||||
tileColor:
|
.read<AudioPlayerNotifier>()
|
||||||
isPlaying ? context.primaryColorDark : null,
|
.loadEpisodeFromPlaylist(episode);
|
||||||
contentPadding: EdgeInsets.symmetric(vertical: 8),
|
}
|
||||||
onTap: () async {
|
},
|
||||||
if (!isPlaying) {
|
|
||||||
await context
|
|
||||||
.read<AudioPlayerNotifier>()
|
|
||||||
.loadEpisodeFromPlaylist(episode);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
title: Container(
|
|
||||||
padding: EdgeInsets.fromLTRB(0, 5.0, 20.0, 5.0),
|
|
||||||
child: Text(
|
|
||||||
episode.title,
|
|
||||||
maxLines: 1,
|
|
||||||
overflow: TextOverflow.ellipsis,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
leading: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
// Icon(Icons.unfold_more, color: c),
|
|
||||||
SizedBox(width: 24),
|
|
||||||
CircleAvatar(
|
|
||||||
backgroundColor: c.withOpacity(0.5),
|
|
||||||
backgroundImage: episode.avatarImage),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
subtitle: Container(
|
|
||||||
padding: EdgeInsets.only(top: 5, bottom: 5),
|
|
||||||
height: 35,
|
|
||||||
child: Row(
|
|
||||||
children: <Widget>[
|
|
||||||
if (episode.explicit == 1)
|
|
||||||
Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.red[800],
|
|
||||||
shape: BoxShape.circle),
|
|
||||||
height: 25.0,
|
|
||||||
width: 25.0,
|
|
||||||
margin: EdgeInsets.only(right: 10.0),
|
|
||||||
alignment: Alignment.center,
|
|
||||||
child: Text('E',
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.white))),
|
|
||||||
if (episode.duration != 0)
|
|
||||||
episodeTag(
|
|
||||||
episode.duration == 0
|
|
||||||
? ''
|
|
||||||
: s.minsCount(
|
|
||||||
episode.duration ~/ 60),
|
|
||||||
Colors.cyan[300]),
|
|
||||||
if (episode.enclosureLength != null)
|
|
||||||
episodeTag(
|
|
||||||
episode.enclosureLength == 0
|
|
||||||
? ''
|
|
||||||
: '${(episode.enclosureLength) ~/ 1000000}MB',
|
|
||||||
Colors.lightBlue[300]),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
trailing: isPlaying && running
|
|
||||||
? Container(
|
|
||||||
height: 20,
|
|
||||||
width: 20,
|
|
||||||
margin:
|
|
||||||
EdgeInsets.symmetric(horizontal: 10),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
shape: BoxShape.circle,
|
|
||||||
),
|
|
||||||
child: WaveLoader(
|
|
||||||
color: context.accentColor))
|
|
||||||
: SizedBox(width: 1),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Divider(
|
|
||||||
height: 2,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -857,6 +779,7 @@ class _NewPlaylist extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class __NewPlaylistState extends State<_NewPlaylist> {
|
class __NewPlaylistState extends State<_NewPlaylist> {
|
||||||
|
final _dbHelper = DBHelper();
|
||||||
String _playlistName = '';
|
String _playlistName = '';
|
||||||
NewPlaylistOption _option;
|
NewPlaylistOption _option;
|
||||||
int _error;
|
int _error;
|
||||||
|
@ -867,6 +790,14 @@ class __NewPlaylistState extends State<_NewPlaylist> {
|
||||||
_option = NewPlaylistOption.blank;
|
_option = NewPlaylistOption.blank;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<List<EpisodeBrief>> _random() async {
|
||||||
|
return await _dbHelper.getRandomRssItem(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<EpisodeBrief>> _recent() async {
|
||||||
|
return await _dbHelper.getRecentRssItem(10);
|
||||||
|
}
|
||||||
|
|
||||||
Widget _createOption(NewPlaylistOption option) {
|
Widget _createOption(NewPlaylistOption option) {
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.all(8.0),
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
@ -954,7 +885,22 @@ class __NewPlaylistState extends State<_NewPlaylist> {
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case NewPlaylistOption.latest10:
|
case NewPlaylistOption.latest10:
|
||||||
|
final recent = await _recent();
|
||||||
|
playlist = Playlist(
|
||||||
|
_playlistName,
|
||||||
|
episodeList: [for(var e in recent) e.enclosureUrl],
|
||||||
|
);
|
||||||
|
await playlist.getPlaylist();
|
||||||
|
break;
|
||||||
case NewPlaylistOption.randon10:
|
case NewPlaylistOption.randon10:
|
||||||
|
final random = await _random();
|
||||||
|
playlist = Playlist(
|
||||||
|
_playlistName,
|
||||||
|
episodeList: [for(var e in random) e.enclosureUrl],
|
||||||
|
);
|
||||||
|
await playlist.getPlaylist();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
context.read<AudioPlayerNotifier>().addPlaylist(playlist);
|
context.read<AudioPlayerNotifier>().addPlaylist(playlist);
|
||||||
|
|
Loading…
Reference in New Issue