narou 1.7.2 → 2.0.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 (100) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +1 -0
  3. data/ChangeLog.md +35 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE.txt +100 -0
  6. data/README.md +28 -39
  7. data/lib/color.rb +0 -2
  8. data/lib/command.rb +1 -0
  9. data/lib/command/convert.rb +33 -4
  10. data/lib/command/diff.rb +5 -4
  11. data/lib/command/download.rb +9 -1
  12. data/lib/command/flag.rb +2 -2
  13. data/lib/command/list.rb +1 -1
  14. data/lib/command/mail.rb +3 -3
  15. data/lib/command/remove.rb +2 -1
  16. data/lib/command/send.rb +7 -6
  17. data/lib/command/setting.rb +39 -95
  18. data/lib/command/tag.rb +25 -13
  19. data/lib/command/update.rb +6 -1
  20. data/lib/command/version.rb +5 -1
  21. data/lib/command/web.rb +111 -0
  22. data/lib/commandbase.rb +5 -2
  23. data/lib/commandline.rb +16 -0
  24. data/lib/converterbase.rb +20 -14
  25. data/lib/device.rb +5 -4
  26. data/lib/downloader.rb +68 -39
  27. data/lib/eventable.rb +72 -0
  28. data/lib/helper.rb +105 -37
  29. data/lib/ini.rb +2 -1
  30. data/lib/input.rb +68 -0
  31. data/lib/inventory.rb +4 -0
  32. data/lib/kindlestrip.rb +2 -2
  33. data/lib/logger.rb +41 -19
  34. data/lib/narou.rb +10 -0
  35. data/lib/narou/api.rb +1 -1
  36. data/lib/novelconverter.rb +8 -21
  37. data/lib/novelsetting.rb +79 -4
  38. data/lib/version.rb +1 -1
  39. data/lib/web/all.rb +12 -0
  40. data/lib/web/appserver.rb +612 -0
  41. data/lib/web/helper4web.rb +15 -0
  42. data/lib/web/progressbar4web.rb +32 -0
  43. data/lib/web/public/favicon.ico +0 -0
  44. data/lib/web/public/resources/bootbox.min.js +6 -0
  45. data/lib/web/public/resources/common.ui.js +143 -0
  46. data/lib/web/public/resources/dataTables.colVis.js +1113 -0
  47. data/lib/web/public/resources/help/rect_select.png +0 -0
  48. data/lib/web/public/resources/help/ssmain.png +0 -0
  49. data/lib/web/public/resources/help/tag.png +0 -0
  50. data/lib/web/public/resources/jquery.moveto.js +44 -0
  51. data/lib/web/public/resources/jquery.outerclick.js +60 -0
  52. data/lib/web/public/resources/jquery.slidenavbar.js +89 -0
  53. data/lib/web/public/resources/narou.library.js +815 -0
  54. data/lib/web/public/resources/narou.ui.js +993 -0
  55. data/lib/web/public/resources/perfect-scrollbar.min.css +5 -0
  56. data/lib/web/public/resources/perfect-scrollbar.min.js +4 -0
  57. data/lib/web/public/resources/shortcut.js +223 -0
  58. data/lib/web/public/resources/sort_asc.png +0 -0
  59. data/lib/web/public/resources/sort_desc.png +0 -0
  60. data/lib/web/public/resources/toggle-switch.css +322 -0
  61. data/lib/web/public/robots.txt +3 -0
  62. data/lib/web/public/test/jquery.outerclick.html +72 -0
  63. data/lib/web/pushserver.rb +110 -0
  64. data/lib/web/settingmessages.rb +14 -0
  65. data/lib/web/streaminginput.rb +103 -0
  66. data/lib/web/streaminglogger.rb +52 -0
  67. data/lib/web/views/about.haml +11 -0
  68. data/lib/web/views/help.haml +105 -0
  69. data/lib/web/views/index.haml +245 -0
  70. data/lib/web/views/js/widget.erb +74 -0
  71. data/lib/web/views/layout.haml +49 -0
  72. data/lib/web/views/novels/setting.haml +177 -0
  73. data/lib/web/views/settings.haml +115 -0
  74. data/lib/web/views/style.scss +737 -0
  75. data/lib/web/views/widget.haml +39 -0
  76. data/lib/web/web-socket-ruby/.gitignore +1 -0
  77. data/lib/web/web-socket-ruby/README.txt +75 -0
  78. data/lib/web/web-socket-ruby/lib/web_socket.rb +601 -0
  79. data/lib/web/web-socket-ruby/samples/chat_server.rb +58 -0
  80. data/lib/web/web-socket-ruby/samples/echo_server.rb +33 -0
  81. data/lib/web/web-socket-ruby/samples/stdio_client.rb +25 -0
  82. data/lib/web/worker.rb +87 -0
  83. data/narou.gemspec +36 -3
  84. data/narou.rb +8 -6
  85. data/preset/ncode.syosetu.com/n8725k/converter.rb +2 -1
  86. data/spec/data/convert_test/replace/correct_test_replace.txt +1 -1
  87. data/spec/data/convert_test/replace/test_replace.txt +1 -1
  88. data/spec/data/convert_test/ruby/correct_test_ruby.txt +18 -1
  89. data/spec/data/convert_test/ruby/test_ruby.txt +18 -0
  90. data/spec/downloader_spec.rb +37 -0
  91. data/spec/eventable_spec.rb +172 -0
  92. data/spec/exit_code_spec.rb +67 -0
  93. data/spec/helper_spec.rb +72 -0
  94. data/spec/input_spec.rb +76 -0
  95. data/spec/logger_spec.rb +53 -0
  96. data/spec/novelsetting_spec.rb +35 -0
  97. data/spec/worker_spec.rb +56 -0
  98. data/template/ibunko_novel.txt.erb +2 -2
  99. data/template/novel.txt.erb +2 -2
  100. metadata +213 -29
@@ -10,9 +10,13 @@ module Command
10
10
  end
11
11
 
12
12
  def execute(argv)
13
+ puts self.class.create_version_string
14
+ end
15
+
16
+ def self.create_version_string
13
17
  cv_path = File.expand_path("commitversion", Narou.get_script_dir)
14
18
  commitversion = File.exist?(cv_path) ? File.read(cv_path) : `git describe --always`.strip + "(develop)"
15
- puts ::Version + " build " + commitversion
19
+ "#{::Version} build #{commitversion}"
16
20
  end
17
21
  end
18
22
  end
@@ -0,0 +1,111 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright 2013 whiteleaf. All rights reserved.
4
+ #
5
+
6
+ module Command
7
+ class Web < CommandBase
8
+ def self.oneline_help
9
+ "WEBアプリケーション用サーバを起動します"
10
+ end
11
+
12
+ def initialize
13
+ super("[options...]")
14
+ @opt.separator <<-EOS
15
+
16
+ ・WEBアプリケーション用サーバを起動します
17
+ ・小説の管理及び設定をブラウザで行うことができます
18
+ ・--port を指定しない場合、ポートは初回起動時にランダムで設定します
19
+ (以降同じ設定を引き継ぎます)
20
+ ・サーバ起動後にブラウザを立ち上げます
21
+ ・サーバの停止はコンソールで Ctrl+C を入力します
22
+
23
+ Examples:
24
+ narou web # サーバ起動(ポートはランダム。ポート設定保存)
25
+ narou web -p 4567 # ポート4567で起動(保存はされない)
26
+
27
+ # 先に決めておく
28
+ narou s server-port=8000
29
+ narou web # ポート8000で起動
30
+
31
+ Options:
32
+ EOS
33
+ @opt.on("-p", "--port PORT", Integer, "起動するポートを指定") { |port|
34
+ @options["port"] = port
35
+ }
36
+ @opt.on("-n", "--no-browser", "起動時にブラウザは開かない") {
37
+ @options["no-browser"] = true
38
+ }
39
+ end
40
+
41
+ def confirm_of_first
42
+ setting = Inventory.load("server_setting", :global)
43
+ is_first = !setting["already-server-boot"]
44
+ if is_first
45
+ puts <<-EOS
46
+ 初めてサーバを起動します。ファイアウォールのアクセス許可を尋ねられた場合、許可をして下さい。
47
+ また、起動したサーバを止めるにはコンソール上で Ctrl+C を入力するか、ブラウザ上で「設定(歯車マーク)→サーバをシャットダウン」を実行して下さい。
48
+
49
+ EOS
50
+ if @options["no-browser"]
51
+ puts "(何かキーを押して下さい)"
52
+ else
53
+ puts "(何かキーを押して下さい。サーバ起動後ブラウザが立ち上がります)"
54
+ end
55
+ $stdin.getch
56
+ setting["already-server-boot"] = true
57
+ setting.save
58
+ end
59
+ is_first
60
+ end
61
+
62
+ def create_push_server(params)
63
+ host, port = params[:host], params[:port]
64
+ push_server = Narou::PushServer.instance
65
+ push_server.accepted_domains = (host == "0.0.0.0" ? "*" : host)
66
+ push_server.port = port + 1
67
+ push_server.host = host
68
+ push_server
69
+ end
70
+
71
+ def execute(argv)
72
+ super
73
+ require_relative "../web/all"
74
+ confirm_of_first
75
+ params = Narou::AppServer.create_address(@options["port"])
76
+ push_server = create_push_server(params)
77
+ Narou.web = true
78
+ Thread.abort_on_exception = true
79
+
80
+ address = "http://#{params[:host]}:#{params[:port]}/"
81
+ puts address
82
+ puts "サーバを止めるには Ctrl+C を入力"
83
+ puts
84
+
85
+ push_server.run
86
+ unless @options["no-browser"]
87
+ Thread.new do
88
+ sleep 0.2 until Narou::AppServer.running?
89
+ Helper.open_browser(address)
90
+ end
91
+ end
92
+ $stdout = Narou::StreamingLogger.new(push_server)
93
+ ProgressBar.push_server = push_server
94
+ Narou::AppServer.push_server = push_server
95
+ Narou::Worker.instance.start
96
+ Narou::AppServer.run!
97
+ push_server.quit
98
+ rescue Errno::EADDRINUSE => e
99
+ STDOUT.puts <<-EOS
100
+ #{e}
101
+ ポートが使われています。サーバがすでに立ち上がっているかどうか確認して下さい。
102
+ 他のアプリケーションが使っているポートだった場合、ポートを変更して下さい。
103
+
104
+ ポートの変更方法
105
+ $ narou s server-port=5678
106
+ EOS
107
+ exit Narou::EXIT_ERROR_CODE
108
+ end
109
+ end
110
+ end
111
+
data/lib/commandbase.rb CHANGED
@@ -41,10 +41,13 @@ module Command
41
41
  @opt.parse!(argv)
42
42
  rescue OptionParser::InvalidOption => e
43
43
  error "不明なオプションです(#{e})"
44
- exit 1
44
+ exit Narou::EXIT_ERROR_CODE
45
+ rescue OptionParser::InvalidArgument => e
46
+ error "オプションの引数が正しくありません(#{e})"
47
+ exit Narou::EXIT_ERROR_CODE
45
48
  rescue OptionParser::MissingArgument => e
46
49
  error "オプションの引数が指定されていないか正しくありません(#{e})"
47
- exit 1
50
+ exit Narou::EXIT_ERROR_CODE
48
51
  end
49
52
 
50
53
  def load_local_settings
data/lib/commandline.rb CHANGED
@@ -12,6 +12,7 @@ module CommandLine
12
12
  module_function
13
13
 
14
14
  def run(argv)
15
+ argv.flatten!
15
16
  if Helper.os_windows?
16
17
  argv.map! do |arg|
17
18
  arg.encode(Encoding::UTF_8)
@@ -43,6 +44,21 @@ module CommandLine
43
44
  argv += STDIN.gets.split
44
45
  end
45
46
  Command.get_list[arg].new.execute(argv)
47
+ ensure
48
+ if Command::Convert.exists_sending_error_list?
49
+ Command::Convert.display_sending_error_list
50
+ end
51
+ end
52
+
53
+ #
54
+ # exit を捕捉して終了コードを返す
55
+ #
56
+ def run!(argv)
57
+ run(argv)
58
+ rescue SystemExit => e
59
+ e.status
60
+ else
61
+ 0
46
62
  end
47
63
 
48
64
  def load_default_arguments(cmd)
data/lib/converterbase.rb CHANGED
@@ -830,6 +830,9 @@ class ConverterBase
830
830
  data.gsub!(/([^、])、\n ([^「『((【<<〈《≪…‥―])/, "\\1、\\2")
831
831
  end
832
832
 
833
+ CHARACTER_OF_RUBY = "一-龠A-Za-zA-Za-z"
834
+ AUTO_RUBY_CHARACTERS = "([ぁ-んァ-ヶーゝゞ・A-Za-zA-Za-z  ]{,20})"
835
+
833
836
  #
834
837
  # 小説家になろうのルビ対策
835
838
  #
@@ -840,7 +843,7 @@ class ConverterBase
840
843
  to_ruby(match, $1, $2, ["≪", "≫"])
841
844
  end
842
845
  # ()なルビの対処
843
- data.gsub!(/(.+?)(([ぁ-んァ-ヶーゝゞ・A-Za-zA-Za-z  ]{,20}))/) do |match|
846
+ data.gsub!(/(.+?)(#{AUTO_RUBY_CHARACTERS})/) do |match|
844
847
  to_ruby(match, $1, $2, ["(", ")"])
845
848
  end
846
849
  end
@@ -848,8 +851,6 @@ class ConverterBase
848
851
  data.gsub!("[#ルビ用縦線]", "|")
849
852
  end
850
853
 
851
- CHARACTER_OF_RUBY = "一-龠A-Za-zA-Za-z"
852
-
853
854
  def object_of_ruby?(char)
854
855
  char =~ /[#{CHARACTER_OF_RUBY}]/
855
856
  end
@@ -888,16 +889,21 @@ class ConverterBase
888
889
  when m1.include?("|")
889
890
  "#{m1.sub(/|([^|]*)$/, "[#ルビ用縦線]\\1")}《#{m2}》"
890
891
  when object_of_ruby?(last_char)
891
- # なろうのルビ対象文字を辿って|を挿入する(青空文庫となろうのルビ仕様の差異吸収のため)
892
- # 空白もルビ対象文字に含むのはなろうの仕様である
893
- m1.sub(/([#{CHARACTER_OF_RUBY}  ]+)$/) {
894
- match_target = $1
895
- if match_target =~ /^( +)/
896
- "#{$1}[#ルビ用縦線]#{match_target[$1.length..-1]}"
897
- else
898
- "[#ルビ用縦線]#{match_target}"
899
- end
900
- } + "《#{ruby_youon_to_big(m2)}"
892
+ if openclose_symbols[0] == "≪" && m2 !~ /^#{AUTO_RUBY_CHARACTERS}$/
893
+ # 《 》タイプのルビであっても、|が存在しない場合の自動ルビ化対象はひらがな等だけである
894
+ match
895
+ else
896
+ # なろうのルビ対象文字を辿って|を挿入する(青空文庫となろうのルビ仕様の差異吸収のため)
897
+ # 空白もルビ対象文字に含むのはなろうの仕様である
898
+ m1.sub(/([#{CHARACTER_OF_RUBY}  ]+)$/) {
899
+ match_target = $1
900
+ if match_target =~ /^( +)/
901
+ "#{$1}[#ルビ用縦線]#{match_target[$1.length..-1]}"
902
+ else
903
+ "[#ルビ用縦線]#{match_target}"
904
+ end
905
+ } + "《#{ruby_youon_to_big(m2)}》"
906
+ end
901
907
  else
902
908
  match
903
909
  end
@@ -991,7 +997,7 @@ class ConverterBase
991
997
  def midashi(str)
992
998
  midashi_title = str.gsub("[#半字下げ]", "").gsub(/^[ \s]+/, "").gsub(/[ \s]+$/, "")
993
999
  @inspector.subtitle = midashi_title
994
- "[#3字下げ][#ここから中見出し]#{midashi_title}[#ここで中見出し終わり]"
1000
+ "[#3字下げ][#中見出し]#{midashi_title}[#中見出し終わり]"
995
1001
  end
996
1002
 
997
1003
  def calc_cr_count(str)
data/lib/device.rb CHANGED
@@ -44,6 +44,7 @@ class Device
44
44
  end
45
45
 
46
46
  class UnknownDevice < StandardError; end
47
+ class SendFailure < StandardError; end
47
48
 
48
49
  def self.exists?(device)
49
50
  DEVICES.include?(device.downcase)
@@ -111,7 +112,7 @@ class Device
111
112
  cmd = "copy /B " + %!"#{src_file}" "#{dst_path}"!.gsub("/", "\\").encode(Encoding::Windows_31J)
112
113
  res = Helper::AsyncCommand.exec(cmd)
113
114
  unless res[2].success?
114
- raise res[1].force_encoding(Encoding::Windows_31J).encode(Encoding::UTF_8).rstrip
115
+ raise SendFailure, res[1].force_encoding(Encoding::Windows_31J).encode(Encoding::UTF_8).rstrip
115
116
  end
116
117
  else
117
118
  res = Helper::AsyncCommand.exec(%!cp "#{src_file}" "#{dst_path}"!)
@@ -119,17 +120,17 @@ class Device
119
120
  # cp コマンドで送信失敗するとファイルがぶっ壊れたり0バイトのファイルが作られる
120
121
  # ので一旦削除しておく
121
122
  File.delete(dst_path) if File.exist?(dst_path)
122
- raise res[1].rstrip
123
+ raise SendFailure, res[1].rstrip
123
124
  end
124
125
  end
125
126
  dst_path
126
127
  else
127
128
  nil
128
129
  end
129
- rescue Exception => e
130
+ rescue SendFailure => e
130
131
  puts
131
132
  error $@.shift + ": #{e.message} (#{e.class})"
132
- exit 1
133
+ exit Narou::EXIT_ERROR_CODE
133
134
  end
134
135
 
135
136
  def physical_support?
data/lib/downloader.rb CHANGED
@@ -14,6 +14,7 @@ require_relative "database"
14
14
  require_relative "inventory"
15
15
  require_relative "narou/api"
16
16
  require_relative "html"
17
+ require_relative "input"
17
18
 
18
19
  #
19
20
  # 小説サイトからのダウンロード
@@ -130,7 +131,9 @@ class Downloader
130
131
  return nil unless data
131
132
  id = data["id"]
132
133
  file_title = data["file_title"] || data["title"] # 互換性維持のための処理
133
- path = File.join(Database.archive_root_path, data["sitename"], file_title)
134
+ use_subdirectory = data["use_subdirectory"] || false
135
+ subdirectory = use_subdirectory ? create_subdirecotry_name(file_title) : ""
136
+ path = File.join(Database.archive_root_path, data["sitename"], subdirectory, file_title)
134
137
  if File.exist?(path)
135
138
  return path
136
139
  else
@@ -221,7 +224,7 @@ class Downloader
221
224
  setting = @@settings.find { |s| s["name"] == sitename }
222
225
  return setting if setting
223
226
  error "#{sitename} の設定ファイルが見つかりません"
224
- exit 1
227
+ exit Narou::EXIT_ERROR_CODE
225
228
  end
226
229
 
227
230
  #
@@ -239,11 +242,11 @@ class Downloader
239
242
  end
240
243
  if settings.empty?
241
244
  error "小説サイトの定義ファイルがひとつもありません"
242
- exit 1
245
+ exit Narou::EXIT_ERROR_CODE
243
246
  end
244
247
  unless @@narou
245
248
  error "小説家になろうの定義ファイルが見つかりませんでした"
246
- exit 1
249
+ exit Narou::EXIT_ERROR_CODE
247
250
  end
248
251
  settings
249
252
  end
@@ -270,6 +273,13 @@ class Downloader
270
273
  nil
271
274
  end
272
275
 
276
+ #
277
+ # サブディレクトリ名を生成
278
+ #
279
+ def self.create_subdirecotry_name(title)
280
+ title.start_with?("n") ? title[1..2] : title[0..1]
281
+ end
282
+
273
283
  if Narou.already_init?
274
284
  @@settings = load_settings
275
285
  @@database = Database.instance
@@ -289,6 +299,7 @@ class Downloader
289
299
  @novel_data_dir = nil
290
300
  @novel_status = nil
291
301
  @id = @@database.get_id("toc_url", @setting["toc_url"]) || @@database.get_new_id
302
+ @new_novel = @@database[@id].!
292
303
  @section_download_cache = {}
293
304
 
294
305
  # ウェイト管理関係初期化
@@ -302,11 +313,25 @@ class Downloader
302
313
  @@max_steps_wait_time = [STEPS_WAIT_TIME, @@interval_sleep_time].max
303
314
  end
304
315
  @download_wait_steps = Inventory.load("local_setting", :local)["download.wait-steps"] || 0
316
+ @download_use_subdirectory = use_subdirectory?
305
317
  if @setting["is_narou"] && (@download_wait_steps > 10 || @download_wait_steps == 0)
306
318
  @download_wait_steps = 10
307
319
  end
308
320
  end
309
321
 
322
+ #
323
+ # サブディレクトリに保存してあるかどうか
324
+ #
325
+ def use_subdirectory?
326
+ if @new_novel
327
+ # 新規DLする小説
328
+ Inventory.load("local_setting", :local)["download.use-subdirectory"] || false
329
+ else
330
+ # すでにDL済みの小説
331
+ @@database[@id]["use_subdirectory"] || false
332
+ end
333
+ end
334
+
310
335
  #
311
336
  # 18歳以上か確認する
312
337
  #
@@ -315,7 +340,7 @@ class Downloader
315
340
  if global_setting.include?("over18")
316
341
  return global_setting["over18"]
317
342
  end
318
- if Helper.confirm("年齢認証:あなたは18歳以上ですか")
343
+ if Narou::Input.confirm("年齢認証:あなたは18歳以上ですか")
319
344
  global_setting["over18"] = true
320
345
  global_setting.save
321
346
  return true
@@ -351,7 +376,7 @@ class Downloader
351
376
  return :canceled
352
377
  end
353
378
  end
354
- old_toc = load_novel_data(TOC_FILE_NAME)
379
+ old_toc = @new_novel ? nil : load_novel_data(TOC_FILE_NAME)
355
380
  unless old_toc
356
381
  init_novel_dir
357
382
  old_toc = {}
@@ -388,7 +413,7 @@ class Downloader
388
413
  rescue Interrupt
389
414
  remove_cache_dir
390
415
  puts "ダウンロードを中断しました"
391
- exit 1
416
+ exit Narou::EXIT_ERROR_CODE
392
417
  end
393
418
  update_database
394
419
  :ok
@@ -404,7 +429,7 @@ class Downloader
404
429
  :none
405
430
  end
406
431
  save_novel_data(TOC_FILE_NAME, latest_toc)
407
- tags = @@database[@id]["tags"] || []
432
+ tags = @new_novel ? [] : @@database[@id]["tags"] || []
408
433
  if novel_end?
409
434
  unless tags.include?("end")
410
435
  update_database if update_subtitles.count == 0
@@ -440,17 +465,28 @@ class Downloader
440
465
  latest_subtitles_count = latest_toc["subtitles"].size
441
466
  old_subtitles_count = old_toc["subtitles"].size
442
467
  if latest_subtitles_count < old_subtitles_count
443
- STDOUT.puts "#{latest_toc["title"]}"
444
- STDOUT.puts "更新後の話数が保存されている話数より減少していることを検知しました"
445
- STDOUT.puts "ダイジェスト化されている可能性があるので、更新に関しての処理を選択して下さい"
446
- digest_output_interface(old_subtitles_count, latest_subtitles_count)
447
- unless STDIN.tty?
448
- puts "2"
449
- return true
450
- end
451
- while input = $stdin.getch
452
- puts input
453
- case input
468
+ title = latest_toc["title"]
469
+ message = <<-EOS
470
+ 更新後の話数が保存されている話数より減少していることを検知しました。
471
+ ダイジェスト化されている可能性があるので、更新に関しての処理を選択して下さい。
472
+
473
+ 保存済み話数: #{old_subtitles_count}
474
+ 更新後の話数: #{latest_subtitles_count}
475
+
476
+ EOS
477
+ choices = {
478
+ "1" => "このまま更新する",
479
+ "2" => "更新をキャンセル",
480
+ "3" => "更新をキャンセルして小説を凍結する",
481
+ "4" => "バックアップを作成する",
482
+ "5" => "最新のあらすじを表示する",
483
+ "6" => "小説ページをブラウザで開く",
484
+ "7" => "保存フォルダを開く",
485
+ default: "2"
486
+ }
487
+ loop do
488
+ choice = Narou::Input.choose(title, message, choices)
489
+ case choice
454
490
  when "1"
455
491
  return false
456
492
  when "2"
@@ -461,35 +497,26 @@ class Downloader
461
497
  when "4"
462
498
  Command::Backup.execute!([latest_toc["toc_url"]])
463
499
  when "5"
464
- STDOUT.puts "あらすじ"
465
- STDOUT.puts latest_toc["story"]
500
+ if Narou.web?
501
+ message = "あらすじ\n#{latest_toc["story"]}\n"
502
+ else
503
+ puts "あらすじ"
504
+ puts latest_toc["story"]
505
+ end
466
506
  when "6"
467
507
  Helper.open_browser(latest_toc["toc_url"])
468
508
  when "7"
469
509
  Helper.open_directory(Downloader.get_novel_data_dir_by_target(latest_toc["toc_url"]))
470
510
  end
471
- digest_output_interface(old_subtitles_count, latest_subtitles_count)
511
+ unless Narou.web?
512
+ message = "" # 長いので二度は表示しない
513
+ end
472
514
  end
473
515
  else
474
516
  return false
475
517
  end
476
518
  end
477
519
 
478
- def digest_output_interface(old_subtitles_count, latest_subtitles_count)
479
- STDOUT.puts
480
- STDOUT.puts "保存済み話数: #{old_subtitles_count}"
481
- STDOUT.puts "更新後の話数: #{latest_subtitles_count}"
482
- STDOUT.puts
483
- STDOUT.puts "1: このまま更新する"
484
- STDOUT.puts "2: 更新をキャンセル"
485
- STDOUT.puts "3: 更新をキャンセルして小説を凍結する"
486
- STDOUT.puts "4: バックアップを作成する"
487
- STDOUT.puts "5: 最新のあらすじを表示する"
488
- STDOUT.puts "6: 小説ページをブラウザで開く"
489
- STDOUT.puts "7: 保存フォルダを開く"
490
- STDOUT.print "選択する処理の番号を入力: "
491
- end
492
-
493
520
  #
494
521
  # 差分用キャッシュ保存ディレクトリ作成
495
522
  #
@@ -523,6 +550,7 @@ class Downloader
523
550
  "end" => novel_end?,
524
551
  "last_update" => Time.now,
525
552
  "new_arrivals_date" => (@new_arrivals ? Time.now : @@database[@id]["new_arrivals_date"]),
553
+ "use_subdirectory" => @download_use_subdirectory,
526
554
  }
527
555
  if @@database[@id]
528
556
  @@database[@id].merge!(data)
@@ -954,7 +982,7 @@ class Downloader
954
982
  if e.message =~ /^503/
955
983
  if retry_count == 0
956
984
  error "上限までリトライしましたがファイルがダウンロード出来ませんでした"
957
- exit 1
985
+ exit Narou::EXIT_ERROR_CODE
958
986
  end
959
987
  retry_count -= 1
960
988
  puts
@@ -1043,7 +1071,8 @@ class Downloader
1043
1071
  def get_novel_data_dir
1044
1072
  return @novel_data_dir if @novel_data_dir
1045
1073
  raise "小説名がまだ設定されていません" unless get_file_title
1046
- @novel_data_dir = File.join(Database.archive_root_path, @setting["name"], get_file_title)
1074
+ subdirectory = @download_use_subdirectory ? Downloader.create_subdirecotry_name(get_file_title) : ""
1075
+ @novel_data_dir = File.join(Database.archive_root_path, @setting["name"], subdirectory, get_file_title)
1047
1076
  @novel_data_dir
1048
1077
  end
1049
1078