module Memegen

Module Memegen provides free api driver for memegen.link/

@author Maanav Shah <shah.maanav.07@gmail.com>

Attributes

font[RW]
height[RW]
share[RW]
width[RW]

Public Instance Methods

generate(title, caption, image) click to toggle source

Generate the meme using title, caption and image url

@param String title A title for the image @param String caption A caption for the image @param String image An url for image

@return File An image

# File lib/meme_generate/memegen.rb, line 61
def generate(title, caption, image)
  # check if title, caption and image is present and valid
  invalid = false
  if title.nil? || title.empty?
    logger.error('Empty title detected')
    invalid = true
  end
  if caption.nil? || caption.empty?
    logger.error('Empty caption detected')
    invalid = true
  end
  url = image.match(/.*(?=\.)/)
  if url.nil? || !image_exists?(url[0])
    logger.error('Image not found')
    invalid = true
  end

  unless invalid
    # Replace the reserve words
    reserved_characters.each { |k, v| title.gsub!(k.to_s, v.to_s) }
    reserved_characters.each { |k, v| caption.gsub!(k.to_s, v.to_s) }

    # Generate the url
    url = "https://memegen.link/custom/#{title}/#{caption}.jpg?alt=#{image}"

    # Parameters
    options = {}
    options[:font] = @font if list_fonts.include?(@font)
    options[:width] = @width.to_i if @width.to_i > 100
    options[:height] = @height.to_i if @height.to_i > 100
    options[:share] = (@share == true)
    options.reject! { |_k, v| v.empty? }
    response = if options.empty? || options.nil?
                 Unirest.get(url)
               else
                 Unirest.get(url, parameters: options)
               end

    # Writing image
    File.open("#{Time.now.to_i}.jpeg", 'w+') do |f|
      f.write(response.body)
      f.close
    end
    logger.info('Meme generated')
  end
end
list_fonts() click to toggle source

Get the list of fonts

@return Array List of fonts

# File lib/meme_generate/memegen.rb, line 47
def list_fonts
  response = Unirest.get('https://memegen.link/api/fonts')
  response.body
end
logger() click to toggle source

Initializes logger

@return Logger Logger instancce

# File lib/meme_generate/memegen.rb, line 37
def logger
  @logger ||= Logger.new(STDOUT)
end
reserved_characters() click to toggle source

Initializes reserved_characters that replaces special characters

@return Hash reserved_characters to substitute

# File lib/meme_generate/memegen.rb, line 18
def reserved_characters
  @reserved_characters ||= {
    '_': '__',
    '-': '--',
    ' ': '-',
    '?': '~q',
    '%': '~p',
    '#': '~h',
    '/': '~s',
    '"': "''"
  }
end

Private Instance Methods

image_exists?(url) click to toggle source

Check if the image exists on remote URL

@param url A remote image url

@return boolean true/false if the image exists or not

# File lib/meme_generate/memegen.rb, line 117
def image_exists?(url)
  uri = URI(url)
  request = Net::HTTP.new uri.host
  response = request.request_head(uri.path)
  [200, 301].include?(response.code.to_i)
end