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 # # 小説本文の保存パスを生成