narou 3.2.5.1 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of narou might be problematic. Click here for more details.

Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -5
  3. data/.haml-lint.yml +7 -0
  4. data/.rubocop.yml +23 -5
  5. data/.scss-lint.yml +9 -0
  6. data/ChangeLog.md +86 -0
  7. data/Gemfile.lock +35 -35
  8. data/README.md +80 -64
  9. data/lib/backtracer.rb +2 -2
  10. data/lib/color.rb +5 -1
  11. data/lib/command.rb +7 -2
  12. data/lib/command/alias.rb +3 -5
  13. data/lib/command/backup.rb +3 -5
  14. data/lib/command/browser.rb +3 -5
  15. data/lib/command/clean.rb +5 -1
  16. data/lib/command/console.rb +33 -0
  17. data/lib/command/convert.rb +143 -117
  18. data/lib/command/csv.rb +2 -1
  19. data/lib/command/diff.rb +20 -18
  20. data/lib/command/download.rb +25 -14
  21. data/lib/command/folder.rb +3 -5
  22. data/lib/command/freeze.rb +3 -5
  23. data/lib/command/help.rb +20 -18
  24. data/lib/command/init.rb +4 -3
  25. data/lib/command/inspect.rb +2 -1
  26. data/lib/command/list.rb +10 -8
  27. data/lib/command/list/novel_decorator.rb +2 -1
  28. data/lib/command/log.rb +100 -0
  29. data/lib/command/log/tail.rb +76 -0
  30. data/lib/command/mail.rb +20 -17
  31. data/lib/command/remove.rb +7 -6
  32. data/lib/command/send.rb +23 -20
  33. data/lib/command/setting.rb +74 -40
  34. data/lib/command/tag.rb +16 -15
  35. data/lib/command/trace.rb +2 -2
  36. data/lib/command/update.rb +78 -128
  37. data/lib/command/update/general_lastup_updater.rb +3 -2
  38. data/lib/command/update/hotentry_manager.rb +2 -1
  39. data/lib/command/update/interval.rb +2 -1
  40. data/lib/command/version.rb +2 -1
  41. data/lib/command/web.rb +17 -3
  42. data/lib/commandbase.rb +34 -7
  43. data/lib/commandline.rb +54 -35
  44. data/lib/converterbase.rb +21 -15
  45. data/lib/database.rb +3 -2
  46. data/lib/device.rb +5 -4
  47. data/lib/device/epub.rb +2 -1
  48. data/lib/device/ibooks.rb +2 -1
  49. data/lib/device/ibunko.rb +2 -1
  50. data/lib/device/kindle.rb +2 -1
  51. data/lib/device/kobo.rb +2 -1
  52. data/lib/device/library/cygwin.rb +2 -1
  53. data/lib/device/library/linux.rb +2 -1
  54. data/lib/device/library/mac.rb +2 -1
  55. data/lib/device/library/windows.rb +2 -1
  56. data/lib/device/library/windows/eject.rb +2 -1
  57. data/lib/device/reader.rb +2 -1
  58. data/lib/diffviewer.rb +8 -11
  59. data/lib/downloader.rb +159 -151
  60. data/lib/eventable.rb +2 -1
  61. data/lib/extension.rb +16 -14
  62. data/lib/extensions/jruby.rb +2 -1
  63. data/lib/extensions/monkey_patches.rb +7 -0
  64. data/lib/extensions/monkey_patches/pathname.rb +22 -0
  65. data/lib/extensions/windows.rb +2 -1
  66. data/lib/extensions/windows_write_color.rb +2 -1
  67. data/lib/helper.rb +35 -20
  68. data/lib/html.rb +2 -1
  69. data/lib/illustration.rb +2 -1
  70. data/lib/ini.rb +2 -1
  71. data/lib/input.rb +2 -1
  72. data/lib/inspector.rb +3 -2
  73. data/lib/inventory.rb +3 -3
  74. data/lib/mailer.rb +3 -2
  75. data/lib/mixin/all.rb +8 -0
  76. data/lib/mixin/locker.rb +40 -0
  77. data/lib/mixin/output_error.rb +28 -0
  78. data/lib/narou.rb +69 -51
  79. data/lib/narou/api.rb +2 -4
  80. data/lib/narou_logger.rb +236 -108
  81. data/lib/novelconverter.rb +77 -69
  82. data/lib/novelinfo.rb +4 -2
  83. data/lib/novelsetting.rb +15 -12
  84. data/lib/progressbar.rb +13 -9
  85. data/lib/sitesetting.rb +39 -18
  86. data/lib/template.rb +5 -4
  87. data/lib/version.rb +3 -2
  88. data/lib/web/all.rb +2 -1
  89. data/lib/web/appserver.rb +83 -65
  90. data/lib/web/helper4web.rb +10 -5
  91. data/lib/web/progressbar4web.rb +8 -4
  92. data/lib/web/public/resources/default-style.css +2 -3
  93. data/lib/web/public/resources/narou.library.js +86 -60
  94. data/lib/web/public/resources/narou.queue.js +24 -30
  95. data/lib/web/public/resources/narou.ui.js +22 -3
  96. data/lib/web/public/theme/Cerulean/style.css +5 -5
  97. data/lib/web/public/theme/Darkly/style.css +5 -5
  98. data/lib/web/public/theme/Readable/style.css +5 -5
  99. data/lib/web/public/theme/Slate/style.css +2 -3
  100. data/lib/web/public/theme/Superhero/style.css +2 -3
  101. data/lib/web/public/theme/United/style.css +5 -5
  102. data/lib/web/pushserver.rb +10 -7
  103. data/lib/web/server_helpers.rb +16 -1
  104. data/lib/web/settingmessages.rb +10 -7
  105. data/lib/web/streaminginput.rb +2 -1
  106. data/lib/web/streaminglogger.rb +45 -32
  107. data/lib/web/views/_about.haml +6 -3
  108. data/lib/web/views/_header.haml +2 -3
  109. data/lib/web/views/_move_to_top.haml +2 -0
  110. data/lib/web/views/_queue.haml +7 -0
  111. data/lib/web/views/bookmarklet/insert_button.js.erb +1 -1
  112. data/lib/web/views/index.haml +30 -27
  113. data/lib/web/views/layout.haml +2 -0
  114. data/lib/web/views/novels/setting.haml +3 -4
  115. data/lib/web/views/settings.haml +22 -8
  116. data/lib/web/views/style.scss +54 -3
  117. data/lib/web/views/widget/download.haml +9 -3
  118. data/lib/web/views/widget/drag_and_drop.haml +10 -4
  119. data/lib/web/web_worker.rb +132 -0
  120. data/lib/worker.rb +142 -0
  121. data/narou.gemspec +80 -45
  122. data/narou.rb +6 -4
  123. data/template/novel.txt.erb +1 -0
  124. data/webnovel/kakuyomu.jp.yaml +9 -13
  125. data/webnovel/ncode.syosetu.com.yaml +3 -1
  126. data/webnovel/novel18.syosetu.com.yaml +8 -1
  127. data/webnovel/syosetu.org.yaml +3 -1
  128. data/webnovel/www.akatsuki-novels.com.yaml +4 -2
  129. data/webnovel/www.mai-net.net.yaml +3 -1
  130. metadata +109 -48
  131. data/lib/web/worker.rb +0 -126
@@ -1,4 +1,5 @@
1
- # -*- coding: utf-8 -*-
1
+ # frozen_string_literal: true
2
+
2
3
  #
3
4
  # Copyright 2013 whiteleaf. All rights reserved.
4
5
  #
@@ -57,10 +58,10 @@ module Command
57
58
  @options["tags"] = tags.split.tap { |array|
58
59
  array.each do |tag|
59
60
  if tag =~ BAN_CHAR
60
- error "#{tag} に使用禁止記号が含まれています"
61
+ stream_io.error "#{tag} に使用禁止記号が含まれています"
61
62
  exit Narou::EXIT_ERROR_CODE
62
63
  elsif BAN_WORD.include?(tag)
63
- error "#{tag} は使用禁止ワードです"
64
+ stream_io.error "#{tag} は使用禁止ワードです"
64
65
  exit Narou::EXIT_ERROR_CODE
65
66
  end
66
67
  end
@@ -75,7 +76,7 @@ module Command
75
76
  "#{' '*25}COL=#{get_color_list}") { |color|
76
77
  color.downcase!
77
78
  unless COLORS.include?(color)
78
- error "#{color}という色は存在しません。色指定は無視されます"
79
+ stream_io.error "#{color}という色は存在しません。色指定は無視されます"
79
80
  color = nil
80
81
  end
81
82
  @options["color"] = color
@@ -126,11 +127,11 @@ module Command
126
127
  return
127
128
  end
128
129
  if color_changed
129
- puts "タグの色を変更しました"
130
+ stream_io.puts "タグの色を変更しました"
130
131
  display_taglist
131
132
  return
132
133
  else
133
- error "対象の小説を指定して下さい"
134
+ stream_io.error "対象の小説を指定して下さい"
134
135
  exit Narou::EXIT_ERROR_CODE
135
136
  end
136
137
  else
@@ -145,8 +146,8 @@ module Command
145
146
  def display_taglist
146
147
  database = Database.instance
147
148
  tag_list = Tag.get_tag_list
148
- puts "タグ一覧"
149
- puts tag_list.map { |tag, count|
149
+ stream_io.puts "タグ一覧"
150
+ stream_io.puts tag_list.map { |tag, count|
150
151
  color = Tag.get_color(tag)
151
152
  "<bold><#{color}>#{TermColorLight.escape(tag)}(#{count})</#{color}></bold>"
152
153
  }.join(" ").termcolor
@@ -173,7 +174,7 @@ module Command
173
174
  argv.each do |target|
174
175
  data = Downloader.get_data_by_target(target)
175
176
  unless data
176
- error "#{target} は存在しません"
177
+ stream_io.error "#{target} は存在しません"
177
178
  next
178
179
  end
179
180
  tags = data["tags"] || []
@@ -181,21 +182,21 @@ module Command
181
182
  case @options["mode"]
182
183
  when :add
183
184
  tags |= @options["tags"]
184
- puts "#{title} にタグを設定しました"
185
+ stream_io.puts "#{title} にタグを設定しました"
185
186
  when :delete
186
187
  tags -= @options["tags"]
187
- puts "#{title} からタグを外しました"
188
+ stream_io.puts "#{title} からタグを外しました"
188
189
  when :clear
189
190
  tags.clear
190
- puts "#{title} のタグをすべて外しました"
191
+ stream_io.puts "#{title} のタグをすべて外しました"
191
192
  end
192
193
  if tags.size > 0
193
- print "現在のタグは "
194
- print tags.map { |tagname|
194
+ stream_io.print "現在のタグは "
195
+ stream_io.print tags.map { |tagname|
195
196
  color = Tag.get_color(tagname)
196
197
  "<bold><#{color}>#{TermColorLight.escape(tagname)}</#{color}></bold>"
197
198
  }.join(" ").termcolor
198
- puts " です"
199
+ stream_io.puts " です"
199
200
  end
200
201
  database[data["id"]]["tags"] = tags
201
202
  end
@@ -7,11 +7,11 @@
7
7
  module Command
8
8
  class Trace < CommandBase
9
9
  def self.oneline_help
10
- "エラーログを表示します"
10
+ "直前のバックトレースを表示します"
11
11
  end
12
12
 
13
13
  def initialize
14
- super(" ")
14
+ super()
15
15
  @opt.separator <<-MSG
16
16
 
17
17
  ・エラーが発生した際に保存されたバックトレースログを表示します。
@@ -1,4 +1,5 @@
1
- # -*- coding: utf-8 -*-
1
+ # frozen_string_literal: true
2
+
2
3
  #
3
4
  # Copyright 2013 whiteleaf. All rights reserved.
4
5
  #
@@ -19,10 +20,6 @@ module Command
19
20
  extend Memoist
20
21
  include Narou::Eventable
21
22
 
22
- LOG_DIR_NAME = "log"
23
- LOG_NUM_LIMIT = 30 # ログの保存する上限数
24
- LOG_FILENAME_FORMAT = "update_log_%s.txt"
25
-
26
23
  HOTENTRY_DIR_NAME = "hotentry"
27
24
  HOTENTRY_TEMPLATE_NAME = "hotentry.txt"
28
25
  HOTENTRY_TITLE_PATTERN = "hotentry %y/%m/%d %H:%M"
@@ -62,16 +59,9 @@ module Command
62
59
  @opt.on("-n", "--no-convert", "変換をせずアップデートのみ実行する") {
63
60
  @options["no-convert"] = true
64
61
  }
65
- @opt.on("-a", "--convert-only-new-arrival", "新着のみ変換を実行する") {
62
+ @opt.on("-a", "--convert-only-new-arrival", "新着がある場合のみ変換を実行する") {
66
63
  @options["convert-only-new-arrival"] = true
67
64
  }
68
- @opt.on("-l", "--log [N]", "最新からN番目のログを表示する(デフォ1)") { |n|
69
- n = n.to_i
70
- n -= 1 if n > 0
71
- @options["log"] = n
72
- view_log
73
- exit 0
74
- }
75
65
  @opt.on("--gl [OPT]", <<-EOS) { |option|
76
66
  データベースに最新話掲載日を反映させる
77
67
  | OPT | 概要
@@ -164,129 +154,84 @@ module Command
164
154
  interval = Interval.new(@options["interval"])
165
155
 
166
156
  begin
167
- update_log = $stdout.capture(quiet: false) do
168
- sort_by_key(sort_key, update_target_list).each_with_index do |target, i|
169
- display_message = nil
170
- data = Downloader.get_data_by_target(target)
171
- if !data
172
- display_message = "<bold><red>[ERROR]</red></bold> #{target} は管理小説の中に存在しません".termcolor
173
- elsif Narou.novel_frozen?(target) && !@options["force"]
174
- next if argv.empty?
175
- display_message = "ID:#{data["id"]} #{data["title"]} は凍結中です"
176
- end
177
- Helper.print_horizontal_rule if i > 0
178
- if display_message
179
- puts display_message
180
- mistook_count += 1
181
- next
182
- end
183
- interval.wait
184
- downloader = Downloader.new(target)
185
- hotentry_manager.connect(downloader)
186
-
187
- delete_modified_tag = -> do
188
- tags = data["tags"] || []
189
- data["tags"] = tags - [Narou::MODIFIED_TAG] if tags.include?(Narou::MODIFIED_TAG)
190
- data["last_check_date"] = Time.now
191
- end
157
+ sort_by_key(sort_key, update_target_list).each_with_index do |target, i|
158
+ display_message = nil
159
+ data = Downloader.get_data_by_target(target)
160
+ if !data
161
+ display_message = "<bold><red>[ERROR]</red></bold> #{target} は管理小説の中に存在しません".termcolor
162
+ elsif Narou.novel_frozen?(target) && !@options["force"]
163
+ next if argv.empty?
164
+ display_message = "ID:#{data["id"]} #{data["title"]} は凍結中です"
165
+ end
166
+ Helper.print_horizontal_rule if i > 0
167
+ if display_message
168
+ puts display_message
169
+ mistook_count += 1
170
+ next
171
+ end
172
+ interval.wait
173
+ downloader = Downloader.new(target)
174
+ hotentry_manager.connect(downloader)
175
+
176
+ delete_modified_tag = -> do
177
+ tags = data["tags"] || []
178
+ data["tags"] = tags - [Narou::MODIFIED_TAG] if tags.include?(Narou::MODIFIED_TAG)
179
+ data["last_check_date"] = Time.now
180
+ end
192
181
 
193
- result = downloader.start_download
194
- case result.status
195
- when :ok
196
- delete_modified_tag.call
197
- trigger(:success, data)
198
- if @options["no-convert"] ||
199
- (@options["convert-only-new-arrival"] && !result.new_arrivals)
200
- interval.force_wait
201
- next
202
- end
203
- when :failed
204
- puts "ID:#{data["id"]} #{data["title"]} の更新は失敗しました"
205
- mistook_count += 1
182
+ result = downloader.start_download
183
+ case result.status
184
+ when :ok
185
+ delete_modified_tag.call
186
+ trigger(:success, data)
187
+ puts "#{data["title"]} の更新チェックが完了しました"
188
+ if @options["no-convert"] ||
189
+ (@options["convert-only-new-arrival"] && !result.new_arrivals)
190
+ interval.force_wait
206
191
  next
207
- when :canceled
208
- puts "ID:#{data["id"]} #{data["title"]} の更新はキャンセルされました"
209
- mistook_count += 1
210
- next
211
- when :none
212
- delete_modified_tag.call
213
- puts "#{data["title"]} に更新はありません"
214
- next unless data["_convert_failure"]
215
- end
216
-
217
- if data["_convert_failure"]
218
- puts "<yellow>前回変換できなかったので再変換します</yellow>".termcolor
219
- end
220
- convert_argv = [target]
221
- convert_argv << "--no-open" if @options["no-open"]
222
- convert_status = Convert.execute!(convert_argv)
223
- if convert_status > 0
224
- # 変換が失敗したか、中断された
225
- data["_convert_failure"] = true
226
- # 中断された場合には残りのアップデートも中止する
227
- raise Interrupt if convert_status == Narou::EXIT_INTERRUPT
228
- else
229
- # 変換に成功した
230
- data.delete("_convert_failure")
231
192
  end
193
+ when :failed
194
+ puts "ID:#{data["id"]} #{data["title"]} の更新は失敗しました"
195
+ mistook_count += 1
196
+ next
197
+ when :canceled
198
+ puts "ID:#{data["id"]} #{data["title"]} の更新はキャンセルされました"
199
+ mistook_count += 1
200
+ next
201
+ when :none
202
+ delete_modified_tag.call
203
+ puts "#{data["title"]} に更新はありません"
204
+ next unless data["_convert_failure"]
232
205
  end
233
206
 
234
- process_hotentry(hotentry_manager.hotentries)
207
+ if data["_convert_failure"]
208
+ puts "<yellow>前回変換できなかったので再変換します</yellow>".termcolor
209
+ end
210
+ convert_argv = [target]
211
+ convert_argv << "--no-open" if @options["no-open"]
212
+ convert_status = Convert.execute!(convert_argv)
213
+ if convert_status > 0
214
+ # 変換が失敗したか、中断された
215
+ data["_convert_failure"] = true
216
+ # 中断された場合には残りのアップデートも中止する
217
+ raise Interrupt if convert_status == Narou::EXIT_INTERRUPT
218
+ else
219
+ # 変換に成功した
220
+ data.delete("_convert_failure")
221
+ end
235
222
  end
236
223
  ensure
237
- save_log(update_log)
238
224
  Database.instance.save_database
225
+ process_hotentry(hotentry_manager.hotentries)
239
226
  end
240
227
 
241
228
  exit mistook_count if mistook_count > 0
242
229
  rescue Interrupt
243
230
  puts "アップデートを中断しました"
231
+ Narou::Worker.cancel if Narou.concurrency_enabled?
244
232
  exit Narou::EXIT_INTERRUPT
245
233
  end
246
234
 
247
- def get_log_paths
248
- Dir.glob(File.join(log_dirname, LOG_FILENAME_FORMAT % "*")).sort.reverse
249
- end
250
-
251
- def view_log
252
- list = get_log_paths
253
- n = @options["log"]
254
- if list[n]
255
- puts File.read(list[n], encoding: Encoding::UTF_8)
256
- else
257
- error "#{n+1}番目のログはありません"
258
- end
259
- end
260
-
261
- def save_log(log)
262
- return unless @options["logging"]
263
- create_log_dir
264
- now = Time.now
265
- logname = File.join(log_dirname, LOG_FILENAME_FORMAT % now.strftime("%Y%m%d_%H%M%S"))
266
- File.open(logname, "w:UTF-8") do |fp|
267
- fp.puts "--- ログ出力日時 #{now.strftime("%Y/%m/%d %H:%M:%S")} ---"
268
- fp.puts log
269
- end
270
- remove_old_log
271
- end
272
-
273
- def log_dirname
274
- @@__log_dirname ||= File.join(Narou.get_root_dir, LOG_DIR_NAME)
275
- end
276
-
277
- def create_log_dir
278
- logdir = log_dirname
279
- return if File.directory?(logdir)
280
- FileUtils.mkdir_p(logdir)
281
- end
282
-
283
- def remove_old_log
284
- list = get_log_paths
285
- (list[LOG_NUM_LIMIT..-1] || []).each do |path|
286
- File.delete(path)
287
- end
288
- end
289
-
290
235
  def update_general_lastup(option = nil)
291
236
  puts "最新話掲載日を確認しています..."
292
237
 
@@ -336,8 +281,11 @@ module Command
336
281
  hotentry.each do |id, subtitles|
337
282
  setting = NovelSetting.load(id, ignore_force, ignore_default)
338
283
  setting.enable_illust = false # 挿絵はパス解決が煩雑なので強制無効
339
- novel_converter = NovelConverter.new(setting, output_filename,
340
- display_inspector, Update.hotentry_dirname)
284
+ novel_converter = NovelConverter.new(
285
+ setting, output_filename,
286
+ display_inspector, Update.hotentry_dirname,
287
+ stream_io: stream_io
288
+ )
341
289
  last_num = 0
342
290
  novel_converter.on(:"convert_main.loop") do |i|
343
291
  progressbar.output(total_progress + i)
@@ -367,10 +315,12 @@ module Command
367
315
  File.write(txt_output_path, hotentry_text)
368
316
  # テキストを書籍データに変換
369
317
  relay_proc = -> {
370
- NovelConverter.convert_txt_to_ebook_file(txt_output_path, {
318
+ NovelConverter.convert_txt_to_ebook_file(
319
+ txt_output_path,
371
320
  use_dakuten_font: use_dakuten_font,
372
- device: device
373
- })
321
+ device: device,
322
+ stream_io: stream_io
323
+ )
374
324
  }
375
325
  if device
376
326
  cmd_convert.extend(device.get_hook_module)
@@ -390,11 +340,11 @@ module Command
390
340
  end
391
341
 
392
342
  def copy_hotentry(ebook_path, cmd_convert)
393
- cmd_convert.copy_to_converted_file(ebook_path)
343
+ cmd_convert.copy_to_converted_file(ebook_path, io: stream_io)
394
344
  end
395
345
 
396
346
  def send_hotentry(ebook_path, cmd_convert)
397
- cmd_convert.send_file_to_device(ebook_path)
347
+ cmd_convert.send_file_to_device(ebook_path, io: stream_io)
398
348
  end
399
349
 
400
350
  def mail_hotentry
@@ -404,7 +354,7 @@ module Command
404
354
  end
405
355
 
406
356
  def self.hotentry_dirname
407
- @@__hotentry_dirname ||= File.join(Narou.get_root_dir, HOTENTRY_DIR_NAME)
357
+ @@__hotentry_dirname ||= File.join(Narou.root_dir, HOTENTRY_DIR_NAME)
408
358
  end
409
359
 
410
360
  def self.get_newest_hotentry_file_path(device)
@@ -1,4 +1,5 @@
1
- # -*- coding: utf-8 -*-
1
+ # frozen_string_literal: true
2
+
2
3
  #
3
4
  # Copyright 2013 whiteleaf. All rights reserved.
4
5
  #
@@ -68,7 +69,7 @@ module Command
68
69
  "general_lastup" => downloader.get_general_lastup,
69
70
  "length" => downloader.novel_length
70
71
  }
71
- rescue OpenURI::HTTPError, Errno::ECONNRESET
72
+ rescue OpenURI::HTTPError, Errno::ECONNRESET, Errno::ETIMEDOUT, Net::OpenTimeout
72
73
  next
73
74
  end
74
75
  data = @database[id]
@@ -1,4 +1,5 @@
1
- # -*- coding: utf-8 -*-
1
+ # frozen_string_literal: true
2
+
2
3
  #
3
4
  # Copyright 2013 whiteleaf. All rights reserved.
4
5
  #
@@ -1,4 +1,5 @@
1
- # -*- coding: utf-8 -*-
1
+ # frozen_string_literal: true
2
+
2
3
  #
3
4
  # Copyright 2013 whiteleaf. All rights reserved.
4
5
  #
@@ -1,4 +1,5 @@
1
- # -*- coding: utf-8 -*-
1
+ # frozen_string_literal: true
2
+
2
3
  #
3
4
  # Copyright 2013 whiteleaf. All rights reserved.
4
5
  #
@@ -1,4 +1,5 @@
1
- # -*- coding: utf-8 -*-
1
+ # frozen_string_literal: true
2
+
2
3
  #
3
4
  # Copyright 2013 whiteleaf. All rights reserved.
4
5
  #
@@ -89,6 +90,7 @@ module Command
89
90
  argv << "--no-color" if $disable_color
90
91
  argv << "--boot"
91
92
  argv_copy = argv.dup
93
+ kill_threads
92
94
  begin
93
95
  loop do
94
96
  if $development
@@ -103,11 +105,15 @@ module Command
103
105
  rescue Interrupt => e
104
106
  # 中断されてコンソールへの入力が可能になってから、WEBrick が終了するまで
105
107
  # タイムラグがあって表示がごちゃまぜになるので、終わるのを少し待つ
106
- sleep 2
108
+ sleep 1
107
109
  end
108
110
  end
109
111
  end
110
112
 
113
+ def kill_threads
114
+ Narou::Worker.stop
115
+ end
116
+
111
117
  def boot
112
118
  require_relative "../web/all"
113
119
  confirm_of_first
@@ -126,11 +132,19 @@ module Command
126
132
  send_rebooted_event_when_connection_recover(push_server)
127
133
 
128
134
  $stdout = Narou::StreamingLogger.new(push_server)
135
+ $stdout2 = if Inventory.load["concurrency"]
136
+ Narou::StreamingLogger.new(push_server, $stdout2, target_console: "stdout2")
137
+ else
138
+ $stdout
139
+ end
129
140
  ProgressBar.push_server = push_server
141
+ Narou::Worker.push_server = push_server
130
142
  Narou::AppServer.push_server = push_server
131
- Narou::Worker.instance.start
143
+ Narou::WebWorker.run
132
144
  Narou::AppServer.run!
133
145
  push_server.quit
146
+ Narou::WebWorker.stop
147
+ Narou::Worker.stop
134
148
  if Narou::AppServer.request_reboot?
135
149
  exit Narou::EXIT_REQUEST_REBOOT
136
150
  end