diff options
author | ByteHamster <ByteHamster@users.noreply.github.com> | 2024-03-24 18:04:39 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-24 18:04:39 +0100 |
commit | 7b390f1c9299d644ad0339e83724e1457c150410 (patch) | |
tree | 8e74d59cc8e3447b81817759869b7d5af1345b12 /core/src | |
parent | 084b9c231744a5657a620087b4b560db38b66ab8 (diff) | |
download | AntennaPod-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.java | 7 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/storage/FeedItemDuplicateGuesser.java | 2 |
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; } |