diff --git a/lib/granblue/downloaders/base_downloader.rb b/lib/granblue/downloaders/base_downloader.rb index a740adc..60865e4 100644 --- a/lib/granblue/downloaders/base_downloader.rb +++ b/lib/granblue/downloaders/base_downloader.rb @@ -46,15 +46,19 @@ module Granblue end # Download images for all sizes + # @param selected_size [String] The size to download # @return [void] - def download - log_info "-> #{@id}" + def download(selected_size = nil) + log_info("-> #{@id}") return if @test_mode - SIZES.each_with_index do |size, index| + # If a specific size is provided, use only that; otherwise, use all available sizes. + sizes = selected_size ? [selected_size] : SIZES + + sizes.each_with_index do |size, index| path = download_path(size) url = build_url(size) - process_download(url, size, path, last: index == SIZES.size - 1) + process_download(url, size, path, last: index == sizes.size - 1) end end @@ -182,7 +186,7 @@ module Granblue # Log informational message if verbose # @param message [String] Message def log_info(message) - puts message if @verbose + @logger.info(message) if @verbose end # Download elemental variant image @@ -197,12 +201,10 @@ module Granblue filepath = "#{path}/#{filename}" URI.open(url) do |file| content = file.read - if content - File.open(filepath, 'wb') do |output| - output.write(content) - end - else - raise "Failed to read content from #{url}" + raise "Failed to read content from #{url}" unless content + + File.open(filepath, 'wb') do |output| + output.write(content) end end log_info "-> #{size}:\t#{url}..." diff --git a/lib/granblue/downloaders/character_downloader.rb b/lib/granblue/downloaders/character_downloader.rb index 5c45c3c..c5028d5 100644 --- a/lib/granblue/downloaders/character_downloader.rb +++ b/lib/granblue/downloaders/character_downloader.rb @@ -15,24 +15,27 @@ module Granblue # Downloads images for all variants of a character based on their uncap status. # Overrides {BaseDownloader#download} to handle character-specific variants. # + # @param selected_size [String] The size to download. If nil, downloads all sizes. # @return [void] # @note Skips download if character is not found in database # @note Downloads FLB/ULB variants only if character has those uncaps # @see #download_variants - def download + def download(selected_size = nil) character = Character.find_by(granblue_id: @id) return unless character - download_variants(character) + download_variants(character, selected_size) end private # Downloads all variants of a character's images + # # @param character [Character] Character model instance to download images for + # @param selected_size [String] The size to download. If nil, downloads all sizes. # @return [void] # @note Only downloads variants that should exist based on character uncap status - def download_variants(character) + def download_variants(character, selected_size = nil) # All characters have 01 and 02 variants variants = %W[#{@id}_01 #{@id}_02] @@ -45,18 +48,22 @@ module Granblue log_info "Downloading character variants: #{variants.join(', ')}" if @verbose variants.each do |variant_id| - download_variant(variant_id) + download_variant(variant_id, selected_size) end end # Downloads a specific variant's images in all sizes + # # @param variant_id [String] Character variant ID (e.g., "3040001000_01") + # @param selected_size [String] The size to download. If nil, downloads all sizes. # @return [void] - def download_variant(variant_id) + def download_variant(variant_id, selected_size = nil) log_info "-> #{variant_id}" if @verbose return if @test_mode - SIZES.each_with_index do |size, index| + sizes = selected_size ? [selected_size] : SIZES + + sizes.each_with_index do |size, index| path = download_path(size) url = build_variant_url(variant_id, size) process_download(url, size, path, last: index == SIZES.size - 1) @@ -64,8 +71,9 @@ module Granblue end # Builds URL for a specific variant and size + # # @param variant_id [String] Character variant ID - # @param size [String] Image size variant ("main", "grid", or "square") + # @param size [String] Image size variant ("main", "grid", "square", or "detail") # @return [String] Complete URL for downloading the image def build_variant_url(variant_id, size) directory = directory_for_size(size) @@ -85,6 +93,7 @@ module Granblue end # Gets directory name for a size variant + # # @param size [String] Image size variant # @return [String] Directory name in game asset URL structure # @note Maps "main" -> "f", "grid" -> "m", "square" -> "s" diff --git a/lib/granblue/downloaders/summon_downloader.rb b/lib/granblue/downloaders/summon_downloader.rb index 0ac6493..540b9e1 100644 --- a/lib/granblue/downloaders/summon_downloader.rb +++ b/lib/granblue/downloaders/summon_downloader.rb @@ -15,25 +15,28 @@ module Granblue # Downloads images for all variants of a summon based on their uncap status. # Overrides {BaseDownloader#download} to handle summon-specific variants. # + # @param selected_size [String] The size to download. If nil, downloads all sizes. # @return [void] # @note Skips download if summon is not found in database # @note Downloads ULB and transcendence variants only if summon has those uncaps # @see #download_variants - def download + def download(selected_size = nil) summon = Summon.find_by(granblue_id: @id) return unless summon - download_variants(summon) + download_variants(summon, selected_size) end private # Downloads all variants of a summon's images + # # @param summon [Summon] Summon model instance to download images for + # @param selected_size [String] The size to download. If nil, downloads all sizes. # @return [void] # @note Only downloads variants that should exist based on summon uncap status # @note Handles special transcendence art variants for 6★ summons - def download_variants(summon) + def download_variants(summon, selected_size = nil) # All summons have base variant variants = [@id] @@ -41,26 +44,28 @@ module Granblue variants << "#{@id}_02" if summon.ulb # Add Transcendence variants if available - if summon.transcendence - variants.push("#{@id}_03", "#{@id}_04") - end + variants.push("#{@id}_03", "#{@id}_04") if summon.transcendence log_info "Downloading summon variants: #{variants.join(', ')}" if @verbose variants.each do |variant_id| - download_variant(variant_id) + download_variant(variant_id, selected_size) end end # Downloads a specific variant's images in all sizes + # # @param variant_id [String] Summon variant ID (e.g., "2040001000_02") + # @param selected_size [String] The size to download. If nil, downloads all sizes. # @return [void] # @note Downloads all size variants (main/grid/square) for the given variant - def download_variant(variant_id) + def download_variant(variant_id, selected_size = nil) log_info "-> #{variant_id}" if @verbose return if @test_mode - SIZES.each_with_index do |size, index| + sizes = selected_size ? [selected_size] : SIZES + + sizes.each_with_index do |size, index| path = download_path(size) url = build_variant_url(variant_id, size) process_download(url, size, path, last: index == SIZES.size - 1) @@ -68,8 +73,9 @@ module Granblue end # Builds URL for a specific variant and size + # # @param variant_id [String] Summon variant ID - # @param size [String] Image size variant ("main", "grid", or "square") + # @param size [String] Image size variant ("main", "grid", "square", or "detail") # @return [String] Complete URL for downloading the image def build_variant_url(variant_id, size) directory = directory_for_size(size) diff --git a/lib/granblue/downloaders/weapon_downloader.rb b/lib/granblue/downloaders/weapon_downloader.rb index d380a32..834b824 100644 --- a/lib/granblue/downloaders/weapon_downloader.rb +++ b/lib/granblue/downloaders/weapon_downloader.rb @@ -16,25 +16,28 @@ module Granblue # Downloads images for all variants of a weapon based on their uncap status. # Overrides {BaseDownloader#download} to handle weapon-specific variants. # + # @param selected_size [String] The size to download. If nil, downloads all sizes. # @return [void] # @note Skips download if weapon is not found in database # @note Downloads transcendence variants only if weapon has those uncaps # @see #download_variants - def download + def download(selected_size = nil) weapon = Weapon.find_by(granblue_id: @id) return unless weapon - download_variants(weapon) + download_variants(weapon, selected_size) end private # Downloads all variants of a weapon's images + # # @param weapon [Weapon] Weapon model instance to download images for + # @param selected_size [String] The size to download. If nil, downloads all sizes. # @return [void] # @note Only downloads variants that should exist based on weapon uncap status # @note Handles special transcendence art variants for transcendable weapons - def download_variants(weapon) + def download_variants(weapon, selected_size = nil) # All weapons have base variant variants = [@id] @@ -46,19 +49,23 @@ module Granblue log_info "Downloading weapon variants: #{variants.join(', ')}" if @verbose variants.each do |variant_id| - download_variant(variant_id) + download_variant(variant_id, selected_size) end end # Downloads a specific variant's images in all sizes + # # @param variant_id [String] Weapon variant ID (e.g., "1040001000_02") + # @param selected_size [String] The size to download. If nil, downloads all sizes. # @return [void] # @note Downloads all size variants (main/grid/square) for the given variant - def download_variant(variant_id) + def download_variant(variant_id, selected_size = nil) log_info "-> #{variant_id}" if @verbose return if @test_mode - SIZES.each_with_index do |size, index| + sizes = selected_size ? [selected_size] : SIZES + + sizes.each_with_index do |size, index| path = download_path(size) url = build_variant_url(variant_id, size) process_download(url, size, path, last: index == SIZES.size - 1) @@ -66,8 +73,9 @@ module Granblue end # Builds URL for a specific variant and size + # # @param variant_id [String] Weapon variant ID - # @param size [String] Image size variant ("main", "grid", or "square") + # @param size [String] Image size variant ("main", "grid", "square", or "raw") # @return [String] Complete URL for downloading the image def build_variant_url(variant_id, size) directory = directory_for_size(size)