summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorByteHamster <info@bytehamster.com>2021-02-15 23:13:26 +0100
committerByteHamster <info@bytehamster.com>2021-02-15 23:13:29 +0100
commit4f2dcc189cbab51dbae65ad93917c151f0bcd428 (patch)
treee1fa2fadcf832e0b1334211b2f8136407e5ba230
parentaaeea78b37377cc09252c89a35fe9ae2e8542c68 (diff)
downloadAntennaPod-4f2dcc189cbab51dbae65ad93917c151f0bcd428.zip
Fix parsing chapters with multiple null bytes
Previously, we relied on the string to fill the complete frame. Some podcasts terminate the string early and leave some garbage in the frame data. Skip that garbage, so that the reader is at a valid frame header position when starting the next iteration.
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java8
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ID3Reader.java16
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/id3reader/model/FrameHeader.java19
3 files changed, 29 insertions, 14 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java b/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java
index ce3577a9e..b3ef4d40a 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java
@@ -53,7 +53,7 @@ public class ChapterReader extends ID3Reader {
| ((int) startTimeSource[2] << 8) | startTimeSource[3];
currentChapter = new ID3Chapter(elementId.toString(), startTime);
skipBytes(input, 12);
- return ID3Reader.ACTION_DONT_SKIP;
+ return ID3Reader.ACTION_DONT_SKIP; // Let reader discover the sub-frames
case FRAME_ID_TITLE:
if (currentChapter != null && currentChapter.getTitle() == null) {
StringBuilder title = new StringBuilder();
@@ -62,7 +62,7 @@ public class ChapterReader extends ID3Reader {
.setTitle(title.toString());
Log.d(TAG, "Found title: " + currentChapter.getTitle());
- return ID3Reader.ACTION_DONT_SKIP;
+ return ID3Reader.ACTION_SKIP;
}
break;
case FRAME_ID_LINK:
@@ -79,7 +79,7 @@ public class ChapterReader extends ID3Reader {
Log.w(TAG, "Bad URL found in ID3 data");
}
- return ID3Reader.ACTION_DONT_SKIP;
+ return ID3Reader.ACTION_SKIP;
}
break;
case FRAME_ID_PICTURE:
@@ -109,7 +109,7 @@ public class ChapterReader extends ID3Reader {
}
skipBytes(input, length);
}
- return ID3Reader.ACTION_DONT_SKIP;
+ return ID3Reader.ACTION_SKIP;
}
break;
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ID3Reader.java b/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ID3Reader.java
index 124388254..155376d85 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ID3Reader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ID3Reader.java
@@ -20,7 +20,14 @@ public class ID3Reader {
private static final int ID3_LENGTH = 3;
private static final int FRAME_ID_LENGTH = 4;
- private static final int ACTION_SKIP = 1;
+ /**
+ * Should skip remaining bytes of the current frame.
+ */
+ static final int ACTION_SKIP = 1;
+
+ /**
+ * Should not skip remaining bytes of the current frame. Can be used to parse sub-frames.
+ */
static final int ACTION_DONT_SKIP = 2;
private int readerPosition;
@@ -49,12 +56,17 @@ public class ID3Reader {
if (checkForNullString(frameHeader.getId())) {
break;
}
+ int readerPositionBeforeFrame = input.getCount();
rc = onStartFrameHeader(frameHeader, input);
if (rc == ACTION_SKIP) {
if (frameHeader.getSize() + readerPosition > tagHeader.getSize()) {
break;
}
- skipBytes(input, frameHeader.getSize());
+ int bytesAlreadyHandled = input.getCount() - readerPositionBeforeFrame;
+ int bytesLeftToSkip = frameHeader.getSize() - bytesAlreadyHandled;
+ if (bytesLeftToSkip > 0) {
+ skipBytes(input, bytesLeftToSkip);
+ }
}
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/model/FrameHeader.java b/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/model/FrameHeader.java
index 2f3f378ab..3823d1427 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/model/FrameHeader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/model/FrameHeader.java
@@ -1,17 +1,20 @@
package de.danoeh.antennapod.core.util.id3reader.model;
+import androidx.annotation.NonNull;
+
public class FrameHeader extends Header {
- private final char flags;
+ private final char flags;
- public FrameHeader(String id, int size, char flags) {
- super(id, size);
- this.flags = flags;
- }
+ public FrameHeader(String id, int size, char flags) {
+ super(id, size);
+ this.flags = flags;
+ }
- @Override
- public String toString() {
- return String.format("FrameHeader [flags=%s, id=%s, size=%s]", Integer.toBinaryString(flags), id, Integer.toBinaryString(size));
+ @Override
+ @NonNull
+ public String toString() {
+ return String.format("FrameHeader [flags=%s, id=%s, size=%s]", Integer.toBinaryString(flags), id, size);
}
}