Class: ImagesConvert::Configuration

Inherits:
Object
  • Object
show all
Defined in:
lib/images_convert/configuration.rb

Constant Summary collapse

CONFIG_FILE =
File.expand_path('~/.images-convert/config.yml')

Class Method Summary collapse

Class Method Details

.config ⇒ Object



299
300
301
# File 'lib/images_convert/configuration.rb', line 299

def self.config
  @config
end

.create_default_config ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/images_convert/configuration.rb', line 21

def self.create_default_config
  default_config = {
    'defaults' => {
      'from' => 'HEIC',
      'to' => 'JPG',
      'resize' => '1920x'
    },
    'directories' => {
      'input' => File.expand_path('~/Downloads'),
      'output' => File.expand_path('~/Desktop')
    },
    'selection' => {
      'latest_mode' => 'mtime'
    },
    'waifu2x' => {
      'scale' => 2,
      'noise' => 1,
      'model' => 'photo',
      'auto_scale_a4' => true,
      'a4_print' => true,
      'image_format' => 'webp',
      'on_error' => 'stop'
    },
    'output' => {
      'image_quality' => 90,
      'pdf_quality' => 90,
      'pdf_compression' => 'jpeg',
      'pdf_density' => 300
    }
  }

  FileUtils.mkdir_p(File.dirname(CONFIG_FILE))
  File.write(CONFIG_FILE, default_config.to_yaml)

  # 初回メッセージ表示(重複防止のため、configコマンドでの表示を抑制)
  @first_run_message_displayed = true
  puts "設定ファイルを作成しました: #{CONFIG_FILE}"
  puts "デフォルト設定:"
  puts "  入力形式: #{default_config['defaults']['from']}"
  puts "  出力形式: #{default_config['defaults']['to']}"
  puts "  リサイズ: #{default_config['defaults']['resize']}"
  puts "  入力ディレクトリ: #{default_config['directories']['input']}"
  puts "  出力ディレクトリ: #{default_config['directories']['output']}"
  puts "  最新判定モード: #{default_config['selection']['latest_mode']}"
  puts "  waifu2x 既定倍率: #{default_config['waifu2x']['scale']}"
  puts "  waifu2x ノイズ除去: #{default_config['waifu2x']['noise']}"
  puts "  waifu2x モデル: #{default_config['waifu2x']['model']}"
  puts "  出力画像品質: #{default_config['output']['image_quality']}"
  puts "  PDF 品質: #{default_config['output']['pdf_quality']}"
  puts "  PDF DPI: #{default_config['output']['pdf_density']}"
  puts ""
  puts "設定を変更するには:"
  puts "  images-convert set FROM TO RESIZE  (または: imgconv set ...)"
  puts "  images-convert set-dir INPUT_DIR OUTPUT_DIR  (または: imgconv set-dir ...)"
  puts "  images-convert set-latest-mode MODE (mtime / exif)"
  puts ""

  default_config
end

.default_from ⇒ Object



87
88
89
90
# File 'lib/images_convert/configuration.rb', line 87

def self.default_from
  cfg = load
  cfg.dig('defaults', 'from') || 'HEIC'
end

.default_input_dir ⇒ Object



182
183
184
185
# File 'lib/images_convert/configuration.rb', line 182

def self.default_input_dir
  cfg = load
  cfg.dig('directories', 'input') || File.expand_path('~/Downloads')
end

.default_latest_mode ⇒ Object



102
103
104
105
106
# File 'lib/images_convert/configuration.rb', line 102

def self.default_latest_mode
  cfg = load
  mode = cfg.dig('selection', 'latest_mode')
  %w[mtime exif].include?(mode) ? mode : 'mtime'
end

.default_output_dir ⇒ Object



187
188
189
190
# File 'lib/images_convert/configuration.rb', line 187

def self.default_output_dir
  cfg = load
  cfg.dig('directories', 'output') || File.expand_path('~/Desktop')
end

.default_output_image_quality ⇒ Object



144
145
146
147
148
149
150
151
152
# File 'lib/images_convert/configuration.rb', line 144

def self.default_output_image_quality
  cfg = load
  quality = cfg.dig('output', 'image_quality')
  return 90 if quality.nil?
  q = quality.to_i
  q = 100 if q > 100
  q = 1 if q < 1
  q
end

.default_output_pdf_compression ⇒ Object



164
165
166
167
168
169
170
# File 'lib/images_convert/configuration.rb', line 164

def self.default_output_pdf_compression
  cfg = load
  value = cfg.dig('output', 'pdf_compression')
  return 'jpeg' if value.nil? || value.to_s.strip.empty?
  normalized = value.to_s.strip.downcase
  %w[jpeg jpeg2000 zip].include?(normalized) ? normalized : 'jpeg'
end

.default_output_pdf_density ⇒ Object



172
173
174
175
176
177
178
179
180
# File 'lib/images_convert/configuration.rb', line 172

def self.default_output_pdf_density
  cfg = load
  density = cfg.dig('output', 'pdf_density')
  return 300 if density.nil?
  d = density.to_i
  d = 1200 if d > 1200
  d = 72 if d < 72
  d
end

.default_output_pdf_quality ⇒ Object



154
155
156
157
158
159
160
161
162
# File 'lib/images_convert/configuration.rb', line 154

def self.default_output_pdf_quality
  cfg = load
  quality = cfg.dig('output', 'pdf_quality')
  return 90 if quality.nil?
  q = quality.to_i
  q = 100 if q > 100
  q = 1 if q < 1
  q
end

.default_resize ⇒ Object



97
98
99
100
# File 'lib/images_convert/configuration.rb', line 97

def self.default_resize
  cfg = load
  cfg.dig('defaults', 'resize') || '1920x'
end

.default_to ⇒ Object



92
93
94
95
# File 'lib/images_convert/configuration.rb', line 92

def self.default_to
  cfg = load
  cfg.dig('defaults', 'to') || 'JPG'
end

.default_waifu2x_a4_print ⇒ Object



128
129
130
131
# File 'lib/images_convert/configuration.rb', line 128

def self.default_waifu2x_a4_print
  cfg = load
  cfg.dig('waifu2x', 'a4_print').nil? ? true : cfg.dig('waifu2x', 'a4_print')
end

.default_waifu2x_auto_scale_a4 ⇒ Object



123
124
125
126
# File 'lib/images_convert/configuration.rb', line 123

def self.default_waifu2x_auto_scale_a4
  cfg = load
  cfg.dig('waifu2x', 'auto_scale_a4').nil? ? true : cfg.dig('waifu2x', 'auto_scale_a4')
end

.default_waifu2x_image_format ⇒ Object



133
134
135
136
# File 'lib/images_convert/configuration.rb', line 133

def self.default_waifu2x_image_format
  cfg = load
  cfg.dig('waifu2x', 'image_format') || 'webp'
end

.default_waifu2x_model ⇒ Object



118
119
120
121
# File 'lib/images_convert/configuration.rb', line 118

def self.default_waifu2x_model
  cfg = load
  cfg.dig('waifu2x', 'model') || 'photo'
end

.default_waifu2x_noise ⇒ Object



113
114
115
116
# File 'lib/images_convert/configuration.rb', line 113

def self.default_waifu2x_noise
  cfg = load
  (cfg.dig('waifu2x', 'noise') || 1).to_i
end

.default_waifu2x_on_error ⇒ Object



138
139
140
141
142
# File 'lib/images_convert/configuration.rb', line 138

def self.default_waifu2x_on_error
  cfg = load
  value = cfg.dig('waifu2x', 'on_error') || 'stop'
  %w[skip stop].include?(value) ? value : 'stop'
end

.default_waifu2x_scale ⇒ Object



108
109
110
111
# File 'lib/images_convert/configuration.rb', line 108

def self.default_waifu2x_scale
  cfg = load
  (cfg.dig('waifu2x', 'scale') || 2).to_i
end

.first_run_message_displayed? ⇒ Boolean

Returns:

  • (Boolean)


293
294
295
# File 'lib/images_convert/configuration.rb', line 293

def self.first_run_message_displayed?
  @first_run_message_displayed ||= false
end

.load ⇒ Object



10
11
12
13
14
15
16
17
18
19
# File 'lib/images_convert/configuration.rb', line 10

def self.load
  @config ||= begin
    if File.exist?(CONFIG_FILE)
      YAML.safe_load(File.read(CONFIG_FILE)) || {}
    else
      # 設定ファイルが存在しない場合はデフォルト設定で作成
      create_default_config
    end
  end
end

.reset_to_defaults ⇒ Object



81
82
83
84
85
# File 'lib/images_convert/configuration.rb', line 81

def self.reset_to_defaults
  FileUtils.rm_f(CONFIG_FILE)
  @config = nil
  create_default_config
end

.save_defaults(from:, to:, resize:) ⇒ Object



192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/images_convert/configuration.rb', line 192

def self.save_defaults(from:, to:, resize:)
  config = load
  config['defaults'] ||= {}
  config['defaults']['from'] = from
  config['defaults']['to'] = to
  config['defaults']['resize'] = resize

  FileUtils.mkdir_p(File.dirname(CONFIG_FILE))
  File.write(CONFIG_FILE, config.to_yaml)
  # 変更を即時反映させるためキャッシュを無効化
  @config = nil
end

.save_directories(input_dir:, output_dir:) ⇒ Object



205
206
207
208
209
210
211
212
213
214
215
# File 'lib/images_convert/configuration.rb', line 205

def self.save_directories(input_dir:, output_dir:)
  config = load
  config['directories'] ||= {}
  config['directories']['input'] = input_dir
  config['directories']['output'] = output_dir

  FileUtils.mkdir_p(File.dirname(CONFIG_FILE))
  File.write(CONFIG_FILE, config.to_yaml)
  # 変更を即時反映
  @config = nil
end

.save_latest_mode(mode) ⇒ Object



217
218
219
220
221
222
223
224
225
226
227
228
229
# File 'lib/images_convert/configuration.rb', line 217

def self.save_latest_mode(mode)
  unless %w[mtime exif].include?(mode)
    raise ArgumentError, "MODE には mtime または exif を指定してください。"
  end

  config = load
  config['selection'] ||= {}
  config['selection']['latest_mode'] = mode

  FileUtils.mkdir_p(File.dirname(CONFIG_FILE))
  File.write(CONFIG_FILE, config.to_yaml)
  @config = nil
end

.save_output_settings(image_quality:, pdf_quality:, pdf_compression: 'jpeg', pdf_density: 300) ⇒ Object



247
248
249
250
251
252
253
254
255
256
257
258
# File 'lib/images_convert/configuration.rb', line 247

def self.save_output_settings(image_quality:, pdf_quality:, pdf_compression: 'jpeg', pdf_density: 300)
  config = load
  config['output'] ||= {}
  config['output']['image_quality'] = image_quality
  config['output']['pdf_quality'] = pdf_quality
  config['output']['pdf_compression'] = pdf_compression
  config['output']['pdf_density'] = pdf_density

  FileUtils.mkdir_p(File.dirname(CONFIG_FILE))
  File.write(CONFIG_FILE, config.to_yaml)
  @config = nil
end

.save_waifu2x_settings(scale:, noise:, model:, auto_scale_a4:, a4_print:, image_format:, on_error:) ⇒ Object



231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
# File 'lib/images_convert/configuration.rb', line 231

def self.save_waifu2x_settings(scale:, noise:, model:, auto_scale_a4:, a4_print:, image_format:, on_error:)
  config = load
  config['waifu2x'] ||= {}
  config['waifu2x']['scale'] = scale
  config['waifu2x']['noise'] = noise
  config['waifu2x']['model'] = model
  config['waifu2x']['auto_scale_a4'] = auto_scale_a4
  config['waifu2x']['a4_print'] = a4_print
  config['waifu2x']['image_format'] = image_format
  config['waifu2x']['on_error'] = on_error

  FileUtils.mkdir_p(File.dirname(CONFIG_FILE))
  File.write(CONFIG_FILE, config.to_yaml)
  @config = nil
end

.show_all_settings ⇒ Object



260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# File 'lib/images_convert/configuration.rb', line 260

def self.show_all_settings
  config = load
  {
    defaults: {
      from: default_from,
      to: default_to,
      resize: default_resize
    },
    directories: {
      input: default_input_dir,
      output: default_output_dir
    },
    selection: {
      latest_mode: default_latest_mode
    },
    output: {
      image_quality: default_output_image_quality,
      pdf_quality: default_output_pdf_quality,
      pdf_compression: default_output_pdf_compression,
      pdf_density: default_output_pdf_density
    },
    waifu2x: {
      scale: default_waifu2x_scale,
      noise: default_waifu2x_noise,
      model: default_waifu2x_model,
      auto_scale_a4: default_waifu2x_auto_scale_a4,
      a4_print: default_waifu2x_a4_print,
      image_format: default_waifu2x_image_format,
      on_error: default_waifu2x_on_error
    }
  }
end