概要
Linuxデスクトップ環境を使っていて困ることと言えば、Linux用のKindleアプリがないことです。
これに対する解決策としては
- Kindle Cloud Reader(https://read.amazon.co.jp/ )を使う
- LinuxにWineをインストールしてその上でWindows用のKindleアプリを動かす
のどちらかになります。
前者はブラウザさえあれば使えるものの、ページをめくるたびにダウンロードが発生するので反応が悪すぎます。後者に関しては、Wineのバージョン、Kindleアプリのバージョン、その他OS環境によって、動いたり動かなかったりします。
そこでWineの入ったDockerコンテナでKindleアプリを動かせば、ある程度は環境による影響を軽減できると考えました。
環境
OS: Fedora37
Dockerエンジン: moby-engine-20.10.21
Windows用Kindleアプリ: KindleForPC-installer-1.39.65383.exe
Kindleアプリは古いバージョンが入手しづらいので、うまくいったら保存しておく方がいいでしょう。
https://www.amazon.co.jp/kindle-dbs/fd/kcp
環境構築
今回使用するDockerイメージは、scottyhardy/docker-wine です。
公式の説明通り以下のようにします。
[host]$ wget https://raw.githubusercontent.com/scottyhardy/docker-wine/master/docker-wine
[host]$ chmod +x docker-wine
ダウンロードしたままだとエラーが多発していたので、下記のようにスクリプトの最後のほうにadd_run_arg --ipc=host
を追加します。
# Add Linux run args
add_run_arg --env="DISPLAY"
add_run_arg --volume="/tmp/.X11-unix:/tmp/.X11-unix:ro"
add_run_arg --ipc=host
コンテナを立ち上げます。タグの指定がなければlatestが使われますが、うまく動作したバージョンを明示的に指定します。
[host]$ ./docker-wine --tag=stable-7.0.1-20230115
コンテナが立ち上がるとbashのプロンプトが表示されるのでwineの設定を行います。
[wine]$ winecfg
Windows8.1を選んで、OKを押します(Windows10はダメでした)
以下のようにして、日本語フォントをインストールします。
sudoのパスワードはwineuserです。
[wine]$ sudo apt update -y
[wine]$ sudo apt install -y winetricks
[wine]$ winetricks -q cjkfonts vcrun2013
ここで別端末でDockerホスト側からKindleアプリをコンテナにコピーします。
[host]$ docker cp KindleForPC-installer-1.39.65383.exe wine:/home/wineuser
コンテナの端末でKindleのインストーラを起動します。ログイン画面が出るまで少し時間がかかります。
[wine]$ wine KindleForPC-installer-1.39.65383.exe
ログイン画面では、amazon.co.jpを選んでおいたほうがいいでしょう。
あとは指示通り進めれば、本棚が表示されるはずです。
ここでファイルメニューからKindleアプリを終了させてシェルに戻ります。
設定データの保存対策
このあとはコンテナの立ち上げと同時にKindleアプリを立ち上げるようにしたいのですが、画面サイズ変更や設定データの保存を行えるように少し細工をします。
エディタをインストールして起動用のスクリプトを作ります。
[wine]# sudo apt update
[wine]# sudo apt install -y vim
[wine]# cd
[wine]# vim execKindle.sh
[wine]# chmod +x execKindle.sh
起動用スクリプトは以下のようになります。
#!/bin/sh
wine '/home/wineuser/.wine/drive_c/Program Files (x86)/Amazon/Kindle/Kindle.exe'
sleep 5
Kindleアプリが正しく起動するか確認します。
[wine]# ./execKindle.sh
正しく起動できたらシェルからexitして、コンテナを終了します。
以降、ホスト側で以下のように入力すればKindleアプリが立ち上がります(シェルスクリプトなどにした方がいいでしょう)
[host]$ ./docker-wine --notty --tag=stable-7.0.1-20230115 /bin/sh /home/wineuser/execKindle.sh
※ 補足
Dockerは最初に起動したコマンドが終了すると、コテンナごと終了します。
一方で、Wineにexeを実行させた場合、exeが終了してからデータが保存されるまでに少し時間がかかるようです(おそらくwineserverがexeの終了後にデータを保存していると思われます。
なのでKindle.exeを起動コマンドに指定すると、データが保存される前に、コンテナがしてしまうので、execKindle.shではKindle.exeを終了後に少しsleepを入れています。
Kindleの設定
Kindleアプリの設定についてです。
日本語メニュー
日本語メニューも選べます。
自動更新の停止
新バージョンがリリースされると動かなくなってしまうので、自動更新は停止しておきます(いつかは更新しないといけないでしょうが)。
参考
登録デバイスの削除: https://www.amazon.co.jp/hz/mycd/digital-console/alldevices
余談:docker-wineのデータ保存
docker-wineでは、コンテナ自身はアプリの終了ととも削除されますが、設定データや書籍データは下記のボリュームに保存されます。
aptでインストールしたwinetricksも消えてしまいますが、インスールしたフォントもボリュームに保存されています。
[host]$ docker volume ls
DRIVER VOLUME NAME
local winehome
余談:docker-wineの中身
[wine]$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
[wine]$ dpkg-query -l | grep -i wine
ii wine-stable 7.0.1~focal-1 amd64 WINE Is Not An Emulator - runs MS Windows programs
ii wine-stable-amd64 7.0.1~focal-1 amd64 WINE Is Not An Emulator - runs MS Windows programs
ii wine-stable-i386:i386 7.0.1~focal-1 i386 WINE Is Not An Emulator - runs MS Windows programs
ii winehq-stable 7.0.1~focal-1 amd64 WINE Is Not An Emulator - runs MS Windows programs