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