levdon 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f644b9bcbe5fcd9e5a453bae0b8a0e34c9da18f5
4
- data.tar.gz: 831a339cec878dc9266c50476d9d36c623f5d677
3
+ metadata.gz: 5fa51449de191b50b839e774fa2d16ea429c271b
4
+ data.tar.gz: ac8a48b26603f6f8adc9315cd4f80fbaba90ac05
5
5
  SHA512:
6
- metadata.gz: 2a4baebf126b1b294c46ac94db7abed58ead303dfa9ca4df11179c4f3304c234ac947a6e1be89302880771790f1cc0905c2e4b881c0097345464732204ee4bf7
7
- data.tar.gz: 15a5682baca2fc30062b2d01d8d82e48fe71d4d14f74df9f357ca7c5506039a58cf4d58db5d57b92e21b6ee696ed74ed446839bd632e8341f270077fd4d1e6b6
6
+ metadata.gz: 2803eb099e73a0c070fe911b5de64e2c58463ef7e3f1eb8e401643e19af99a03464fc10bb5cc9ff2135acbb8b25c6fb0d8929d2d80aa946139ce22714c044c4b
7
+ data.tar.gz: d25f3d8cf7f8f3440ae35121da6ee6f47587bf8495e496fb9987cfbe09901f0b45cd1e979962c8d64dc9a2f68e057074f765aac8c401388d5144b8375b6481ae
data/Gemfile CHANGED
@@ -1,4 +1,11 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+
4
+ gem "bundle"
5
+ gem "rake"
6
+ gem "rmagick"
7
+ gem "multipart-post"
8
+ gem "streamio-ffmpeg"
9
+
3
10
  # Specify your gem's dependencies in levdon.gemspec
4
11
  gemspec
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2017 Akihito Nakatsuka
3
+ Copyright (c) 2017 Pegara
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
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.14"
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 "levdon/version"
1
+ require 'levdon/version'
2
2
 
3
- require "json" # default
4
- require "securerandom" # default
5
- require "fileutils" # default
6
- require "stringio" # default
7
- require "open-uri" # default
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 "rmagick" # sudo gem install rmagick
10
- require "net/http/post/multipart" # sudo gem install multipart-post #https://github.com/nicksieger/multipart-post
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 = 80
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,:parameter => parameter}
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
- return open(any).read
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
- return File.open(any).read # File IO
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
- raise "expected key: request_id" if(parameter[:request_id])
773
- raise "expected key: ontologies" if(parameter[:ontologies])
774
- raise "required key: target. Specify a file path or URL or data." unless(parameter[:target])
775
- parameter[:request_id] = SecureRandom.uuid.gsub("-","")
776
- parameter[:ontologies] = @ontologies
777
- parameter[:access_token] = @access_token
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,:parameter => parameter}
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
@@ -1,3 +1,3 @@
1
1
  module Levdon
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
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
- APIKEY = ENV['EATER_ACCESS_TOKEN']
7
- TARGET_PATH = "/Users/johndoe/Desktop/data/test_data"
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(APIKEY)
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(APIKEY) {|state|
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.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-12 00:00:00.000000000 Z
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: '1.14'
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: '1.14'
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
- - ".gitignore"
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.6.11
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.