Permalink
Switch branches/tags
Nothing to show
Find file Copy path
5866b35 Jan 18, 2018
1 contributor

Users who have contributed to this file

executable file 155 lines (140 sloc) 5.06 KB
#!/usr/bin/zsh
# Transfer PDF file(s) to a reMarkable
# Adrian Daerr 2017/2018 - public domain
#
# - The files will appear in reMarkable's top-level "My Files" directory,
# - After finishing all transfers, you have to restart the xochitl
# service on the tablet in order to force a scan of its document
# directory ${xochitldir} (so that you see the newly transferred
# files), e.g. by sending the tablet the following command:
# ssh remarkable systemctl restart xochitl
#
# Disclaimer and liability limitation:
# [see also all-caps text borrowed from GPL below]
# - This is a dirty hack based on superficial reverse-engineering.
# - Expect this script to break at any time, especially upon a
# reMarkable system upgrade
# - I am not responsible for any damage caused by this script,
# including (but not limited to) bricking your reMarkable, erasing
# your documents etc. YOU ARE USING THIS SOFTWARE ON YOUR OWN RISK.
#
# Disclaimer of Warranty.
#
# THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
# APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE
# COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM
# “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE
# RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
# SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
# NECESSARY SERVICING, REPAIR OR CORRECTION.
#
# Limitation of Liability.
#
# IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
# WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO
# MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE
# LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
# INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
# INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
# DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
# YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE
# WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS
# BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
#
# Prerequisites:
#
# * The ssh access has to be configured under the host alias 'remarkable',
# e.g. by putting the following in .ssh/config :
# | host remarkable
# | Hostname 10.11.99.1
# | User root
# | ForwardX11 no
# | ForwardAgent no
# See also the variable "xochitldir" below
#
# * Beyond core utilities (date, basename,...), the following software
# has to be installed on the host computer:
# - uuidgen
# - imagemagick (or graphicsmagick)
# This is where ssh will try to copy the files associated with the document
xochitldir=remarkable:.local/share/remarkable/xochitl/
# Check if we have something to do
if [ $# -lt 1 ]; then
echo "Transfer PDF document to a reMarkable tablet"
echo "usage: $(basename $0) path-to-pdf-file [path-to-pdf-file]..."
exit 1
fi
# Create directory where we prepare the files as the reMarkable expects them
tmpdir=$(mktemp -d)
# Loop over the command line arguments,
# which we expect are paths to the PDF files to be transfered
for pdfname in $@ ; do
# reMarkable documents appear to be identified by universally unique IDs (UUID),
# so we generate one for the document at hand
uuid=$(uuidgen)
# Copy the PDF file itself
cp $pdfname ${tmpdir}/${uuid}.pdf
# Add metadata
# The lastModified item appears to contain the date in milliseconds since Epoch
cat <<EOF >>${tmpdir}/${uuid}.metadata
{
"deleted": false,
"lastModified": "$(date +%s)000",
"metadatamodified": false,
"modified": false,
"parent": "",
"pinned": false,
"synced": false,
"type": "DocumentType",
"version": 1,
"visibleName": "$(basename $pdfname .pdf)"
}
EOF
# Add content information
cat <<EOF >${tmpdir}/${uuid}.content
{
"extraMetadata": {
},
"fileType": "pdf",
"fontName": "",
"lastOpenedPage": 0,
"lineHeight": -1,
"margins": 100,
"pageCount": 1,
"textScale": 1,
"transform": {
"m11": 1,
"m12": 1,
"m13": 1,
"m21": 1,
"m22": 1,
"m23": 1,
"m31": 1,
"m32": 1,
"m33": 1
}
}
EOF
# Add cache directory
mkdir ${tmpdir}/${uuid}.cache
# Add highlights directory
mkdir ${tmpdir}/${uuid}.highlights
# Add thumbnails directory
mkdir ${tmpdir}/${uuid}.thumbnails
# Generate preview thumbnail for the first page
# Different sizes were found (possibly depending on whether created by
# the reMarkable itself or some synchronization app?): 280x374 or
# 362x512 pixels. In any case the thumbnails appear to be baseline
# jpeg images - JFIF standard 1.01, resolution (DPI), density 228x228
# or 72x72, segment length 16, precision 8, frames 3
#
# The following will look nice only for PDFs that are higher than about 32mm.
convert -density 300 $pdfname'[0]' -colorspace Gray -separate -average -shave 5%x5% -resize 280x374 ${tmpdir}/${uuid}.thumbnails/0.jpg
# Transfer files
echo "Transferring $pdfname$ as $uuid$"
scp -r ${tmpdir}/* ${xochitldir}
rm -rf ${tmpdir}/*
done
rm -rf ${tmpdir}