Docker+WineでKindleアプリを立ち上げる

# 概要

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 です。

https://hub.docker.com/r/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はダメでした）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147328/9bc797fd-7712-8ccc-43a0-dc02ad1ba76f.png)

以下のようにして、日本語フォントをインストールします。
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を選んでおいたほうがいいでしょう。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147328/b708c14e-94e1-1d6f-6925-99b6c3f3996f.png" width="500px">

あとは指示通り進めれば、本棚が表示されるはずです。
ここでファイルメニューからKindleアプリを終了させてシェルに戻ります。

## 設定データの保存対策

このあとはコンテナの立ち上げと同時にKindleアプリを立ち上げるようにしたいのですが、画面サイズ変更や設定データの保存を行えるように少し細工をします。

エディタをインストールして起動用のスクリプトを作ります。

```
[wine]# sudo apt update
[wine]# sudo apt install -y vim
[wine]# cd
[wine]# vim execKindle.sh
[wine]# chmod +x execKindle.sh
```

起動用スクリプトは以下のようになります。

```shell:/home/wineuser/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アプリの設定についてです。

### 日本語メニュー

日本語メニューも選べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147328/be46c249-0328-e930-42c5-d10285156a68.png)


### 自動更新の停止

新バージョンがリリースされると動かなくなってしまうので、自動更新は停止しておきます（いつかは更新しないといけないでしょうが）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147328/f8549cd8-fd58-5c26-854a-23c5af0d3c6f.png)

## 参考

登録デバイスの削除： 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
```