Finish dataminer
Adds logger and continuing downloads
This commit is contained in:
parent
fc16d72c81
commit
29aa434d90
1 changed files with 62 additions and 40 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue