in _src/_plugins/avatar_downloader.rb [51:166]
def generate(site)
avatar_dir = File.join(site.source, 'assets', 'img', 'avatars')
FileUtils.mkdir_p(avatar_dir) unless Dir.exist?(avatar_dir)
metadata_dir = File.join(site.source, 'assets', 'img', 'avatars', '.metadata')
FileUtils.mkdir_p(metadata_dir) unless Dir.exist?(metadata_dir)
metadata_file = File.join(metadata_dir, 'metadata.yml')
avatar_metadata = {}
if File.exist?(metadata_file)
begin
avatar_metadata = YAML.load_file(metadata_file) || {}
rescue => e
puts "Error loading avatar metadata: #{e.message}"
avatar_metadata = {}
end
end
contributors = site.data['contributors'] || []
contributors.each do |contributor|
next unless contributor['githubId']
github_id = contributor['githubId']
avatar_url = "https://avatars.githubusercontent.com/#{github_id}"
local_path = File.join(avatar_dir, "#{github_id}.jpg")
user_metadata = avatar_metadata[github_id] || {}
stored_etag = user_metadata['etag']
stored_last_modified = user_metadata['last_modified']
download_needed = false
headers = {}
if stored_etag
headers['If-None-Match'] = stored_etag
end
if stored_last_modified
headers['If-Modified-Since'] = stored_last_modified
end
if !File.exist?(local_path) || stored_etag || stored_last_modified
begin
uri = URI(avatar_url)
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
request = Net::HTTP::Head.new(uri, headers)
response = http.request(request)
case response.code
when '200'
download_needed = true
avatar_metadata[github_id] = {
'etag' => response['ETag'],
'last_modified' => response['Last-Modified']
}
when '304'
puts "Avatar for #{github_id} is up-to-date (HTTP 304)"
download_needed = false
else
puts "Unexpected response for #{github_id}: #{response.code}"
download_needed = false
end
end
if download_needed
puts "Downloading avatar for #{github_id}..."
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
request = Net::HTTP::Get.new(uri)
response = http.request(request)
if response.code == '200'
File.open(local_path, 'wb') do |file|
file.write(response.body)
end
puts "Avatar saved for #{github_id}"
avatar_metadata[github_id] = {
'etag' => response['ETag'],
'last_modified' => response['Last-Modified']
}
else
puts "Failed to download avatar for #{github_id}: #{response.code}"
end
end
end
rescue => e
puts "Error processing avatar for #{github_id}: #{e.message}"
end
end
end
File.open(metadata_file, 'w') do |file|
file.write(avatar_metadata.to_yaml)
end
site.config['avatar_path'] = '/assets/img/avatars'
end