generate

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