From 82c341c4f4e8e7dc7e51a4f350ca201ec93ebda6 Mon Sep 17 00:00:00 2001 From: Carlos Gallardo Polanco Date: Mon, 1 Feb 2021 21:52:14 +0000 Subject: [PATCH] Renamed files and updated Readme --- README.md | 39 ++++++++++++++++++----------- authorize_rmapy.py | 4 +-- images/workflow.png | Bin 0 -> 24672 bytes sync.py | 10 +++----- common.py => utils/common.py | 0 rM_utils.py => utils/remarkable.py | 4 +-- zotero_utils.py => utils/zotero.py | 2 +- 7 files changed, 33 insertions(+), 26 deletions(-) create mode 100644 images/workflow.png rename common.py => utils/common.py (100%) rename rM_utils.py => utils/remarkable.py (99%) rename zotero_utils.py => utils/zotero.py (99%) diff --git a/README.md b/README.md index 82de34b..1afbf9b 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,22 @@ -# zotero-reMarkable-sync +# zotero - reMarkable Synchronization -# TODO: Update readme +Synchronize all the .pdf files in your [Zotero](https://www.zotero.org) library with your [reMarkable](https://remarkable.com) device. -This repository allows you to synchronize all the .pdf files from your [Zotero](https://www.zotero.org) library to your [reMarkable](https://remarkable.com) device. +![picture alt](images/workflow.png "Title is optional") -How does it work? -1. Download all the .pdf files from the Zotero library to a local folder `` -2. Synchronize the `` to your reMarkable `/` folder. +##### How does it work? + +1. Fetch files from Zotero +2. Fetch files from reMarkable +3. Compare with the last sync files stored in `~/.zot_rm_sync/` +4. Pull changes from Zotero (add new files and remove deleted files) +5. Push changes to reMarkable (add new files and remove deleted files) +6. Pull changes from reMarkable (remove deleted files) +7. Push changes to Zotero (remove deleted files) + +Note: +- New files are expected to be added to Zotero only. Files added manually to the reMarkable `/` directory will be ignored. +- reMarkable annotations are not saved in Zotero ## Requirements @@ -15,34 +25,35 @@ Tested on Python 3.6 ``` bash pip install -r requirements.txt ``` + ## Authorization ### reMarkable -Get a **Security Code** from https://my.remarkable.com/connect/remarkable and run ***authorize_rmapy.py*** +Get a [**Security Code**](https://my.remarkable.com/connect/remarkable) and run ***authorize_rmapy.py*** ``` bash python authorize_rmapy.py --security-code ``` -### zotero +### Zotero -Get your **Zotero Library ID** and **Zotero API Key** from https://www.zotero.org/settings/keys +Get your [**Zotero Library ID** and **Zotero API Key**](https://www.zotero.org/settings/keys) ## Use ``` bash -python sync.py --zot-library-id --zot-api-key --directory [--verbose] +python sync.py --zot-library-id/-l --zot-api-key/-k --directory/-d [--verbose/-v] ``` ## Features -- [x] Download .pdf files from Zotero Library +- [x] Download .pdf files from the Zotero Library - [x] Upload .pdf files to reMarkable -- [x] Keep the directory structure +- [x] Maintain directory structure - [x] Prevent duplicate uploads and downloads +- [x] Delete files from reMarkable if they are deleted in the Zotero library - [ ] Support more file extensions like .epub -- [ ] Delete files from reMarkable if they are deleted in the Zotero library -- [ ] Update files in the Zotero Library with the reMarkable annotations +- [ ] Update files in Zotero Library with reMarkable annotations ##### Thanks to @urschrei and @subutux for the fantastic APIs diff --git a/authorize_rmapy.py b/authorize_rmapy.py index d237df5..e5c0ded 100644 --- a/authorize_rmapy.py +++ b/authorize_rmapy.py @@ -1,10 +1,10 @@ import sys import argparse -from rM_utils import authorize +from utils.remarkable import authorize def get_args(): """Command line argument parsing""" - + parser = argparse.ArgumentParser() parser.add_argument("--security-code", "-s", diff --git a/images/workflow.png b/images/workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..9d6650f9f49e69ccd8ced8ab7971225480322e7c GIT binary patch literal 24672 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 literal 0 HcmV?d00001 diff --git a/sync.py b/sync.py index b9a5dfb..308f04d 100644 --- a/sync.py +++ b/sync.py @@ -2,9 +2,9 @@ import sys import argparse from colorama import Fore, Style -from common import list_local_files, compare -from zotero_utils import Zotero -from rM_utils import ReMarkable +from utils.common import list_local_files, compare +from utils.zotero import Zotero +from utils.remarkable import ReMarkable def get_args(): """Command line argument parsing""" @@ -136,7 +136,3 @@ def main(): if __name__ == "__main__": main() - - - -# diff --git a/common.py b/utils/common.py similarity index 100% rename from common.py rename to utils/common.py diff --git a/rM_utils.py b/utils/remarkable.py similarity index 99% rename from rM_utils.py rename to utils/remarkable.py index f25ba00..48e08ea 100644 --- a/rM_utils.py +++ b/utils/remarkable.py @@ -5,7 +5,7 @@ from rmapy.exceptions import AuthError from rmapy.folder import Folder from rmapy.document import ZipDocument -from common import File +from utils.common import File class ReMarkable(): @@ -239,7 +239,7 @@ def authorize(security_code): Returns: True is authorized, False otherwise """ - + rma = Client() try: diff --git a/zotero_utils.py b/utils/zotero.py similarity index 99% rename from zotero_utils.py rename to utils/zotero.py index 2701367..45b1feb 100644 --- a/zotero_utils.py +++ b/utils/zotero.py @@ -3,7 +3,7 @@ from colorama import Fore, Style from pyzotero import zotero from pyzotero.zotero_errors import UserNotAuthorised -from common import File +from utils.common import File class Zotero():