1
0
mirror of https://github.com/stonega/tsacdop synced 2025-02-23 14:57:52 +01:00

Fix bug hide listened mode load more broken.

This commit is contained in:
stonegate 2020-08-27 16:35:18 +08:00
parent b4e640bad3
commit fc4b8a275e
3 changed files with 382 additions and 273 deletions

View File

@ -197,6 +197,8 @@ class _RssResultState extends State<RssResult> {
!_isSubscribed !_isSubscribed
? OutlineButton( ? OutlineButton(
highlightedBorderColor: context.accentColor, highlightedBorderColor: context.accentColor,
borderSide: BorderSide(
color: context.accentColor, width: 2),
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(100.0), borderRadius: BorderRadius.circular(100.0),
side: side:
@ -514,30 +516,30 @@ class SearchResult extends StatelessWidget {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
bottom: Divider.createBorderSide(context), // bottom: Divider.createBorderSide(context),
), ),
), ),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
ListTile( ListTile(
contentPadding: EdgeInsets.symmetric(horizontal: 20.0), contentPadding: EdgeInsets.fromLTRB(20, 10, 20, 10),
onTap: () { onTap: () {
onSelect(onlinePodcast); onSelect(onlinePodcast);
}, },
leading: ClipRRect( leading: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(20.0)), borderRadius: BorderRadius.circular(25.0),
child: CachedNetworkImage( child: CachedNetworkImage(
height: 40.0, height: 50.0,
width: 40.0, width: 50.0,
fit: BoxFit.fitWidth, fit: BoxFit.fitWidth,
alignment: Alignment.center, alignment: Alignment.center,
imageUrl: onlinePodcast.image, imageUrl: onlinePodcast.image,
progressIndicatorBuilder: (context, url, downloadProgress) => progressIndicatorBuilder: (context, url, downloadProgress) =>
Container( Container(
height: 40, height: 50,
width: 40, width: 50,
alignment: Alignment.center, alignment: Alignment.center,
color: context.primaryColorDark, color: context.primaryColorDark,
child: SizedBox( child: SizedBox(
@ -548,8 +550,8 @@ class SearchResult extends StatelessWidget {
), ),
), ),
errorWidget: (context, url, error) => Container( errorWidget: (context, url, error) => Container(
width: 40, width: 50,
height: 40, height: 50,
alignment: Alignment.center, alignment: Alignment.center,
color: context.primaryColorDark, color: context.primaryColorDark,
child: Icon(Icons.error)), child: Icon(Icons.error)),
@ -560,6 +562,7 @@ class SearchResult extends StatelessWidget {
trailing: !isSubscribed trailing: !isSubscribed
? OutlineButton( ? OutlineButton(
highlightedBorderColor: context.accentColor, highlightedBorderColor: context.accentColor,
borderSide: BorderSide(color: context.accentColor),
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(100.0), borderRadius: BorderRadius.circular(100.0),
side: BorderSide(color: context.accentColor)), side: BorderSide(color: context.accentColor)),
@ -807,6 +810,9 @@ class _SearchResultDetailState extends State<SearchResultDetail>
? OutlineButton( ? OutlineButton(
highlightedBorderColor: highlightedBorderColor:
context.accentColor, context.accentColor,
borderSide: BorderSide(
color: context.accentColor,
width: 2),
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: borderRadius:
BorderRadius.circular(100.0), BorderRadius.circular(100.0),

View File

@ -292,15 +292,10 @@ class DBHelper {
var dbClient = await database; var dbClient = await database;
var i = 0; var i = 0;
List<Map> list = await dbClient.rawQuery( List<Map> list = await dbClient.rawQuery(
"SELECT listen_time FROM PlayHistory WHERE enclosure_url = ?", [url]); "SELECT SUM(listen_time) FROM PlayHistory WHERE enclosure_url = ?",
if (list.length == 0) { [url]);
return 0; i = list.first['SUM(listen_time)'];
} else { return i ?? 0;
for (var element in list) {
i += element['listen_time'];
}
return i;
}
} }
Future<int> markNotListened(String url) async { Future<int> markNotListened(String url) async {
@ -596,143 +591,254 @@ class DBHelper {
var dbClient = await database; var dbClient = await database;
var episodes = <EpisodeBrief>[]; var episodes = <EpisodeBrief>[];
var list = <Map>[]; var list = <Map>[];
if (count == -1) { if (hideListened) {
switch (filter) { if (count == -1) {
case Filter.all: switch (filter) {
list = await dbClient case Filter.all:
.rawQuery("""SELECT E.title, E.enclosure_url, E.enclosure_length, list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? ORDER BY E.milliseconds ASC""", [id]); LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url
break; WHERE P.id = ? AND H.SUM(listen_time) > 0 ORDER BY E.milliseconds ASC""",
case Filter.liked: [id]);
list = await dbClient break;
.rawQuery("""SELECT E.title, E.enclosure_url, E.enclosure_length, case Filter.liked:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds ASC""", [id]); WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds ASC""", [id]);
break; break;
case Filter.downloaded: case Filter.downloaded:
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, """SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? AND E.media_id != E.enclosure_url ORDER BY E.milliseconds ASC""", WHERE P.id = ? AND E.media_id != E.enclosure_url ORDER BY E.milliseconds ASC""",
[id]); [id]);
break; break;
case Filter.search: case Filter.search:
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, """SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds ASC""", WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds ASC""",
[id, '%$query%']); [id, '%$query%']);
break; break;
default: default:
}
} else if (reverse) {
switch (filter) {
case Filter.all:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
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
WHERE P.id = ? GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds ASC LIMIT ?""",
[id, count]);
break;
case Filter.liked:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
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
WHERE P.id = ? AND E.liked = 1 GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds ASC LIMIT ?""",
[id, count]);
break;
case Filter.downloaded:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
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
WHERE P.id = ? AND E.enclosure_url != E.media_id
GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds ASC LIMIT ?""",
[id, count]);
break;
case Filter.search:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
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
WHERE P.id = ? AND E.title LIKE ? GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds ASC LIMIT ?""",
[id, '%$query%', count]);
break;
default:
}
} else {
switch (filter) {
case Filter.all:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
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
WHERE P.id = ? GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ?""",
[id, count]);
break;
case Filter.liked:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
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
WHERE P.id = ? AND E.liked = 1 GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ?""",
[id, count]);
break;
case Filter.downloaded:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
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
WHERE P.id = ? AND E.enclosure_url != E.media_id GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ?""",
[id, count]);
break;
case Filter.search:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
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
WHERE P.id = ? AND E.title LIKE ? GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ?""",
[id, '%$query%', count]);
break;
default:
}
} }
} else if (reverse) { } else {
switch (filter) { if (count == -1) {
case Filter.all: switch (filter) {
list = await dbClient case Filter.all:
.rawQuery("""SELECT E.title, E.enclosure_url, E.enclosure_length, list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? ORDER BY E.milliseconds ASC""", [id]);
break;
case Filter.liked:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds ASC""", [id]);
break;
case Filter.downloaded:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? AND E.media_id != E.enclosure_url ORDER BY E.milliseconds ASC""",
[id]);
break;
case Filter.search:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds ASC""",
[id, '%$query%']);
break;
default:
}
} else if (reverse) {
switch (filter) {
case Filter.all:
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? ORDER BY E.milliseconds ASC LIMIT ?""", [id, count]); WHERE P.id = ? ORDER BY E.milliseconds ASC LIMIT ?""", [id, count]);
break; break;
case Filter.liked: case Filter.liked:
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, """SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds ASC LIMIT ?""", WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds ASC LIMIT ?""",
[id, count]); [id, count]);
break; break;
case Filter.downloaded: case Filter.downloaded:
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, """SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? AND E.enclosure_url != E.media_id ORDER BY E.milliseconds ASC LIMIT ?""", WHERE P.id = ? AND E.enclosure_url != E.media_id ORDER BY E.milliseconds ASC LIMIT ?""",
[id, count]); [id, count]);
break; break;
case Filter.search: case Filter.search:
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, """SELECT E.title, E.enclosure_url, E.enclosure_length,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds ASC LIMIT ?""", WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds ASC LIMIT ?""",
[id, '%$query%', count]); [id, '%$query%', count]);
break; break;
default: default:
} }
} else { } else {
switch (filter) { switch (filter) {
case Filter.all: case Filter.all:
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? ORDER BY E.milliseconds DESC LIMIT ?""", [id, count]); WHERE P.id = ? ORDER BY E.milliseconds DESC LIMIT ?""", [id, count]);
break; break;
case Filter.liked: case Filter.liked:
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds DESC LIMIT ?""", WHERE P.id = ? AND E.liked = 1 ORDER BY E.milliseconds DESC LIMIT ?""",
[id, count]); [id, count]);
break; break;
case Filter.downloaded: case Filter.downloaded:
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? AND E.enclosure_url != E.media_id ORDER BY E.milliseconds DESC LIMIT ?""", WHERE P.id = ? AND E.enclosure_url != E.media_id ORDER BY E.milliseconds DESC LIMIT ?""",
[id, count]); [id, count]);
break; break;
case Filter.search: case Filter.search:
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, """SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new,
E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit, E.milliseconds, P.imagePath, P.title as feedTitle, E.duration, E.explicit,
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds DESC LIMIT ?""", WHERE P.id = ? AND E.title LIKE ? ORDER BY E.milliseconds DESC LIMIT ?""",
[id, '%$query%', count]); [id, '%$query%', count]);
break; break;
default: default:
}
} }
} }
if (list.isNotEmpty) { if (list.isNotEmpty) {
if (!hideListened) { for (var i in list) {
for (var i in list) { episodes.add(EpisodeBrief(
episodes.add(EpisodeBrief( i['title'],
i['title'], i['enclosure_url'],
i['enclosure_url'], i['enclosure_length'],
i['enclosure_length'], i['milliseconds'],
i['milliseconds'], i['feedTitle'],
i['feedTitle'], i['primaryColor'],
i['primaryColor'], i['duration'],
i['duration'], i['explicit'],
i['explicit'], i['imagePath'],
i['imagePath'], i['is_new']));
i['is_new']));
}
} else {
for (var i in list) {
var listened = await isListened(i['enclosure_url']);
if (listened == 0) {
episodes.add(EpisodeBrief(
i['title'],
i['enclosure_url'],
i['enclosure_length'],
i['milliseconds'],
i['feedTitle'],
i['primaryColor'],
i['duration'],
i['explicit'],
i['imagePath'],
i['is_new']));
}
}
} }
} }
return episodes; return episodes;
@ -804,13 +910,65 @@ class DBHelper {
var dbClient = await database; var dbClient = await database;
var episodes = <EpisodeBrief>[]; var episodes = <EpisodeBrief>[];
var list = <Map>[]; var list = <Map>[];
list = await dbClient.rawQuery( if (hideListened) {
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.is_new, 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 E.milliseconds DESC LIMIT ? """,
[top]);
} 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, 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 P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
ORDER BY E.milliseconds DESC LIMIT ? """, [top]); ORDER BY E.milliseconds DESC LIMIT ? """, [top]);
}
if (list.isNotEmpty) { if (list.isNotEmpty) {
if (!hideListened) { for (var i in list) {
episodes.add(EpisodeBrief(
i['title'],
i['enclosure_url'],
i['enclosure_length'],
i['milliseconds'],
i['feedTitle'],
i['primaryColor'],
i['duration'],
i['explicit'],
i['imagePath'],
i['is_new']));
}
}
return episodes;
}
Future<List<EpisodeBrief>> getGroupRssItem(int top, List<String> group,
{bool hideListened = false}) async {
var dbClient = await database;
var episodes = <EpisodeBrief>[];
if (group.length > 0) {
var s = group.map<String>((e) => "'$e'").toList();
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
WHERE P.id in (${s.join(',')}) GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ? """,
[top]);
} 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
WHERE P.id in (${s.join(',')})
ORDER BY E.milliseconds DESC LIMIT ? """, [top]);
}
if (list.isNotEmpty) {
for (var i in list) { for (var i in list) {
episodes.add(EpisodeBrief( episodes.add(EpisodeBrief(
i['title'], i['title'],
@ -824,73 +982,6 @@ class DBHelper {
i['imagePath'], i['imagePath'],
i['is_new'])); i['is_new']));
} }
} else {
for (var i in list) {
var listened = await isListened(i['enclosure_url']);
if (listened == 0) {
episodes.add(EpisodeBrief(
i['title'],
i['enclosure_url'],
i['enclosure_length'],
i['milliseconds'],
i['feedTitle'],
i['primaryColor'],
i['duration'],
i['explicit'],
i['imagePath'],
i['is_new']));
}
}
}
}
return episodes;
}
Future<List<EpisodeBrief>> getGroupRssItem(int top, List<String> group,
{bool hideListened = false}) async {
var dbClient = await database;
var episodes = <EpisodeBrief>[];
if (group.length > 0) {
var s = group.map<String>((e) => "'$e'").toList();
List<Map> 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
WHERE P.id in (${s.join(',')})
ORDER BY E.milliseconds DESC LIMIT ? """, [top]);
if (list.isNotEmpty) {
if (!hideListened) {
for (var i in list) {
episodes.add(EpisodeBrief(
i['title'],
i['enclosure_url'],
i['enclosure_length'],
i['milliseconds'],
i['feedTitle'],
i['primaryColor'],
i['duration'],
i['explicit'],
i['imagePath'],
i['is_new']));
}
} else {
for (var i in list) {
var listened = await isListened(i['enclosure_url']);
if (listened == 0) {
episodes.add(EpisodeBrief(
i['title'],
i['enclosure_url'],
i['enclosure_length'],
i['milliseconds'],
i['feedTitle'],
i['primaryColor'],
i['duration'],
i['explicit'],
i['imagePath'],
i['is_new']));
}
}
}
} }
} }
return episodes; return episodes;
@ -952,66 +1043,77 @@ class DBHelper {
var dbClient = await database; var dbClient = await database;
var episodes = <EpisodeBrief>[]; var episodes = <EpisodeBrief>[];
List<Map> list; List<Map> list;
//Ordered by date if (hideListened) {
if (mode == 0) { if (mode == 0) {
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date, E.is_new, """SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date, 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
WHERE E.enclosure_url != E.media_id GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.download_date DESC""",
);
} else if (mode == 1) {
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date,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
WHERE E.enclosure_url != E.media_id GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.download_date ASC""",
);
} else if (mode == 2) {
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date,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
WHERE E.enclosure_url != E.media_id GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.enclosure_length DESC""",
);
}
} else //Ordered by date
{
if (mode == 0) {
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date, E.is_new,
E.milliseconds, P.title as feed_title, E.duration, E.explicit, 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 P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE E.enclosure_url != E.media_id WHERE E.enclosure_url != E.media_id
ORDER BY E.download_date DESC""", ORDER BY E.download_date DESC""",
); );
} else if (mode == 1) { } else if (mode == 1) {
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date,E.is_new, """SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date,E.is_new,
E.milliseconds, P.title as feed_title, E.duration, E.explicit, 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 P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE E.enclosure_url != E.media_id WHERE E.enclosure_url != E.media_id
ORDER BY E.download_date ASC""", ORDER BY E.download_date ASC""",
); );
} else if (mode == 2) { } else if (mode == 2) {
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date,E.is_new, """SELECT E.title, E.enclosure_url, E.enclosure_length, E.download_date,E.is_new,
E.milliseconds, P.title as feed_title, E.duration, E.explicit, 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 P.imagePath, P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE E.enclosure_url != E.media_id WHERE E.enclosure_url != E.media_id
ORDER BY E.enclosure_length DESC""", ORDER BY E.enclosure_length DESC""",
); );
}
} }
if (list.isNotEmpty) { if (list.isNotEmpty) {
if (!hideListened) { for (var i in list) {
for (var i in list) { episodes.add(EpisodeBrief(
episodes.add(EpisodeBrief( i['title'],
i['title'], i['enclosure_url'],
i['enclosure_url'], i['enclosure_length'],
i['enclosure_length'], i['milliseconds'],
i['milliseconds'], i['feedTitle'],
i['feedTitle'], i['primaryColor'],
i['primaryColor'], i['duration'],
i['duration'], i['explicit'],
i['explicit'], i['imagePath'],
i['imagePath'], i['is_new'],
i['is_new'], downloadDate: i['download_date']));
downloadDate: i['download_date']));
}
} else {
for (var i in list) {
var listened = await isListened(i['enclosure_url']);
if (listened == 0) {
episodes.add(EpisodeBrief(
i['title'],
i['enclosure_url'],
i['enclosure_length'],
i['milliseconds'],
i['feedTitle'],
i['primaryColor'],
i['duration'],
i['explicit'],
i['imagePath'],
i['is_new'],
downloadDate: i['download_date']));
}
}
} }
} }
return episodes; return episodes;
@ -1054,7 +1156,7 @@ class DBHelper {
return episodes; return episodes;
} }
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.length > 0) {
var s = group.map<String>((e) => "'$e'").toList(); var s = group.map<String>((e) => "'$e'").toList();
@ -1065,7 +1167,7 @@ class DBHelper {
} }
} }
removeEpisodeNewMark(String url) async { Future<void> removeEpisodeNewMark(String url) async {
var dbClient = await database; var dbClient = await database;
await dbClient.transaction((txn) async { await dbClient.transaction((txn) async {
await txn.rawUpdate( await txn.rawUpdate(
@ -1079,51 +1181,52 @@ class DBHelper {
var dbClient = await database; var dbClient = await database;
var episodes = <EpisodeBrief>[]; var episodes = <EpisodeBrief>[];
var list = <Map>[]; var list = <Map>[];
if (sortBy == 0) { if (hideListened) {
list = await dbClient.rawQuery( if (sortBy == 0) {
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath,
P.title as feed_title, E.duration, E.explicit, P.primaryColor, E.is_new
FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url
WHERE E.liked = 1 GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.milliseconds DESC LIMIT ?""", [i]);
} else {
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath,
P.title as feed_title, E.duration, E.explicit, P.primaryColor, E.is_new
FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
LEFT JOIN PlayHistory H ON E.enclosure_url = H.enclosure_url
WHERE E.liked = 1 GROUP BY E.enclosure_url HAVING SUM(H.listen_time) is null
OR SUM(H.listen_time) = 0 ORDER BY E.liked_date DESC LIMIT ?""", [i]);
}
} else {
if (sortBy == 0) {
list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath,
P.title as feed_title, E.duration, E.explicit, P.primaryColor, E.is_new P.title as feed_title, E.duration, E.explicit, P.primaryColor, E.is_new
FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE E.liked = 1 ORDER BY E.milliseconds DESC LIMIT ?""", [i]); WHERE E.liked = 1 ORDER BY E.milliseconds DESC LIMIT ?""", [i]);
} else { } else {
list = await dbClient.rawQuery( list = await dbClient.rawQuery(
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath, """SELECT E.title, E.enclosure_url, E.enclosure_length, E.milliseconds, P.imagePath,
P.title as feed_title, E.duration, E.explicit, P.primaryColor, E.is_new P.title as feed_title, E.duration, E.explicit, P.primaryColor, E.is_new
FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_id = P.id
WHERE E.liked = 1 ORDER BY E.liked_date DESC LIMIT ?""", [i]); WHERE E.liked = 1 ORDER BY E.liked_date DESC LIMIT ?""", [i]);
}
} }
if (list.isNotEmpty) { if (list.isNotEmpty) {
if (!hideListened) { for (var i in list) {
for (var i in list) { episodes.add(EpisodeBrief(
episodes.add(EpisodeBrief( i['title'],
i['title'], i['enclosure_url'],
i['enclosure_url'], i['enclosure_length'],
i['enclosure_length'], i['milliseconds'],
i['milliseconds'], i['feedTitle'],
i['feedTitle'], i['primaryColor'],
i['primaryColor'], i['duration'],
i['duration'], i['explicit'],
i['explicit'], i['imagePath'],
i['imagePath'], i['is_new']));
i['is_new']));
}
} else {
for (var i in list) {
var listened = await isListened(i['enclosure_url']);
if (listened == 0) {
episodes.add(EpisodeBrief(
i['title'],
i['enclosure_url'],
i['enclosure_length'],
i['milliseconds'],
i['feedTitle'],
i['primaryColor'],
i['duration'],
i['explicit'],
i['imagePath'],
i['is_new']));
}
}
} }
} }

View File

@ -695,7 +695,7 @@ class _PodcastDetailState extends State<PodcastDetail> {
setState(() => _loadMore = true); setState(() => _loadMore = true);
} }
await Future.delayed(Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
if (mounted) { if (mounted && _loadMore) {
setState(() { setState(() {
_top = _top + 36; _top = _top + 36;
_loadMore = false; _loadMore = false;