2024年7月6日土曜日

アルバムアートをサムネイルに

PPxでは、ファイルだけではなく、フォルダにも任意のサムネイルをつけることができるらしい。 フォルダ内にcover.jpgあるいはfolder.jpgといったアルバムアートがある場合、それをサムネイルにできるようにする。

準備

以下をScriptフォルダに保存。

setalbumart_all.js

//!*script
// フォルダ内のカバーアート(cover.jpg || folder.jpg)をサムネイルにする
// カレントフォルダの各ディレクトリに対して実行
// 例:*script %0Script\setalbumart_all.js
var ALBUM_ART_NAME1="COVER.JPG";
var ALBUM_ART_NAME2="FOLDER.JPG";
var filepath;
var img;
var img_path;
for (var i = 0; i<PPx.EntryAllCount; i++){
PPx.EntryIndex=i;
var name = PPx.EntryName;
if (PPx.EntryAttributes & 16 && name !=('.') && name!=('..')){
filepath = PPx.Extract('%1') + "\\" + name;
img = getcoverart(filepath);
if (img) {
img_path =PPx.Extract('%*name(BCD,'+getcoverart(filepath)+')');
PPx.Execute("*setentryimage "+img_path+" -save");
}
} else {
continue;
}
}
// カバーアート取得用関数
// カーソル下フォルダ内にcover.jpgあるいはfolcer.jpgがあればそれを返す
function getcoverart(dirpath) {
var path = dirpath;
var fso = PPx.CreateObject("Scripting.FileSystemObject");
var thumbnailpath;
var f_name;
// ファイルを取得
var objFolder = fso.GetFolder(path);
var enmFile = PPx.Enumerator(objFolder.Files);
for (; !enmFile.atEnd(); enmFile.moveNext()){
f_name = enmFile.item().Name.toUpperCase();
if (f_name == ALBUM_ART_NAME1 || f_name == ALBUM_ART_NAME2){
thumbnailpath = fso.BuildPath(path, enmFile.item().Name);
break;
}
}
return thumbnailpath;
}

やり方

音楽ファイルをフォルダごとにまとめたフォルダで、以下のコマンドを実行。

*script %0Script\setalbumart_all.js

各フォルダ内にあるcover.jpgあるいはfolder.jpgを取得し、それをサムネイルにする。

2024年7月3日水曜日

epubのカバー画像をサムネイルに

epubのカバー画像をサムネイルにする。Extend convert Susie Plug-in等、やり方は他にも色々ありそうだが、今回は*setentryimageとスクリプトの組み合わせで行う。

準備

以下の二つのスクリプトをScriptフォルダに保存。

getcoverimage.js

//!*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

//!*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で記述。

//!*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;
}