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 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.