bagel 0.1.0

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 (79) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.prettierignore +2 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +13 -0
  6. data/CHANGELOG.md +5 -0
  7. data/Gemfile +5 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +187 -0
  10. data/Rakefile +12 -0
  11. data/bagel.gemspec +32 -0
  12. data/bin/console +15 -0
  13. data/bin/setup +8 -0
  14. data/lib/bagel/colors.rb +8 -0
  15. data/lib/bagel/fonts.rb +3 -0
  16. data/lib/bagel/graphic/comment.rb +49 -0
  17. data/lib/bagel/graphic/intro.rb +49 -0
  18. data/lib/bagel/graphic/scoreboard/context.rb +28 -0
  19. data/lib/bagel/graphic/scoreboard/games.rb +13 -0
  20. data/lib/bagel/graphic/scoreboard/name.rb +32 -0
  21. data/lib/bagel/graphic/scoreboard/points.rb +13 -0
  22. data/lib/bagel/graphic/scoreboard/score.rb +38 -0
  23. data/lib/bagel/graphic/scoreboard/server.rb +16 -0
  24. data/lib/bagel/graphic/scoreboard/sets.rb +13 -0
  25. data/lib/bagel/graphic/scoreboard.rb +102 -0
  26. data/lib/bagel/graphic/stats/duration.rb +33 -0
  27. data/lib/bagel/graphic/stats/header.rb +32 -0
  28. data/lib/bagel/graphic/stats/result.rb +41 -0
  29. data/lib/bagel/graphic/stats/stat.rb +48 -0
  30. data/lib/bagel/graphic/stats.rb +80 -0
  31. data/lib/bagel/graphic.rb +23 -0
  32. data/lib/bagel/tennis/checker.rb +100 -0
  33. data/lib/bagel/tennis/outcome.rb +48 -0
  34. data/lib/bagel/tennis/player.rb +22 -0
  35. data/lib/bagel/tennis/point.rb +17 -0
  36. data/lib/bagel/tennis/score.rb +68 -0
  37. data/lib/bagel/tennis/scoring.rb +26 -0
  38. data/lib/bagel/tennis/serve.rb +36 -0
  39. data/lib/bagel/tennis/stats/aces.rb +28 -0
  40. data/lib/bagel/tennis/stats/break_points_won.rb +33 -0
  41. data/lib/bagel/tennis/stats/double_faults.rb +28 -0
  42. data/lib/bagel/tennis/stats/first_serve_in.rb +33 -0
  43. data/lib/bagel/tennis/stats/first_serve_points_won.rb +33 -0
  44. data/lib/bagel/tennis/stats/net_points_won.rb +33 -0
  45. data/lib/bagel/tennis/stats/points_won.rb +24 -0
  46. data/lib/bagel/tennis/stats/second_serve_points_won.rb +33 -0
  47. data/lib/bagel/tennis/stats/stat.rb +40 -0
  48. data/lib/bagel/tennis/stats/unforced_errors.rb +24 -0
  49. data/lib/bagel/tennis/stats/winners.rb +24 -0
  50. data/lib/bagel/tennis/stats.rb +16 -0
  51. data/lib/bagel/tennis.rb +13 -0
  52. data/lib/bagel/timeframe.rb +31 -0
  53. data/lib/bagel/version.rb +5 -0
  54. data/lib/bagel/video/clip.rb +41 -0
  55. data/lib/bagel/video/clip_builder_factory.rb +13 -0
  56. data/lib/bagel/video/clip_builders/clip_builder.rb +32 -0
  57. data/lib/bagel/video/clip_builders/intro_clip_builder.rb +37 -0
  58. data/lib/bagel/video/clip_builders/point_clip_builder.rb +67 -0
  59. data/lib/bagel/video/clip_builders/stats_clip_builder.rb +56 -0
  60. data/lib/bagel/video/clip_data_parser.rb +39 -0
  61. data/lib/bagel/video/clip_director.rb +16 -0
  62. data/lib/bagel/video/clip_saver.rb +59 -0
  63. data/lib/bagel/video/fade.rb +24 -0
  64. data/lib/bagel/video/ffmpeg/concat_file.rb +45 -0
  65. data/lib/bagel/video/ffmpeg/fade_filter.rb +34 -0
  66. data/lib/bagel/video/ffmpeg/overlay_filter.rb +52 -0
  67. data/lib/bagel/video/ffmpeg.rb +41 -0
  68. data/lib/bagel/video/orientation.rb +8 -0
  69. data/lib/bagel/video/overlays/comment.rb +15 -0
  70. data/lib/bagel/video/overlays/intro.rb +15 -0
  71. data/lib/bagel/video/overlays/overlay.rb +28 -0
  72. data/lib/bagel/video/overlays/scoreboard.rb +15 -0
  73. data/lib/bagel/video/overlays/second_serve.rb +15 -0
  74. data/lib/bagel/video/overlays/stats.rb +15 -0
  75. data/lib/bagel/video/padding.rb +9 -0
  76. data/lib/bagel/video/video.rb +18 -0
  77. data/lib/bagel/video.rb +32 -0
  78. data/lib/bagel.rb +76 -0
  79. metadata +196 -0
@@ -0,0 +1,8 @@
1
+ module Bagel::Video
2
+ class Orientation
3
+ BOTTOM = :bottom
4
+ BOTTOM_LEFT = :bottom_left
5
+ BOTTOM_RIGHT = :bottom_right
6
+ CENTER = :center
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ module Bagel::Video::Overlays
2
+ class Comment < Overlay
3
+ def orientation
4
+ Orientation::BOTTOM_RIGHT
5
+ end
6
+
7
+ def padding
8
+ Padding.new(x: 50, y: 50)
9
+ end
10
+
11
+ def fade
12
+ Fade.new(out_start: 2.5, out_duration: 0.5)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Bagel::Video::Overlays
2
+ class Intro < Overlay
3
+ def orientation
4
+ Orientation::BOTTOM_LEFT
5
+ end
6
+
7
+ def padding
8
+ Padding.new(x: 80, y: 60)
9
+ end
10
+
11
+ def fade
12
+ Fade.new(out_start: 5, out_duration: 1.5)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ module Bagel::Video::Overlays
2
+ class Overlay
3
+ attr_reader :asset
4
+
5
+ def initialize(asset, fade=false)
6
+ @asset = asset
7
+ @fade = fade
8
+ end
9
+
10
+ def orientation
11
+ raise_not_implemented_error(self.class, __method__)
12
+ end
13
+
14
+ def padding
15
+ raise_not_implemented_error(self.class, __method__)
16
+ end
17
+
18
+ def fade
19
+ raise_not_implemented_error(self.class, __method__)
20
+ end
21
+
22
+ private
23
+
24
+ def raise_not_implemented_error(klass, method)
25
+ raise NotImplementedError, "#{klass} has not implemented method '#{method}'"
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ module Bagel::Video::Overlays
2
+ class Scoreboard < Overlay
3
+ def orientation
4
+ Orientation::BOTTOM_LEFT
5
+ end
6
+
7
+ def padding
8
+ Padding.new(x: 50, y: 50)
9
+ end
10
+
11
+ def fade
12
+ @fade ? Fade.new(out_start: 3, out_duration: 1.5) : nil
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Bagel::Video::Overlays
2
+ class SecondServe < Overlay
3
+ def orientation
4
+ Orientation::BOTTOM
5
+ end
6
+
7
+ def padding
8
+ Padding.new(x: 50, y: 50)
9
+ end
10
+
11
+ def fade
12
+ Fade.new(out_start: 2.5, out_duration: 0.5)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Bagel::Video::Overlays
2
+ class Stats < Overlay
3
+ def orientation
4
+ Orientation::CENTER
5
+ end
6
+
7
+ def padding
8
+ nil
9
+ end
10
+
11
+ def fade
12
+ Fade.new(in_start: 3, in_duration: 1.5, out_start: 8, out_duration: 1.5)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ module Bagel::Video
2
+ class Padding
3
+ attr_reader :x, :y
4
+
5
+ def initialize(attrs)
6
+ @x, @y = attrs[:x], attrs[:y]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ module Bagel::Video
2
+ class Video
3
+ private attr_reader :clips
4
+
5
+ def initialize(clips)
6
+ @clips = clips
7
+ end
8
+
9
+ def save
10
+ clips.map(&:save)
11
+ FFMPEG.concat(
12
+ source: Bagel.config.clip_dir,
13
+ destination: Bagel.config.destination_video,
14
+ transcode: false
15
+ )
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,32 @@
1
+ require 'bagel/video/clip_data_parser'
2
+ require 'bagel/video/clip'
3
+ require 'bagel/video/clip_saver'
4
+
5
+ require 'bagel/video/clip_director'
6
+ require 'bagel/video/clip_builders/clip_builder'
7
+ require 'bagel/video/clip_builders/intro_clip_builder'
8
+ require 'bagel/video/clip_builders/point_clip_builder'
9
+ require 'bagel/video/clip_builders/stats_clip_builder'
10
+ require 'bagel/video/clip_builder_factory'
11
+
12
+ require 'bagel/video/orientation'
13
+
14
+ require 'bagel/video/overlays/overlay'
15
+ require 'bagel/video/overlays/intro'
16
+ require 'bagel/video/overlays/scoreboard'
17
+ require 'bagel/video/overlays/second_serve'
18
+ require 'bagel/video/overlays/comment'
19
+ require 'bagel/video/overlays/stats'
20
+
21
+ require 'bagel/video/video'
22
+ require 'bagel/video/fade'
23
+ require 'bagel/video/padding'
24
+
25
+ require 'bagel/video/ffmpeg'
26
+ require 'bagel/video/ffmpeg/fade_filter'
27
+ require 'bagel/video/ffmpeg/overlay_filter'
28
+
29
+ module Bagel
30
+ module Video
31
+ end
32
+ end
data/lib/bagel.rb ADDED
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require 'forwardable'
5
+ require 'ostruct'
6
+ require 'tempfile'
7
+ require 'yaml'
8
+ require 'rmagick'
9
+ include Magick
10
+
11
+ require 'bagel/version'
12
+ require 'bagel/colors'
13
+ require 'bagel/fonts'
14
+
15
+ require 'bagel/video'
16
+ require 'bagel/graphic'
17
+ require 'bagel/tennis'
18
+ require 'bagel/timeframe'
19
+
20
+ include Bagel
21
+ include Bagel::Graphic
22
+ include Bagel::Tennis
23
+ include Bagel::Tennis::Stats
24
+ include Bagel::Video
25
+ include Bagel::Video::ClipBuilders
26
+ include Bagel::Video::FFMPEG
27
+
28
+ module Bagel
29
+ TMP_DIR = 'tmp'
30
+ GRAPHIC_DIR = 'graphics'
31
+ TRIM_DIR = 'trims'
32
+ CLIP_DIR = 'clips'
33
+
34
+ def self.config
35
+ @config ||= OpenStruct.new
36
+ end
37
+
38
+ def self.configure
39
+ yield(config)
40
+ check_values
41
+ set_default_values
42
+ init_directories
43
+ end
44
+
45
+ def self.check_values
46
+ raise 'source_video does not exist' unless File.exist?(config.source_video.to_s)
47
+ raise 'score_sheet does not exist' unless File.exist?(config.clip_data.to_s)
48
+ end
49
+
50
+ def self.set_default_values
51
+ @config.show_scores = true if config.show_scores.nil?
52
+ @config.show_second_serve_indicator = true if config.show_second_serve_indicator.nil?
53
+ end
54
+
55
+ def init_directories
56
+ @config.tmp_dir = File.join(TMP_DIR, @config.name)
57
+ @config.graphic_dir = File.join(@config.tmp_dir, GRAPHIC_DIR)
58
+ @config.trim_dir = File.join(@config.tmp_dir, TRIM_DIR)
59
+ @config.clip_dir = File.join(@config.tmp_dir, CLIP_DIR)
60
+
61
+ [
62
+ @config.graphic_dir,
63
+ @config.trim_dir,
64
+ @config.clip_dir
65
+ ].each do |path|
66
+ FileUtils.rm_rf(path, secure: true)
67
+ FileUtils.mkdir_p(path)
68
+ end
69
+ end
70
+
71
+ def self.make_video
72
+ data = Bagel.config.clip_data
73
+ clips = ClipDataParser.new(data).parse_clips
74
+ Video::Video.new(clips).save
75
+ end
76
+ end
metadata ADDED
@@ -0,0 +1,196 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bagel
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Brent Chuang
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-09-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rmagick
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 4.2.2
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '4.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 4.2.2
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '13.0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '13.0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rubocop
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.7'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.7'
75
+ - !ruby/object:Gem::Dependency
76
+ name: factory_bot
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '6.2'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '6.2'
89
+ description:
90
+ email:
91
+ - burennto@gmail.com
92
+ executables: []
93
+ extensions: []
94
+ extra_rdoc_files: []
95
+ files:
96
+ - ".gitignore"
97
+ - ".prettierignore"
98
+ - ".rspec"
99
+ - ".rubocop.yml"
100
+ - CHANGELOG.md
101
+ - Gemfile
102
+ - LICENSE.txt
103
+ - README.md
104
+ - Rakefile
105
+ - bagel.gemspec
106
+ - bin/console
107
+ - bin/setup
108
+ - lib/bagel.rb
109
+ - lib/bagel/colors.rb
110
+ - lib/bagel/fonts.rb
111
+ - lib/bagel/graphic.rb
112
+ - lib/bagel/graphic/comment.rb
113
+ - lib/bagel/graphic/intro.rb
114
+ - lib/bagel/graphic/scoreboard.rb
115
+ - lib/bagel/graphic/scoreboard/context.rb
116
+ - lib/bagel/graphic/scoreboard/games.rb
117
+ - lib/bagel/graphic/scoreboard/name.rb
118
+ - lib/bagel/graphic/scoreboard/points.rb
119
+ - lib/bagel/graphic/scoreboard/score.rb
120
+ - lib/bagel/graphic/scoreboard/server.rb
121
+ - lib/bagel/graphic/scoreboard/sets.rb
122
+ - lib/bagel/graphic/stats.rb
123
+ - lib/bagel/graphic/stats/duration.rb
124
+ - lib/bagel/graphic/stats/header.rb
125
+ - lib/bagel/graphic/stats/result.rb
126
+ - lib/bagel/graphic/stats/stat.rb
127
+ - lib/bagel/tennis.rb
128
+ - lib/bagel/tennis/checker.rb
129
+ - lib/bagel/tennis/outcome.rb
130
+ - lib/bagel/tennis/player.rb
131
+ - lib/bagel/tennis/point.rb
132
+ - lib/bagel/tennis/score.rb
133
+ - lib/bagel/tennis/scoring.rb
134
+ - lib/bagel/tennis/serve.rb
135
+ - lib/bagel/tennis/stats.rb
136
+ - lib/bagel/tennis/stats/aces.rb
137
+ - lib/bagel/tennis/stats/break_points_won.rb
138
+ - lib/bagel/tennis/stats/double_faults.rb
139
+ - lib/bagel/tennis/stats/first_serve_in.rb
140
+ - lib/bagel/tennis/stats/first_serve_points_won.rb
141
+ - lib/bagel/tennis/stats/net_points_won.rb
142
+ - lib/bagel/tennis/stats/points_won.rb
143
+ - lib/bagel/tennis/stats/second_serve_points_won.rb
144
+ - lib/bagel/tennis/stats/stat.rb
145
+ - lib/bagel/tennis/stats/unforced_errors.rb
146
+ - lib/bagel/tennis/stats/winners.rb
147
+ - lib/bagel/timeframe.rb
148
+ - lib/bagel/version.rb
149
+ - lib/bagel/video.rb
150
+ - lib/bagel/video/clip.rb
151
+ - lib/bagel/video/clip_builder_factory.rb
152
+ - lib/bagel/video/clip_builders/clip_builder.rb
153
+ - lib/bagel/video/clip_builders/intro_clip_builder.rb
154
+ - lib/bagel/video/clip_builders/point_clip_builder.rb
155
+ - lib/bagel/video/clip_builders/stats_clip_builder.rb
156
+ - lib/bagel/video/clip_data_parser.rb
157
+ - lib/bagel/video/clip_director.rb
158
+ - lib/bagel/video/clip_saver.rb
159
+ - lib/bagel/video/fade.rb
160
+ - lib/bagel/video/ffmpeg.rb
161
+ - lib/bagel/video/ffmpeg/concat_file.rb
162
+ - lib/bagel/video/ffmpeg/fade_filter.rb
163
+ - lib/bagel/video/ffmpeg/overlay_filter.rb
164
+ - lib/bagel/video/orientation.rb
165
+ - lib/bagel/video/overlays/comment.rb
166
+ - lib/bagel/video/overlays/intro.rb
167
+ - lib/bagel/video/overlays/overlay.rb
168
+ - lib/bagel/video/overlays/scoreboard.rb
169
+ - lib/bagel/video/overlays/second_serve.rb
170
+ - lib/bagel/video/overlays/stats.rb
171
+ - lib/bagel/video/padding.rb
172
+ - lib/bagel/video/video.rb
173
+ homepage: https://github.com/burennto/bagel
174
+ licenses:
175
+ - MIT
176
+ metadata: {}
177
+ post_install_message:
178
+ rdoc_options: []
179
+ require_paths:
180
+ - lib
181
+ required_ruby_version: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: 2.4.0
186
+ required_rubygems_version: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ requirements: []
192
+ rubygems_version: 3.2.15
193
+ signing_key:
194
+ specification_version: 4
195
+ summary: Bagel is a tennis video editor/annotator.
196
+ test_files: []