summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorByteHamster <ByteHamster@users.noreply.github.com>2024-03-24 18:04:39 +0100
committerGitHub <noreply@github.com>2024-03-24 18:04:39 +0100
commit7b390f1c9299d644ad0339e83724e1457c150410 (patch)
tree8e74d59cc8e3447b81817759869b7d5af1345b12 /core/src
parent084b9c231744a5657a620087b4b560db38b66ab8 (diff)
downloadAntennaPod-7b390f1c9299d644ad0339e83724e1457c150410.zip
Speed up feed parsing (#7023)
AntennaPod is quite slow with huge feeds. The reason is that we have a bunch of workarounds for misbehaving feeds that also make it slower to work with feeds that do not misbehave. Changes: - Only start guessing duplicate episodes when no "proper" match is found - Only parse non-html as HTML for attributes that really need it - Do not log failed Long parsing when size is not specified - Try to parse dates with RFC822 first before falling back to workarounds for other formats I ran a benchmark with "Stuff you should know" (for which the workarounds are not needed) containing 2k episodes. Includes download of 8MB of feed XML (~5 seconds), debug build. Before: 44 seconds, after: 13 seconds ==> 3.4 times faster feed refresh
Diffstat (limited to 'core/src')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java7
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/FeedItemDuplicateGuesser.java2
2 files changed, 8 insertions, 1 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java
index 1fb0991dd..883aefee8 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java
@@ -171,6 +171,13 @@ public final class DBTasks {
* This is to work around podcasters breaking their GUIDs.
*/
private static FeedItem searchFeedItemGuessDuplicate(List<FeedItem> items, FeedItem searchItem) {
+ // First, see if it is a well-behaving feed that contains an item with the same identifier
+ for (FeedItem item : items) {
+ if (FeedItemDuplicateGuesser.sameAndNotEmpty(item.getItemIdentifier(), searchItem.getItemIdentifier())) {
+ return item;
+ }
+ }
+ // Not found yet, start more expensive guessing
for (FeedItem item : items) {
if (FeedItemDuplicateGuesser.seemDuplicates(item, searchItem)) {
return item;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/FeedItemDuplicateGuesser.java b/core/src/main/java/de/danoeh/antennapod/core/storage/FeedItemDuplicateGuesser.java
index 88f896187..1eb8b0577 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/FeedItemDuplicateGuesser.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/FeedItemDuplicateGuesser.java
@@ -31,7 +31,7 @@ public class FeedItemDuplicateGuesser {
&& mimeTypeLooksSimilar(media1, media2);
}
- private static boolean sameAndNotEmpty(String string1, String string2) {
+ public static boolean sameAndNotEmpty(String string1, String string2) {
if (TextUtils.isEmpty(string1) || TextUtils.isEmpty(string2)) {
return false;
}