lib/downloader.rb in narou-1.7.2 vs lib/downloader.rb in narou-2.0.0
- old
+ new
@@ -12,10 +12,11 @@
require_relative "template"
require_relative "database"
require_relative "inventory"
require_relative "narou/api"
require_relative "html"
+require_relative "input"
#
# 小説サイトからのダウンロード
#
class Downloader
@@ -128,11 +129,13 @@
data = @@database[target.to_i]
end
return nil unless data
id = data["id"]
file_title = data["file_title"] || data["title"] # 互換性維持のための処理
- path = File.join(Database.archive_root_path, data["sitename"], file_title)
+ use_subdirectory = data["use_subdirectory"] || false
+ subdirectory = use_subdirectory ? create_subdirecotry_name(file_title) : ""
+ path = File.join(Database.archive_root_path, data["sitename"], subdirectory, file_title)
if File.exist?(path)
return path
else
@@database.delete(id)
@@database.save_database
@@ -219,11 +222,11 @@
def self.get_sitesetting_by_sitename(sitename)
setting = @@settings.find { |s| s["name"] == sitename }
return setting if setting
error "#{sitename} の設定ファイルが見つかりません"
- exit 1
+ exit Narou::EXIT_ERROR_CODE
end
#
# 小説サイトの定義ファイルを全部読み込む
#
@@ -237,15 +240,15 @@
end
settings << setting
end
if settings.empty?
error "小説サイトの定義ファイルがひとつもありません"
- exit 1
+ exit Narou::EXIT_ERROR_CODE
end
unless @@narou
error "小説家になろうの定義ファイルが見つかりませんでした"
- exit 1
+ exit Narou::EXIT_ERROR_CODE
end
settings
end
#
@@ -268,10 +271,17 @@
return Dir.glob("#{dir}/*")
end
nil
end
+ #
+ # サブディレクトリ名を生成
+ #
+ def self.create_subdirecotry_name(title)
+ title.start_with?("n") ? title[1..2] : title[0..1]
+ end
+
if Narou.already_init?
@@settings = load_settings
@@database = Database.instance
end
@@ -287,10 +297,11 @@
@cache_dir = nil
@new_arrivals = false
@novel_data_dir = nil
@novel_status = nil
@id = @@database.get_id("toc_url", @setting["toc_url"]) || @@database.get_new_id
+ @new_novel = @@database[@id].!
@section_download_cache = {}
# ウェイト管理関係初期化
@@__run_once ||= false
unless @@__run_once
@@ -300,24 +311,38 @@
@@interval_sleep_time = Inventory.load("local_setting", :local)["download.interval"] || 0
@@interval_sleep_time = 0 if @@interval_sleep_time < 0
@@max_steps_wait_time = [STEPS_WAIT_TIME, @@interval_sleep_time].max
end
@download_wait_steps = Inventory.load("local_setting", :local)["download.wait-steps"] || 0
+ @download_use_subdirectory = use_subdirectory?
if @setting["is_narou"] && (@download_wait_steps > 10 || @download_wait_steps == 0)
@download_wait_steps = 10
end
end
#
+ # サブディレクトリに保存してあるかどうか
+ #
+ def use_subdirectory?
+ if @new_novel
+ # 新規DLする小説
+ Inventory.load("local_setting", :local)["download.use-subdirectory"] || false
+ else
+ # すでにDL済みの小説
+ @@database[@id]["use_subdirectory"] || false
+ end
+ end
+
+ #
# 18歳以上か確認する
#
def confirm_over18?
global_setting = Inventory.load("global_setting", :global)
if global_setting.include?("over18")
return global_setting["over18"]
end
- if Helper.confirm("年齢認証:あなたは18歳以上ですか")
+ if Narou::Input.confirm("年齢認証:あなたは18歳以上ですか")
global_setting["over18"] = true
global_setting.save
return true
else
return false
@@ -349,11 +374,11 @@
unless confirm_over18?
puts "18歳以上のみ閲覧出来る小説です。ダウンロードを中止しました"
return :canceled
end
end
- old_toc = load_novel_data(TOC_FILE_NAME)
+ old_toc = @new_novel ? nil : load_novel_data(TOC_FILE_NAME)
unless old_toc
init_novel_dir
old_toc = {}
@new_arrivals = true
end
@@ -386,11 +411,11 @@
remove_cache_dir
end
rescue Interrupt
remove_cache_dir
puts "ダウンロードを中断しました"
- exit 1
+ exit Narou::EXIT_ERROR_CODE
end
update_database
:ok
elsif old_toc["subtitles"].size > latest_toc["subtitles"].size
# 削除された節がある(かつ更新がない)場合
@@ -402,11 +427,11 @@
:ok
else
:none
end
save_novel_data(TOC_FILE_NAME, latest_toc)
- tags = @@database[@id]["tags"] || []
+ tags = @new_novel ? [] : @@database[@id]["tags"] || []
if novel_end?
unless tags.include?("end")
update_database if update_subtitles.count == 0
$stdout.silence do
Command::Tag.execute!([@id, "--add", "end", "--color", "white"])
@@ -438,60 +463,62 @@
def process_digest(old_toc, latest_toc)
return false unless old_toc["subtitles"]
latest_subtitles_count = latest_toc["subtitles"].size
old_subtitles_count = old_toc["subtitles"].size
if latest_subtitles_count < old_subtitles_count
- STDOUT.puts "#{latest_toc["title"]}"
- STDOUT.puts "更新後の話数が保存されている話数より減少していることを検知しました"
- STDOUT.puts "ダイジェスト化されている可能性があるので、更新に関しての処理を選択して下さい"
- digest_output_interface(old_subtitles_count, latest_subtitles_count)
- unless STDIN.tty?
- puts "2"
- return true
- end
- while input = $stdin.getch
- puts input
- case input
+ title = latest_toc["title"]
+ message = <<-EOS
+更新後の話数が保存されている話数より減少していることを検知しました。
+ダイジェスト化されている可能性があるので、更新に関しての処理を選択して下さい。
+
+保存済み話数: #{old_subtitles_count}
+更新後の話数: #{latest_subtitles_count}
+
+ EOS
+ choices = {
+ "1" => "このまま更新する",
+ "2" => "更新をキャンセル",
+ "3" => "更新をキャンセルして小説を凍結する",
+ "4" => "バックアップを作成する",
+ "5" => "最新のあらすじを表示する",
+ "6" => "小説ページをブラウザで開く",
+ "7" => "保存フォルダを開く",
+ default: "2"
+ }
+ loop do
+ choice = Narou::Input.choose(title, message, choices)
+ case choice
when "1"
return false
when "2"
return true
when "3"
Command::Freeze.execute!([latest_toc["toc_url"]])
return true
when "4"
Command::Backup.execute!([latest_toc["toc_url"]])
when "5"
- STDOUT.puts "あらすじ"
- STDOUT.puts latest_toc["story"]
+ if Narou.web?
+ message = "あらすじ\n#{latest_toc["story"]}\n"
+ else
+ puts "あらすじ"
+ puts latest_toc["story"]
+ end
when "6"
Helper.open_browser(latest_toc["toc_url"])
when "7"
Helper.open_directory(Downloader.get_novel_data_dir_by_target(latest_toc["toc_url"]))
end
- digest_output_interface(old_subtitles_count, latest_subtitles_count)
+ unless Narou.web?
+ message = "" # 長いので二度は表示しない
+ end
end
else
return false
end
end
- def digest_output_interface(old_subtitles_count, latest_subtitles_count)
- STDOUT.puts
- STDOUT.puts "保存済み話数: #{old_subtitles_count}"
- STDOUT.puts "更新後の話数: #{latest_subtitles_count}"
- STDOUT.puts
- STDOUT.puts "1: このまま更新する"
- STDOUT.puts "2: 更新をキャンセル"
- STDOUT.puts "3: 更新をキャンセルして小説を凍結する"
- STDOUT.puts "4: バックアップを作成する"
- STDOUT.puts "5: 最新のあらすじを表示する"
- STDOUT.puts "6: 小説ページをブラウザで開く"
- STDOUT.puts "7: 保存フォルダを開く"
- STDOUT.print "選択する処理の番号を入力: "
- end
-
#
# 差分用キャッシュ保存ディレクトリ作成
#
def create_cache_dir
now = Time.now
@@ -521,10 +548,11 @@
"sitename" => @setting["name"],
"novel_type" => get_novel_type,
"end" => novel_end?,
"last_update" => Time.now,
"new_arrivals_date" => (@new_arrivals ? Time.now : @@database[@id]["new_arrivals_date"]),
+ "use_subdirectory" => @download_use_subdirectory,
}
if @@database[@id]
@@database[@id].merge!(data)
else
@@database[@id] = data
@@ -952,11 +980,11 @@
end
rescue OpenURI::HTTPError => e
if e.message =~ /^503/
if retry_count == 0
error "上限までリトライしましたがファイルがダウンロード出来ませんでした"
- exit 1
+ exit Narou::EXIT_ERROR_CODE
end
retry_count -= 1
puts
warn "server message: #{e.message}"
warn "リトライ待機中……"
@@ -1041,10 +1069,11 @@
# 小説データの格納ディレクトリパス
#
def get_novel_data_dir
return @novel_data_dir if @novel_data_dir
raise "小説名がまだ設定されていません" unless get_file_title
- @novel_data_dir = File.join(Database.archive_root_path, @setting["name"], get_file_title)
+ subdirectory = @download_use_subdirectory ? Downloader.create_subdirecotry_name(get_file_title) : ""
+ @novel_data_dir = File.join(Database.archive_root_path, @setting["name"], subdirectory, get_file_title)
@novel_data_dir
end
#
# 小説本文の保存パスを生成