levdon 0.1.1 → 0.1.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.
- checksums.yaml +4 -4
- data/Gemfile +7 -0
- data/LICENSE.txt +1 -1
- data/levdon.gemspec +3 -1
- data/lib/levdon.rb +112 -19
- data/lib/levdon/version.rb +1 -1
- data/test.rb +22 -4
- metadata +30 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5fa51449de191b50b839e774fa2d16ea429c271b
|
4
|
+
data.tar.gz: ac8a48b26603f6f8adc9315cd4f80fbaba90ac05
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2803eb099e73a0c070fe911b5de64e2c58463ef7e3f1eb8e401643e19af99a03464fc10bb5cc9ff2135acbb8b25c6fb0d8929d2d80aa946139ce22714c044c4b
|
7
|
+
data.tar.gz: d25f3d8cf7f8f3440ae35121da6ee6f47587bf8495e496fb9987cfbe09901f0b45cd1e979962c8d64dc9a2f68e057074f765aac8c401388d5144b8375b6481ae
|
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
data/levdon.gemspec
CHANGED
@@ -19,8 +19,10 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_development_dependency "bundler", "~> 1.
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.13.6"
|
23
23
|
spec.add_development_dependency "rake", "~> 10.0"
|
24
24
|
spec.add_development_dependency "rmagick", "~> 2.16.0"
|
25
25
|
spec.add_development_dependency "multipart-post", "~> 2.0.0"
|
26
|
+
spec.add_development_dependency "streamio-ffmpeg", "~> 3.0.2"
|
27
|
+
|
26
28
|
end
|
data/lib/levdon.rb
CHANGED
@@ -1,13 +1,17 @@
|
|
1
|
-
require
|
1
|
+
require 'levdon/version'
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
3
|
+
require 'json' # default
|
4
|
+
require 'securerandom' # default
|
5
|
+
require 'fileutils' # default
|
6
|
+
require 'stringio' # default
|
7
|
+
require 'open-uri' # default
|
8
8
|
|
9
|
-
require
|
10
|
-
require
|
9
|
+
require 'rmagick' # sudo gem install rmagick
|
10
|
+
require 'net/http/post/multipart' # sudo gem install multipart-post #https://github.com/nicksieger/multipart-post
|
11
|
+
|
12
|
+
require 'tempfile'
|
13
|
+
require 'streamio-ffmpeg' # gem install streamio-ffmpeg / brew install ffmpeg
|
14
|
+
#require 'filemagic' # gem install ruby-filemagic / brew install libmagick
|
11
15
|
|
12
16
|
|
13
17
|
module Levdon
|
@@ -34,6 +38,7 @@ module Levdon
|
|
34
38
|
|
35
39
|
ONTOLOGY_REV_LIST = {}
|
36
40
|
ONTOLOGY_LIST.each{|k,v| ONTOLOGY_REV_LIST[v[:key]] = k }
|
41
|
+
|
37
42
|
|
38
43
|
class NonBlockLineStream
|
39
44
|
def initialize(input_stream, output_stream)
|
@@ -396,7 +401,7 @@ module Levdon
|
|
396
401
|
img = Magick::Image.from_blob(stream).first
|
397
402
|
img = img.resize(224,224)
|
398
403
|
img.to_blob {
|
399
|
-
self.quality =
|
404
|
+
self.quality = 20
|
400
405
|
self.format = "jpeg"
|
401
406
|
}
|
402
407
|
end
|
@@ -655,7 +660,7 @@ module Levdon
|
|
655
660
|
error += e.backtrace.to_s + "\n"
|
656
661
|
end
|
657
662
|
|
658
|
-
{:results => ret, :error => error
|
663
|
+
{:results => ret, :error => error}
|
659
664
|
}
|
660
665
|
}
|
661
666
|
|
@@ -691,15 +696,82 @@ module Levdon
|
|
691
696
|
end
|
692
697
|
}
|
693
698
|
end
|
699
|
+
|
700
|
+
def detect_content_type(ouri)
|
701
|
+
if(ouri)
|
702
|
+
if(ouri.respond_to?(:content_type))
|
703
|
+
ct = ouri.content_type
|
704
|
+
if(ct)
|
705
|
+
if(ct.index('image'))
|
706
|
+
return 'image'
|
707
|
+
elsif(ct.index('video'))
|
708
|
+
return 'video'
|
709
|
+
end
|
710
|
+
end
|
711
|
+
else
|
712
|
+
return 'file'
|
713
|
+
end
|
714
|
+
end
|
715
|
+
return nil
|
716
|
+
end
|
717
|
+
|
718
|
+
def detect_image_or_video_from_path(path)
|
719
|
+
ext = File.extname(path).downcase
|
720
|
+
if(ext == ".jpeg" || ext == ".png" || ext == ".gif" || ext == ".jpg" || ext == ".tiff" || ext == ".tif" || ext == ".psd" || ext == ".pdf")
|
721
|
+
return "image"
|
722
|
+
elsif(ext == ".mp4" || ext == ".avi" || ext == ".mov" || ext == ".3gp" || ext == ".flv" || ext == ".wmv")
|
723
|
+
return "video"
|
724
|
+
end
|
725
|
+
return nil
|
726
|
+
end
|
727
|
+
|
728
|
+
def generate_thumb_from_video(f)
|
729
|
+
thumb_url = "tmp"+Process.pid.to_s
|
730
|
+
movie = FFMPEG::Movie.new(f)
|
731
|
+
duration = (movie.duration / 2).floor
|
732
|
+
path = "#{thumb_url}.jpg"
|
733
|
+
movie.screenshot(path, seek_time: duration)
|
734
|
+
data = File.open(path).read()
|
735
|
+
File.delete(path)
|
736
|
+
return data
|
737
|
+
end
|
738
|
+
|
739
|
+
def to_image(fname,ct)
|
740
|
+
if(ct == "video")
|
741
|
+
return generate_thumb_from_video(fname)
|
742
|
+
elsif(ct == "image")
|
743
|
+
return File.open(fname).read
|
744
|
+
end
|
745
|
+
puts "Invalid media stream."
|
746
|
+
return nil
|
747
|
+
end
|
694
748
|
|
695
749
|
def load(any)
|
696
750
|
if(any.class.name == "String")
|
697
751
|
if(any.index("http://") == 0 or any.index("https://") == 0)
|
698
752
|
# from network
|
699
|
-
|
753
|
+
ouri = open(any)
|
754
|
+
ct = detect_content_type(ouri)
|
755
|
+
new_data = nil
|
756
|
+
if(ct == "video")
|
757
|
+
new_data = generate_thumb_from_video(ouri.path)
|
758
|
+
elsif(ct == "image")
|
759
|
+
new_data = ouri.read
|
760
|
+
end
|
761
|
+
return new_data
|
700
762
|
else
|
701
763
|
if File::ftype(any) == "file"
|
702
|
-
|
764
|
+
ct = detect_image_or_video_from_path(any)
|
765
|
+
if(ct == "video")
|
766
|
+
return generate_thumb_from_video(any)
|
767
|
+
elsif(ct == "image")
|
768
|
+
return File.open(any).read
|
769
|
+
end
|
770
|
+
puts "Invalid media file."
|
771
|
+
return nil
|
772
|
+
elsif(File::ftype(any) == "directory")
|
773
|
+
puts "Can't load a directory. Target should be a file or URL."
|
774
|
+
return nil
|
703
775
|
else
|
704
776
|
# from memory
|
705
777
|
return any
|
@@ -769,12 +841,18 @@ module Levdon
|
|
769
841
|
end
|
770
842
|
|
771
843
|
def predict(parameter)
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
844
|
+
if(parameter.class.name == "String")
|
845
|
+
parameter = {:target => parameter }
|
846
|
+
elsif(parameter.class.name == "Hash")
|
847
|
+
raise "expected key: request_id" if(parameter[:request_id])
|
848
|
+
raise "expected key: ontologies" if(parameter[:ontologies])
|
849
|
+
raise "required key: target. Specify a file path or URL or data." unless(parameter[:target])
|
850
|
+
else
|
851
|
+
raise "Invalid parameter type"
|
852
|
+
end
|
853
|
+
parameter[:request_id] = SecureRandom.uuid.gsub("-","")
|
854
|
+
parameter[:ontologies] = @ontologies
|
855
|
+
parameter[:access_token] = @access_token
|
778
856
|
|
779
857
|
ret = nil
|
780
858
|
error = nil
|
@@ -788,7 +866,7 @@ module Levdon
|
|
788
866
|
error += e.message.to_s + "\n"
|
789
867
|
error += e.backtrace.to_s + "\n"
|
790
868
|
end
|
791
|
-
return {:results => ret, :error => error
|
869
|
+
return {:results => ret, :error => error}
|
792
870
|
end
|
793
871
|
|
794
872
|
end
|
@@ -796,4 +874,19 @@ module Levdon
|
|
796
874
|
def self.new
|
797
875
|
LevdonImpl.new
|
798
876
|
end
|
877
|
+
|
878
|
+
def self.predict(access_token,target)
|
879
|
+
api = LevdonImpl.new
|
880
|
+
state = api.start(access_token)
|
881
|
+
if(state[:error])
|
882
|
+
raise state[:error]
|
883
|
+
else
|
884
|
+
result = api.predict(target)
|
885
|
+
if(result[:error])
|
886
|
+
raise result[:error]
|
887
|
+
else
|
888
|
+
return result
|
889
|
+
end
|
890
|
+
end
|
891
|
+
end
|
799
892
|
end
|
data/lib/levdon/version.rb
CHANGED
data/test.rb
CHANGED
@@ -3,14 +3,32 @@
|
|
3
3
|
require 'levdon'
|
4
4
|
|
5
5
|
# Account is not necessary during for free version.
|
6
|
-
|
7
|
-
TARGET_PATH
|
6
|
+
ACCESS_TOKEN = ENV['EATER_ACCESS_TOKEN']
|
7
|
+
TARGET_PATH = "/Users/johndoe/Desktop/data/test_data"
|
8
8
|
|
9
|
+
|
10
|
+
TESTS = ["/Users/johndoe/Downloads/j/backup/Movies/gen_movie/SAC17.mp4",
|
11
|
+
"http://art51.photozou.jp/pub/275/2258275/photo/115456936_org.v1494939738.jpg",
|
12
|
+
"http://techslides.com/demos/sample-videos/small.mp4",
|
13
|
+
"/Users/johndoe/Desktop/a.png",
|
14
|
+
"/Users/johndoe/test.gif",
|
15
|
+
"https://dora-neco.com/img/gif/gif0025.gif"]
|
16
|
+
|
17
|
+
TESTS.each{|e|
|
18
|
+
begin
|
19
|
+
puts e
|
20
|
+
puts Levdon.predict(ACCESS_TOKEN,e)
|
21
|
+
rescue => err
|
22
|
+
puts e
|
23
|
+
puts err
|
24
|
+
end
|
25
|
+
}
|
26
|
+
return;
|
9
27
|
USE_SYNC = true
|
10
28
|
if(USE_SYNC)
|
11
29
|
api = Levdon.new()
|
12
30
|
api.option({:CLASS => [:CLASS_ADULT]})
|
13
|
-
state = api.start(
|
31
|
+
state = api.start(ACCESS_TOKEN)
|
14
32
|
if(state[:error])
|
15
33
|
puts state[:error]
|
16
34
|
else
|
@@ -41,7 +59,7 @@ else
|
|
41
59
|
:PARALLEL => 32
|
42
60
|
})
|
43
61
|
|
44
|
-
api.async_start(
|
62
|
+
api.async_start(ACCESS_TOKEN) {|state|
|
45
63
|
if(state[:error])
|
46
64
|
puts state[:error]
|
47
65
|
else
|
metadata
CHANGED
@@ -1,71 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: levdon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pegara, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.13.6
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.13.6
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '10.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rmagick
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 2.16.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 2.16.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: multipart-post
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 2.0.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 2.0.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: streamio-ffmpeg
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 3.0.2
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 3.0.2
|
69
83
|
description:
|
70
84
|
email:
|
71
85
|
- info@pegara.com
|
@@ -73,7 +87,7 @@ executables: []
|
|
73
87
|
extensions: []
|
74
88
|
extra_rdoc_files: []
|
75
89
|
files:
|
76
|
-
-
|
90
|
+
- .gitignore
|
77
91
|
- Gemfile
|
78
92
|
- LICENSE.txt
|
79
93
|
- README.md
|
@@ -101,17 +115,17 @@ require_paths:
|
|
101
115
|
- lib
|
102
116
|
required_ruby_version: !ruby/object:Gem::Requirement
|
103
117
|
requirements:
|
104
|
-
- -
|
118
|
+
- - '>='
|
105
119
|
- !ruby/object:Gem::Version
|
106
120
|
version: '0'
|
107
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
122
|
requirements:
|
109
|
-
- -
|
123
|
+
- - '>='
|
110
124
|
- !ruby/object:Gem::Version
|
111
125
|
version: '0'
|
112
126
|
requirements: []
|
113
127
|
rubyforge_project:
|
114
|
-
rubygems_version: 2.
|
128
|
+
rubygems_version: 2.0.14.1
|
115
129
|
signing_key:
|
116
130
|
specification_version: 4
|
117
131
|
summary: AI(DeepLearning) contents filter library for mastodon.
|