From fbc75858d7838b6b2bbe114ebcef0194561e68e4 Mon Sep 17 00:00:00 2001 From: Samy Abidib Date: Tue, 11 May 2021 11:51:35 -0400 Subject: [PATCH 1/7] ZipDocument class vars should be instance vars --- rmapy/document.py | 134 +++++++++++++++++++++++----------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/rmapy/document.py b/rmapy/document.py index 8124750..aedc46c 100644 --- a/rmapy/document.py +++ b/rmapy/document.py @@ -113,73 +113,6 @@ class ZipDocument(object): rm: A list of :class:rmapy.document.RmPage in this zip. """ - # {"extraMetadata": {}, - # "fileType": "pdf", - # "pageCount": 0, - # "lastOpenedPage": 0, - # "lineHeight": -1, - # "margins": 180, - # "textScale": 1, - # "transform": {}} - content = { - "extraMetadata": { - # "LastBrushColor": "Black", - # "LastBrushThicknessScale": "2", - # "LastColor": "Black", - # "LastEraserThicknessScale": "2", - # "LastEraserTool": "Eraser", - # "LastPen": "Ballpoint", - # "LastPenColor": "Black", - # "LastPenThicknessScale": "2", - # "LastPencil": "SharpPencil", - # "LastPencilColor": "Black", - # "LastPencilThicknessScale": "2", - # "LastTool": "SharpPencil", - # "ThicknessScale": "2" - }, - # "FileType": "", - # "FontName": "", - "lastOpenedPage": 0, - "lineHeight": -1, - "margins": 180, - # "Orientation": "portrait", - "pageCount": 0, - # "Pages": [], - "textScale": 1, - "transform": { - # "M11": 1, - # "M12": 0, - # "M13": 0, - # "M21": 0, - # "M22": 1, - # "M23": 0, - # "M31": 0, - # "M32": 0, - # "M33": 1, - } - } - - metadata = { - "deleted": False, - "lastModified": "1568368808000", - "metadatamodified": False, - "modified": False, - "parent": "", - "pinned": False, - "synced": True, - "type": "DocumentType", - "version": 1, - "VissibleName": "New Document" - } - - pagedata = "b''" - - zipfile = BytesIO() - pdf = None - epub = None - rm: List[RmPage] = [] - ID = None - def __init__(self, _id=None, doc=None, file=None): """Create a new instance of a ZipDocument @@ -188,6 +121,73 @@ def __init__(self, _id=None, doc=None, file=None): doc: a raw pdf, epub or rm (.lines) file. file: a zipfile to convert from """ + # {"extraMetadata": {}, + # "fileType": "pdf", + # "pageCount": 0, + # "lastOpenedPage": 0, + # "lineHeight": -1, + # "margins": 180, + # "textScale": 1, + # "transform": {}} + self.content = { + "extraMetadata": { + # "LastBrushColor": "Black", + # "LastBrushThicknessScale": "2", + # "LastColor": "Black", + # "LastEraserThicknessScale": "2", + # "LastEraserTool": "Eraser", + # "LastPen": "Ballpoint", + # "LastPenColor": "Black", + # "LastPenThicknessScale": "2", + # "LastPencil": "SharpPencil", + # "LastPencilColor": "Black", + # "LastPencilThicknessScale": "2", + # "LastTool": "SharpPencil", + # "ThicknessScale": "2" + }, + # "FileType": "", + # "FontName": "", + "lastOpenedPage": 0, + "lineHeight": -1, + "margins": 180, + # "Orientation": "portrait", + "pageCount": 0, + # "Pages": [], + "textScale": 1, + "transform": { + # "M11": 1, + # "M12": 0, + # "M13": 0, + # "M21": 0, + # "M22": 1, + # "M23": 0, + # "M31": 0, + # "M32": 0, + # "M33": 1, + } + } + + self.metadata = { + "deleted": False, + "lastModified": "1568368808000", + "metadatamodified": False, + "modified": False, + "parent": "", + "pinned": False, + "synced": True, + "type": "DocumentType", + "version": 1, + "VissibleName": "New Document" + } + + self.pagedata = "b''" + + self.zipfile = BytesIO() + self.pdf = None + self.epub = None + self.rm: List[RmPage] = [] + self.ID = None + if not _id: _id = str(uuid4()) self.ID = _id From 7e2a3033e0997197eeb582c0bb32e96bc7446900 Mon Sep 17 00:00:00 2001 From: Dan Corne Date: Thu, 20 May 2021 19:20:04 +0100 Subject: [PATCH 2/7] Updated the API URL to new domain name This has changed recently and the old domain no longer works. --- rmapy/const.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rmapy/const.py b/rmapy/const.py index 21ee01c..7ca37b3 100644 --- a/rmapy/const.py +++ b/rmapy/const.py @@ -1,7 +1,7 @@ RFC3339Nano = "%Y-%m-%dT%H:%M:%SZ" USER_AGENT = "rmapy" BASE_URL = "https://document-storage-production-dot-remarkable-production.appspot.com" # noqa -DEVICE_TOKEN_URL = "https://my.remarkable.com/token/json/2/device/new" -USER_TOKEN_URL = "https://my.remarkable.com/token/json/2/user/new" +DEVICE_TOKEN_URL = "https://webapp-production-dot-remarkable-production.appspot.com/token/json/2/device/new" +USER_TOKEN_URL = "https://webapp-production-dot-remarkable-production.appspot.com/token/json/2/user/new" DEVICE = "desktop-windows" SERVICE_MGR_URL = "https://service-manager-production-dot-remarkable-production.appspot.com" # noqa From 10a27bcdb2f0d122f03acd11c50e012c51132e40 Mon Sep 17 00:00:00 2001 From: Stijn Van Campenhout Date: Sun, 30 May 2021 15:01:13 +0200 Subject: [PATCH 3/7] Bump version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9f86a9f..2bdfce5 100644 --- a/setup.py +++ b/setup.py @@ -37,7 +37,7 @@ # For a discussion on single-sourcing the version across setup.py and the # project code, see # https://packaging.python.org/en/latest/single_source_version.html - version='0.2.4', # Required + version='0.2.5', # Required # This is a one-line description or tagline of what your project does. This # corresponds to the "Summary" metadata field: From 5595ade375fbb2035ba6ef82d49f7b5c9df3a767 Mon Sep 17 00:00:00 2001 From: Stijn Van Campenhout Date: Sun, 11 Jul 2021 11:26:30 +0200 Subject: [PATCH 4/7] fix: CVE-2021-33503 --- Pipfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Pipfile b/Pipfile index 3b463b9..884c44a 100644 --- a/Pipfile +++ b/Pipfile @@ -9,6 +9,7 @@ verify_ssl = true requests = "*" pyaml = "*" sphinx = "*" +urllib3 = ">=1.26.5" [requires] python_version = "3.7" From 8b120202afa0b4b782d96badde18c48b9e4c47f9 Mon Sep 17 00:00:00 2001 From: Stijn Van Campenhout Date: Sun, 11 Jul 2021 11:33:54 +0200 Subject: [PATCH 5/7] fix: fix: CVE-2021-33503 --- Pipfile.lock | 193 +++++++++++++++++++++++------------------------ requirements.txt | 1 + 2 files changed, 97 insertions(+), 97 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index c37fb24..4211ef6 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "880b0f4dc28652bfa8674e7ebeaae37eb25ec47d136a03791bcef5b6f7a5518d" + "sha256": "f7fb5bcb7b1ad271a4b43ccd956c97f6d6a530869b7d9b8454aaf4defcadf09f" }, "pipfile-spec": 6, "requires": { @@ -25,138 +25,129 @@ }, "babel": { "hashes": [ - "sha256:9d35c22fcc79893c3ecc85ac4a56cde1ecf3f19c540bba0922308a6c06ca6fa5", - "sha256:da031ab54472314f210b0adcff1588ee5d1d1d0ba4dbd07b94dba82bde791e05" + "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9", + "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0" ], - "version": "==2.9.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.9.1" }, "certifi": { "hashes": [ - "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", - "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" + "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee", + "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8" ], - "version": "==2020.12.5" + "version": "==2021.5.30" }, "chardet": { "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", + "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" ], - "version": "==3.0.4" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==4.0.0" }, "docutils": { "hashes": [ - "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af", - "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc" + "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125", + "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61" ], - "version": "==0.16" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.17.1" }, "idna": { "hashes": [ - "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", - "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", + "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" ], - "version": "==2.8" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.10" }, "imagesize": { "hashes": [ "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1", "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.2.0" }, "jinja2": { "hashes": [ - "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419", - "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6" + "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4", + "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4" ], - "index": "pypi", - "version": "==2.11.3" + "markers": "python_version >= '3.6'", + "version": "==3.0.1" }, "markupsafe": { "hashes": [ - "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", - "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", - "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", - "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", - "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", - "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f", - "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39", - "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", - "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", - "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014", - "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f", - "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", - "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", - "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", - "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", - "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", - "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", - "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", - "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", - "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85", - "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1", - "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", - "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", - "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", - "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850", - "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0", - "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", - "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", - "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb", - "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", - "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", - "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", - "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1", - "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2", - "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", - "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", - "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", - "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7", - "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", - "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8", - "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", - "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193", - "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", - "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b", - "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", - "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", - "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5", - "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c", - "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032", - "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", - "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be", - "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621" + "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298", + "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64", + "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b", + "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567", + "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff", + "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74", + "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35", + "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26", + "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7", + "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75", + "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f", + "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135", + "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8", + "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a", + "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914", + "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18", + "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8", + "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2", + "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d", + "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b", + "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f", + "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb", + "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833", + "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415", + "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902", + "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9", + "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d", + "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066", + "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f", + "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5", + "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94", + "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509", + "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51", + "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872" ], - "version": "==1.1.1" + "markers": "python_version >= '3.6'", + "version": "==2.0.1" }, "packaging": { "hashes": [ - "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", - "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" + "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7", + "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14" ], - "version": "==20.9" + "markers": "python_version >= '3.6'", + "version": "==21.0" }, "pyaml": { "hashes": [ - "sha256:a2dcbc4a8bb00b541efd1c5a064d93474d4f41ded1484fbb08bec9d236523931", - "sha256:c79ae98ececda136a034115ca178ee8bf3aa7df236c488c2f55d12f177b88f1e" + "sha256:29a5c2a68660a799103d6949167bd6c7953d031449d08802386372de1db6ad71", + "sha256:67081749a82b72c45e5f7f812ee3a14a03b3f5c25ff36ec3b290514f8c4c4b99" ], "index": "pypi", - "version": "==19.4.1" + "version": "==20.4.0" }, "pygments": { "hashes": [ - "sha256:2656e1a6edcdabf4275f9a3640db59fd5de107d88e8663c5d4e9a0fa62f77f94", - "sha256:534ef71d539ae97d4c3a4cf7d6f110f214b0e687e92f9cb9d2a3b0d3101289c8" + "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f", + "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e" ], - "version": "==2.8.1" + "markers": "python_version >= '3.5'", + "version": "==2.9.0" }, "pyparsing": { "hashes": [ "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.4.7" }, "pytz": { @@ -198,15 +189,16 @@ "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6", "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==5.4.1" }, "requests": { "hashes": [ - "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", - "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", + "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" ], "index": "pypi", - "version": "==2.22.0" + "version": "==2.25.1" }, "snowballstemmer": { "hashes": [ @@ -217,17 +209,18 @@ }, "sphinx": { "hashes": [ - "sha256:0d586b0f8c2fc3cc6559c5e8fd6124628110514fda0e5d7c82e682d749d2e845", - "sha256:839a3ed6f6b092bb60f492024489cc9e6991360fb9f52ed6361acd510d261069" + "sha256:5747f3c855028076fcff1e4df5e75e07c836f0ac11f7df886747231092cfe4ad", + "sha256:dff357e6a208eb7edb2002714733ac21a9fe597e73609ff417ab8cf0c6b4fbb8" ], "index": "pypi", - "version": "==2.2.0" + "version": "==4.0.3" }, "sphinxcontrib-applehelp": { "hashes": [ "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a", "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58" ], + "markers": "python_version >= '3.5'", "version": "==1.0.2" }, "sphinxcontrib-devhelp": { @@ -235,20 +228,23 @@ "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" ], + "markers": "python_version >= '3.5'", "version": "==1.0.2" }, "sphinxcontrib-htmlhelp": { "hashes": [ - "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f", - "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b" + "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07", + "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2" ], - "version": "==1.0.3" + "markers": "python_version >= '3.6'", + "version": "==2.0.0" }, "sphinxcontrib-jsmath": { "hashes": [ "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" ], + "markers": "python_version >= '3.5'", "version": "==1.0.1" }, "sphinxcontrib-qthelp": { @@ -256,21 +252,24 @@ "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6" ], + "markers": "python_version >= '3.5'", "version": "==1.0.3" }, "sphinxcontrib-serializinghtml": { "hashes": [ - "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc", - "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a" + "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", + "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952" ], - "version": "==1.1.4" + "markers": "python_version >= '3.5'", + "version": "==1.1.5" }, "urllib3": { "hashes": [ - "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2", - "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e" + "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4", + "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f" ], - "version": "==1.25.11" + "index": "pypi", + "version": "==1.26.6" } }, "develop": {} diff --git a/requirements.txt b/requirements.txt index 02b6e19..90c9caa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,5 @@ pyaml==19.4.1 sphinx==2.2.0 sphinx-autodoc-typehints==1.8.0 guzzle-sphinx-theme==0.7.11 +urllib3>=1.26.5 From 934e270c6dc9327015db173e5e472a193963bfd2 Mon Sep 17 00:00:00 2001 From: Samy Abidib Date: Sun, 11 Jul 2021 05:37:20 -0400 Subject: [PATCH 6/7] feat: Add highlight support (#22) * Add support for downloading highlights * Add to docs * Respond to feedback * Add doc line * Bug and doc fix Thanks @sabidib! --- docs/source/quickstart.rst | 3 +++ rmapy/document.py | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 9a03ff0..4f1224a 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -175,10 +175,13 @@ Here is the content of an archive retried on the tablet as example: * 384326f5-133e-49c8-82ff-30aa19f3cfa40.pdf * 384327f5-133e-49c8-82ff-30aa19f3cfa40.pagedata * 384327f5-133e-49c8-82ff-30aa19f3cfa40.thumbnails/0.jpg + * 384327f5-133e-49c8-82ff-30aa19f3cfa40.highlights/9b75d8df-1d06-4c59-8f3e-4cf69aa96cd9.json As the .zip file from remarkable is simply a normal .zip file containing specific file formats. +Highlights are stored in the `{uuid}.highlights/` folder. + You can find some help about the format at the following URL: https://remarkablewiki.com/tech/filesystem diff --git a/rmapy/document.py b/rmapy/document.py index aedc46c..dc0c203 100644 --- a/rmapy/document.py +++ b/rmapy/document.py @@ -42,6 +42,33 @@ def __repr__(self) -> str: """String representation of this object""" return self.__str__() +class Highlight(object): + """ Highlight represents all highlights on a page created using the highligher pen + in EPUB documents. + + Functionality introduced in Remarkable 2.7 software. + + Contains the page_id where the highlights are located and the highlights + metadata for the page from the Remarkable Cloud. + + Corresponds to single .json file in the .highlights/ folder. + + Attributes: + page_id: The ID of the page where the highlight is located. + highlight_data: A dictionary containing all highlight data. + """ + + def __init__(self, page_id: str, highlight_data: str): + self.page_id = page_id + self.highlight_data = json.loads(highlight_data) + + def __str__(self) -> str: + """String representation of this object""" + return f"" + + def __repr__(self) -> str: + """String representation of this object""" + return self.__str__() class Document(Meta): """ Document represents a real object expected in most @@ -90,6 +117,7 @@ class ZipDocument(object): * 384326f5-133e-49c8-82ff-30aa19f3cfa40.rm * 384327f5-133e-49c8-82ff-30aa19f3cfa40.pagedata * 384327f5-133e-49c8-82ff-30aa19f3cfa40.thumbnails/0.jpg + * 384327f5-133e-49c8-82ff-30aa19f3cfa40.highlights/9b75d8df-1d06-4c59-8f3e-4cf69aa96cd9.json As the .zip file from remarkable is simply a normal .zip file containing specific file formats, this package is a helper to @@ -106,6 +134,7 @@ class ZipDocument(object): Attributes: content: Sane defaults for the .content file in the zip. metadata: parameters describing this blob. + highlights: list of contents of the .highlights folder pagedata: the content of the .pagedata file. zipfile: The raw zipfile in memory. pdf: the raw pdf file if there is one. @@ -188,6 +217,8 @@ def __init__(self, _id=None, doc=None, file=None): self.rm: List[RmPage] = [] self.ID = None + self.highlights: List[Highlight] = [] + if not _id: _id = str(uuid4()) self.ID = _id @@ -253,6 +284,10 @@ def dump(self, file: BytesOrString) -> None: zf.writestr(f"{self.ID}.epub", self.epub.read()) + for highlight in self.highlights: + zf.writestr(f"{self.ID}.highlights/{highlight.page_id}.json", + json.dumps(highlight.highlight_data)) + for page in self.rm: zf.writestr(f"{self.ID}/{page.order}.rm", @@ -316,6 +351,14 @@ def load(self, file: BytesOrString) -> None: except KeyError: pass + # Get Highlights + highlights = [x for x in zf.namelist() + if x.startswith(f"{self.ID}.highlights/") and x.endswith('.json')] + for highlight in highlights: + with zf.open(highlight, 'r') as highlight_fp: + page_id = highlight.replace(f"{self.ID}.highlights/", "").replace(".json", "") + self.highlights.append(Highlight(page_id, highlight_fp.read())) + # Get the RM pages pages = [x for x in zf.namelist() if x.startswith(f"{self.ID}/") and x.endswith('.rm')] From 42430b0eb8c2b862cfa9fb5ce1b44b1b6e5c2e68 Mon Sep 17 00:00:00 2001 From: Stijn Van Campenhout Date: Sun, 11 Jul 2021 11:38:42 +0200 Subject: [PATCH 7/7] =?UTF-8?q?=F0=9F=9A=80=20bump=20version=20to=200.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 2bdfce5..14227bf 100644 --- a/setup.py +++ b/setup.py @@ -37,7 +37,7 @@ # For a discussion on single-sourcing the version across setup.py and the # project code, see # https://packaging.python.org/en/latest/single_source_version.html - version='0.2.5', # Required + version='0.3.0', # Required # This is a one-line description or tagline of what your project does. This # corresponds to the "Summary" metadata field: