epubのカバー画像をサムネイルにする。Extend convert Susie Plug-in等、やり方は他にも色々ありそうだが、今回は*setentryimageとスクリプトの組み合わせで行う。
準備
以下の二つのスクリプトをScriptフォルダに保存。
getcoverimage.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//!*script
// epubファイルから表紙画像を抽出する
// 7zipが必要
// 第一引数:epubファイルのパス
//
// 例:*setentryimage %*script(%0Script\getcoverimage.js,%FCD)
// 引数がなければ終了
if (PPx.Arguments.Length < 1){
PPx.SetPopLineMessage("引数が正しくありません。");
PPx.Quit();
}
// 7z.exeのパス
//var exec = "C:\\Program Files\\7-Zip\\7z.exe";
var exec = PPx.Extract('%\'7z\'');
var tempdir = PPx.Extract("%*temp(name,d)");
var sorce_file = PPx.Arguments(0);
var fso = PPx.CreateObject("Scripting.FileSystemObject");
var doc = PPx.CreateObject("MSXML2.DOMDocument");
var container_xml_path = fso.BuildPath(tempdir, "META-INF\\container.xml");
var id_attr;
var cover_path_relative;
var cover_path;
// 7zipで一時フォルダに解凍
var command = '%OBnsq ' + exec + '' + ' x -y ' + ' -o\"' + tempdir + '\" \"' + sorce_file + '\"';
PPx.Execute(command);
// container.xmlからopfファイルのパスを取得
doc.load(container_xml_path);
var opf_path_relative = doc.getElementsByTagName('rootfile')[0].getAttribute('full-path');
var opf_path = PPx.Extract('%*name(KDC,'+ fso.BuildPath(tempdir, opf_path_relative) +')'); // パス区切りを「\」に統一
var opf_dir = PPx.Extract('%*name(D,'+opf_path+')');
// opfファイルからcoverファイルのパスを取得
doc.load(opf_path);
var item_element = doc.getElementsByTagName('item');
for (i = 0;i < item_element.length;i++) {
id_attr = item_element[i].getAttribute('id');
if (id_attr == "cover" || id_attr == "cover-image"){
cover_path_relative = item_element[i].getAttribute('href');
cover_path = PPx.Extract('%*name(KDC,'+fso.BuildPath(opf_dir, cover_path_relative)+')'); // パス区切りを「\」に統一
break;
}
}
for (i = 0;i < item_element.length;i++) {
var props = item_element[i].getAttribute('properties');
if (props == "cover" || props == "cover-image"){
cover_path_relative = item_element[i].getAttribute('href');
cover_path = PPx.Extract('%*name(KDC,'+fso.BuildPath(opf_dir, cover_path_relative)+')'); // パス区切りを「\」に統一
break;
}
}
PPx.Result = cover_path;
setcoverimage_all.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//!*script
// epubファイルの表紙画像をサムネイルにする
// カレントフォルダのすべてのepubファイルに対して実行
// このスクリプトと同じフォルダにgetcoverimage.jsを置く必要
var script_dir = PPx.Extract('%*name(KD,"' + PPx.ScriptName + '")');
var filepath;
var img;
for (var i = 0; i<PPx.EntryAllCount; i++){
PPx.EntryIndex=i;
// フォルダを除外
if (PPx.EntryAttributes & 16){
continue;
} else if (PPx.EntryName.match(/.epub$/i)){
filepath = PPx.Extract('%1') + "\\" + PPx.EntryName;
img = PPx.Extract('%*script('+script_dir+'\\getcoverimage.js,"'+filepath+'")');
PPx.Execute("*setentryimage "+img+" -save");
}
}
epubの解凍には7zipを利用する。7zipをインストールしていない場合はインストールしておく。また、getcoverimage.jsの7zipに関する箇所を各自の環境にあわせて書き換えておく。
やり方
エントリ表示形式を、画像が含まれるものに変更する。とりあえずは、[;]で表示されるメニューから「サムネイル1」を選んでおけばいい。こうしないと、以下の過程で「no image mode」と言われてしまう。
カーソル下のepubファイルのサムネイルを変更したい場合は、以下のコマンドを実行する。
* setentryimage %* script (% 0Script \getcoverimage . js ,% FCD )
カレントフォルダのすべてのepubファイルのサムネイルを変更したい場合は、以下を実行する。まあまあ時間がかかるので、大量にファイルがある場合は注意。
* script % 0Script \setcoverimage_all . js
追記2024-10-18
マークファイルのサムネイルを変更するスクリプトを作った。ES6で記述。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//!*script
//
// ES6で記述
// epubファイルの表紙画像をサムネイルにする
// カレントフォルダのマークファイルかつepubファイルに対して実行
// このスクリプトと同じフォルダにgetcoverimage.jsを置く必要
// e.g. *script %0Script\setcoverimage_marked.js
const script_dir = PPx.Extract('%*name(KD,"' + PPx.ScriptName + '")');
PPx.EntryFirstMark;
while(true){
const filepath = PPx.Extract('%1') + "\\" + PPx.EntryName;
if (PPx.EntryName.match(/.epub$/i)){
const img = PPx.Extract('%*script('+script_dir+'\\getcoverimage.js,"'+filepath+'")');
PPx.Execute("*setentryimage "+img+" -save");
}
if(PPx.EntryNextMark != 1) break;
}