visioner 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +35 -33
- data/bin/visioner +23 -3
- data/lib/visioner/version.rb +1 -1
- data/lib/visioner.rb +55 -9
- data/visioner.gemspec +2 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ad07e8c2e46392159f5c62a4a956d4e646ab4f3
|
4
|
+
data.tar.gz: fcc1116040567630a84f1c96c4f94d6c899d5bee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91018c0cd1ef95db035ee992d996c75f6a7dcf17df4b51a4127ec90e5d421d5c5f1b7b52a27eca92c625f8a3718c7c5162c3ff2ed4243c48d9eddf8596c711b7
|
7
|
+
data.tar.gz: a5482df04d15ddba0fa81fca3dfec6700377b6b8f0594dd15290a52c25e3681ae46b8b795fe81399de55e19ad8437da2e2f89daf08503eb83c28a11a8f6f67aa
|
data/README.md
CHANGED
@@ -1,41 +1,43 @@
|
|
1
1
|
# Visioner
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
Automatically rename your pictures using Google Vision API and metadata.
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
gem 'visioner'
|
13
|
-
```
|
14
|
-
|
15
|
-
And then execute:
|
16
|
-
|
17
|
-
$ bundle
|
18
|
-
|
19
|
-
Or install it yourself as:
|
20
|
-
|
21
|
-
$ gem install visioner
|
7
|
+
$ bundle install
|
8
|
+
$ rake install
|
22
9
|
|
23
10
|
## Usage
|
24
11
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
12
|
+
$ export GOOGLE_VISION_API_KEY=...
|
13
|
+
$ bin/visioner [options] image ...
|
14
|
+
|
15
|
+
**Options:**
|
16
|
+
|
17
|
+
-c, --country Adds country to the new filename (ex: south-korea)
|
18
|
+
|
19
|
+
-d, --date Adds date to the new filename (ex: 29/07/2016)
|
20
|
+
|
21
|
+
-h, --help Displays help
|
22
|
+
|
23
|
+
**Examples:**
|
24
|
+
|
25
|
+
$ export GOOGLE_VISION_API_KEY=BI34SyB5DhqV5ReVnkmIM79812yux9UFazNdynD
|
26
|
+
|
27
|
+
$ bin/visioner /Desktop/travel-south-korea-2016-2/*.jpg
|
28
|
+
/Desktop/travel-south-korea-2016-2/IMG_213.jpg -> sea.jpg
|
29
|
+
/Desktop/travel-south-korea-2016-2/IMG_214.jpg -> tower.jpg
|
30
|
+
/Desktop/travel-south-korea-2016-2/IMG_215.jpg -> people.jpg
|
31
|
+
/Desktop/travel-south-korea-2016-2/IMG_216.jpg -> sea2.jpg
|
32
|
+
|
33
|
+
$ bin/visioner --date /Desktop/travel-south-korea-2016-3/*.jpg
|
34
|
+
/Desktop/travel-south-korea-2016-3/IMG_213.jpg -> 02-28-2015_sea.jpg
|
35
|
+
/Desktop/travel-south-korea-2016-3/IMG_214.jpg -> 02-15-2015_tower.jpg
|
36
|
+
/Desktop/travel-south-korea-2016-3/IMG_215.jpg -> 03-28-2015_people.jpg
|
37
|
+
/Desktop/travel-south-korea-2016-3/IMG_216.jpg -> 04-02-2015_sea2.jpg
|
38
|
+
|
39
|
+
$ bin/visioner --country --date /Desktop/travel-south-korea-2016-4/*.jpg
|
40
|
+
/Desktop/travel-south-korea-2016-4/IMG_213.jpg -> south-korea_02-28-2015_sea.jpg
|
41
|
+
/Desktop/travel-south-korea-2016-4/IMG_214.jpg -> south-korea_03-15-2015_tower.jpg
|
42
|
+
/Desktop/travel-south-korea-2016-4/IMG_215.jpg -> south-korea_03-28-2015_people.jpg
|
43
|
+
/Desktop/travel-south-korea-2016-4/IMG_216.jpg -> south-korea_04-02-2015_sea2.jpg
|
data/bin/visioner
CHANGED
@@ -1,11 +1,31 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'visioner'
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
options = {}
|
7
|
+
opts = OptionParser.new
|
8
|
+
|
9
|
+
opts.banner = "Visioner automatically renames your pictures using Google API Visioner and metadata.\nMake sure you have set GOOGLE_API_KEY in your env.\n\nUsage: visioner [options] image ..."
|
10
|
+
|
11
|
+
opts.on("-c", "--country", "Adds country to the new filename (ex: south-korea)") do |c|
|
12
|
+
options[:country] = c
|
13
|
+
end
|
14
|
+
|
15
|
+
opts.on("-d", "--date", "Adds date to the new filename (ex: 29/07/2016)") do |d|
|
16
|
+
options[:date] = d
|
17
|
+
end
|
18
|
+
|
19
|
+
opts.on("-h", "--help", "Displays help") do
|
20
|
+
puts opts
|
21
|
+
exit
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.parse!
|
4
25
|
|
5
26
|
if ARGV.empty?
|
6
|
-
puts
|
7
|
-
puts "Usage: visioner image ..."
|
27
|
+
puts opts
|
8
28
|
exit 1
|
9
29
|
else
|
10
|
-
Visioner.rename_all(ARGV)
|
30
|
+
Visioner.rename_all(ARGV, options)
|
11
31
|
end
|
data/lib/visioner/version.rb
CHANGED
data/lib/visioner.rb
CHANGED
@@ -2,21 +2,53 @@ require 'visioner/version'
|
|
2
2
|
require 'base64'
|
3
3
|
require 'net/http'
|
4
4
|
require 'json'
|
5
|
+
require 'exifr'
|
6
|
+
require 'optparse'
|
5
7
|
|
6
8
|
module Visioner
|
7
|
-
|
8
|
-
def self.
|
9
|
+
|
10
|
+
def self.get_country(latitude, longitude)
|
11
|
+
# Prepare request
|
12
|
+
url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=#{latitude},#{longitude}"
|
13
|
+
url = URI(url)
|
14
|
+
req = Net::HTTP::Get.new(url)
|
15
|
+
res = Net::HTTP.new(url.host, url.port)
|
16
|
+
res.use_ssl = true
|
17
|
+
|
18
|
+
# Get country
|
19
|
+
country = 'unknown'
|
20
|
+
res.start do |http|
|
21
|
+
resp = http.request(req)
|
22
|
+
json = JSON.parse(resp.body)
|
23
|
+
if json && json['status'] == 'OK' && json['results'][0]['address_components'] && json['results'][0]['address_components'].select {|address_component| address_component['types'][0] == 'country' }
|
24
|
+
country = json['results'][0]['address_components'].select {|address_component| address_component['types'][0] == 'country' }
|
25
|
+
country = country[0]['long_name']
|
26
|
+
country = country.downcase.tr(" ", "-")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
return country
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.rename_all(images, options)
|
9
34
|
images.each do |image_name|
|
10
35
|
|
36
|
+
# Check file extension
|
37
|
+
if File.extname(image_name) != '.jpg'
|
38
|
+
puts "Error: can only rename jpg files. Continuing..."
|
39
|
+
next
|
40
|
+
end
|
41
|
+
|
42
|
+
|
11
43
|
# Convert image to Base 64
|
12
44
|
begin
|
13
45
|
b64_data = Base64.encode64(File.open(image_name, "rb").read)
|
14
46
|
rescue
|
15
|
-
puts "Error: can't read file"
|
47
|
+
puts "Error: can't read file. Exiting..."
|
16
48
|
end
|
17
49
|
|
18
50
|
# Prepare request
|
19
|
-
api_key = ENV['
|
51
|
+
api_key = ENV['GOOGLE_API_KEY']
|
20
52
|
content_type = "Content-Type: application/json"
|
21
53
|
url = "https://vision.googleapis.com/v1/images:annotate?key=#{api_key}"
|
22
54
|
data = {
|
@@ -34,8 +66,6 @@ module Visioner
|
|
34
66
|
}
|
35
67
|
]
|
36
68
|
}.to_json
|
37
|
-
|
38
|
-
# Make request
|
39
69
|
url = URI(url)
|
40
70
|
req = Net::HTTP::Post.new(url, initheader = {'Content-Type' =>'application/json'})
|
41
71
|
req.body = data
|
@@ -49,18 +79,34 @@ module Visioner
|
|
49
79
|
json = JSON.parse(resp.body)
|
50
80
|
if json && json["responses"] && json["responses"][0]["labelAnnotations"] && json["responses"][0]["labelAnnotations"][0]["description"]
|
51
81
|
name = json['responses'][0]['labelAnnotations'][0]['description']
|
82
|
+
name = name.tr(" ", "-")
|
52
83
|
end
|
53
84
|
end
|
54
85
|
|
55
86
|
unless name.empty?
|
56
|
-
counter =
|
87
|
+
counter = nil
|
57
88
|
while File.exist?(File.dirname(image_name) + "/" + name + counter.to_s + File.extname(image_name)) do
|
89
|
+
counter = 1 if counter == nil
|
58
90
|
counter = counter.to_i + 1
|
59
91
|
end
|
60
92
|
|
61
|
-
|
93
|
+
exif = EXIFR::JPEG.new(image_name)
|
94
|
+
|
95
|
+
date = ''
|
96
|
+
if options[:date]
|
97
|
+
date = File.mtime(image_name).strftime('%m-%d-%Y') # Fallback
|
98
|
+
date = exif.date_time_original.strftime('%m-%d-%Y') + '_' if exif.date_time_original
|
99
|
+
end
|
100
|
+
|
101
|
+
country = ''
|
102
|
+
if options[:country]
|
103
|
+
country = 'unknown' # Fallback
|
104
|
+
country = self.get_country(exif.gps.latitude, exif.gps.longitude) + '_' if exif.gps_latitude && exif.gps_longitude
|
105
|
+
end
|
106
|
+
|
107
|
+
puts "#{image_name} -> #{country + date + name + counter.to_s + File.extname(image_name)}"
|
62
108
|
|
63
|
-
File.rename(image_name, File.dirname(image_name) + "/" + name + counter.to_s + File.extname(image_name))
|
109
|
+
File.rename(image_name, File.dirname(image_name) + "/" + country + date + name + counter.to_s + File.extname(image_name))
|
64
110
|
end
|
65
111
|
|
66
112
|
end
|
data/visioner.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Pierre-Jean Bergeron"]
|
10
10
|
spec.email = ["pj@bergeron.io"]
|
11
11
|
|
12
|
-
spec.summary = %q{Automatically rename your pictures using Google Vision API.}
|
12
|
+
spec.summary = %q{Automatically rename your pictures using Google Vision API and metadata.}
|
13
13
|
spec.homepage = "https://github.com/berpj/visioner"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -20,4 +20,5 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.11"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "exifr", "~> 1.2"
|
23
24
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: visioner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pierre-Jean Bergeron
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: exifr
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.2'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.2'
|
41
55
|
description:
|
42
56
|
email:
|
43
57
|
- pj@bergeron.io
|
@@ -82,5 +96,5 @@ rubyforge_project:
|
|
82
96
|
rubygems_version: 2.5.1
|
83
97
|
signing_key:
|
84
98
|
specification_version: 4
|
85
|
-
summary: Automatically rename your pictures using Google Vision API.
|
99
|
+
summary: Automatically rename your pictures using Google Vision API and metadata.
|
86
100
|
test_files: []
|