Finish dataminer

Adds logger and continuing downloads
This commit is contained in:
Justin Edmund 2025-03-06 19:11:21 -08:00
parent fc16d72c81
commit 29aa434d90

View file

@ -21,9 +21,9 @@ class Dataminer
'X-Requested-With' => 'XMLHttpRequest' 'X-Requested-With' => 'XMLHttpRequest'
}.freeze }.freeze
attr_reader :page, :cookies attr_reader :page, :cookies, :logger, :debug
def initialize(page:, access_token:, wing:, midship:, t: 'dummy') def initialize(page:, access_token:, wing:, midship:, t: 'dummy', debug: false)
@page = page @page = page
@cookies = { @cookies = {
access_gbtk: access_token, access_gbtk: access_token,
@ -31,6 +31,8 @@ class Dataminer
t: t, t: t,
midship: midship midship: midship
} }
@debug = debug
setup_logger
end end
def fetch def fetch
@ -104,16 +106,16 @@ class Dataminer
end end
# Public batch processing methods # Public batch processing methods
def fetch_all_characters def fetch_all_characters(only_missing: false)
process_all_records('Character') process_all_records('Character', only_missing: only_missing)
end end
def fetch_all_weapons def fetch_all_weapons(only_missing: false)
process_all_records('Weapon') process_all_records('Weapon', only_missing: only_missing)
end end
def fetch_all_summons def fetch_all_summons(only_missing: false)
process_all_records('Summon') process_all_records('Summon', only_missing: only_missing)
end end
private private
@ -133,17 +135,35 @@ class Dataminer
end end
end end
def setup_logger
@logger = ::Logger.new($stdout)
@logger.level = debug ? ::Logger::DEBUG : ::Logger::INFO
@logger.formatter = proc do |severity, _datetime, _progname, msg|
case severity
when 'DEBUG'
debug ? "#{msg}\n" : ''
else
"#{msg}\n"
end
end
# Suppress SQL logs in non-debug mode
return if debug
ActiveRecord::Base.logger.level = ::Logger::INFO if defined?(ActiveRecord::Base)
end
def fetch_detail(url, body) def fetch_detail(url, body)
puts "\n=== Request Details ===" logger.debug "\n=== Request Details ==="
puts "URL: #{url}" logger.debug "URL: #{url}"
puts 'Headers:' logger.debug 'Headers:'
puts HEADERS.merge( logger.debug HEADERS.merge(
'Cookie' => format_cookies, 'Cookie' => format_cookies,
'X-VERSION' => GAME_VERSION 'X-VERSION' => GAME_VERSION
).inspect ).inspect
puts 'Body:' logger.debug 'Body:'
puts body.to_json logger.debug body.to_json
puts '====================' logger.debug '===================='
response = self.class.post( response = self.class.post(
url, url,
@ -154,19 +174,19 @@ class Dataminer
body: body.to_json body: body.to_json
) )
puts "\n=== Response Details ===" logger.debug "\n=== Response Details ==="
puts "Response code: #{response.code}" logger.debug "Response code: #{response.code}"
puts 'Response headers:' logger.debug 'Response headers:'
puts response.headers.inspect logger.debug response.headers.inspect
puts 'Raw response body:' logger.debug 'Raw response body:'
puts response.body.inspect logger.debug response.body.inspect
begin begin
puts 'Parsed response body (if JSON):' logger.debug 'Parsed response body (if JSON):'
puts JSON.parse(response.body).inspect logger.debug JSON.parse(response.body).inspect
rescue JSON::ParserError => e rescue JSON::ParserError => e
puts "Could not parse as JSON: #{e.message}" logger.debug "Could not parse as JSON: #{e.message}"
end end
puts '======================' logger.debug '======================'
raise AuthenticationError if auth_failed?(response) raise AuthenticationError if auth_failed?(response)
@ -181,24 +201,27 @@ class Dataminer
if record if record
record.update(game_raw_en: response_data) record.update(game_raw_en: response_data)
puts "Updated #{model_name} #{granblue_id}" logger.debug "Updated #{model_name} #{granblue_id}"
else else
puts "#{model_name} with granblue_id #{granblue_id} not found in database" logger.warn "#{model_name} with granblue_id #{granblue_id} not found in database"
end end
rescue StandardError => e rescue StandardError => e
puts "Error updating #{model_name} #{granblue_id}: #{e.message}" logger.error "Error updating #{model_name} #{granblue_id}: #{e.message}"
end end
def process_all_records(model_name) def process_all_records(model_name, only_missing: false)
model = Object.const_get(model_name) model = Object.const_get(model_name)
total = model.count scope = model
scope = scope.where(game_raw_en: nil) if only_missing
total = scope.count
success_count = 0 success_count = 0
error_count = 0 error_count = 0
puts "Starting to fetch #{total} #{model_name.downcase}s..." logger.info "Starting to fetch #{total} #{model_name.downcase}s#{' (missing data only)' if only_missing}..."
model.find_each do |record| scope.find_each do |record|
puts "\nProcessing #{model_name} #{record.granblue_id} (#{success_count + error_count + 1}/#{total})" logger.info "\nProcessing #{model_name} #{record.granblue_id} (#{success_count + error_count + 1}/#{total})"
response = case model_name response = case model_name
when 'Character' when 'Character'
@ -210,19 +233,18 @@ class Dataminer
end end
success_count += 1 success_count += 1
puts "Successfully processed #{model_name} #{record.granblue_id}" logger.debug "Successfully processed #{model_name} #{record.granblue_id}"
# Add a small delay to avoid overwhelming the server
sleep(1) sleep(1)
rescue StandardError => e rescue StandardError => e
error_count += 1 error_count += 1
puts "Error processing #{model_name} #{record.granblue_id}: #{e.message}" logger.error "Error processing #{model_name} #{record.granblue_id}: #{e.message}"
end end
puts "\nProcessing complete!" logger.info "\nProcessing complete!"
puts "Total: #{total}" logger.info "Total: #{total}"
puts "Successful: #{success_count}" logger.info "Successful: #{success_count}"
puts "Failed: #{error_count}" logger.info "Failed: #{error_count}"
end end
class AuthenticationError < StandardError; end class AuthenticationError < StandardError; end