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.
- checksums.yaml +5 -13
- data/.gitignore +1 -0
- data/ChangeLog.md +35 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +100 -0
- data/README.md +28 -39
- data/lib/color.rb +0 -2
- data/lib/command.rb +1 -0
- data/lib/command/convert.rb +33 -4
- data/lib/command/diff.rb +5 -4
- data/lib/command/download.rb +9 -1
- data/lib/command/flag.rb +2 -2
- data/lib/command/list.rb +1 -1
- data/lib/command/mail.rb +3 -3
- data/lib/command/remove.rb +2 -1
- data/lib/command/send.rb +7 -6
- data/lib/command/setting.rb +39 -95
- data/lib/command/tag.rb +25 -13
- data/lib/command/update.rb +6 -1
- data/lib/command/version.rb +5 -1
- data/lib/command/web.rb +111 -0
- data/lib/commandbase.rb +5 -2
- data/lib/commandline.rb +16 -0
- data/lib/converterbase.rb +20 -14
- data/lib/device.rb +5 -4
- data/lib/downloader.rb +68 -39
- data/lib/eventable.rb +72 -0
- data/lib/helper.rb +105 -37
- data/lib/ini.rb +2 -1
- data/lib/input.rb +68 -0
- data/lib/inventory.rb +4 -0
- data/lib/kindlestrip.rb +2 -2
- data/lib/logger.rb +41 -19
- data/lib/narou.rb +10 -0
- data/lib/narou/api.rb +1 -1
- data/lib/novelconverter.rb +8 -21
- data/lib/novelsetting.rb +79 -4
- data/lib/version.rb +1 -1
- data/lib/web/all.rb +12 -0
- data/lib/web/appserver.rb +612 -0
- data/lib/web/helper4web.rb +15 -0
- data/lib/web/progressbar4web.rb +32 -0
- data/lib/web/public/favicon.ico +0 -0
- data/lib/web/public/resources/bootbox.min.js +6 -0
- data/lib/web/public/resources/common.ui.js +143 -0
- data/lib/web/public/resources/dataTables.colVis.js +1113 -0
- data/lib/web/public/resources/help/rect_select.png +0 -0
- data/lib/web/public/resources/help/ssmain.png +0 -0
- data/lib/web/public/resources/help/tag.png +0 -0
- data/lib/web/public/resources/jquery.moveto.js +44 -0
- data/lib/web/public/resources/jquery.outerclick.js +60 -0
- data/lib/web/public/resources/jquery.slidenavbar.js +89 -0
- data/lib/web/public/resources/narou.library.js +815 -0
- data/lib/web/public/resources/narou.ui.js +993 -0
- data/lib/web/public/resources/perfect-scrollbar.min.css +5 -0
- data/lib/web/public/resources/perfect-scrollbar.min.js +4 -0
- data/lib/web/public/resources/shortcut.js +223 -0
- data/lib/web/public/resources/sort_asc.png +0 -0
- data/lib/web/public/resources/sort_desc.png +0 -0
- data/lib/web/public/resources/toggle-switch.css +322 -0
- data/lib/web/public/robots.txt +3 -0
- data/lib/web/public/test/jquery.outerclick.html +72 -0
- data/lib/web/pushserver.rb +110 -0
- data/lib/web/settingmessages.rb +14 -0
- data/lib/web/streaminginput.rb +103 -0
- data/lib/web/streaminglogger.rb +52 -0
- data/lib/web/views/about.haml +11 -0
- data/lib/web/views/help.haml +105 -0
- data/lib/web/views/index.haml +245 -0
- data/lib/web/views/js/widget.erb +74 -0
- data/lib/web/views/layout.haml +49 -0
- data/lib/web/views/novels/setting.haml +177 -0
- data/lib/web/views/settings.haml +115 -0
- data/lib/web/views/style.scss +737 -0
- data/lib/web/views/widget.haml +39 -0
- data/lib/web/web-socket-ruby/.gitignore +1 -0
- data/lib/web/web-socket-ruby/README.txt +75 -0
- data/lib/web/web-socket-ruby/lib/web_socket.rb +601 -0
- data/lib/web/web-socket-ruby/samples/chat_server.rb +58 -0
- data/lib/web/web-socket-ruby/samples/echo_server.rb +33 -0
- data/lib/web/web-socket-ruby/samples/stdio_client.rb +25 -0
- data/lib/web/worker.rb +87 -0
- data/narou.gemspec +36 -3
- data/narou.rb +8 -6
- data/preset/ncode.syosetu.com/n8725k/converter.rb +2 -1
- data/spec/data/convert_test/replace/correct_test_replace.txt +1 -1
- data/spec/data/convert_test/replace/test_replace.txt +1 -1
- data/spec/data/convert_test/ruby/correct_test_ruby.txt +18 -1
- data/spec/data/convert_test/ruby/test_ruby.txt +18 -0
- data/spec/downloader_spec.rb +37 -0
- data/spec/eventable_spec.rb +172 -0
- data/spec/exit_code_spec.rb +67 -0
- data/spec/helper_spec.rb +72 -0
- data/spec/input_spec.rb +76 -0
- data/spec/logger_spec.rb +53 -0
- data/spec/novelsetting_spec.rb +35 -0
- data/spec/worker_spec.rb +56 -0
- data/template/ibunko_novel.txt.erb +2 -2
- data/template/novel.txt.erb +2 -2
- metadata +213 -29
data/lib/command/version.rb
CHANGED
@@ -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
|
-
|
19
|
+
"#{::Version} build #{commitversion}"
|
16
20
|
end
|
17
21
|
end
|
18
22
|
end
|
data/lib/command/web.rb
ADDED
@@ -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
|
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
|
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!(/(.+?)
|
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
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
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
|
-
"
|
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
|
130
|
+
rescue SendFailure => e
|
130
131
|
puts
|
131
132
|
error $@.shift + ": #{e.message} (#{e.class})"
|
132
|
-
exit
|
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
|
-
|
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
|
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
|
245
|
+
exit Narou::EXIT_ERROR_CODE
|
243
246
|
end
|
244
247
|
unless @@narou
|
245
248
|
error "小説家になろうの定義ファイルが見つかりませんでした"
|
246
|
-
exit
|
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
|
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
|
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
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
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
|
-
|
465
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
|