こんなの見つけた。
Zip files: GSF Reference Manual
何だよ、GNOME には ZIP ファイルを扱うライブラリがあったのか。
GLib や Gio ばかり見ていて気が付かなかった。
Fedora 24 には普通に最初から libgsf が入っていますね。
GObject Introspection からも使える、これは使わない手はない。
以下は Vala だけどサンプルコードも見つかった。
Projects/Vala/GSFSample – GNOME Wiki!
早速コードを書いてみたけど色々困った。
gsf_infile_num_children はアーカイブの一階層分しか得ることができない。
階層がある場合は gsf_infile_num_children の戻り値を再帰するしかない。
しかも二階層以下はソートが名前の逆順に。
Python の ZIP ファイルもそうだったけど何故だ?
しかたがないので一階層以降は逆順の再帰で。
ついでに、サイズ取得が何故かプロパティ。
gst_input_size は size_t で size property は int64 だし。
意味ワカンネェけど動いたからいいや。
#!/usr/bin/env python3
import sys, gi
gi.require_version('Gtk', '3.0')
gi.require_version('Gsf', '1')
from gi.repository import Gtk, Gio, GdkPixbuf, Gsf
PATH = "ziptest.cbz";
#PATH = "なえコレ.zip"
class GsfTest(Gtk.ApplicationWindow):
def __init__(self, app):
Gtk.ApplicationWindow.__init__(self, application=app)
self.datas = []
# unzip
f = Gsf.InputStdio.new(PATH)
infile = Gsf.InfileZip.new(f)
self.read_zipfile(infile)
# add
fbox = Gtk.FlowBox(valign=Gtk.Align.START, min_children_per_line=5)
for data in self.datas:
fbox.add(data)
self.add(fbox)
self.show_all()
def read_zipfile(self, infile):
num = infile.num_children()
for i in range(num):
item = infile.child_by_index(i)
if item.size == 0:
self.read_childfile(item)
else:
self.append_data(infile, item)
def read_childfile(self, infile):
num = infile.num_children()
for i in range(num-1, -1, -1):
item = infile.child_by_index(i)
if item.size == 0:
# recursive function
self.read_childfile(item)
else:
self.append_data(infile, item)
def append_data(self, infile, item):
data = item.read(item.size)
try:
stream = Gio.MemoryInputStream.new_from_data(data)
p = GdkPixbuf.Pixbuf.new_from_stream(stream)
minp = p.scale_simple(80, 100, GdkPixbuf.InterpType.BILINEAR)
image = Gtk.Image(pixbuf=minp)
self.datas.append(image)
except Exception as e:
print(e)
class GsfApp(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self)
def do_activate(self):
GsfTest(self)
app = GsfApp()
app.run(sys.argv)
コレでイケたけど。
階層の名前を取り出してソートしたほうが無難だろうか?
それより問題は速度がどうなるかだ。
Comipoli beta3 | PaePoi
の時からどう変わったか Comipoli に組み込んで同じ巨大ファイルを。
あんまり変わんねえヤン…
期待したのに。
せっかく安定して動いているのを変えるべきか悩む。

