PCHViewer Assist CGI
タイトル見るとなんじゃそりゃって感じですが
PCHViewer Assist CGIとは
お絵かき掲示板や、お絵かきチャットのpchファイルや
spchファイルのリスト化、再生、ダウンロードが出来るCGIです。
pchとspchはお絵描きのアニメが記録されたファイルです。
2009/07/27追加
PCHViewer Assist CGIの作者、SANTAROUさんに
こちらの改造記事へのリンクを貼っていただきました。
で、書き忘れていた重大なことを。
※このCGI改造は自己責任でお願い致します。
この改造で何かあってもCGI本体の作者さんに問い合わせないでください。
以上を踏まえた上でどうぞ↓
2009/06/11追加
このCGI自体の本体は→ こちら
私が今回作成したのはこのCGIver0.51LEを改造するソースです。
通常は単独pchとかspchを配布したりする必要がありますが
このCGIを使えば、CGIで設定するデータフォルダにspchや
pchファイル突っ込むだけで、勝手にリスト化して表示してくれます。
あとはCGIにアクセスして
アニメを見たいファイルを参照したりダウンロードしたり出来ます。
もともとお絵描き掲示板やお絵描きチャットの公式でも
pchアニメビューアーはあるのですが、バージョンが古すぎて
新しめのpchファイルが再生できません。
このPCHViewer Assist CGIだとpchやspchのバージョンがどうあれ
アニメ再生のJAVAアプレットを新しいもので再生するので
大抵のものが再生できるようになっています。
で、こいつをみやの絵茶用に置いたのですが
どうにもspchが再生されないので、なんだ使えねぇCGIだなと思っていたら
絵茶Ver3.56bのspchアニメログはヘッダにバグがあって再生できない
とのこと。
このCGIが悪いのではなく、絵茶側が悪かったのである。
ここまでが1日前のエントリーの話。
つーわけで、絵茶側を弄れないのであれば
こっちのPCHViewer Assist CGI側を弄ればいいのではと思って改造に着手。
具体策として、前回エントリーで書いたように
・spchファイルが入ったディレクトリを調べる
・pch、spch読み込む
・spchの場合ヘッダ部分を参照
・ヘッダが無い場合、追加
・spchファイル上書き
・リスト化
上記3工程が追加する部分です。
つーわけで、こうなりました↓追記
PCHViewer Assist CGI Ver0.51のpvac5le.cgiでやっています。
他のバージョンは知らない。
222〜225行辺り。
#ファイルデータサイズ取得
$byte = (stat(“$pch_file_directory$file_name"))[7];
if($byte > 0 && $byte < 1024) { $byte = 1024;}
の下に追加
# ディレクトリ内ファイルを1つずつ開く。メモリ消費量考えてない設計
open(RPFILE, “$pch_file_directory$file_name") || die “No File : $pch_file_directory$file_name";
binmode(RPFILE);
sysread(RPFILE, $b_buf, $byte);
close(RPFILE);
# 文字バイナリを16進数へアンパック。必要なのか不明
@pch_hex = unpack(“H*", $b_buf);
# 16進数化した配列を連結して24文字目まで取得。Clが認識できればそれで済む話だけど無駄に長めに取得
$binText = substr(join(",@pch_hex), 0, 24);
# ヒント:436C69656E745F496D616765 → Client_Image
# Client_Imageヘッダがあるか無いか比較ですね、わかります
if($binText ne “436c69656e745f496d616765") {
# 無かったらヘッダ情報埋め込み
$spch_data = “Client_Image_Width=$width\r\nClient_Image_Height=$height\r\nversion=3\r\n" . $b_buf;
# SPCHファイルに上書き。ファイルロックも無しで恐ろしい
open(RPFILE, “>","$pch_file_directory$file_name") || die “No File : $pch_file_directory$file_name";
binmode(RPFILE);
print RPFILE $spch_data;
close(RPFILE);
}
一度16進数化してから比較してますが、必要かどうかは知らない。
文字コード関係なく16進数バイナリなら大丈夫だと思ってやってる程度。
プログラム詳しい人からしたら、こんなにも工程いらないかもしれない。
config_le.cgiの方は使いません。
アニメ再生の縦横キャンパスサイズを参照してるだけ。
っていうか、以前作ったKENTのうpろだを
東方リプレイファイルrpyのアップロード&作品名・バージョン表記に
対応させたcgiのrpyファイルのバイナリ比較部分を参照改造しただけ。
名残として、ファイル開くときのハンドラがRPFILEになってる。
今回はバイナリ比較参照だけじゃなく、ヘッダ追加して上書きという工程も入ってますが。
ファイルロックもせず、いきなり参照いきなり上書きもしてますが
今ん所実装してからファイル追加されても3.56bのspchで問題なく再生されています。
ダウンロードしてみても、ちゃんと正常にヘッダ追加されてました。
因みにウチではこのPCHViewer Assist CGIがポート80のhttpd内で動いてて
みや身内専用絵茶が違うポート且つ、ディレクトリ位置が違うので
みやの絵茶のアニメログ保存ディレクトリにファイルが追加されたら
このCGIの指定したデータディレクトリにファイルをコピーするという
監視・バックアップツールを使っています。
PCHViewer Assist CGIから相対パスどころか絶対パスすら使えないのでw
(絵茶の保存ディレクトリにはURLパスじゃアクセス不可)
どうしても3.56bが必要で稼動させてるけどspchファイルの公開が出来ない所は
こういう改造してみてはいかがでしょうか。
多分少し勉強したらウチみたいなクソプログラムじゃなく
もっとマトモなソースで実現できると思うけど、出来ない場合は
この改造を使ってみてください。
Discussion
New Comments
はじめましてこんにちは。
PCHViewer Assist の開発を行っているSANTAROUと申します。
いろいろ整理中にサイト名でぐぐってみたところ
このブログにたどり着きました。
もし宜しかったらサイトの方で紹介させて頂きたいのですが可能でしょうか?
よろしくお願い致します。
SANTAROUさん初めまして、
うちの改造が適当過ぎて本当に正しいのか分からず
Ver3.56bのspch限定で上手く動いているからblogで紹介といった程度で実装していますが
(ファイルハンドラとかの定義も分からずやってる)
こんなので宜しければ紹介して頂いても構いませんー。
やっている処理自体は
■spchの場合ヘッダ部分を参照
■ヘッダが無い場合、Client_Image_〜(略)をConfig_le.cgiの縦横サイズ参照した上で追加
■spchファイル上書き
だけですので、作者さんであるSANTAROUさんでしたら
このCGIの振る舞いや決まり事をきちんとした上でのソースで
実装して貰えると思いますので、もし良かったらそちらで綺麗なソースに改変した上で
紹介して頂いておっけーです(・ω・)
ご返答ありがとうございます。
まず本記事へのリンクをさせて頂きました。
調べてみた所、3.56b以前の3系ではヘッダバグが存在するようですね。
3.66でも怪しいファイルがちらほら出力されますが…
本記事を参考に何らかの形で導入したいと思います。
この度はありがとうございました。
またお邪魔させていただきます(`・ω・´)
3.56b以前のは試していないのでどんな挙動をするのか分かりませんが
ヘッダ情報が丸ごとすっぽ抜けてしまうバグであれば、このソースで直るはずです。
リンクを確認させて頂きました。こちらこそ、ありがとうございますー。
今後のこのCGIの進化を楽しみにしております(・ω・)