diff --git a/README.md b/README.md
index 1ede6fd..f90b632 100644
--- a/README.md
+++ b/README.md
@@ -52,7 +52,7 @@ from https://docs.docker.com/get-docker/. Then run the following command to star
have not tested it on Windows yet):
```
-touch ~/.remarkable-pocket ~/.rmapi && mkdir -p ~/.rmapi-cache && docker run -it --env TZ=Europe/Amsterdam -p 65112:65112 -v ~/.remarkable-pocket:/root/.remarkable-pocket -v ~/.rmapi:/root/.rmapi -v ~/.rmapi-cache:/root/.cache/rmapi ghcr.io/nov1n/remarkable-pocket:0.2.1
+touch ~/.remarkable-pocket ~/.rmapi && mkdir -p ~/.rmapi-cache && docker run -it --env TZ=Europe/Amsterdam -p 65112:65112 -v ~/.remarkable-pocket:/root/.remarkable-pocket -v ~/.rmapi:/root/.rmapi -v ~/.rmapi-cache:/root/.cache/rmapi ghcr.io/nov1n/remarkable-pocket:0.2.2
```
The first time you run the application, you will be asked to authorize Pocket and Remarkable Cloud. Once you have done
diff --git a/docker-compose.yml b/docker-compose.yml
index ae7b447..cb2deaf 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -2,7 +2,7 @@ version: '3'
services:
remarkable-pocket:
- image: ghcr.io/nov1n/remarkable-pocket:0.2.1
+ image: ghcr.io/nov1n/remarkable-pocket:0.2.2
restart: always
ports:
- 65112:65112
diff --git a/nl.carosi.remarkable-pocket.plist b/nl.carosi.remarkable-pocket.plist
index 33d3ec3..68f8559 100644
--- a/nl.carosi.remarkable-pocket.plist
+++ b/nl.carosi.remarkable-pocket.plist
@@ -8,7 +8,7 @@
/bin/sh
-c
- while ! /usr/local/bin/docker version > /dev/null 2>&1; do sleep 5; done && /usr/local/bin/docker run --env TZ=Europe/Amsterdam -v ~/.remarkable-pocket:/root/.remarkable-pocket -v ~/.rmapi:/root/.rmapi -v ~/.rmapi-cache:/root/.cache/rmapi ghcr.io/nov1n/remarkable-pocket:0.2.1 1>>$HOME/.remarkable-pocket.log 2>&1
+ while ! /usr/local/bin/docker version > /dev/null 2>&1; do sleep 5; done && /usr/local/bin/docker run --env TZ=Europe/Amsterdam -v ~/.remarkable-pocket:/root/.remarkable-pocket -v ~/.rmapi:/root/.rmapi -v ~/.rmapi-cache:/root/.cache/rmapi ghcr.io/nov1n/remarkable-pocket:0.2.2 1>>$HOME/.remarkable-pocket.log 2>&1
RunAtLoad
diff --git a/src/main/java/nl/carosi/remarkablepocket/MetadataProvider.java b/src/main/java/nl/carosi/remarkablepocket/MetadataProvider.java
index 130df24..1350ca9 100644
--- a/src/main/java/nl/carosi/remarkablepocket/MetadataProvider.java
+++ b/src/main/java/nl/carosi/remarkablepocket/MetadataProvider.java
@@ -58,22 +58,26 @@ final class MetadataProvider {
DocumentMetadata getMetadata(String name) {
LOG.debug("Getting metadata for document: {}.", name);
- ZipFile zip;
- try {
- zip = new ZipFile(rmapi.download(name, workDir.toString()));
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- String fileHash = zip.entries().nextElement().getName().split("\\.")[0];
-
- try (InputStream lines = zip.getInputStream(zip.getEntry(fileHash + ".content"));
- InputStream epub = zip.getInputStream(zip.getEntry(fileHash + ".epub"))) {
- int pageCount = objectMapper.readValue(lines, Lines.class).pageCount();
- String pocketId = extractPocketId(epub);
- return new DocumentMetadata(rmapi.info(name), pageCount, pocketId);
- } catch (IOException | SAXException | XPathExpressionException e) {
- throw new RuntimeException(e);
+ try (ZipFile zip = new ZipFile(rmapi.download(name, workDir.toString()))) {
+ String fileHash = zip.entries().nextElement().getName().split("\\.")[0];
+ if (zip.getEntry(fileHash + ".pdf") != null) {
+ // In this case the article was converted to pdf because Remarkable
+ // couldn't read the epub file. This means we lost the metadata,
+ // so we delete it.
+ return null;
+ }
+ try (InputStream linesStream = zip.getInputStream(zip.getEntry(fileHash + ".content"));
+ InputStream epubStream = zip.getInputStream(zip.getEntry(fileHash + ".epub"))) {
+ int pageCount = objectMapper.readValue(linesStream, Lines.class).pageCount();
+ String pocketId = extractPocketId(epubStream);
+ return new DocumentMetadata(rmapi.info(name), pageCount, pocketId);
+ }
+ } catch (Exception e) {
+ LOG.info(
+ "Article '{}' is corrupted. Deleting file and retrieving new article in next sync.",
+ name);
+ rmapi.delete(name);
+ return null;
}
}
diff --git a/src/main/java/nl/carosi/remarkablepocket/RemarkableService.java b/src/main/java/nl/carosi/remarkablepocket/RemarkableService.java
index 2a8ad17..84c8216 100644
--- a/src/main/java/nl/carosi/remarkablepocket/RemarkableService.java
+++ b/src/main/java/nl/carosi/remarkablepocket/RemarkableService.java
@@ -4,6 +4,7 @@ import static com.google.common.base.Preconditions.checkArgument;
import java.nio.file.Path;
import java.util.List;
+import java.util.Objects;
import javax.annotation.PostConstruct;
import nl.carosi.remarkablepocket.model.DocumentMetadata;
import org.slf4j.Logger;
@@ -43,6 +44,7 @@ final class RemarkableService {
List listReadDocuments() {
return rmapi.list().stream()
.map(metadataProvider::getMetadata)
+ .filter(Objects::nonNull)
.peek(this::logPages)
// Current page starts counting at 0.
.filter(e -> e.doc().currentPage() + 1 == e.pageCount())
diff --git a/src/main/java/nl/carosi/remarkablepocket/SyncCommand.java b/src/main/java/nl/carosi/remarkablepocket/SyncCommand.java
index 7abba07..6be6733 100644
--- a/src/main/java/nl/carosi/remarkablepocket/SyncCommand.java
+++ b/src/main/java/nl/carosi/remarkablepocket/SyncCommand.java
@@ -19,7 +19,7 @@ import picocli.CommandLine.Option;
sortOptions = false,
usageHelpAutoWidth = true,
// TODO: Read from gradle.properties
- version = "0.2.1",
+ version = "0.2.2",
mixinStandardHelpOptions = true)
class SyncCommand implements Callable {
@Option(
diff --git a/src/main/jib/usr/local/bin/rmapi_aarch64 b/src/main/jib/usr/local/bin/rmapi_aarch64
index 3bdc5ce..d8b336e 100755
Binary files a/src/main/jib/usr/local/bin/rmapi_aarch64 and b/src/main/jib/usr/local/bin/rmapi_aarch64 differ