Class: ComicWalker::ItemDecoder

Inherits:
Object
  • Object
show all
Defined in:
lib/comic_walker/item_decoder.rb,
lib/comic_walker/item_decoder/unknown.rb

Defined Under Namespace

Modules: Unknown

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(configuration_pack) ⇒ ItemDecoder

Returns a new instance of ItemDecoder.



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/comic_walker/item_decoder.rb', line 8

def initialize(configuration_pack)
  fname = '0.dat'
  ct = configuration_pack['ct']
  st = configuration_pack['st']
  et = configuration_pack['et']
  if ct && st && et
    @key1 = (ct + st + fname).unpack('C*')
    @key2 = (ct + fname + et).unpack('C*')
    @key3 = (fname + st + et).unpack('C*')
  end
  @pages = []
  configuration_pack['configuration']['contents'].each do |content|
    pages[content['index']-1] = content['file']
  end
  @file_info = {}
  @pages.each do |file|
    @file_info[file] = configuration_pack[file]
  end
end

Instance Attribute Details

#pagesObject (readonly)

Returns the value of attribute pages.



6
7
8
# File 'lib/comic_walker/item_decoder.rb', line 6

def pages
  @pages
end

Instance Method Details

#decode(file, dat_path, img_path, blob) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/comic_walker/item_decoder.rb', line 45

def decode(file, dat_path, img_path, blob)
  src = Magick::Image.from_blob(blob).first
  width = src.columns
  height = src.rows
  page_info = @file_info[file]['FileLinkInfo']['PageLinkInfoList'].first['Page']
  dummy_height = page_info['DummyHeight']
  dummy_width = page_info['DummyWidth']
  t = dat_path.sub_ext('').to_s.chars.inject(0) { |acc, c| acc + c.ord }
  pat = t%4 + 1
  moves = Unknown.calculate_moves(width, height, 64, 64, pat)

  dst = Magick::Image.new(width - dummy_width, height - dummy_height)
  dst.format = 'jpeg'
  moves.each do |move|
    crop = src.excerpt(move[:destX], move[:destY], move[:width], move[:height])
    dst.composite!(crop, move[:srcX], move[:srcY], Magick::SrcOverCompositeOp)
  end
  dst.write(img_path.to_s)
end

#decode_b64(file, dat_path, img_path, b64data) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/comic_walker/item_decoder.rb', line 32

def decode_b64(file, dat_path, img_path, b64data)
  bs = 128
  hs = 1024
  blob = Unknown.finish(
    @key1, hs,
    Unknown.decrypt(
      @key2, bs,
      Unknown.prepare(@key3, Base64.decode64(b64data).unpack('C*'))
    )
  ).pack('C*')
  decode(file, dat_path, img_path, blob)
end

#has_keys?Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/comic_walker/item_decoder.rb', line 28

def has_keys?
  !!@key1
end