lib/command/update.rb in narou-3.2.5.1 vs lib/command/update.rb in narou-3.3.0

- old
+ new

@@ -1,6 +1,7 @@ -# -*- coding: utf-8 -*- +# frozen_string_literal: true + # # Copyright 2013 whiteleaf. All rights reserved. # require "fileutils" @@ -17,14 +18,10 @@ module Command class Update < CommandBase extend Memoist include Narou::Eventable - LOG_DIR_NAME = "log" - LOG_NUM_LIMIT = 30 # ログの保存する上限数 - LOG_FILENAME_FORMAT = "update_log_%s.txt" - HOTENTRY_DIR_NAME = "hotentry" HOTENTRY_TEMPLATE_NAME = "hotentry.txt" HOTENTRY_TITLE_PATTERN = "hotentry %y/%m/%d %H:%M" HOTENTRY_FILE_PATTERN = "hotentry_%y-%m-%d_%H%M.txt" @@ -60,20 +57,13 @@ Options: EOS @opt.on("-n", "--no-convert", "変換をせずアップデートのみ実行する") { @options["no-convert"] = true } - @opt.on("-a", "--convert-only-new-arrival", "新着のみ変換を実行する") { + @opt.on("-a", "--convert-only-new-arrival", "新着がある場合のみ変換を実行する") { @options["convert-only-new-arrival"] = true } - @opt.on("-l", "--log [N]", "最新からN番目のログを表示する(デフォ1)") { |n| - n = n.to_i - n -= 1 if n > 0 - @options["log"] = n - view_log - exit 0 - } @opt.on("--gl [OPT]", <<-EOS) { |option| データベースに最新話掲載日を反映させる | OPT | 概要 | 指定なし | 全ての小説を対象にする | narou | なろうAPIを使える小説のみ対象 @@ -162,133 +152,88 @@ hotentry_manager = HotentryManager.new interval = Interval.new(@options["interval"]) begin - update_log = $stdout.capture(quiet: false) do - sort_by_key(sort_key, update_target_list).each_with_index do |target, i| - display_message = nil - data = Downloader.get_data_by_target(target) - if !data - display_message = "<bold><red>[ERROR]</red></bold> #{target} は管理小説の中に存在しません".termcolor - elsif Narou.novel_frozen?(target) && !@options["force"] - next if argv.empty? - display_message = "ID:#{data["id"]} #{data["title"]} は凍結中です" - end - Helper.print_horizontal_rule if i > 0 - if display_message - puts display_message - mistook_count += 1 - next - end - interval.wait - downloader = Downloader.new(target) - hotentry_manager.connect(downloader) + sort_by_key(sort_key, update_target_list).each_with_index do |target, i| + display_message = nil + data = Downloader.get_data_by_target(target) + if !data + display_message = "<bold><red>[ERROR]</red></bold> #{target} は管理小説の中に存在しません".termcolor + elsif Narou.novel_frozen?(target) && !@options["force"] + next if argv.empty? + display_message = "ID:#{data["id"]} #{data["title"]} は凍結中です" + end + Helper.print_horizontal_rule if i > 0 + if display_message + puts display_message + mistook_count += 1 + next + end + interval.wait + downloader = Downloader.new(target) + hotentry_manager.connect(downloader) - delete_modified_tag = -> do - tags = data["tags"] || [] - data["tags"] = tags - [Narou::MODIFIED_TAG] if tags.include?(Narou::MODIFIED_TAG) - data["last_check_date"] = Time.now - end + delete_modified_tag = -> do + tags = data["tags"] || [] + data["tags"] = tags - [Narou::MODIFIED_TAG] if tags.include?(Narou::MODIFIED_TAG) + data["last_check_date"] = Time.now + end - result = downloader.start_download - case result.status - when :ok - delete_modified_tag.call - trigger(:success, data) - if @options["no-convert"] || - (@options["convert-only-new-arrival"] && !result.new_arrivals) - interval.force_wait - next - end - when :failed - puts "ID:#{data["id"]} #{data["title"]} の更新は失敗しました" - mistook_count += 1 + result = downloader.start_download + case result.status + when :ok + delete_modified_tag.call + trigger(:success, data) + puts "#{data["title"]} の更新チェックが完了しました" + if @options["no-convert"] || + (@options["convert-only-new-arrival"] && !result.new_arrivals) + interval.force_wait next - when :canceled - puts "ID:#{data["id"]} #{data["title"]} の更新はキャンセルされました" - mistook_count += 1 - next - when :none - delete_modified_tag.call - puts "#{data["title"]} に更新はありません" - next unless data["_convert_failure"] end - - if data["_convert_failure"] - puts "<yellow>前回変換できなかったので再変換します</yellow>".termcolor - end - convert_argv = [target] - convert_argv << "--no-open" if @options["no-open"] - convert_status = Convert.execute!(convert_argv) - if convert_status > 0 - # 変換が失敗したか、中断された - data["_convert_failure"] = true - # 中断された場合には残りのアップデートも中止する - raise Interrupt if convert_status == Narou::EXIT_INTERRUPT - else - # 変換に成功した - data.delete("_convert_failure") - end + when :failed + puts "ID:#{data["id"]} #{data["title"]} の更新は失敗しました" + mistook_count += 1 + next + when :canceled + puts "ID:#{data["id"]} #{data["title"]} の更新はキャンセルされました" + mistook_count += 1 + next + when :none + delete_modified_tag.call + puts "#{data["title"]} に更新はありません" + next unless data["_convert_failure"] end - process_hotentry(hotentry_manager.hotentries) + if data["_convert_failure"] + puts "<yellow>前回変換できなかったので再変換します</yellow>".termcolor + end + convert_argv = [target] + convert_argv << "--no-open" if @options["no-open"] + convert_status = Convert.execute!(convert_argv) + if convert_status > 0 + # 変換が失敗したか、中断された + data["_convert_failure"] = true + # 中断された場合には残りのアップデートも中止する + raise Interrupt if convert_status == Narou::EXIT_INTERRUPT + else + # 変換に成功した + data.delete("_convert_failure") + end end ensure - save_log(update_log) Database.instance.save_database + process_hotentry(hotentry_manager.hotentries) end exit mistook_count if mistook_count > 0 rescue Interrupt puts "アップデートを中断しました" + Narou::Worker.cancel if Narou.concurrency_enabled? exit Narou::EXIT_INTERRUPT end - def get_log_paths - Dir.glob(File.join(log_dirname, LOG_FILENAME_FORMAT % "*")).sort.reverse - end - - def view_log - list = get_log_paths - n = @options["log"] - if list[n] - puts File.read(list[n], encoding: Encoding::UTF_8) - else - error "#{n+1}番目のログはありません" - end - end - - def save_log(log) - return unless @options["logging"] - create_log_dir - now = Time.now - logname = File.join(log_dirname, LOG_FILENAME_FORMAT % now.strftime("%Y%m%d_%H%M%S")) - File.open(logname, "w:UTF-8") do |fp| - fp.puts "--- ログ出力日時 #{now.strftime("%Y/%m/%d %H:%M:%S")} ---" - fp.puts log - end - remove_old_log - end - - def log_dirname - @@__log_dirname ||= File.join(Narou.get_root_dir, LOG_DIR_NAME) - end - - def create_log_dir - logdir = log_dirname - return if File.directory?(logdir) - FileUtils.mkdir_p(logdir) - end - - def remove_old_log - list = get_log_paths - (list[LOG_NUM_LIMIT..-1] || []).each do |path| - File.delete(path) - end - end - def update_general_lastup(option = nil) puts "最新話掲載日を確認しています..." updater = GeneralLastupUpdater.new(@options) updater.update_narou_novels if !option || option == "narou" @@ -334,12 +279,15 @@ begin hotentry.each do |id, subtitles| setting = NovelSetting.load(id, ignore_force, ignore_default) setting.enable_illust = false # 挿絵はパス解決が煩雑なので強制無効 - novel_converter = NovelConverter.new(setting, output_filename, - display_inspector, Update.hotentry_dirname) + novel_converter = NovelConverter.new( + setting, output_filename, + display_inspector, Update.hotentry_dirname, + stream_io: stream_io + ) last_num = 0 novel_converter.on(:"convert_main.loop") do |i| progressbar.output(total_progress + i) last_num = i end @@ -365,14 +313,16 @@ txt_output_path = File.join(Update.hotentry_dirname, now.strftime(HOTENTRY_FILE_PATTERN)) create_inclusive_directory(txt_output_path) File.write(txt_output_path, hotentry_text) # テキストを書籍データに変換 relay_proc = -> { - NovelConverter.convert_txt_to_ebook_file(txt_output_path, { + NovelConverter.convert_txt_to_ebook_file( + txt_output_path, use_dakuten_font: use_dakuten_font, - device: device - }) + device: device, + stream_io: stream_io + ) } if device cmd_convert.extend(device.get_hook_module) cmd_convert.converted_txt_path = txt_output_path cmd_convert.hook_call(:change_settings) @@ -388,24 +338,24 @@ def create_inclusive_directory(path) FileUtils.mkdir_p(File.dirname(path)) end def copy_hotentry(ebook_path, cmd_convert) - cmd_convert.copy_to_converted_file(ebook_path) + cmd_convert.copy_to_converted_file(ebook_path, io: stream_io) end def send_hotentry(ebook_path, cmd_convert) - cmd_convert.send_file_to_device(ebook_path) + cmd_convert.send_file_to_device(ebook_path, io: stream_io) end def mail_hotentry hotentry_manager = HotentryManager.new return unless hotentry_manager.auto_mail? Mail.execute!("hotentry") end def self.hotentry_dirname - @@__hotentry_dirname ||= File.join(Narou.get_root_dir, HOTENTRY_DIR_NAME) + @@__hotentry_dirname ||= File.join(Narou.root_dir, HOTENTRY_DIR_NAME) end def self.get_newest_hotentry_file_path(device) pattern = File.join(Update.hotentry_dirname, "hotentry_*#{device.ebook_file_ext}") Dir.glob(pattern).sort.last