flickr_cli 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/flickr_cli +4 -0
- data/lib/authentication.rb +38 -0
- data/lib/flickr_cli.rb +22 -0
- data/lib/image_cutter.rb +55 -0
- data/lib/menu.rb +68 -0
- metadata +103 -0
data/bin/flickr_cli
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
module FlickrCli
|
2
|
+
module Authentication
|
3
|
+
def self.establish_session
|
4
|
+
auth_file = File.expand_path("~/.flick_airliftrc")
|
5
|
+
FlickRaw.api_key = "e8505c88feb2c0cc9d2da6bcbe18767c"
|
6
|
+
FlickRaw.shared_secret = "d344de362ea86f0e"
|
7
|
+
|
8
|
+
if File.exists?(auth_file)
|
9
|
+
puts "authenticating thought #{auth_file}"
|
10
|
+
data = YAML.load_file(auth_file)
|
11
|
+
auth = flickr.auth.checkToken :auth_token => data["api_token"]
|
12
|
+
else
|
13
|
+
frob = flickr.auth.getFrob
|
14
|
+
auth_url = FlickRaw.auth_url :frob => frob, :perms => "write"
|
15
|
+
|
16
|
+
puts " "
|
17
|
+
puts "opening your browser..."
|
18
|
+
sleep 1
|
19
|
+
puts "Come back and press Enter when you are finished"
|
20
|
+
sleep 2
|
21
|
+
Launchy.open(auth_url)
|
22
|
+
|
23
|
+
STDIN.getc
|
24
|
+
|
25
|
+
# Authentication
|
26
|
+
auth = flickr.auth.getToken :frob => frob
|
27
|
+
login = flickr.test.login
|
28
|
+
|
29
|
+
puts auth.token
|
30
|
+
|
31
|
+
require 'yaml'
|
32
|
+
data = {}
|
33
|
+
data["api_token"] = auth.token
|
34
|
+
File.open(auth_file, "w"){|f| YAML.dump(data, f) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/flickr_cli.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Extental Dependencies
|
2
|
+
require 'rubygems'
|
3
|
+
require 'tempfile'
|
4
|
+
require 'flickraw'
|
5
|
+
require 'net/http'
|
6
|
+
require 'cgi'
|
7
|
+
require 'launchy'
|
8
|
+
require 'highline/import'
|
9
|
+
require 'RMagick'
|
10
|
+
# Internal Libraries
|
11
|
+
require 'authentication'
|
12
|
+
require 'menu'
|
13
|
+
|
14
|
+
module FlickrCli
|
15
|
+
|
16
|
+
def self.start_program
|
17
|
+
HighLine.track_eof = false
|
18
|
+
|
19
|
+
Authentication.establish_session
|
20
|
+
Menu.main_menu
|
21
|
+
end
|
22
|
+
end
|
data/lib/image_cutter.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
module FlickrCli
|
2
|
+
module ImageCutter
|
3
|
+
|
4
|
+
CHARS = [ 'W', 'M', '$', '@', '#', '%', '^', 'x', '*', 'o', '=', '+',':', '~', '.', ' ' ]
|
5
|
+
FONT_ROWS = 8
|
6
|
+
FONT_COLS = 4
|
7
|
+
|
8
|
+
def self.convert_to_ascii(file)
|
9
|
+
|
10
|
+
img = Magick::Image.read(file).first
|
11
|
+
|
12
|
+
# Resize too-large images. The resulting image is going to be
|
13
|
+
# about twice the size of the input, so if the original image is too
|
14
|
+
# large we need to make it smaller so the ASCII version won't be too
|
15
|
+
# big. The `change_geometry' method computes new dimensions for an
|
16
|
+
# image based on the geometry argument. The '320x320>' argument says
|
17
|
+
# "If the image is too big to fit in a 320x320 square, compute the
|
18
|
+
# dimensions of an image that will fit, but retain the original aspect
|
19
|
+
# ratio. If the image is already smaller than 320x320, keep the same
|
20
|
+
# dimensions."
|
21
|
+
img.change_geometry('728x728>') do |cols, rows|
|
22
|
+
img.resize!(cols, rows) if cols != img.columns || rows != img.rows
|
23
|
+
end
|
24
|
+
|
25
|
+
# Compute the image size in ASCII "pixels" and resize the image to have
|
26
|
+
# those dimensions. The resulting image does not have the same aspect
|
27
|
+
# ratio as the original, but since our "pixels" are twice as tall as
|
28
|
+
# they are wide we'll get our proportions back (roughly) when we render.
|
29
|
+
pr = img.rows / FONT_ROWS
|
30
|
+
pc = img.columns / FONT_COLS
|
31
|
+
img.resize!(pc, pr)
|
32
|
+
|
33
|
+
img = img.quantize(16, Magick::GRAYColorspace)
|
34
|
+
img = img.normalize
|
35
|
+
|
36
|
+
# Draw the image surrounded by a border. The `view' method is slow but
|
37
|
+
# it makes it easy to address individual pixels. In grayscale images,
|
38
|
+
# all three RGB channels have the same value so the red channel is as
|
39
|
+
# good as any for choosing which character to represent the intensity of
|
40
|
+
# this particular pixel.
|
41
|
+
border = '+' + ('-' * pc) + '+'
|
42
|
+
puts border
|
43
|
+
|
44
|
+
img.view(0, 0, pc, pr) do |view|
|
45
|
+
pr.times do |i|
|
46
|
+
putc '|'
|
47
|
+
pc.times { |j| putc CHARS[view[i][j].red/16] }
|
48
|
+
puts '|'
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
border
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/menu.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
module FlickrCli
|
2
|
+
module Menu
|
3
|
+
|
4
|
+
def self.main_menu
|
5
|
+
choose do |menu|
|
6
|
+
menu.prompt = "What's up?"
|
7
|
+
menu.choice(:Contacts) { contacts }
|
8
|
+
# menu.choice(:"Your Sets") { sets }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.menu_for(contact)
|
13
|
+
|
14
|
+
user_id = flickr.people.findByUsername(:username => contact).id
|
15
|
+
photos = flickr.photos.search(:user_id => user_id)
|
16
|
+
|
17
|
+
choose do |menu|
|
18
|
+
menu.prompt = "Pick a file"
|
19
|
+
|
20
|
+
photos.map(&:title).each do |photo|
|
21
|
+
menu.choice(photo) do
|
22
|
+
# When you choose a photo...
|
23
|
+
FlickrCli::Menu.download_and_print(photos.detect{|x| x.title == photo})
|
24
|
+
puts "Press any ENTER to continue"
|
25
|
+
do_nothing = STDIN.gets
|
26
|
+
self.menu_for(FlickrCli::Menu.menu_for(contact))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.download_and_print(picked_photo)
|
33
|
+
|
34
|
+
photos = flickr.photos.getSizes(:photo_id => picked_photo.id)
|
35
|
+
download_url = nil
|
36
|
+
|
37
|
+
["Medium", "Medium 640", "Small"].each do |style|
|
38
|
+
if picture = photos.find{ |photo| photo.label == style }
|
39
|
+
download_url = picture.source
|
40
|
+
end
|
41
|
+
break if download_url
|
42
|
+
end
|
43
|
+
|
44
|
+
my_file = Tempfile.new('tempimage.jpg')
|
45
|
+
my_file << Net::HTTP.get_response(URI.parse(download_url)).body
|
46
|
+
my_file.close
|
47
|
+
puts FlickrCli::ImageCutter.convert_to_ascii(my_file.path)
|
48
|
+
my_file.delete
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.contacts
|
52
|
+
contacts ||= flickr.contacts.getList.map(&:username).sort
|
53
|
+
|
54
|
+
choose do |menu|
|
55
|
+
menu.prompt = "Choose a contact"
|
56
|
+
contacts.each do |contact|
|
57
|
+
menu.choice(contact.to_sym) { FlickrCli::Menu.menu_for(contact) }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# TODO: implement sets
|
64
|
+
# def self.sets
|
65
|
+
#
|
66
|
+
# end
|
67
|
+
|
68
|
+
end
|
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: flickr_cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Stephen Schor
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-01-11 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: launchy
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - "="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 15
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 4
|
33
|
+
- 0
|
34
|
+
version: 0.4.0
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: flickraw
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - "="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 55
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 8
|
49
|
+
- 4
|
50
|
+
version: 0.8.4
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
description: A Command-Line tool for exploring your flickr account
|
54
|
+
email:
|
55
|
+
- beholdthepanda@gmail.com
|
56
|
+
executables:
|
57
|
+
- flickr_cli
|
58
|
+
extensions: []
|
59
|
+
|
60
|
+
extra_rdoc_files: []
|
61
|
+
|
62
|
+
files:
|
63
|
+
- bin/flickr_cli
|
64
|
+
- lib/authentication.rb
|
65
|
+
- lib/flickr_cli.rb
|
66
|
+
- lib/image_cutter.rb
|
67
|
+
- lib/menu.rb
|
68
|
+
has_rdoc: true
|
69
|
+
homepage: https://github.com/nodanaonlyzuul/flickr_cli
|
70
|
+
licenses: []
|
71
|
+
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options: []
|
74
|
+
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
hash: 3
|
83
|
+
segments:
|
84
|
+
- 0
|
85
|
+
version: "0"
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
hash: 3
|
92
|
+
segments:
|
93
|
+
- 0
|
94
|
+
version: "0"
|
95
|
+
requirements: []
|
96
|
+
|
97
|
+
rubyforge_project: nowarning
|
98
|
+
rubygems_version: 1.3.7
|
99
|
+
signing_key:
|
100
|
+
specification_version: 3
|
101
|
+
summary: A Command-Line tool for exploring your flickr account
|
102
|
+
test_files: []
|
103
|
+
|