whiteleaf7 / narou

Narou.rb - 小説家になろうのダウンローダ&縦書き整形&管理アプリ。Kindle(などの電子書籍端末)でなろうを読む場合に超便利です!
Other
496 stars 55 forks source link

AozoraEpub3 実行中 file not exist エラーに見舞われる #375

Closed yutotakano closed 3 years ago

yutotakano commented 3 years ago

まず掲示板ではなくこちらに書き込んでいることをお許しください。海外にいるためか、掲示板に投稿しようとしたところ「逆引きできないホストからの書き込みは禁止されています」と言われてしまいました。日本サーバーのVPN使用でも同様です。

Narou.rb のバージョン: 3.5.1

OS のバージョン: Windows 10 20H2

その他環境情報(任意):

> java --version
java 14.0.1 2020-04-14
Java(TM) SE Runtime Environment (build 14.0.1+7)
Java HotSpot(TM) 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)
> ruby --version
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x64-mingw32]

AozoraEpub3-1.1.1b6Q Windows Terminal 使用

何が起きたのか: narou convert 0 の際にFile Not Existエラーが出る。AozoraEpub3のエラーかもしれないが検索しても原因が分からない。 エンコーディングに関係してそうだが細かいことは分からない。パソコン言語は英語で、Windows Terminal表示はUTF-8です。 スクリーンショット ファイルは確かに存在する。 ファイル

再現方法(何をやったら起こったのか詳細に): 新規インストール後:

narou init
narou download n9669bk (この時ダウンロードは完了するが変換時点でエラー)
(そのあとはnarou convert 0を行うたびにエラー)
yutotakano commented 3 years ago

やはり何かしらのエンコーディングエラーですね、、、AozoraEpub3を直接呼んでみたところ、ヘルプ画面が完全にクエスチョンマークで埋まってしまいました。こちらはUTF-8で表示しているのですが、元が違うということは自分でコンパイルする必要があるのでしょうか、、、

AozoraEpub3の文字化け

whiteleaf7 commented 3 years ago

OSの言語が英語だと動かないらしいです(数年前に指摘されたことがありました)

yutotakano commented 3 years ago

そうですか、ありがとうございます、、、

yutotakano commented 3 years ago

調べたところ、英語環境ではJavaプログラムへASCII以外の引数がそもそも渡せないらしいです。20年ほど前からバグとして申請されていますが全く相手にされてないようです。

代わりにですが、https://blogs.osdn.jp/2020/05/20/java-unicode.html こちらのブログでexewrapを使用してEXEに変換したら日本語の引数も受け入れるようになったということが書かれていたので早速やってみたところ、成功いたしました。

> exewrap -a "-Dfile.encoding=UTF-8" -M AozoraEpub3 AozoraEpub3.jar
> AozoraEpub3.exe -enc UTF-8 -of -ext .kepub.epub "G:\Documents\Novels\小説データ\小説家になろう\n9669bk 無職転生 - 異世界行ったら本気だす -\[理不尽な孫の手] 無職転生 - 異世界行ったら本気だす -.txt"

成功

呼び出し方が変わるのでローカルでlib/novelconverter.rbを編集しようとおもったのですが、なにせRuby経験皆無なもので、インストールされたGemの改変方法が分からない状態です。もし差支えなければ今後誰かが同じ問題にぶつかった時のためも考え、ここで教えてもらってもよろしいでしょうか。

takotakot commented 3 years ago

@yutotakano まず、narou がどこにインストールされたかを探す必要がありそうです。gem env で分かるかもしれません。

narou/lib/novelconverter.rb を探し、実行部分を改変する必要があります。

https://github.com/whiteleaf7/narou/blob/2acbf469e4b0271a8a7256c626851fa040438f44/lib/novelconverter.rb#L174-L178

java のコマンド呼び出しをしているのですが、なんとなく読めますでしょうか。

ここを AozoraEpub3.exe の呼び出しに変えれば、ひとまずは動くと思います。(ここまで成功した時点で共有して頂くのが良さそう?)

上手くいきそうなら、「java 経由か、exewrap 後かを切り替えるフラグ」みたいなのを用意して頂いて、フラグによって分岐したコードを書ければ取り込みまでいけると思います。

横から失礼しました。

yutotakano commented 3 years ago

gem envありがとうございます!C:\Ruby27-x64\lib\ruby\gems\2.7.0\gems\narou-3.5.1\lib\novelconverter.rbにて発見できました。場所的にgem updateの際に上書きされそうですが、その時はその時でまた改変しますね。

- command = %!java #{java_encoding} -cp #{aozoraepub3_basename} AozoraEpub3 -enc UTF-8 -of #{device_option} ! +
- %!#{cover_option} #{dst_option} #{ext_option} #{yokogaki_option} "#{abs_srcpath}"!
+ command = %!AozoraEpub3.exe -enc UTF-8 -of #{device_option} ! +
+ %!#{cover_option} #{dst_option} #{ext_option} #{yokogaki_option} "#{abs_srcpath}"!

これで無事narou convert 0ができるようになりました! 成功です!

切り替えのフラグについてですが、数年間需要が無かったものですからまずは @whiteleaf7 さんに判断を任せたいと思います。exewrapで包むという過程がエンドユーザーに増えるので、導入がちょっと難しくなる懸念があります(まぁそもそも不可能だったので可能なだけいいのですが)。フラグが別にあっても問題無いようでしたらフォークでちょっと弄ってプルリクしてみますね。

takotakot commented 3 years ago

@yutotakano 素早い…良かったですね。 @whiteleaf7 init 処理の追記を何か考えるか、narou setting convert.epub-use-exe (初期 false 変数)のようなものを増やしていただくのはいかがでしょうか。

whiteleaf7 commented 3 years ago

java コマンドを偽装すれば良いと思いますが。

whiteleaf7 commented 3 years ago

windows は bat ファイルを拡張子省略で実行できるので、パスが通ってるところに java.bat を作ってその中で AozoraEpub3.exe を実行すれば良いと思われます (Narou.rb を実行するときだけ偽装したいだろうと思うので、narou コマンドも bat 作ってそこでパス通せばいいんじゃないかなと)

yutotakano commented 3 years ago

あ!凄いです思いつきもしませんでした! やってみたところ、Gemに変更を施すことなく問題なく使用できることを確認できました、ありがとうございます。

AozoraEpub3のあるフォルダにて、java.bat (または java.cmd)を作成、中身は以下の通りです。

@echo off
rem 最初の 0「java」 1「-Dfile.encoding」 2「UTF-8」 3「-cp」 4「AozoraEpub3.jar」 5「AozoraEpub3」 を消す。イコールサインはスペースとみなされる。
shift && shift && shift && shift && shift
rem 残りを全てくっつけるためのループ
set params=%1
:loop
shift
if [%1]==[] goto launch
set params=%params% %1
goto loop
:launch
AozoraEpub3.exe %params%

narouの時だけ偽装ということについては今のところ特に問題ないのでとりあえず見送らせていただきます。

@whiteleaf7 さんも @takotakot さんも、本当に夜分遅くまでありがとうございました!