From 8273af0f829b388f920f2184927e6ce2e48087f5 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Sat, 24 Dec 2022 07:29:12 -0800 Subject: [PATCH 1/5] Ignore exported files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index cd72409..5133da9 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,9 @@ # Ignore master key for decrypting credentials and more. /config/master.key +# Ignore exported files +/export + .DS_Store /config/credentials/development.key From c9c52fbf1503acd1c50dd8b90789842f070e14c2 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Sat, 24 Dec 2022 07:29:36 -0800 Subject: [PATCH 2/5] Add rake tasks for exporting URL lists --- lib/tasks/export_all.rake | 38 ++++++++++++++++++++++++++++++ lib/tasks/export_character.rake | 41 +++++++++++++++++++++++++++++++++ lib/tasks/export_summon.rake | 39 +++++++++++++++++++++++++++++++ lib/tasks/export_weapon.rake | 38 ++++++++++++++++++++++++++++++ 4 files changed, 156 insertions(+) create mode 100644 lib/tasks/export_all.rake create mode 100644 lib/tasks/export_character.rake create mode 100644 lib/tasks/export_summon.rake create mode 100644 lib/tasks/export_weapon.rake diff --git a/lib/tasks/export_all.rake b/lib/tasks/export_all.rake new file mode 100644 index 0000000..80198be --- /dev/null +++ b/lib/tasks/export_all.rake @@ -0,0 +1,38 @@ +namespace :granblue do + namespace :export do + desc 'Exports files of URLs for every object at every size' + task :all do + # Run character tasks + Rake::Task['granblue:export:character'].invoke('main') + Rake::Task['granblue:export:character'].reenable + + Rake::Task['granblue:export:character'].invoke('grid') + Rake::Task['granblue:export:character'].reenable + + Rake::Task['granblue:export:character'].invoke('square') + Rake::Task['granblue:export:character'].reenable + + # Run weapon tasks + Rake::Task['granblue:export:weapon'].invoke('main') + Rake::Task['granblue:export:weapon'].reenable + + Rake::Task['granblue:export:weapon'].invoke('grid') + Rake::Task['granblue:export:weapon'].reenable + + Rake::Task['granblue:export:weapon'].invoke('square') + Rake::Task['granblue:export:weapon'].reenable + + # Run summon tasks + Rake::Task['granblue:export:summon'].invoke('main') + Rake::Task['granblue:export:summon'].reenable + + Rake::Task['granblue:export:summon'].invoke('grid') + Rake::Task['granblue:export:summon'].reenable + + Rake::Task['granblue:export:summon'].invoke('square') + Rake::Task['granblue:export:summon'].reenable + + puts 'Exported 9 files' + end + end +end diff --git a/lib/tasks/export_character.rake b/lib/tasks/export_character.rake new file mode 100644 index 0000000..41c5ef0 --- /dev/null +++ b/lib/tasks/export_character.rake @@ -0,0 +1,41 @@ +namespace :granblue do + namespace :export do + def build_chara_url(id, size) + # Set up URL + base_url = 'http://gbf.game-a.mbga.jp/assets/img/sp/assets/npc' + extension = '.jpg' + + directory = 'f' if size.to_s == 'main' + directory = 'm' if size.to_s == 'grid' + directory = 's' if size.to_s == 'square' + + "#{base_url}/#{directory}/#{id}#{extension}" + end + + desc 'Exports a list of character URLs for a given size' + task :character, [:size] => :environment do |_t, args| + # Set up options + size = args[:size] + + # Include character model + Dir.glob("#{Rails.root}/app/models/character.rb").each { |file| require file } + + # Set up filepath + dir = "#{Rails.root}/export/" + FileUtils.mkdir(dir) unless Dir.exist?(dir) + + unless File.exist?("#{dir}/character-#{size}.txt") + File.open("#{dir}/character-#{size}.txt", 'w') do |f| + Character.all.each do |c| + f.write("#{build_chara_url("#{c.granblue_id}_01", size)} \n") + f.write("#{build_chara_url("#{c.granblue_id}_02", size)} \n") + f.write("#{build_chara_url("#{c.granblue_id}_03", size)} \n") if c.flb + f.write("#{build_chara_url("#{c.granblue_id}_04", size)} \n") if c.ulb + end + end + end + + puts "Wrote #{Character.count} character URLs for \"#{size}\" size" + end + end +end diff --git a/lib/tasks/export_summon.rake b/lib/tasks/export_summon.rake new file mode 100644 index 0000000..e5e1d0c --- /dev/null +++ b/lib/tasks/export_summon.rake @@ -0,0 +1,39 @@ +namespace :granblue do + namespace :export do + def build_summon_url(id, size) + # Set up URL + base_url = 'http://gbf.game-a.mbga.jp/assets/img/sp/assets/summon' + extension = '.jpg' + + directory = 'party_main' if size.to_s == 'main' + directory = 'party_sub' if size.to_s == 'grid' + directory = 's' if size.to_s == 'square' + + "#{base_url}/#{directory}/#{id}#{extension}" + end + + desc 'Exports a list of summon URLs for a given size' + task :summon, [:size] => :environment do |_t, args| + # Set up options + size = args[:size] + + # Include character model + Dir.glob("#{Rails.root}/app/models/summon.rb").each { |file| require file } + + # Set up filepath + dir = "#{Rails.root}/export/" + FileUtils.mkdir(dir) unless Dir.exist?(dir) + + unless File.exist?("#{dir}/summon-#{size}.txt") + File.open("#{dir}/summon-#{size}.txt", 'w') do |f| + Summon.all.each do |s| + f.write("#{build_summon_url("#{s.granblue_id}_01", size)} \n") + f.write("#{build_summon_url("#{s.granblue_id}_02", size)} \n") if (s.series == 3 || s.series == 0) && s.ulb + end + end + end + + puts "Wrote #{Summon.count} summon URLs for \"#{size}\" size" + end + end +end diff --git a/lib/tasks/export_weapon.rake b/lib/tasks/export_weapon.rake new file mode 100644 index 0000000..8a6a808 --- /dev/null +++ b/lib/tasks/export_weapon.rake @@ -0,0 +1,38 @@ +namespace :granblue do + namespace :export do + def build_weapon_url(id, size) + # Set up URL + base_url = 'http://gbf.game-a.mbga.jp/assets/img/sp/assets/weapon' + extension = '.jpg' + + directory = 'ls' if size.to_s == 'main' + directory = 'm' if size.to_s == 'grid' + directory = 's' if size.to_s == 'square' + + "#{base_url}/#{directory}/#{id}#{extension}" + end + + desc 'Exports a list of weapon URLs for a given size' + task :weapon, [:size] => :environment do |_t, args| + # Set up options + size = args[:size] + + # Include weapon model + Dir.glob("#{Rails.root}/app/models/weapon.rb").each { |file| require file } + + # Set up filepath + dir = "#{Rails.root}/export/" + FileUtils.mkdir(dir) unless Dir.exist?(dir) + + unless File.exist?("#{dir}/weapon-#{size}.txt") + File.open("#{dir}/weapon-#{size}.txt", 'w') do |f| + Weapon.all.each do |w| + f.write("#{build_weapon_url(w.granblue_id.to_s, size)} \n") + end + end + end + + puts "Wrote #{Weapon.count} weapon URLs for \"#{size}\" size" + end + end +end From 0350d940c6fd29ea5f4abff1bc68a2d0446059cc Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Sat, 24 Dec 2022 14:16:28 -0800 Subject: [PATCH 3/5] Ignore downloaded files --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5133da9..3f3248c 100644 --- a/.gitignore +++ b/.gitignore @@ -31,8 +31,9 @@ # Ignore master key for decrypting credentials and more. /config/master.key -# Ignore exported files +# Ignore exported and downloaded files /export +/download .DS_Store From eb765e246332ea29ba5470f7f265ec84f1a396b3 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Sat, 24 Dec 2022 14:16:45 -0800 Subject: [PATCH 4/5] Update tasks --- lib/tasks/export_character.rake | 20 +++++++++++--------- lib/tasks/export_summon.rake | 20 ++++++++++++++------ lib/tasks/export_weapon.rake | 14 ++++++++------ 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/lib/tasks/export_character.rake b/lib/tasks/export_character.rake index 41c5ef0..cdcd3e1 100644 --- a/lib/tasks/export_character.rake +++ b/lib/tasks/export_character.rake @@ -22,20 +22,22 @@ namespace :granblue do # Set up filepath dir = "#{Rails.root}/export/" + filename = "#{dir}/character-#{size}.txt" FileUtils.mkdir(dir) unless Dir.exist?(dir) - unless File.exist?("#{dir}/character-#{size}.txt") - File.open("#{dir}/character-#{size}.txt", 'w') do |f| - Character.all.each do |c| - f.write("#{build_chara_url("#{c.granblue_id}_01", size)} \n") - f.write("#{build_chara_url("#{c.granblue_id}_02", size)} \n") - f.write("#{build_chara_url("#{c.granblue_id}_03", size)} \n") if c.flb - f.write("#{build_chara_url("#{c.granblue_id}_04", size)} \n") if c.ulb - end + # Write to file + File.open(filename, 'w+') do |f| + Character.all.each do |c| + f.write("#{build_chara_url("#{c.granblue_id}_01", size)} \n") + f.write("#{build_chara_url("#{c.granblue_id}_02", size)} \n") + f.write("#{build_chara_url("#{c.granblue_id}_03", size)} \n") if c.flb + f.write("#{build_chara_url("#{c.granblue_id}_04", size)} \n") if c.ulb end end - puts "Wrote #{Character.count} character URLs for \"#{size}\" size" + # CLI Output + count = `wc -l #{filename}`.split.first.to_i + puts "Wrote #{count} character URLs for \"#{size}\" size" end end end diff --git a/lib/tasks/export_summon.rake b/lib/tasks/export_summon.rake index e5e1d0c..5942ab1 100644 --- a/lib/tasks/export_summon.rake +++ b/lib/tasks/export_summon.rake @@ -22,18 +22,26 @@ namespace :granblue do # Set up filepath dir = "#{Rails.root}/export/" + filename = "#{dir}/summon-#{size}.txt" FileUtils.mkdir(dir) unless Dir.exist?(dir) - unless File.exist?("#{dir}/summon-#{size}.txt") - File.open("#{dir}/summon-#{size}.txt", 'w') do |f| - Summon.all.each do |s| - f.write("#{build_summon_url("#{s.granblue_id}_01", size)} \n") - f.write("#{build_summon_url("#{s.granblue_id}_02", size)} \n") if (s.series == 3 || s.series == 0) && s.ulb + # Write to file + File.open(filename, 'w') do |f| + Summon.all.each do |s| + series = s.series.to_i + f.write("#{build_summon_url(s.granblue_id.to_s, size)} \n") + + # Download second images only for Providence ULBs and Primal summons + if series == 3 || (series == 0 && s.ulb) + f.write("#{build_summon_url("#{s.granblue_id}_02", + size)} \n") end end end - puts "Wrote #{Summon.count} summon URLs for \"#{size}\" size" + # CLI output + count = `wc -l #{filename}`.split.first.to_i + puts "Wrote #{count} summon URLs for \"#{size}\" size" end end end diff --git a/lib/tasks/export_weapon.rake b/lib/tasks/export_weapon.rake index 8a6a808..9c4292e 100644 --- a/lib/tasks/export_weapon.rake +++ b/lib/tasks/export_weapon.rake @@ -22,17 +22,19 @@ namespace :granblue do # Set up filepath dir = "#{Rails.root}/export/" + filename = "#{dir}/weapon-#{size}.txt" FileUtils.mkdir(dir) unless Dir.exist?(dir) - unless File.exist?("#{dir}/weapon-#{size}.txt") - File.open("#{dir}/weapon-#{size}.txt", 'w') do |f| - Weapon.all.each do |w| - f.write("#{build_weapon_url(w.granblue_id.to_s, size)} \n") - end + # Write to file + File.open(filename, 'w') do |f| + Weapon.all.each do |w| + f.write("#{build_weapon_url(w.granblue_id.to_s, size)} \n") end end - puts "Wrote #{Weapon.count} weapon URLs for \"#{size}\" size" + # CLI output + count = `wc -l #{filename}`.split.first.to_i + puts "Wrote #{count} weapon URLs for \"#{size}\" size" end end end From 6db048dcc89e1a1a7bee16a51e74808f8eb0bec1 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Sat, 24 Dec 2022 14:16:56 -0800 Subject: [PATCH 5/5] Create task for downloading images --- lib/tasks/download_images.rake | 41 ++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 lib/tasks/download_images.rake diff --git a/lib/tasks/download_images.rake b/lib/tasks/download_images.rake new file mode 100644 index 0000000..fee19c8 --- /dev/null +++ b/lib/tasks/download_images.rake @@ -0,0 +1,41 @@ +namespace :granblue do + def _progress_reporter(count:, total:, result:, bar_len: 40, multi: true) + filled_len = (bar_len * count / total).round + status = File.basename(result) + percents = (100.0 * count / total).round(1) + bar = '=' * filled_len + '-' * (bar_len - filled_len) + + if !multi + print("[#{bar}] #{percents}% ...#{' ' * 20}#{status}\n") + else + print "\n" + end + end + + desc 'Exports a list of character URLs for a given size' + task :download_images, %i[object size] => :environment do |_t, args| + require 'open-uri' + + filename = "export/#{args[:object]}-#{args[:size]}.txt" + count = `wc -l #{filename}`.split.first.to_i + + path = "#{Rails.root}/download/#{args[:object]}-#{args[:size]}" + FileUtils.mkdir_p(path) unless Dir.exist?(path) + + puts "Downloading #{count} images from #{args[:object]}-#{args[:size]}.txt..." + if File.exist?(filename) + File.readlines(filename).each_with_index do |line, i| + download = URI.parse(line.strip).open + download_URI = "#{path}/#{download.base_uri.to_s.split('/')[-1]}" + if File.exist?(download_URI) + puts "Skipping #{line}" + else + IO.copy_stream(download, "#{path}/#{download.base_uri.to_s.split('/')[-1]}") + _progress_reporter(count: i, total: count, result: download_URI, bar_len: 40, multi: false) + end + rescue StandardError => e + puts "#{e}: #{line}" + end + end + end +end