eikon 0.1.1

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.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +0 -0
  3. data/.github/workflows/main.yml +27 -0
  4. data/.gitignore +12 -0
  5. data/.rubocop.yml +57 -0
  6. data/.travis.yml +6 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +22 -0
  9. data/Gemfile.lock +183 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +54 -0
  12. data/Rakefile +10 -0
  13. data/bin/console +14 -0
  14. data/bin/setup +8 -0
  15. data/bin/tapioca +27 -0
  16. data/eikon-0.1.0.gem +0 -0
  17. data/eikon.gemspec +34 -0
  18. data/lib/eikon/comparator.rb +17 -0
  19. data/lib/eikon/image_processor.rb +48 -0
  20. data/lib/eikon/version.rb +4 -0
  21. data/lib/eikon/video_processor.rb +72 -0
  22. data/lib/eikon.rb +35 -0
  23. data/sorbet/config +2 -0
  24. data/sorbet/rbi/gems/byebug.rbi +1041 -0
  25. data/sorbet/rbi/gems/climate_control.rbi +46 -0
  26. data/sorbet/rbi/gems/coderay.rbi +92 -0
  27. data/sorbet/rbi/gems/eikon.rbi +21 -0
  28. data/sorbet/rbi/gems/ffi.rbi +560 -0
  29. data/sorbet/rbi/gems/method_source.rbi +64 -0
  30. data/sorbet/rbi/gems/minitest.rbi +422 -0
  31. data/sorbet/rbi/gems/pry.rbi +1949 -0
  32. data/sorbet/rbi/gems/rake.rbi +645 -0
  33. data/sorbet/rbi/gems/ruby-vips.rbi +656 -0
  34. data/sorbet/rbi/gems/ruby_jard.rbi +681 -0
  35. data/sorbet/rbi/gems/terrapin.rbi +116 -0
  36. data/sorbet/rbi/gems/tty-screen.rbi +66 -0
  37. data/sorbet/rbi/hidden-definitions/errors.txt +34134 -0
  38. data/sorbet/rbi/hidden-definitions/hidden.rbi +17393 -0
  39. data/sorbet/rbi/sorbet-typed/lib/actionpack/all/actionpack.rbi +1138 -0
  40. data/sorbet/rbi/sorbet-typed/lib/actionview/all/actionview.rbi +408 -0
  41. data/sorbet/rbi/sorbet-typed/lib/activesupport/>=6/activesupport.rbi +37 -0
  42. data/sorbet/rbi/sorbet-typed/lib/activesupport/all/activesupport.rbi +1850 -0
  43. data/sorbet/rbi/sorbet-typed/lib/minitest/all/minitest.rbi +108 -0
  44. data/sorbet/rbi/sorbet-typed/lib/railties/>=6.1/railties.rbi +15 -0
  45. data/sorbet/rbi/sorbet-typed/lib/railties/all/railties.rbi +110 -0
  46. data/sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi +276 -0
  47. data/sorbet/rbi/sorbet-typed/lib/rake/all/rake.rbi +645 -0
  48. data/sorbet/rbi/sorbet-typed/lib/rubocop/>=1.8/rubocop.rbi +12 -0
  49. data/sorbet/rbi/sorbet-typed/lib/rubocop-performance/~>1.6/rubocop-performance.rbi +149 -0
  50. data/sorbet/rbi/sorbet-typed/lib/rubocop-rails/~>2.5/rubocop-rails.rbi +328 -0
  51. data/sorbet/rbi/sorbet-typed/lib/thor/all/thor.rbi +905 -0
  52. data/sorbet/rbi/sorbet-typed/lib/yard/all/yard.rbi +32 -0
  53. data/sorbet/rbi/todo.rbi +15 -0
  54. data/sorbet/tapioca/config.yml +13 -0
  55. data/sorbet/tapioca/require.rb +4 -0
  56. metadata +141 -0
@@ -0,0 +1,72 @@
1
+ # typed: strict
2
+ require "sorbet-runtime"
3
+ require "terrapin"
4
+
5
+ module Eikon
6
+ class VideoProcessor
7
+ extend T::Sig
8
+
9
+ sig { returns(String) }
10
+ attr_reader :file_name
11
+
12
+ sig { params(file_name: String).void }
13
+ def initialize(file_name)
14
+ @file_name = T.let(file_name, String)
15
+ end
16
+
17
+ sig { returns(String) }
18
+ def split_video_into_images
19
+ file_name = get_file_name(@file_name)
20
+
21
+ setup_tmp_folder
22
+
23
+ output_folder_path = "tmp/videos/#{file_name}_#{Time.now.utc.strftime("%Y%m%d%H%M%S")}"
24
+ begin
25
+ make_dir_command = Terrapin::CommandLine.new("mkdir", ":folder_name")
26
+ make_dir_command.run(folder_name: output_folder_path)
27
+ rescue Terrapin::ExitStatusError
28
+ raise "Folder already exists for this export"
29
+ end
30
+
31
+ # ffmpeg -i pexels-ron-lach-7121125.mp4 -vf fps=10/60 out%d.png
32
+ line = Terrapin::CommandLine.new("ffmpeg", "-i :file_name -vf fps=10/60 :folder_name")
33
+ line.run(file_name: @file_name, folder_name: "#{output_folder_path}/#{file_name}_%d.png")
34
+ output_folder_path
35
+ end
36
+
37
+ sig { params(folder_path: String).returns(T::Array[T::Hash[String, T.any(Integer, String)]]) }
38
+ def get_frames_dhash(folder_path)
39
+ # All the file lists start with `.` and `..` so we need to remove those
40
+ file_names = Dir.entries(folder_path).drop(2)
41
+
42
+ dhashes = file_names.map do |file_name|
43
+ dhash = Eikon.dhash_for_image("#{folder_path}/#{file_name}")
44
+ { file_name: file_name, dhash: dhash }
45
+ end
46
+ dhashes
47
+ end
48
+
49
+ private
50
+
51
+ sig { params(file_name: String).returns(String) }
52
+ def get_file_name(file_name)
53
+ file_name_parts = file_name.split(".")
54
+ file_name_parts.select! { |e| !e.empty? }
55
+ file_name = file_name_parts.first
56
+ T.must(T.must(file_name).split("/").last)
57
+ end
58
+
59
+ sig { void }
60
+ def setup_tmp_folder
61
+ begin
62
+ make_dir_command = Terrapin::CommandLine.new("mkdir", "tmp/")
63
+ make_dir_command.run
64
+ rescue Terrapin::ExitStatusError; end
65
+
66
+ begin
67
+ make_dir_command = Terrapin::CommandLine.new("mkdir", "tmp/videos")
68
+ make_dir_command.run
69
+ rescue Terrapin::ExitStatusError; end
70
+ end
71
+ end
72
+ end
data/lib/eikon.rb ADDED
@@ -0,0 +1,35 @@
1
+ # typed: strict
2
+ require "eikon/version"
3
+ require "eikon/comparator"
4
+ require "eikon/video_processor"
5
+ require "eikon/image_processor"
6
+ require "vips"
7
+ require "ruby_jard"
8
+ require "sorbet-runtime"
9
+
10
+ module Eikon
11
+ extend T::Sig
12
+
13
+ class Error < StandardError; end
14
+
15
+ sig { params(filename: T.untyped).returns(String) }
16
+ def self.dhash_for_image(filename)
17
+ image = Eikon::ImageProcessor.new(filename)
18
+ image.preprocess_image
19
+ image.generate_byte_array
20
+ image.byte_array
21
+ end
22
+
23
+ sig { params(filename: String).returns(T::Array[T::Hash[String, T.any(Integer, String)]]) }
24
+ def self.dhash_for_video(filename)
25
+ video_processor = Eikon::VideoProcessor.new(filename)
26
+ storage_path = video_processor.split_video_into_images
27
+ dhashes = video_processor.get_frames_dhash(storage_path)
28
+ dhashes
29
+ end
30
+
31
+ sig { params(filename_1: String, filename_2: String).returns(Integer) }
32
+ def self.distance_between_files(filename_1, filename_2)
33
+ Eikon::Comparator.compare(dhash_for_image(filename_1), dhash_for_image(filename_2))
34
+ end
35
+ end
data/sorbet/config ADDED
@@ -0,0 +1,2 @@
1
+ --dir
2
+ .