O'ReillyのiPhone AppからEPUBファイルを抽出するRubyスクリプト【Windows版】

404 Blog Not Found:perl - O'ReillyのiPhoneアプリ本からepubをぶっこぬくを参考に、Ruby版を作ってみるテストのWindows版です。

Windowsにはzip/unzipコマンドがないので、ziprubyライブラリを使ってみました。

require "fileutils"
require "zipruby"

def clean
  FileUtils.rmtree('Payload')
end

def die(message)
  puts message
  exit(1)
end

def zip_add_dir_r(zipfile, dir)
  Zip::Archive.open(zipfile) do |ar|
    ar.add_dir(dir)

    Dir.glob("#{dir}/**/*").each do |path|
      if File.directory?(path)
        ar.add_dir(path)
      else
        ar.add_file(path, path)
      end
    end
  end
end

$src = ARGV.shift
die "Usage:#{$0} src.ipa [dst.epub]" unless $src && File.exist?($src)

$dst = ARGV.shift
unless $dst
  $dst = File.basename($src)
  $dst = $dst.sub(/\w+$/, 'epub')
end

Zip::Archive.open($src) do |ar|
  ar.each do |zf|
    if zf.directory?
      FileUtils.mkdir_p(zf.name)
    else
      next if zf.name =~ /iTunes/
      dirname = File.dirname(zf.name)
      FileUtils.mkdir_p(dirname) unless File.exist?(dirname)

      open(zf.name, 'wb') do |f|
        f << zf.read
      end
    end
  end
end

$app = Dir.glob("Payload/*.app/book").first
die "No book found in the archive" unless $app

Dir.chdir($app) do |path|
  $updir = '../../..'

  Zip::Archive.open("#{$updir}/#{$dst}", Zip::CREATE, Zip::BEST_SPEED) do |ar|
    ar.add_file('mimetype')
  end

  zip_add_dir_r("#{$updir}/#{$dst}", 'META-INF')
  zip_add_dir_r("#{$updir}/#{$dst}", 'OEBPS')
end

clean

iTunesに登録するところは、手動でどうぞ。