вторник

Kindle paperwhite и Dropbox


Книжка Kindle Paperwhite конечно классная, но у нее есть одно неудобство - загрузка файлов только по USB (очевидно, сервисы amazon мы не рассматриваем). На это можно было бы закрыть глаза, если бы не было никакого другого способа залить файлы... но ведь там есть wi-fi! А у меня есть дропбокс. Так почему-бы их не подружить?

Процесс работы с дропбоксом я представлял примерно так: кидаю нужные книжки в папку в своем дропбоксе, жду пока они загрузятся, нажимаю пару кнопок на киндле - и книжки магическим образом оказываются в папке documents на моей читалке. Удобно? Черт, возьми, да!

Забегая вперед, почти в самый конец, скажу, что у меня таки получилось. Пусть и немного не удобно, но работает.



Вместо отмазки
Если кто-то не знает, с linux я знаком весьма никак. Поэтому гуру пингвиноводства могут обоснованно посчитать решение кривым и некрасивым. На что я решительно отвечу две вещи:
1) Оно работает!
2) I did it for lulz!

Итак, поехали:
В дропбоксе есть папка Public. Отличается от всего остального она тем, что на каждый файл в ней есть прямая ссылка. Например если в папке Public есть подпапка books, а в ней файл test.txt, то ссылка на этот файл будет иметь вид:

http://dl.dropbox.com/u/31337/books/test.txt

Где вместо 31337 будет номер вашего dropbox-аккаунта. Хотя кому-то несказанно повезло, и у него eleet-номер. *зависть*

Запрос к http://dl.dropbox.com/u/31337/books/ даст красивую страничку с цифрами 404. Ибо нефиг: доступ возможен только к отдельным файлам.

Значит книжки нам предварительно придется собирать в архив. Это несколько снижает удобство работы, даже, если собираться они будут скриптом:

#!/bin/sh
tar -cf pack.tar ./ --exclude='pack.sh' --exclude='pack.tar.gz' --remove-files
gzip pack.tar

Для тех, кто еще не познал могущество командной строки, показываю на пальцах:
tar -cf pack.tar ./ --exclude='pack.sh' --exclude='pack.tar.gz' --remove-files
Создает (-cf) архив с названием pack.tar из всех файлов в текущей папке (./) за исключением файлов pack.sh (это наш скрипт) и pack.tar.gz, после чего удаляет исходные файлы.

gzip pack.tar
Сжимает архив pack.tar (а tar просто собирала файлы в кучу, без сжатия). После чего файл pack.tar заменяется на pack.tar.gz. (и вот по-этому мы исключили pack.tar.gz из файлов, добавляемых в архив командой tar - чтобы не добавлять каждый раз предыдущий архив).

То-есть кинули книжки в папку, запустили скриптик, книжки исчезли, появился архив.

Теперь он доступен по прямой ссылке http://dl.dropbox.com/u/31337/books/pack.tar.gz

Параноикам на заметку: так как ссылка постоянная и доступна откуда угодно, архивчик тоже доступен откуда угодно.

Отлично, переходим к книжке!

****
Тут внезапно в голову пришла светлая мысль: чтобы не насиловать лишний раз сервера дропбокса, да и просто для того чтобы не плодить лишние папки, можно было бы скидывать книжки в любую другую папку на диске. А в дроп, причем в корень папки Public, выгружать уже готовый архив
****

От книжки нам понадобится jailbreak , kindle launcher и kterm  (его я использую для отображения хода загрузки и вывода ошибок. Можно и без него, но без консоли как-скучно :))

На стороне читалке работает вот такой скрипт

#!/bin/sh
wget -P /mnt/us/documents http://dl.dropbox.com/u/31337/books/pack.tar.gz
tar -xzf  /mnt/us/documents/pack.tar -C /mnt/us/documents/
rm /mnt/us/documents/pack.tar

Опять, на пальцах:
wget -P /mnt/us/documents http://dl.dropbox.com/u/31337/books/pack.tar.gz
Скачиваем в папку (-P) /mnt/us/documents (/mnt/us/ - это корневая папка, которую мы видем, когда подключаем читалку по usb) файл по ссылке http://dl.dropbox.com/u/31337/books/pack.tar.gz

(Естественно, вместо 31337 надо будет подставить свой ID :))

tar -xzvf  /mnt/us/documents/pack.tar -C /mnt/us/documents/
Разархивируем (-xzf), предварительно пропустив через gzip (-xzf) файл /mnt/us/documents/pack.tar (именно .tar - после gzip расширение .gz отвалится) в папку (-C) /mnt/us/documents/

rm /mnt/us/documents/pack.tar
Удаляем архив, чтобы глаза не мозолил

Бросаем этот скрипт куда-нибудь, например, в корень (/mnt/us/). Теперь если в терминале набрать

/mnt/us/dl.sh

То с дропа скачается архив и распакуется в папку documents.


Почти готово.

У нас есть kindle launcher, показывающий удобную менюшку, из которой можно запускать расширения. Терминал kterm - одно из них.

Расширения устроены очень просто, поэтому я быстренько замутил свой пункт меню под названием download-dropbox, по нажатию на который запускается терминал и в нем выполняется скрипт dl.sh

Скрипт я немного усложнил - теперь он проверяет код возврата каждой команды, и если хоть одна выполнилась с ошибкой, устраивает задержку в минуту, чтобы терминал сразу не захлопнулся и можно было прочитать в чем дело (естественно, минуту ждать не надо - терминал можно закрыть). А если все выполнилось правильно - терминал захлопывается сразу.

Чтобы замутить новый пункт меню в лаунчере, создаем папку в /extensions, например drop-download (название не важно) и кидаем в нее файл config.xml

<?xml version="1.0" encoding="UTF-8"?>
<extension>
<information>
<name>dropbox download</name>
<version>0.1a</version>
<author>dcoder_mm</author>
<id>drop-dl</id>
</information>
<menus>
<menu type="json" dynamic="true">menu.json</menu>
</menus>
</extension>

Тут ничего интересного, только указание на файл с описание пунктов меню для нашего расширения - menu.json. Он должен находится в той-же папке:

{
"items": [
{"name": "dropbox-download", "priority": 1, "action": "/mnt/us/extensions/kterm/bin/kterm -e mnt/us/extensions/drop-download/dl.sh"}
]
}

А вот тут уже интересно: мы описываем действия при нажатии на пункт меню

/mnt/us/extensions/kterm/bin/kterm -e mnt/us/extensions/drop-download/dl.sh

Запускаем терминал и передаем ему с ключем -e команду, которую он выполнит при запуске: mnt/us/extensions/drop-download/dl.sh
Да, скрипт я перенес из корневой папки, в папку с drop-download, ну просто чтобы не болтался под ногами.


Теперь, запускаем шайтан-систему:

Вот так :)


А как же окошки?
Для винды тоже есть решение. Для начала ставим tar и gzip :)
(Binaries - Setup)
Затем используем вот такой батник для создания архива


tar -cf pack.tar ./ --exclude='pack.sh' --exclude='pack.tar' --exclude='pack.tar.gz' --exclude='pack.bat' --remove-files
gzip -f pack.tar



Архив с "исходниками"
Инструкция по установке:
pack.sh и pack.bat положить в Dropbox/Public/books (туда-же потом кидать книжки)
Папку extensions бросить в корневую папку киндла. Если kterm уже установлен, то можно просто выбросить drop-download (из папки extensions в архиве) в папку extensions на киндле.

4 комментария:

  1. А почему не нравится идея генерировать текстовый файл в папке со списком книг, при добавлении книги запускаем скрипт, он обновляет текстовый файл. А киндл может сравнивать текстовый файл у себя с текстовым файлом на дропбоксе и докачивать то, чего не хватает.

    ОтветитьУдалить
    Ответы
    1. О даа! Вот так всегда, когда слишком рано берешься за реализацию, упускаешь из виду более годную концепцию... :) и ведь что характерно, о текстовом файле я что-то думал. Но почему-то решил, что архив лучше.

      Вместе с названиями в список пихать надо и размер файла (или дату) - чтобы можно определить что какой-то файл в папке заменен новым с тем-же именем.

      А обновлять список файлов в текстовике можно в фоновом режиме, при добавлении в папку новых книжек.

      Надо реализовать.

      Удалить
  2. Спасибо за хорошую работу
    единственно - у меня незахотело так запускатся - дописал один / в меню запуска

    {"name": "dropbox-download", "priority": 1, "action": "/mnt/us/extensions/kterm/bin/kterm -e /mnt/us/extensions/drop-download/dl.sh"}

    ОтветитьУдалить
  3. Замудрено)) Советую использовать сервис IFTTT — редактор визуальных скриптов.
    Делаем такую штуку. Если в обозначенной папке на Дропбоксе появляется файл, отправить его на ваш мэйл *@kindle. И книга моментально окажется на вашей читалке. Все что остается кинуть книжку в папку на компе.

    ОтветитьУдалить