Class: Imgur2

Inherits:
Struct
  • Object
show all
Defined in:
lib/imgur2.rb

Overview

Stupid simple class for uploading to imgur.

client = Imgur2.new 'my imgur key'
p File.open(ARGV[0], 'rb') { |f|
  client.upload f
}

Constant Summary collapse

VERSION =
'1.2.0'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#keyObject

Returns the value of attribute key

Returns:

  • (Object)

    the current value of key



11
12
13
# File 'lib/imgur2.rb', line 11

def key
  @key
end

Class Method Details

.get_image(filename = nil) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/imgur2.rb', line 25

def self.get_image filename = nil
  return open(filename, 'rb') if filename
  begin
    require 'pasteboard'
    require 'stringio'

    clipboard = Pasteboard.new

    data = clipboard[0, Pasteboard::Type::JPEG]

    return StringIO.new data if data
  rescue LoadError
  end

  $stdin
end

.run(argv) ⇒ Object



14
15
16
17
18
19
20
21
22
23
# File 'lib/imgur2.rb', line 14

def self.run argv
  client = Imgur2.new '65aea9a07b4f6110c90248ffa247d41a'
  fh     = get_image argv[0]
  link   = client.upload(fh)['upload']['links']['original']
  link   = client.follow_redirect link
  client.paste link
  puts link
ensure
  fh.close if fh
end

Instance Method Details

#follow_redirect(url) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/imgur2.rb', line 54

def follow_redirect url
  follower = lambda do |uri, depth|
    raise "too many redirects" if depth > 3

    parsed  = URI.parse uri
    resp = Net::HTTP.start(parsed.host) { |http|
      head = Net::HTTP::Head.new parsed.path
      http.request head
    }

    if Net::HTTPRedirection === resp
      follower.call resp['Location'], depth + 1
    else
      uri
    end
  end

  follower.call url, 0
end

#paste(link) ⇒ Object

Tries to find clipboard copy executable and if found puts link in your clipboard.



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/imgur2.rb', line 78

def paste link
  require 'pasteboard'

  clipboard = Pasteboard.new

  clipboard.put_url link
rescue LoadError
  clipboard = %w{
    /usr/bin/pbcopy
    /usr/bin/xclip
  }.find { |path| File.exist? path }

  if clipboard
    IO.popen clipboard, 'w' do |io| io.write link end
  end
end

#upload(io) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/imgur2.rb', line 42

def upload io
  url = URI.parse 'http://api.imgur.com/2/upload.json'

  JSON.parse Net::HTTP.start(url.host) { |http|
    post = Net::HTTP::Post.new url.path
    post.set_form_data('key'   => key,
                       'image' => [io.read].pack('m'),
                       'type'  => 'base64')
    http.request(post).body
  }
end