RMfuse provides access to your reMarkable Cloud files in the form of a FUSE filesystem

Overview

RMfuse

RMfuse provides access to your reMarkable Cloud files in the form of a FUSE filesystem. These files are exposed either in their original format, or as PDF files that contain your annotations. This lets you manage files in the reMarkable Cloud using the same tools you use on your local system.

Installation

RMfuse requires Python 3.7 or later. It also requires the FUSE3 library. This should be available in most Linuxes (fuse3 and libfuse3-3 in Debian-based distributions) and BSDs. RMfuse may work with macFuse, but that is untested. Windows users may try WinFuse, also untested. Installation of RMfuse and its dependencies will likely require the FUSE3 headers and a C build system (libfuse3-dev and build-essential in Debian).

RMfuse can be installed with pip:

pip install rmfuse

Alternatively, you may clone this repository. Poetry is used for development, so once that is installed you can run

poetry install

Usage

RMfuse installs the script rmfuse. The script takes a single argument, the path at which the filesystem should be mounted. This must be an existing directory. Any files within that directory will be hidden as long as RMfuse is mounted.

mkdir ~/remarkable
rmfuse ~/remarkable

(If you installed with Poetry, you may need to run poetry run rmfuse.)

The first time RMfuse is run, it will need a one-time code to get access to your reMarkable Cloud account. You will be prompted to get that code from https://my.remarkable.com/connect/desktop, which may require logging in to your reMarkable account. RMfuse uses that code to obtain tokens which it uses in the future to authenticate itself.

To unmount and halt RMfuse, use the fusermount command:

fusermount -u ~/remarkable

Modes

RMfuse offers several modes to display your reMarkable Cloud files. You can choose the mode with the -m option.

annot: Displays all files in PDF format, with your annotations added. This is the default mode.

orig: Displays the original file for ebooks and PDF files. Notebooks are rendered as PDF files, as in the annot mode.

raw: Displays all files as ZIP files, reflecting the underlying format used by the reMarkable Cloud. This may be useful when working with other tools that expect files in this form.

meta: Displays metadata about the files in JSON format. Only useful for debugging.

RMfuse provides a special file named .mode in root directory. When read, this file gives the current mode. Writing a valid mode to this file will switch the mode RMfuse is in. Additionally, writing refresh to this file will cause RMfuse to refresh its information from the reMarkable Cloud. (By default, this happens every five minutes.)

~/remarkable $ cat .mode
annot
~/remarkable $ ls
book.pdf        document.pdf    notebook.pdf
~/remarkable $ echo orig > .mode
~/remarkable $ ls
book.epub       document.pdf    notebook.pdf

Capabilities

RMfuse allows reading of all files in the reMarkable Cloud. Since reading the file requires several HTTP requests, as well as local processing, reads make take some time. Running RMfuse in verbose mode (-v or -vv) will display information about the actions underway. The most recent file accessed is cached, to improve performance. More sophisticated caching is planned for the future.

RMfuse does its best to provide accurate metadata for the files. However, the reMarkable Cloud provides only modification dates, so that is reported for creation and access dates as well. File sizes in annot mode are only estimates until the file is read for the first time. This metadata is cached locally to improve responsiveness in the future.

Files can be renamed and moved within the RMfuse filesystem. These changes will be propagated to the reMarkable Cloud. Changes to the file extension will be ignored.

Deleting files from a RMfuse filesystem moves them into the reMarkable Cloud's trash area. These files are accessible in the .trash hidden directory in the root of the file system. Deleting files within the .trash folder removes them from the reMarkable Cloud. (N.B. It is not known if this deletes the files from the cloud, or just hides them from clients.)

EPUB and PDF files may be copied into the filesystem, and new directories can be created. These changes are uploaded to the reMarkable Cloud. Copying other types of files into the RMfuse filesystem will fail silently (unfortunately). File extensions are ignored by RMfuse, and thus may change when files are uploaded. For instance, if book.epub is uploaded and RMFuse is in annot mode, it will show up in the filesystem as book.pdf.

Existing files cannot be edited; they appear in read-only mode. If you want to edit the contents of a file, you will need to copy it to your local filesystem, edit it, and then copy it back to the RMfuse filesystem. This will cause annotations to be lost (in orig mode) or flattened into the document itself (in annot mode).

Known Limitations

  • The file size for annotated files is just an estimate before the file is first read. This can confuse some tools which use the file size to determine how much to read. After reading the file once, the file size will be correctly reported going forward; rerunning these tools a second time is usually enough to get them working.

  • To try to address this, RMfuse throws an error when a program tries to read past the end of a file. This can cause "No data available" errors to be reported. These are harmless.

  • Adding a file other than an EPUB or PDF silently fails. RMfuse does throw an error when it has been given an invalid file, but this comes too late for FUSE to pass the error back to the caller. RMfuse may be able to throw an error earlier, based on the first bytes it receives; this will be investigated in the future.

  • RMfuse caches the most-recently accessed file in memory. This is bad for large files (too much memory used) and small files (we could cache several files). A more sophisticated caching system is planned.

Libraries

RMfuse is powered by rmcl, for accessing the reMarkable Cloud, and by rmrl, for rendering annotated documents. The early development of RMfuse can be found in the rmcl repository

Trademarks

reMarkable(R) is a registered trademark of reMarkable AS. rmrl is not affiliated with, or endorsed by, reMarkable AS. The use of "reMarkable" in this work refers to the company’s e-paper tablet product(s).

Copyright

Copyright 2020-2021 Robert Schroll

RMfuse is released under the MIT license. See LICENSE.txt for details.

Disclaimer of Warranty

RMfuse is provided without any warranty. Users accept the risk of damages, including the loss of data on their local system, on their reMarkable device, and in the reMarkable Cloud.

If it breaks, you get to keep both halves.

Comments
  • rmfuse on OSX

    rmfuse on OSX

    Hi,

    I really love the idea of rmfuse and I would love to use it on my Mac.

    It seems that that pyfuse3 is not supported on OSX: https://github.com/osxfuse/osxfuse/issues/390 https://github.com/libfuse/pyfuse3/issues/29

    This is the error I get when doing pip install rmfuse

    Collecting rmfuse
      Using cached rmfuse-0.1.1-py3-none-any.whl (8.7 kB)
    Collecting rmcl<0.4.0,>=0.3.0
      Using cached rmcl-0.3.0-py3-none-any.whl (16 kB)
    Collecting rmrl<0.2.0,>=0.1.2
      Using cached rmrl-0.1.2-py3-none-any.whl (518 kB)
    Collecting pyfuse3<4.0.0,>=3.2.0
      Using cached pyfuse3-3.2.0.tar.gz (465 kB)
        ERROR: Command errored out with exit status 2:
         command: /Users/schneider/anaconda3/bin/python3.8 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/d_/755ltxq50klbwlljp6rsqgzc0000gn/T/pip-install-9z2bjy84/pyfuse3/setup.py'"'"'; __file__='"'"'/private/var/folders/d_/755ltxq50klbwlljp6rsqgzc0000gn/T/pip-install-9z2bjy84/pyfuse3/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /private/var/folders/d_/755ltxq50klbwlljp6rsqgzc0000gn/T/pip-pip-egg-info-9ju778vx
             cwd: /private/var/folders/d_/755ltxq50klbwlljp6rsqgzc0000gn/T/pip-install-9z2bjy84/pyfuse3/
        Complete output (4 lines):
        Package fuse3 was not found in the pkg-config search path.
        Perhaps you should add the directory containing `fuse3.pc'
        to the PKG_CONFIG_PATH environment variable
        No package 'fuse3' found
        ----------------------------------------
    ERROR: Command errored out with exit status 2: python setup.py egg_info Check the logs for full command output.
    
    opened by AaronDavidSchneider 32
  • rmfuse dosen't do anything

    rmfuse dosen't do anything

    Hello there. I'm running a Ubuntu 20.04.2 LTS machine, instaled the dependencies that are mencioned in the repository and the rmfuse pip package. When I try to use it it just stalls, here's my output:

    $ rmfuse  -v /mnt/A/directory/remarkable_backups/
    DEBUG:pyfuse3:Initializing pyfuse3
    DEBUG:pyfuse3:Calling fuse_session_new
    DEBUG:pyfuse3:Calling fuse_session_mount
    DEBUG:pyfuse3:pyfuse-02: No tasks waiting, starting another worker (now 2 total).
    

    Any idea what is causing this? I'm running Kubuntu.

    opened by mcpeixoto 10
  • Clarifications

    Clarifications

    fusermount -u ~/remarkable is useful only to unmount rmfuse which runs in background (eg rmfuse ~/remarkable &), otherwise a ctrl-c is sufficient. Right?
    In the last case, I suggest to manage the KeyboardInterrupt exception.

    The file size for annotated files is just an estimate before the file is first read. This can confuse some tools which use the file size to determine how much to read. After reading the file once, the file size will be correctly reported going forward; rerunning these tools a second time is usually enough to get them working.

    I am not able to open myFile.pdf with xdg-open myFile.pdf if myFile.pdf is in the mounted directory and is a notebook or a annotated pdf. However if I copy it in another directory is ok. Is this the way rmfuse is suppose to work?

    Is there a way to enable/disable the render of templates without manually add/remove the ~/.local/share/rmrl/templates directory? Eventually, can a mode be added?

    opened by f3fora 10
  • ERROR:root:Attempt to get non-existent Item

    ERROR:root:Attempt to get non-existent Item

    Today I tryed again to use rmfuse, but now I get a different error, see bellow.

    Disclaimer: I used other unnoficial APIs before, so I might have an inconsistent reMarkable cloud. Yet, it works elsewhere.

    output when trying to access the mounted cloud:

    traysh@konqi ~ % ls /media/remarkable
    ls: cannot access '/media/remarkable': No such file or directory
    

    rmfuse -vvv /media/remarkable output:

    FUSE library version: 3.10.3
    unique: 2, opcode: INIT (26), nodeid: 0, insize: 56, pid: 0
    INIT: 7.32
    flags=0x03fffffb
    max_readahead=0x00020000
       INIT: 7.31
       flags=0x0040b039
       max_readahead=0x00020000
       max_write=0x00100000
       max_background=0
       congestion_threshold=0
       time_gran=1
       unique: 2, success, outsize: 80
    unique: 4, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26589
    unique: 6, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    unique: 8, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 91827
    unique: 10, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 92201
    unique: 12, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 92200
    ERROR:root:Attempt to get non-existent Item 
       unique: 4, error: -2 (No such file or directory), outsize: 16
    ERROR:root:Attempt to get non-existent Item 
       unique: 6, error: -2 (No such file or directory), outsize: 16
    unique: 14, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 8, error: -2 (No such file or directory), outsize: 16
    ERROR:root:Attempt to get non-existent Item 
       unique: 10, error: -2 (No such file or directory), outsize: 16
    ERROR:root:Attempt to get non-existent Item 
       unique: 12, error: -2 (No such file or directory), outsize: 16
    ERROR:root:Attempt to get non-existent Item 
       unique: 14, error: -2 (No such file or directory), outsize: 16
    unique: 16, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 16, error: -2 (No such file or directory), outsize: 16
    unique: 18, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 18, error: -2 (No such file or directory), outsize: 16
    unique: 20, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 20, error: -2 (No such file or directory), outsize: 16
    unique: 22, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 22, error: -2 (No such file or directory), outsize: 16
    unique: 24, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 24, error: -2 (No such file or directory), outsize: 16
    unique: 26, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 26, error: -2 (No such file or directory), outsize: 16
    unique: 28, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 28, error: -2 (No such file or directory), outsize: 16
    unique: 30, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 30, error: -2 (No such file or directory), outsize: 16
    unique: 32, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 32, error: -2 (No such file or directory), outsize: 16
    unique: 34, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 34, error: -2 (No such file or directory), outsize: 16
    unique: 36, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 36, error: -2 (No such file or directory), outsize: 16
    unique: 38, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 38, error: -2 (No such file or directory), outsize: 16
    unique: 40, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 40, error: -2 (No such file or directory), outsize: 16
    unique: 42, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 42, error: -2 (No such file or directory), outsize: 16
    unique: 44, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 44, error: -2 (No such file or directory), outsize: 16
    unique: 46, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 46, error: -2 (No such file or directory), outsize: 16
    unique: 48, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 48, error: -2 (No such file or directory), outsize: 16
    unique: 50, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 50, error: -2 (No such file or directory), outsize: 16
    unique: 52, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 52, error: -2 (No such file or directory), outsize: 16
    unique: 54, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 54, error: -2 (No such file or directory), outsize: 16
    unique: 56, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 56, error: -2 (No such file or directory), outsize: 16
    unique: 58, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 58, error: -2 (No such file or directory), outsize: 16
    unique: 60, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 26584
    ERROR:root:Attempt to get non-existent Item 
       unique: 60, error: -2 (No such file or directory), outsize: 16
    unique: 62, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 91827
    ERROR:root:Attempt to get non-existent Item 
       unique: 62, error: -2 (No such file or directory), outsize: 16
    unique: 64, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 91827
    ERROR:root:Attempt to get non-existent Item 
       unique: 64, error: -2 (No such file or directory), outsize: 16
    
    
    opened by traysh 5
  • Add allow_other FUSE option to support WSL2/Windows

    Add allow_other FUSE option to support WSL2/Windows

    When running in WSL2 on Windows, the "allow_other" flag is required in order to access the FUSE filesystem from Windows Explorer. With this change, it works as expected on my system:

    Edition Windows 10 Home Version 20H2 Installed on ‎2/‎10/‎2021 OS build 19042.867 Experience Windows Feature Experience Pack 120.2212.551.0

    opened by brush701 5
  • Crash when trying copying more than one pdf

    Crash when trying copying more than one pdf

    When copying with

    cp /path/to/*.pdf remarkable/
    

    I get

    cp: cannot stat '/path/to/file.pdf': Transport endpoint is not connected
    

    and rmfuse crashes with

    WARNING:root:Getting Item e945f1a0-740b-4735-9e20-96134bb1948e during upload.  This may lead to odd behavior!
       unique: 78, success, outsize: 16
    

    Multiple selection works with filemanager instead.

    opened by f3fora 5
  • Upload Documents

    Upload Documents

    Do we have any chance to see a simple way to upload documents to rm_cloud using rmcl?

    Should a mknod in the class RmApiFS(pyfuse3.Operations) be implemented or an external tool be made?

    Moreover, I think that the name of the class should be rmFUSE or whatever and also fuse_options.add('fsname=rmapi') should be changed.

    opened by f3fora 5
  • Rmfuse starting multiple workers while there is no tasks waiting.

    Rmfuse starting multiple workers while there is no tasks waiting.

    Hello,

    I have a problem using rmfuse. When I try to run it it dies after a short time with an exit code 1. I'm not sure if the problem is from rmfuse, I think it might be my mistake however, I don't know where to ask this, so does someone have a clue why it doesn't work ? Here is the debug output:

    DEBUG:pyfuse3:Initializing pyfuse3
    DEBUG:pyfuse3:Calling fuse_session_new
    DEBUG:pyfuse3:Calling fuse_session_mount
    DEBUG:rmfuse.fuse:Mounting on /home/zhaith/reMarkable
    DEBUG:pyfuse3:pyfuse-02: No tasks waiting, starting another worker (now 2 total).
    DEBUG:rmcl.api:Renewing user token
    DEBUG:pyfuse3:pyfuse-03: No tasks waiting, starting another worker (now 3 total).
    DEBUG:pyfuse3:pyfuse-04: No tasks waiting, starting another worker (now 4 total).
    DEBUG:pyfuse3:pyfuse-05: No tasks waiting, starting another worker (now 5 total).
    DEBUG:pyfuse3:pyfuse-06: No tasks waiting, starting another worker (now 6 total).
    DEBUG:rmcl.api:Renewing user token
    DEBUG:pyfuse3:Calling fuse_session_unmount
    DEBUG:pyfuse3:Calling fuse_session_destroy
    

    Also, I'm running it on NixOS using this Nix Expression.

    Thank you for reading, and taking the time to help me on this ^^

    Have a nice day.

    opened by Zhaith-Izaliel 3
  • After logging in successfully I see no content

    After logging in successfully I see no content

    When running rmfuse, I see none of the content that is present in rmcloud/ my remarkable.

    -v output [nix-shell:~]$ rmfuse -v ~/remarkable DEBUG:pyfuse3:Initializing pyfuse3 DEBUG:pyfuse3:Calling fuse_session_new DEBUG:pyfuse3:Calling fuse_session_mount DEBUG:rmfuse.fuse:Mounting on /home/nikolai/remarkable DEBUG:pyfuse3:pyfuse-02: No tasks waiting, starting another worker (now 2 total). DEBUG:pyfuse3:pyfuse-03: No tasks waiting, starting another worker (now 3 total). DEBUG:rmcl.api:Renewing user token DEBUG:pyfuse3:pyfuse-04: No tasks waiting, starting another worker (now 4 total). DEBUG:pyfuse3:pyfuse-05: No tasks waiting, starting another worker (now 5 total). DEBUG:pyfuse3:pyfuse-06: No tasks waiting, starting another worker (now 6 total). DEBUG:rmcl.api:Renewing user token DEBUG:pyfuse3:Calling fuse_session_unmount DEBUG:pyfuse3:Calling fuse_session_destroy

    -vv output FUSE library version: 3.10.5 unique: 2, opcode: INIT (26), nodeid: 0, insize: 56, pid: 0 INIT: 7.35 flags=0x33fffffb max_readahead=0x00020000 INIT: 7.31 flags=0x0040b039 max_readahead=0x00020000 max_write=0x00100000 max_background=0 congestion_threshold=0 time_gran=1 unique: 2, success, outsize: 80 unique: 4, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 2993 unique: 6, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 12818 unique: 8, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 12845 unique: 10, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 12844 unique: 12, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 2517 Any one have any ideas as to what's failing?

    opened by nikolaishields 2
  • default args configfile

    default args configfile

    Default mode option is hardcoded in rmfuse and rmrl.render ones in rmcl or rmrl.

    I think it would be a great idea to have a config file for defaults. If it would be managed by configparser, it should look like:

    [rmfuse]
    mountpoint = /home/user/remarkable
    mode = annot
    
    [rmrl]
    alpha = 0.3
    no-expand = no
    only-annotated = no
    

    However, rmfuse has no explicit dependence on rmrl and it is impossible to pass args to rmrl.render So, do you prefer to manage render defaults directly with rmrl?

    Moreover, rmfuse and rmcl have different version dependence on rmrl, and this can be a problem.

    opened by f3fora 2
  • Allow package to be pip-installed

    Allow package to be pip-installed

    While trying to fix an issue on macOS I noticed that I was unable to install this package using a pre-existing virtualenv and using

    pip install -e rmfuse
    

    I understand the attractiveness of Poetry, and do not want you to steer away from it. But I would suggest that this package should be installable in both Poetry and PIP.

    opened by nils-werner 1
  • Unable to register

    Unable to register

    Unfortunately it looks like this no longer works? Following the instructions given I keep hitting this auth issue that may be related to other recent tickets.

    Hopefully this is just a me problem and there's something I missed

    $ rmfuse ~/remarkable
    This reMarkable client needs to be registered with the reMarkable
    cloud. To do this, please visit
        https://my.remarkable.com/connect/desktop
    to get a one-time code.
    
    (You may be prompted to log into your reMarkable cloud account. If
    this happens, you may not be redirected to the one-time code page.
    In this case, you may open the above link a second time to get the
    code.)
    
    Enter the one-time code: [redacted]
    Error in sys.excepthook:
    Traceback (most recent call last):
      File "/opt/homebrew/lib/python3.10/site-packages/trio/_core/_multierror.py", line 438, in trio_excepthook
        for chunk in traceback.format_exception(etype, value, tb):
      File "/opt/homebrew/Cellar/[email protected]/3.10.9/Frameworks/Python.framework/Versions/3.10/lib/python3.10/traceback.py", line 135, in format_exception
        te = TracebackException(type(value), value, tb, limit=limit, compact=True)
    TypeError: traceback_exception_init() got an unexpected keyword argument 'compact'
    
    Original exception was:
    Traceback (most recent call last):
      File "/opt/homebrew/bin/rmfuse", line 8, in <module>
        sys.exit(main())
      File "/opt/homebrew/lib/python3.10/site-packages/rmfuse/fuse.py", line 548, in main
        get_client_s()
      File "/opt/homebrew/lib/python3.10/site-packages/rmcl/sync.py", line 15, in sfunc
        return trio.run(runner)
      File "/opt/homebrew/lib/python3.10/site-packages/trio/_core/_run.py", line 1932, in run
        raise runner.main_task_outcome.error
      File "/opt/homebrew/lib/python3.10/site-packages/rmcl/sync.py", line 14, in runner
        return await afunc(*args, **kw)
      File "/opt/homebrew/lib/python3.10/site-packages/rmcl/api.py", line 389, in get_client
        await _client.prompt_register_device()
      File "/opt/homebrew/lib/python3.10/site-packages/rmcl/api.py", line 179, in prompt_register_device
        return await self.register_device(code)
      File "/opt/homebrew/lib/python3.10/site-packages/rmcl/api.py", line 158, in register_device
        raise AuthError(f"Could not register device (status code {response.status_code})")
    rmcl.exceptions.AuthError: Could not register device (status code 500)
    
    opened by jk563 0
  • HTML Error 500

    HTML Error 500

    I have yet to get RMFuse to start, I just keep getting this error. Its super generic. How could I fix this on Mac OS Big Sur?

    Failed to decode JSON from bytearray(b'\n<html><head>\n<meta http-equiv="content-type" content="text/html;charset=utf-8">\n<title>500 Server Error</title>\n</head>\n<body text=#000000 bgcolor=#ffffff>\n<h1>Error: Server Error</h1>\n<h2>The server encountered an error and could not complete your request.<p>Please try again in 30 seconds.</h2>\n<h2></h2>\n</body></html>\n') Response code: 500

    opened by jamesaharris 0
  • rmcl error

    rmcl error

    When I try to mount my Remarkable, it produces the following errors:

    rmfuse ~/Remarkable -v
    INFO:rmfuse.fuse:Mounting on ~/Remarkable
    ERROR:rmcl.api:Failed to decode JSON from bytearray(b'')
    ERROR:rmcl.api:Response code: 401
    INFO:llfuse:handler raised <class 'rmcl.exceptions.ApiError'> exception (Failed to decode JSON data), terminating main loop.
    
    opened by KlimaRitter 1
  • Feature request: setting for custom server URL(s)

    Feature request: setting for custom server URL(s)

    I am using rmfakecloud to self-host my own private instance of the reMarkable cloud. In my understanding, rmfuse should be able to connect to this server software as is, since it is implementing the same protocol as the original one.

    I however could not find any option in rmfuse to connect to a custom server instead of the official one. It would be nice to expose this as a new setting.

    Note: this might require some changes in the underlying rmcl library, because the URLs of the servers seem to be constants in rmcl/const.py.

    opened by pacien 0
  • Not able to open files, that have been annotated with ¨new

    Not able to open files, that have been annotated with ¨new" pens

    It fails to access files, that have been annotated with the new ¨coloured" pens. I guess this is an Issue of RMRL though, as I have successfully recreated this issue, by exporting files without these annotations (worked) and with them (it failed).

    opened by KlimaRitter 0
  • read directory failing with 401 error

    read directory failing with 401 error

    Hi, this is replicable whether I use llfuse or fuse3. I have also tried renewing credentials. I'm afraid I'm out of ideas. Would be fantastic if this worked again, I rely on it quite heavily.

    % rmfuse --version
    0.2.3
    % rmfuse -vv ~/lib/remarkable
    DEBUG:pyfuse3:Initializing pyfuse3
    DEBUG:pyfuse3:Calling fuse_session_new
    FUSE library version: 3.10.5
    DEBUG:pyfuse3:Calling fuse_session_mount
    INFO:rmfuse.fuse:Mounting on /home/martinc/lib/remarkable
    DEBUG:pyfuse3:pyfuse-02: No tasks waiting, starting another worker (now 2 total).
    unique: 2, opcode: INIT (26), nodeid: 0, insize: 56, pid: 0
    INIT: 7.35
    flags=0x33fffffb
    max_readahead=0x00020000
       INIT: 7.31
       flags=0x0040b039
       max_readahead=0x00020000
       max_write=0x00100000
       max_background=0
       congestion_threshold=0
       time_gran=1
       unique: 2, success, outsize: 80
    unique: 4, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 55332
    DEBUG:rmcl.api:Got 401 code; trying to renew token
    DEBUG:rmcl.api:Renewing user token
    ERROR:rmcl.api:Failed to decode JSON from bytearray(b'')
    ERROR:rmcl.api:Response code: 401
    DEBUG:pyfuse3:Calling fuse_session_unmount
    DEBUG:pyfuse3:Calling fuse_session_destroy
    
    opened by mmbcorley 3
Owner
Robert Schroll
Robert Schroll
gitfs is a FUSE file system that fully integrates with git - Version controlled file system

gitfs is a FUSE file system that fully integrates with git. You can mount a remote repository's branch locally, and any subsequent changes made to the files will be automatically committed to the remote.

Presslabs 2.3k Jan 8, 2023
Python's Filesystem abstraction layer

PyFilesystem2 Python's Filesystem abstraction layer. Documentation Wiki API Documentation GitHub Repository Blog Introduction Think of PyFilesystem's

pyFilesystem 1.8k Jan 2, 2023
Python library and shell utilities to monitor filesystem events.

Watchdog Python API and shell utilities to monitor file system events. Works on 3.6+. If you want to use Python 2.6, you should stick with watchdog <

Yesudeep Mangalapilly 5.6k Jan 4, 2023
Python virtual filesystem for SQLite to read from and write to S3

Python virtual filesystem for SQLite to read from and write to S3

Department for International Trade 70 Jan 4, 2023
Quick and dirty FAT12 filesystem to ZIP file converter

Quick and Dirty FAT12 Filesystem Converter This is a really crappy Python script I wrote to convert a semi-compatible FAT12 filesystem from my HP150's

Tube Time 2 Feb 12, 2022
Dragon Age: Origins toolset to extract/build .erf files, patch language-specific .dlg files, and view the contents of files in the ERF or GFF format

DAOTools This is a set of tools for Dragon Age: Origins modding. It can patch the text lines of .dlg files, extract and build an .erf file, and view t

null 8 Dec 6, 2022
A Python library that provides basic functions to read / write Aseprite format files

A Python library that provides basic functions to read / write Aseprite format files

Joe Trewin 1 Jan 13, 2022
Python function to stream unzip all the files in a ZIP archive: without loading the entire ZIP file or any of its files into memory at once

Python function to stream unzip all the files in a ZIP archive: without loading the entire ZIP file or any of its files into memory at once

Department for International Trade 206 Jan 2, 2023
csv2ir is a script to convert ir .csv files to .ir files for the flipper.

csv2ir csv2ir is a script to convert ir .csv files to .ir files for the flipper. For a repo of .ir files, please see https://github.com/logickworkshop

Alex 38 Dec 31, 2022
dotsend is a web application which helps you to upload your large files and share file via link

dotsend is a web application which helps you to upload your large files and share file via link

Devocoe 0 Dec 3, 2022
The best way to convert files on your computer, be it .pdf to .png, .pdf to .docx, .png to .ico, or anything you can imagine.

The best way to convert files on your computer, be it .pdf to .png, .pdf to .docx, .png to .ico, or anything you can imagine.

JareBear 2 Nov 20, 2021
A Python script to organize your files in a given directory.

File-Organizer A Python script to organize your files in a given directory. It organizes your files based on the file extension and moves them into sp

Imira Randeniya 1 Sep 11, 2022
Vericopy - This Python script provides various usage modes for secure local file copying and hashing.

Vericopy This Python script provides various usage modes for secure local file copying and hashing. Hash data is captured and logged for paths before

null 15 Nov 5, 2022
Provides a convenient way to append numpy arrays to a file.

Provides a convenient way to append numpy arrays to a file. The NpendWriter and NpendReader classes are used to write and read numpy arrays respective

null 3 May 14, 2022
A JupyterLab extension that allows opening files and directories with external desktop applications.

A JupyterLab extension that allows opening files and directories with external desktop applications.

martinRenou 0 Oct 14, 2021
This is a junk file creator tool which creates junk files in Internal Storage

This is a junk file creator tool which creates junk files in Internal Storage

KiLL3R_xRO 3 Jun 20, 2021
Maltego transforms to pivot between PE files based on their VirusTotal codeblocks

VirusTotal Codeblocks Maltego Transforms Introduction These Maltego transforms allow you to pivot between different PE files based on codeblocks they

Ariel Jungheit 18 Feb 3, 2022
MHS2 Save file editing tools. Transfers save files between players, switch and pc version, encrypts and decrypts.

SaveTools MHS2 Save file editing tools. Transfers save files between players, switch and pc version, encrypts and decrypts. Credits Written by Asteris

null 31 Nov 17, 2022
pydicom - Read, modify and write DICOM files with python code

pydicom is a pure Python package for working with DICOM files. It lets you read, modify and write DICOM data in an easy "pythonic" way.

DICOM in Python 1.5k Jan 4, 2023