bordaigorl / remy Goto Github PK
View Code? Open in Web Editor NEWRemy, an online&offline manager for the reMarkable tablet
License: GNU General Public License v3.0
Remy, an online&offline manager for the reMarkable tablet
License: GNU General Public License v3.0
@karlicoss asked:
I didn't quite understand from the readme (and from a brief look at pagerender.py), what's the core cause of slow erasing? Is this because without eraser drawing is relatively straightforward -- you need to draw the layers from bottom to top; whereas the eraser acts on all the layers simultaneously? Or is it because it's not a 'native' operation in QT canvas, and you have to 'subtract' the strokes?
Mainly it's because there is no native way to clip to the outline of a path.
I don't know if there is a better way, but my best guess to reproduce the eraser accurately works like this:
Annoyingly:
Qt.transparent
because it only works as expected in raster modeAs far as I know, all other renderers either:
I am opening this issue in case somebody has suggestions on how to improve eraser rendering.
It seems there is no way to set a default page range for exporting. I would like this since I usually just need to export the last few pages.
I tried adding "page_ranges": "-5:end",
to the config file under "export"
, but it didn't work.
It would be nice if remycli would be a cli interface comparable to rmapi, is this in scope?
Hi bordaigorl,
Could you please add a feature to delete files that's still on the disk. Logged out my remarkable account, so it's a problem now, as those files were meant to be deleted when they got synced.
Thank you for the great app.
It looks like the recent merge of the 'devel' branch added a new mandatory 'upload' configuration block. Without it, I found uploading documents via ssh caused a crash ala:
Traceback (most recent call last):
File "/home/brettk/git/remy/remy/gui/browser/__init__.py", line 376, in _requestUpload
opt = QApplication.instance().config.upload
File "/home/brettk/git/remy/remy/remarkable/config.py", line 178, in upload
return self.renderOptionsFrom('upload')
File "/home/brettk/git/remy/remy/remarkable/config.py", line 155, in renderOptionsFrom
opt = deepcopy(self.get(key))
File "/home/brettk/git/remy/remy/remarkable/config.py", line 151, in get
raise RemyConfigException("Option '%s' not found in configuration." % opt)
I can't find any reference document around this and the example_config.json
doesn't include this block.
I was able to fix it by adding this JSON block to my configuration, and while it's sufficient to get it to work, it's unclear to me if everything in it is necessary:
"upload": {
"default_options": {}
}
I'm happy to throw together a PR to correct these issues if I got some raw material for the settings that could go in the block and how they're used. I suspect I could also throw in some better error handling in the case where the block is absent.
Thanks for your work!
Is it impossible to import EPUB files to reMarkable using remy?
When I try to import a EPUB, it is then shown as a PDF in remy, and of course reMarkable cannot read it.
It seems that the cleanup
method of the LiveFileSourceRsync
class is not called when the class is deleted.
This effectively makes Remarkable freeze, unless one pushes the power button for several second or restarts
xochitl via ssh.
A possible (admittedly very trivial) fix would be
---
remy/remarkable/filesource.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/remy/remarkable/filesource.py b/remy/remarkable/filesource.py
index 41bb953..8cc9bfb 100644
--- a/remy/remarkable/filesource.py
+++ b/remy/remarkable/filesource.py
@@ -1,5 +1,6 @@
import paramiko
import os
+import atexit
import shutil
import os.path as path
import json
@@ -398,6 +399,8 @@ class LiveFileSourceRsync(LiveFileSourceSSH):
self.host = host
self.username = username
self.cache_mode = cache_mode
+
+ atexit.register(self.cleanup)
if rsync_path:
self.RSYNC = [ rsync_path ]
Then it works as expected.
Hi all,
Not sure if this behaviour is experienced by others, but everytime I run remy, it takes 1-2 minutes to run the initialization ...
Thanks for your awesome tool! I am looking forward to get it working on my remarkable.
When I start remygui.py I still get the following message:
Started
Could not read configuration from '/Users/schneider/Library/Preferences/remy.json'!
I installed all the dependencies and created the config json in /Users/schneider/Library/Preferences/remy.json
with the following content:
{
"sources": {
"source1": {
"name": "reMarkable (RSync)",
"type": "rsync",
"data_dir": "/Users/schneider/Documents/remarkable/remy",
"address": "192.168.178.16",
"host": "remarkable",
"key": "~/.ssh/id_rsa",
"username": "root",
"timeout": 3,
"use_banner": "remy-banner.png"
}
},
"default_source": "source1",
}
What am I doing wrong?
Thanks!
Ubuntu 20.04. I tried on a fresh virtualbox install to avoid messing with qt libraries installed in the main system.
Followed the instructions in readme:
apt install cmake libpoppler-qt5-1
, and also apt build-dep cmake libpoppler-qt5-1
-- just in case some build dependencies are also necessaryTraceback (most recent call last):
File "/shared/remy/remy/gui/filebrowser.py", line 442, in openEntry
self.viewers[uid] = NotebookViewer(index.get(uid))
File "/shared/remy/remy/gui/notebookview.py", line 99, in __init__
self._maxPage = document.baseDocument().numPages() - 1
File "/shared/remy/remy/remarkable/metadata.py", line 256, in baseDocument
from popplerqt5 import Poppler
ImportError: /home/dev/.local/lib/python3.8/site-packages/PyQt5/QtXml.abi3.so: undefined symbol: _ZN12QDomDocument10setContentEP16QXmlStreamReaderbP7QStringPiS4_, version Qt_5
brew
, but even though it installed successfully, it still couldn't find the poppler library, unless I installed it via apt.And the final option I tried -- running pip3 uninstall pyqt5 pyqt5-sip python-poppler-qt5
and then installing them via the package manager (generally this would mean more consistent versions): apt install python3-poppler-qt5 python3-pyq
. Then when opening a pdf I'm getting
Traceback (most recent call last):
File "/shared/remy/remy/gui/filebrowser.py", line 442, in openEntry
self.viewers[uid] = NotebookViewer(index.get(uid))
File "/shared/remy/remy/gui/notebookview.py", line 99, in __init__
self._maxPage = document.baseDocument().numPages() - 1
File "/shared/remy/remy/remarkable/metadata.py", line 262, in baseDocument
self._pdf.setRenderHint(Poppler.Document.HideAnnotations)
AttributeError: type object 'Document' has no attribute 'HideAnnotations
not sure if it's much better though, presumably this method was added in a more recent poppler version, and that's why you were suggesting to install from github in the first place?
I've just started using remy -- it looks great! One problem I have is that when I click "Upload Here" and choose a document, it gets uploaded not into the main folder on the remarkable, but into the alphabetically first subfolder. Is this a bug or a problem with my configuration?
Firstly, this is a really useful app, thank you!
However I had a few issues installing dependencies the first time because of PyPDF2 just released a new version with breaking changes (version 2.0.0)
Specifically they removed the PyPDF.pdf module. (See here)
This causes the following error:
Traceback (most recent call last):
File "<github directory>/remygui.py", line 1, in <module>
from remy.gui import app
File "<github directory>/remy/gui/app.py", line 19, in <module>
from remy.gui.notebookview import *
File "<github directory>/remy/gui/notebookview/__init__.py", line 11, in <module>
from remy.gui.notebookview.view import *
File "<github directory>/remy/gui/notebookview/view.py", line 11, in <module>
from remy.gui.export import exportDocument
File "<github directory>/gui/export/__init__.py", line 8, in <module>
from remy.remarkable.export import Exporter, CancelledExporter
File "<github directory>/remy/remarkable/export.py", line 9, in <module>
from PyPDF2.pdf import PageObject
ModuleNotFoundError: No module named 'PyPDF2.pdf'
With this in mind it would be really useful to include a requirements.txt with the latest supported dependencies so new users installing this for the first time can just run pip3 install -r requirements.txt
and be done! This makes sure that only the compatible versions of the libraries are installed.
(For anyone coming across the same problem, installing with pip3 install PyPDF2==1.28.4
fixed this issue for me.)
When the Remarkable tablet is updated, the SSH server has a new key, which requires to update the known_hosts
file on the client side.
Remy offers several options, the first one being, IIUC, to add a known_hosts
file in ~/.config/remy
, and use that one for SSH connection.
The problem is: once that is done, my rsync based config does not work anymore, because while Remy manages to SSH to the Remarkable, the subsequent rsync does not.
If there is a way to configure rsync to use ~/.config/remy/known_hosts
instead of the default one, it should be used. Otherwise, the option to automatically add the new ket should have a big red warning "this will break your rsync based configs".
Hi,
I just wanted to mention that upon upgrading to Fedora 37 (OpenSSL 3.0.5 5, rsync version 3.2.7 protocol version 31)
remy stopped working for me.
The ssh part goes through just fine (it connects and can send commands to my Remarkable 1), but the rsync
part fails with the error message
Unable to negotiate with 10.11.99.1 port 22: no matching host key type found. Their offer: ssh-rsa
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(231) [Receiver=3.2.7]
Unable to negotiate with 10.11.99.1 port 22: no matching host key type found. Their offer: ssh-rsa
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(231) [Receiver=3.2.7]
The quick and dirty fix is to change the line
ssh_config = ['-e', '%s -o batchmode=yes' % which("ssh")]
in filesource.py to
ssh_config = ['-e', '%s -o batchmode=yes -o HostKeyAlgorithms=+ssh-rsa' % which("ssh")]
Then everything works again :)
Cheers,
Vladyslav
When open a pdf or epub file, remy crashes and produces the following error log:
[I] STARTING: Sat Jan 28 00:23:01 2023
[I] Configuration loaded from /home/cycatz/.config/remy/config.json.
[W] No key nor password given. System-wide SSH connection parameters are going to be used.
[I] Using system default known hosts file
[I] Loading system default known hosts file, this may take a while...
[I] System default known host file loaded
[I] Connecting...
[I] Connected to 192.168.10.16
[I] LOAD TIME: 0.088373
[I] Initialised, launching browser
[W] Could not create thumbnail for ffa6ce5a-8941-44ff-a6e4-412fe68d3efa [arguments did not match any overloaded call:
QImage(): too many arguments
QImage(size: QSize, format: QImage.Format): argument 1 has unexpected type 'float'
QImage(width: int, height: int, format: QImage.Format): argument 1 has unexpected type 'float'
QImage(data: bytes, width: int, height: int, format: QImage.Format): argument 1 has unexpected type 'float'
QImage(data: PyQt5.sip.voidptr, width: int, height: int, format: QImage.Format): argument 1 has unexpected type 'float'
QImage(data: bytes, width: int, height: int, bytesPerLine: int, format: QImage.Format): argument 1 has unexpected type 'float'
QImage(data: PyQt5.sip.voidptr, width: int, height: int, bytesPerLine: int, format: QImage.Format): argument 1 has unexpected type 'float'
QImage(xpm: List[str]): argument 1 has unexpected type 'float'
QImage(fileName: str, format: typing.Optional[str] = None): argument 1 has unexpected type 'float'
QImage(a0: QImage): argument 1 has unexpected type 'float'
QImage(variant: Any): too many arguments]
zsh: segmentation fault (core dumped) python -m remy.guif
My remarkable version is 3.0.4.1305, and uses remy at version df2c1ae
I'm trying to run the app on Linux Mint.
$ python3 remygui.py
[I] STARTING: Fri Feb 18 12:05:45 2022
qt5ct: using qt5ct plugin
[I] Configuration loaded from defaults.
Traceback (most recent call last):
File "remygui.py", line 4, in
app.main()
File "/home/shamot/Downloads/remy-master/remy/gui/app.py", line 364, in main
app.requestInit()
File "/home/shamot/Downloads/remy-master/remy/gui/app.py", line 115, in requestInit
init = RemyInitWorker(*self.config.connectionArgs(**overrides))
File "/home/shamot/Downloads/remy-master/remy/remarkable/config.py", line 193, in connectionArgs
t = c.pop('type')
KeyError: 'type'
This tool looks pretty cool. Does it support reMarkable 2?
Hello!
Lovely tool here, however sadly I cannot seem to connect to my RM2 - 2.14.1.866 [Toltec installed, no DDVK hacks]
....and the config file:
"default_source": false,
"sources": {
"default": {
"name": "reMarkable",
"hidden": false,
"type": "ssh",
"host": "10.11.99.1",
"username": "root",
"host_key_policy": "ask",
"timeout": 3,
"use_banner": false,
"password": "XXXXXXXXXXX",
"enable_webui_export": false
}
},
Log output for debuggingg:
[I] STARTING: Thu Sep 15 17:34:05 2022
[I] Configuration loaded from C:\Users\Jacob\AppData\Local\remy\remy\config.json.
[I] Using known hosts file: C:\Users\Jacob\AppData\Local\remy\remy\known_hosts
[I] Loaded known hosts from C:\Users\Jacob\AppData\Local\remy\remy\known_hosts
[I] Connecting...
[I] Connected to 10.11.99.1
[E] RETRY? ['charmap' codec can't decode byte 0x8d in position 3936: character maps to <undefined>]
[I] Configuration at 'C:\Users\Jacob\AppData\Local\remy\remy\config.json'
[I] Waiting for stray threads
[I] Done waiting
[I] QUITTING: Thu Sep 15 17:34:08 2022
Hi, do you consider making it compatible with Windows? Thanks.
I thought the rM2 supported viewing JPGs and PNGs. I just tried uploading a JPG, nothing was uploaded, and checking the terminal found this error: "remy.remarkable.metadata.RemarkableError: Can only upload PDF and EPUB files, but was given a .JPG"
Hi,
I have been using ReMy since last year, but haven't touched it for quite a while xD. Just picked up my dusty Remarkable, and I noticed that all my notebooks render as blank in Remy. Other PDF books seems to be ok.
After I download those files with builtin downloader and open with system PDF readers, they show up as empty as well.
I think I'm doing something worng. I continue to receive this message:
And this is the command promt:
C:\Users\User>python -m remy.gui
[I] STARTING: Mon May 8 17:11:11 2023
[I] Configuration loaded from C:\Users\User\AppData\Local\remy\remy\config.json.
[W] No key nor password given. System-wide SSH connection parameters are going to be used.
[I] Using known hosts file: C:\Users\User\AppData\Local\remy\remy\known_hosts
[I] Loaded known hosts from C:\Users\User\AppData\Local\remy\remy\known_hosts
[I] Connecting...
[E] Could not connect to 10.11.99.1: No authentication methods available
[E] RETRY? [No authentication methods available]
and here is my config file:
{
"default_source": "default",
"sources": {
"default": {
"name": "reMarkable (USB-SSH)",
"type": "ssh",
"host": "10.11.99.1",
"password": "{I wrote the password}",
"username": "root",
"timeout": 3,
"use_banner": "remy-banner.png"
},
"wifi": {
"name": "reMarkable (RSync)",
"type": "rsync",
"data_dir": "/Users/bordaigorl/remy",
"host": "remarkable",
"key": "~/.ssh/id_rsa",
"username": "root",
"timeout": 3,
"use_banner": "remy-banner.png"
},
"backup": {
"name": "Latest Backup",
"type": "local",
"documents": "/Users/bordaigorl/rmbackup/latest",
"templates": "/Users/bordaigorl/rmbackup/templates"
}
},
"preview": {
"eraser_mode": "accurate"
},
"export": {
"default_dir": "/Users/bordaigorl/Documents",
"open_exported": true
}
}
what am I doing worng?
When I try to run python remygui.py wifi
(wifi is rsync), I'm getting the following error complaining it doesn't find a templates.json
file:
File "/home/user/Downloads/software/remarkable/remy/remy/remarkable/filesource.py", line 372, in __init__
with open(self._local("templates.json", branch=TEMPLDIR), 'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: '~/remarkable/rsync/templates/templates.json'
Not sure what this templates.json
file is supposed to be or where to get one to adapt. FWIW my remy.json
config file is at https://gist.github.com/mefistoso/c2b2ab081ecf1949a4af3fe3765a412b
Thanks for this amazingly useful tool!
On my device, after each use of remy
the UI was all messed up until the next reboot. This quote from the readme put me on the right track:
If Remy crashes and the remarkable seems unresponsive it is only because Remy re-enables the main UI of the tabled on exit; to regain control of the tablet you have three options: try and run Remy again and close it cleanly; or run
ssh REMARKABLEHOST /bin/systemctl start xochitl
; or manually reboot the device. Don't worry nothing bad is happening to the tablet in this circumstance.
As far as I can tell by xochitl
is hardcoded, see here and here, maybe other places. However on my device I use remux
and so restarting xochitl
lead to a visual mess (I'm surprised it even works!)
As a quick fix, I hardcoded remux
in remy/remarkable/filesource.py
: so far it seems to work, but I imagine it would be worth either making it a configurable string in config.json
, or executing systemctl
on the device to know which launcher is running and restart that one.
Happy to try and draft a PR with either solution if you think it's worth it!
When I try to export a file I get:
QPainter::begin(): Returned false
QPainter::setWorldTransform: Painter not active
QPainter::setOpacity: Painter not active
QPainter::restore: Unbalanced save/restore
QPainter::end: Painter not active, aborted
...and many pages of the same messages repeated.
I'm on Manjaro Linux. Using the default config, just changed the source "host" and export "default_dir". The browsing UI seems to connect to the device and work well, it's just export that has a problem. The first export directory I tried had a space in it. I then tried a directory without a space. No change.
Any thoughts? Could it be missing a dependency?
I think hwr on github is incomplete right now, as it includes "from remy.hwr.mathpix import mathpixRaster, MathPixError" which does not exist.
Hi all,
as the title describes, reMy refuse to connect.
Terminal output:
% python3 remygui.py
[I] STARTING: Sun May 8 16:18:26 2022
[I] Configuration loaded from /home/pityhero/.config/remy/config.json.
[I] Using known hosts file: /home/pityhero/.config/remy/known_hosts
[I] Loaded known hosts from /home/pityhero/.config/remy/known_hosts
[I] Connecting...
[I] Connected to 192.168.12.234
[I] DATA STORED IN:
/home/user/bin/remy/data2/documents
/home/user/bin/remy/data2/templates
receiving file list ...
rsync: change_dir "/home/root//'/usr/share/remarkable/templates" failed: No such file or directory (2)
done
sent 8 bytes received 116 bytes 248.00 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1835) [Receiver=v3.2.4]
rsync: [Receiver] write error: Broken pipe (32)
[E] RETRY? [[Errno 2] No such file or directory: '/home/pityhero/bin/remy/data2/templates/templates.json']
[I] Waiting for stray threads
[I] Done waiting
[I] QUITTING: Sun May 8 16:18:30 2022
Config:
"rM (makeAp)": {
"name": "reMarkable (makeAp)",
"type": "rsync",
"data_dir": "/home/user/bin/remy/data2",
"host": "192.168.12.234",
"key": "/home/pityhero/.ssh/id_rsa",
"username": "root",
"timeout": 3,
"use_banner": "remy-banner.png"
}
I am able to ssh into remarkable normally with ssh [email protected]
.
I'm using a ssh key to log in to my Remarkable 2.
It seems remy has problems with this fully working ssh key which I am using daily:
my private key:
$ file /home/shamot/.ssh/id_rsa-Thinkpad
/home/shamot/.ssh/id_rsa-Thinkpad: OpenSSH private key
configuration part:
...
13 "source2": {
14 "name": "reMarkable (WiFi)",
15 "type": "ssh",
16 "host": "192.168.0.40",
17 "key": "/home/shamot/.ssh/id_rsa-Thinkpad",
18 "username": "root",
19 "timeout": 3,
20 "use_banner": "remy-banner.png"
21 }
...
Steps to reproduce the issue:
Traceback (most recent call last):
File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
exec(code, run_globals)
File "/home/shamot/Remarkable2/remy/remy/gui/main.py", line 1, in
from remy.gui import app
File "/home/shamot/Remarkable2/remy/remy/gui/app.py", line 18, in
import remy.gui.resources
ModuleNotFoundError: No module named 'remy.gui.resources'
I'm in the habit of using the mechanical pencil for most of my notes. When I look at a page I've written, the combination of the Qt Dense3Pattern
and my display resolution lead to some really horrible aliasing in the preview window.
Adding the lines below to the PageGraphicsItem
setup helped a lot, but there was still a bit of aliasing.
self.setRenderHint(QPainter.Antialiasing);
self.setRenderHint(QPainter.SmoothPixmapTransform);
Maybe there are other flags to set? It's been a long time since I've used Qt, so I'm just shooting in the dark at the moment.
First of all, many thanks for this handy tool. I use to backup my RM1 and
to export my notes as PDF files and everything really works great.
Since I wanted to have full backups of the xochitl folder, I slightly modified the
source code, removing the asterisk in excludes.
@@ -401,11 +401,11 @@ class LiveFileSourceRsync(LiveFileSourceSSH):
self.templates[name]['png'] = t["filename"] + '.png'
def _remote_rsync(self, path):
return "%s@%s:'%s'" % (self.username, self.host, path)
- def _bulk_download(self, fr, to, excludes=['*'], includes=[], delete=True):
+ def _bulk_download(self, fr, to, excludes=[], includes=[], delete=True):
cmd = self.RSYNC + ['-vaz', '--prune-empty-dirs']
if delete:
cmd.append('--delete')
for i in includes:
cmd.append("--include")
@@ -413,10 +413,11 @@ class LiveFileSourceRsync(LiveFileSourceSSH):
for e in excludes:
cmd.append("--exclude")
cmd.append(e)
cmd.append(self._remote_rsync(fr + "/"))
cmd.append(to)
+ print(cmd)
return subprocess.run(cmd)
def _file_download(self, fr, to):
dirname = path.dirname(to)
if not path.isdir(dirname):
@@ -448,11 +449,11 @@ class LiveFileSourceRsync(LiveFileSourceSSH):
_includes = [ ]
elif self.cache_mode == "light_mirror":
_excludes = ['*.thumbnails']
_includes = [ ]
else:
- _excludes = [ '*' ]
+ _excludes = []
_includes = ['*.metadata', '*.content', '*.pagedata']
self._bulk_download(self._remote(), self._local(), includes=_includes, excludes=_excludes)
with os.scandir(self._local()) as entries:
for entry in entries:
if entry.is_file():
Perhaps one could also offer something like that as a dedicated option for the sake of users
who are less familiar with python and rsync. Just a suggestion from my side.
Hi,
having upgraded to Fedora 35 (Python 3.10, python-poppler-qt5 21.1.0, PyQt5 5.15.6) I noticed that I cannot start the remy GUI
anymore
[I] STARTING: Sun Jan 23 14:34:26 2022
(python:338599): Gtk-WARNING **: 14:34:26.984: Theme parsing error: gtk.css:20:4: Junk at end of value for padding
[I] Configuration loaded from /home/vs/.config/remy/config.json.
[I] LOAD TIME: 0.103348
Traceback (most recent call last):
File "/media/Data/Software/remy/remy/gui/app.py", line 213, in initialised
self.tree = FileBrowser(index)
File "/media/Data/Software/remy/remy/gui/browser/__init__.py", line 211, in __init__
info = self.info = InfoPanel(index, splitter)
File "/media/Data/Software/remy/remy/gui/browser/info.py", line 174, in __init__
self.setEntry()
File "/media/Data/Software/remy/remy/gui/browser/info.py", line 220, in setEntry
self.setInfo(**self._defaults)
File "/media/Data/Software/remy/remy/gui/browser/info.py", line 210, in setInfo
self.setIcon(QPixmap())
File "/media/Data/Software/remy/remy/gui/browser/info.py", line 195, in setIcon
self.icon.setContentsMargins(0, m, 0, m)
TypeError: arguments did not match any overloaded call:
setContentsMargins(self, int, int, int, int): argument 2 has unexpected type 'float'
setContentsMargins(self, QMargins): argument 1 has unexpected type 'int'
/home/vs/bin/vsRemyExplore: Zeile 3: 338599 Abgebrochen (Speicherabzug geschrieben) python /media/Data/Software/remy/remygui.py LocalBackup
I'm on the devel branch.
I've been using syncthing on my rM1 to keep a continuous backup of my files on my computer, and I can use reMy to view those files. I'd like to be able to use reMy to upload files to that "backup" directory, which would then get synced over to the tablet.
Is there any reason not to do this? Perhaps the JSON config file should specify that a local source can be written to, to avoid the case of accidentally overwriting a backup?
I'm happy to submit a PR; does this just require changes in the LocalFileSource
class?
remy/remy/remarkable/filesource.py
Line 101 in 9c5d689
Hi,
After recent updates, I find the program unable to bootstrap due to
File "/home/pityhero/bin/remy/remy/remarkable/export.py", line 9, in
from PyPDF2.pdf import PageObject
ModuleNotFoundError: No module named 'PyPDF2.pdf'
I have the PyPDF2 properly installed and configured, it just seems like they changed the API.
Thanks.
Attempting to run pip install --user .
on an M1 Macbook Pro fails with a dependency error — it attempts to install PyQT5, which requires sip, which then fails due to difficulties with installing PyQT5 on ARM. I put the stack trace below; the error appears related to this error with rmview—the suggestion there is that updating to PyQT6 that has multi-arch support is the "correct" answer, but I know that's definitely not a small task since the API changed!
I've tried a couple of the recommended workarounds (install through Homebrew, install under Rosetta) and haven't gotten anything working yet; would love to hear if anyone else has success with this.
Stack Trace:
└─> pip install --user .
Processing /Users/jpurvis/src/external/remy
Installing build dependencies ... error
error: subprocess-exited-with-error
× pip subprocess to install build dependencies did not run successfully.
│ exit code: 2
╰─> [76 lines of output]
Collecting setuptools
Using cached setuptools-65.5.1-py3-none-any.whl (1.2 MB)
Collecting wheel
Using cached wheel-0.38.2-py3-none-any.whl (36 kB)
Collecting PyQt5
Using cached PyQt5-5.15.7.tar.gz (3.2 MB)
Installing build dependencies: started
Installing build dependencies: finished with status 'done'
Getting requirements to build wheel: started
Getting requirements to build wheel: finished with status 'done'
ERROR: Exception:
Traceback (most recent call last):
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/cli/base_command.py", line 160, in exc_logging_wrapper
status = run_func(*args)
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/cli/req_command.py", line 247, in wrapper
return func(self, options, args)
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/commands/install.py", line 400, in run
requirement_set = resolver.resolve(
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py", line 92, in resolve
result = self._result = resolver.resolve(
File "/opt/homebrew/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py", line 481, in resolve
state = resolution.resolve(requirements, max_rounds=max_rounds)
File "/opt/homebrew/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py", line 348, in resolve
self._add_to_criteria(self.state.criteria, r, parent=None)
File "/opt/homebrew/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py", line 172, in _add_to_criteria
if not criterion.candidates:
File "/opt/homebrew/lib/python3.10/site-packages/pip/_vendor/resolvelib/structs.py", line 151, in __bool__
return bool(self._sequence)
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py", line 155, in __bool__
return any(self)
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py", line 143, in <genexpr>
return (c for c in iterator if id(c) not in self._incompatible_ids)
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py", line 47, in _iter_built
candidate = func()
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/factory.py", line 206, in _make_candidate_from_link
self._link_candidate_cache[link] = LinkCandidate(
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 297, in __init__
super().__init__(
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 162, in __init__
self.dist = self._prepare()
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 231, in _prepare
dist = self._prepare_distribution()
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 308, in _prepare_distribution
return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True)
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/operations/prepare.py", line 491, in prepare_linked_requirement
return self._prepare_linked_requirement(req, parallel_builds)
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/operations/prepare.py", line 577, in _prepare_linked_requirement
dist = _get_prepared_distribution(
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/operations/prepare.py", line 69, in _get_prepared_distribution
abstract_dist.prepare_distribution_metadata(
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py", line 48, in prepare_distribution_metadata
self._install_build_reqs(finder)
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py", line 118, in _install_build_reqs
build_reqs = self._get_build_requires_wheel()
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py", line 95, in _get_build_requires_wheel
return backend.get_requires_for_build_wheel()
File "/opt/homebrew/lib/python3.10/site-packages/pip/_internal/utils/misc.py", line 685, in get_requires_for_build_wheel
return super().get_requires_for_build_wheel(config_settings=cs)
File "/opt/homebrew/lib/python3.10/site-packages/pip/_vendor/pep517/wrappers.py", line 173, in get_requires_for_build_wheel
return self._call_hook('get_requires_for_build_wheel', {
File "/opt/homebrew/lib/python3.10/site-packages/pip/_vendor/pep517/wrappers.py", line 319, in _call_hook
raise BackendUnavailable(data.get('traceback', ''))
pip._vendor.pep517.wrappers.BackendUnavailable: Traceback (most recent call last):
File "/opt/homebrew/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 77, in _build_backend
obj = import_module(mod_path)
File "/opt/homebrew/Cellar/[email protected]/3.10.8/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 992, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'sipbuild'
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error
× pip subprocess to install build dependencies did not run successfully.
│ exit code: 2
╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.
Version check:
└─> pip --version
pip 22.3.1 from /opt/homebrew/lib/python3.10/site-packages/pip (python 3.10)
└─> python --version
Python 3.10.8
Hi there,
I am trying to run remy on my M1 Mac and I keep getting this installation error. I've tried the manual installation, and replacing qtpy5 with qtpy but I still can't install it.
Any ideas?
Processing /Users/skinnylatte/Documents/Remarkable/export/remy
Installing build dependencies ... error
error: subprocess-exited-with-error
× pip subprocess to install build dependencies did not run successfully.
│ exit code: 1
╰─> [49 lines of output]
Collecting setuptools
Obtaining dependency information for setuptools from https://files.pythonhosted.org/packages/4f/ab/0bcfebdfc3bfa8554b2b2c97a555569c4c1ebc74ea288741ea8326c51906/setuptools-68.1.2-py3-none-any.whl.metadata
Using cached setuptools-68.1.2-py3-none-any.whl.metadata (6.2 kB)
Collecting wheel
Obtaining dependency information for wheel from https://files.pythonhosted.org/packages/b8/8b/31273bf66016be6ad22bb7345c37ff350276cfd46e389a0c2ac5da9d9073/wheel-0.41.2-py3-none-any.whl.metadata
Using cached wheel-0.41.2-py3-none-any.whl.metadata (2.2 kB)
Collecting PyQt5
Using cached PyQt5-5.15.9.tar.gz (3.2 MB)
Installing build dependencies: started
Installing build dependencies: finished with status 'done'
Getting requirements to build wheel: started
Getting requirements to build wheel: finished with status 'done'
Preparing metadata (pyproject.toml): started
Preparing metadata (pyproject.toml): finished with status 'error'
error: subprocess-exited-with-error
× Preparing metadata (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> [20 lines of output]
Querying qmake about your Qt installation...
Traceback (most recent call last):
File "/opt/homebrew/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
main()
File "/opt/homebrew/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main
json_out['return_val'] = hook(**hook_input['kwargs'])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 152, in prepare_metadata_for_build_wheel
whl_basename = backend.build_wheel(metadata_directory, config_settings)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/Cellar/[email protected]/3.11.5/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/sipbuild/api.py", line 46, in build_wheel
project = AbstractProject.bootstrap('wheel',
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/Cellar/[email protected]/3.11.5/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/sipbuild/abstract_project.py", line 87, in bootstrap
project.setup(pyproject, tool, tool_description)
File "/opt/homebrew/Cellar/[email protected]/3.11.5/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/sipbuild/project.py", line 602, in setup
self.update(tool)
File "/private/var/folders/wy/0ggz_3dn51s0zpxp_5yp5l500000gn/T/pip-install-_fdz2oei/pyqt5_b3719a7cd08349648ba847a07997dd5b/project.py", line 165, in update
raise UserException(
sipbuild.exceptions.UserException
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed
× Encountered error while generating package metadata.
╰─> See above for output.
note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error
× pip subprocess to install build dependencies did not run successfully.
│ exit code: 1
╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.
would it be possible to support url support on export?
When using an rsync config, and when the rsync command fails (e.g. because of issue #44), Remy does not show any error message, but instead opens with an out-of-date state.
Instead, it should at least warn the user that the local state could not be synced with the tablet.
I cannot manage to install this inside a virtualenv (using python 3.7.9), the first issue is with it not finding the module sipdistutils
with error message ModuleNotFoundError: No module named 'sipdistutils'
. As per frescobaldi/python-poppler-qt5#14 the sip install from PIP doesn't include the sipdistutils.py
file so you can copy it manually as they explain in that issue as a workaround.
After that running pip3 install -r requirements.txt
again I get the following error message: ModuleNotFoundError: No module named 'sipconfig'
. Which points towards a similar problem as with sipdistutils.py
. A workaround again is suggested in frescobaldi/frescobaldi#992 (comment) , which is copying the system's sipconfig.py
file to the virtualenv, in my case it was with something like cp /usr/lib/python3.9/site-packages/sipconfig.py env/lib/python3.7/site-packages
(yeah, I have py3.9 in the system but remy requires 3.7 because of the simplification package, afaik).
A third time running pip3 install -r requirements.txt
I get a ModuleNotFoundError: No module named 'PyQt5'
. So I go ahead and install manually PyQt5 with pip3 install PyQt5==5.14.2
(pip cannot handle the order sometimes when using a requirements.txt
file).
Then, the fourth time I run pip3 install -r requirements.txt
it advances more but resulting in the following nasty error error: command '/usr/bin/sip' failed with exit status 1
along with many other lines (complete error at https://gist.github.com/ijpulidos/3bc11e535a93e59ef1e91d23e5cad7d4 ). And even though I have /usr/bin/sip
in my system it fails (sip in system is 4.19.x). I would've thought that the sip command should come with the sip
package from PyPI, but apparently that's not the case. SO in the end, this is one big mess to install remy inside a virtualenv, which is desired for those whose OS python's version is >3.7, since the simplification dependency for remy needs 3.7.x.
Better support for virtualenv (if even possible) would be nice to have.
Running devel
branch. I imported a PDF directly into the root (maybe I wasn't supposed to, but I was just clicking around trying to figure out how this works). The upload was successful, but after doing this, I could no longer connect to the reMarkable 2:
[I] Connected to 10.0.11.5
[E] RETRY? ['NoneType' object has no attribute 'append']
I hacked around to get it to print an actual backtrace, and the error was here:
Traceback (most recent call last):
File "/home/alex/src/remy/remy/gui/app.py", line 120, in retryInit
raise e
File "/home/alex/src/remy/remy/gui/app.py", line 335, in run
index = RemarkableIndex(fsource, progress=self._progress)
File "/home/alex/src/remy/remy/remarkable/metadata.py", line 400, in __init__
index[parent].files.append(k)
I was able to make it "work" by doing this, but I have no idea what I'm doing lol so take this more as a hint to where the problem lies than a suggestion on how to fix it
diff --git a/remy/remarkable/metadata.py b/remy/remarkable/metadata.py
index 510f0e0..964d8af 100644
--- a/remy/remarkable/metadata.py
+++ b/remy/remarkable/metadata.py
@@ -505,7 +505,11 @@ class RemarkableIndex:
if prop.type == FOLDER_TYPE:
index[parent].folders.append(k)
elif prop.type == DOCUMENT_TYPE:
- index[parent].files.append(k)
+ try:
+ index[parent].files.append(k)
+ except AttributeError:
+ print("SKIP", str(index[parent]), str(k))
+ continue
except KeyError as e:
raise RemarkableDocumentError("Could not find field {0} in document {1}".format(e,k))
With this in place, everything appears to still be functional. Looks like it's created a PDFDoc entry with no parent and is trying to access its parent.
I have a system service on my remarkable setup (using systemds path watching) to push new files to my server whenever I change something, to be able to use these It would be necessary to set the remote_roots folder, are you open to me implementing a setting for this?
Thanks for this wonderful application, works like a charm!
As requested here is some feedback:
Exporting documents works fine, however it doesn't seem to support epub/ebooks. I guess that's intended?
Importing files doesn't work at all on my system. The info panel simply rejects the upload of PDFs.
No matter where I put remy-banner.png it doesn't recognize it. Tried to adapt the config.json file but had no sucess so far. Any advice?
Looking forward to your response and already stoked for new features.
Thanks again!
Hi,
first of all, thank you so much for making this nice piece of software.
Just wanted to let you know, on 3.0.1192, any documents that have been edited since on the new firmware will fail to render the writings properly. It seems anything written when on the new firmware is not displayed at all, but I'm not certain.
This is probably due to breaking changes in the reMarkable firmware (introducing infinite pages, etc).
Best,
Ben
Pencil + brush tools are NOT 'natural'. Dots are too dark and thick (not like feather-like soft touch as visually in preview or on tablet screen).
As you requested feedback, I will try to give some using a new issue. Remy it self works flawlessly! Thanks!
Some issues I faced:
sent 76 bytes received 36539 bytes 24410.00 bytes/sec
total size is 532032 speedup is 14.53
LOAD TIME: 1.031118
objc[70088]: Class RunLoopModeTracker is implemented in both /Users/schneider/anaconda3/lib/libQt5Core.5.dylib (0x10a640a80) and /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore (0x126a7cb40). One of the two will be used. Which one is undefined.
Where to put remy-banner.png
? I used /usr/share/remarkable
and it didnt recognise it.
It would be extremly nice to be able to export multiple files (like a folder) to pdf and save them on the computer :D
Thanks again!
Hi,
I am trying to get remy working in nixos.
I already get it to launch but there are still two problems:
if I work with a local copy of my remarkable folders I get as far as to see my notebooks but if I double click any file I get tracebacks of the form:
Started
Configuration loaded from '/home/benneti/.config/remy.json'.
LOAD TIME: 0.048436
Traceback (most recent call last):
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remy/gui/filebrowser.py", line 442, in openEntry
self.viewers[uid] = NotebookViewer(index.get(uid))
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remy/gui/notebookview.py", line 102, in __init__
self.loadPage(document.lastOpenedPage or 0)
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remy/gui/notebookview.py", line 175, in loadPage
self._page_cache[i] = self.makePageScene(i, eraser_mode=ermode)
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remy/gui/notebookview.py", line 164, in makePageScene
PageGraphicsItem(page, scene=scene, simplify=simplify, smoothen=smoothen, eraser_mode=eraser_mode, parent=r)
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remy/gui/pagerender.py", line 154, in __init__
if eraser_mode >= AUTO_ERASER:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'
/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/bin/.remy-gui-wrapped: line 3: 10095 Aborted (core dumped) /nix/store/2vjlf8bip418y0d9vglaplfgpz29spd5-python3-3.8.6-env/bin/python /nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remygui.py $@
Also if I try to use rsync (installed via entware) I get
Started
Configuration loaded from '/home/benneti/.config/remy.json'.
Connecting...
Connected to 10.11.99.1
DATA STORED IN:
/home/benneti/.local/share/remy/documents
/home/benneti/.local/share/remy/templates
Traceback (most recent call last):
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remygui.py", line 4, in <module>
app.main()
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remy/gui/app.py", line 87, in main
fsource = fileSourceFromSSH(LiveFileSourceRsync, **src)
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remy/remarkable/filesource.py", line 480, in fileSourceFromSSH
return cls(name, client, **kw)
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remy/remarkable/filesource.py", line 367, in __init__
self._bulk_download(
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remy/remarkable/filesource.py", line 397, in _bulk_download
return subprocess.run(cmd)
File "/nix/store/papbnjfxwrdkmz6xfp7v2q7nxyvgcr5l-python3-3.8.6/lib/python3.8/subprocess.py", line 489, in run
with Popen(*popenargs, **kwargs) as process:
File "/nix/store/papbnjfxwrdkmz6xfp7v2q7nxyvgcr5l-python3-3.8.6/lib/python3.8/subprocess.py", line 854, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/nix/store/papbnjfxwrdkmz6xfp7v2q7nxyvgcr5l-python3-3.8.6/lib/python3.8/subprocess.py", line 1702, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: '/opt/bin/rsync'
or without "rsync_path": "/opt/bin/rsync",
in the configuration I get
Started
Configuration loaded from '/home/benneti/.config/remy.json'.
Connecting...
Connected to 10.11.99.1
DATA STORED IN:
/home/benneti/.local/share/remy/documents
/home/benneti/.local/share/remy/templates
sh: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(228) [Receiver=3.2.3]
Traceback (most recent call last):
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remygui.py", line 4, in <module>
app.main()
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remy/gui/app.py", line 87, in main
fsource = fileSourceFromSSH(LiveFileSourceRsync, **src)
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remy/remarkable/filesource.py", line 480, in fileSourceFromSSH
return cls(name, client, **kw)
File "/nix/store/18h689vj846lh37kk0k6mj70nyi41zvj-remy-0-git/src/remy/remarkable/filesource.py", line 373, in __init__
with open(self._local("templates.json", branch=TEMPLDIR), 'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: '/home/benneti/.local/share/remy/templates/templates.json
I think the latter can simply be fixed by allowing to specify --rsync-path via the configuration, if you want I can implement this one. Pointers for the first problem would be appreciated.
It seems reMarkable have changed the .lines file format with their recent v3.0 software.
It now says version=6 and even if remy's version check is bypassed there's errors (of course),
example from lines.py:
readStruct
return fmt.unpack(buff)
struct.error: unpack requires a buffer of 24 bytes
Any idea how to fix this?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.