今度はComicInfo.xml

Lexiconからの情報がとれるようになったので、調子に乗って今度はComicrack仕様のXMLを編集する方に。
余談だけど、Lexiconの管理人(Twitter)が日本に来てたらしい。僕がよく使用する中古同人屋である「アニメリサイクルなごみ」にも訪れた?

結論をいうと、できたっぽい。(Githubにあげた)今まではJavaでプログラムを書いてた習慣もあっていちいち全部クラスを作り、このインスタンスにはこういう状態を持たせて…とやってたけど、今度はGUIのウィンドウだけをクラス書いて、XMLの読みこみ、XML生成、XMLの書き込みという部分は関数(≠メソッド)で行うことにした。

かつての試作品では、あるアーカイブ内のXMLを編集したらComicrackが正常に読めなくなる、と書いた。その時は、この原因はXML内で要素の順序が変わってしまうことだと考えていたが、実はそうではなくComicInfo.xmlアーカイブ内に複数作られてしまうことが原因だった。
というのも、PythonのZipfileというライブラリはアーカイブ内のファイルの削除・上書きに対応しておらず、上書きをしようとすると元のファイルを残したまま同じファイル名のファイルをアーカイブ内に作ってしまうという変な仕様であるのだ。
こんなのComicRack以外でもエラー出るに決まってる。

これを直接的に解消する方法はない。zip内からファイルを削除したい場合は、削除したいファイル以外のファイルを含む一時zipファイルを作成し、それを元のzipファイルに上書きするという方法しかないようだ。
この解決策はStackoverflowで発見。このスニペットをほぼ流用した。


Lexiconでは書名や巻数、サブタイトルをいっしょくたに扱っている。
こういうのって凄いタグ付けに困るんですよね~
"ACT."までをSeriesにして"1"をNumber、"HARUKA"をTitleにするとか?

自分は今'Series', 'Number', 'Title'を利用してこれらを別々に入れていたんだけれども、Lexiconと連携して使うことを考えるとすべて'Series'にまとめてしまったほうがいいと考え、'Number', 'Title'は今後使用しないことに。ComicInfoEditorでの読み込み時にこの2つのフィールドに値があった場合、'Series'に統合される。
すでにタグ付けしてあるやつらもまとめて整理するスクリプトも書かなくては…。

まだほんの少ししかテストしていないので、今後バグが出てくることは予想されるがとりあえずフィールドの編集(既存の情報の改変)、追記ができることは確認。
でもエラー処理にはほとんど気を配ってないので、仕様を理解している人間(自分)以外には使えなくなっている感も。
せめて'Year', 'Month', 'Day'が数字になってるかどうか、くらいはちゃんと判別するようにしたほうがいいだろうか?

300行くらいなので全ソースのせてみる。「ほぼ同じじゃねーか!」といいたくなる繰り返しが多いんだけれども、こういうのを綺麗に少ない行数で書く定石みたいなのはあるんだろうか。前回はリストを使ってイテレーションしてみたけど、これは行数こそ少なくなってもプログラムの構造が見えにくくなるなと思ってやめた。