sra2019 0.7.1 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +3 -1
  4. data/lib/sra2019.rb +104 -13
  5. metadata +28 -27
  6. metadata.gz.sig +4 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 355540486041c1a4b1209995c49bcdfd0cf543257723745435270aea77846418
4
- data.tar.gz: 920193b42c80c12ffa5c568733a6ca31b2541a4f9199bf95030878697d1262ee
2
+ SHA1:
3
+ metadata.gz: ef6fff18b33ade289433566faab793bf5a2f1e76
4
+ data.tar.gz: 30314b992672aa85ef961c2966cfbe889a0465e2
5
5
  SHA512:
6
- metadata.gz: e9d57f8434ee8e69d24579734076971d6adb744c4751c38fc61055c854b0a21dd23697ead57cce984e476b8062a220457123587b0e55970d5069c6d683dd149b
7
- data.tar.gz: da1d2244ee4119de257ea5b30e392d45098f7328418857d990e2f1e9fdf078710eaaa839505ce66a0e4038432a5b706c4f987cfa364b74aceedce24353921147
6
+ metadata.gz: 505db3abd23cc84977dd7f0b06a88bd5bd16e7eacb32dc662fb8e08d0c829e7b22833b9d99659b76d72985babeb6b081b666024a1bd3a36fe73e33c85a1fe579
7
+ data.tar.gz: 3e61bd59af19d5a4f2575942cee9e9f8580efc4efd94d2e28f3b0498b57bee052611f376711af067e1b73ff56605c702495c6fbfdb144131c439282a34f75cc0
Binary file
data.tar.gz.sig CHANGED
@@ -1 +1,3 @@
1
- H���j8�ȸ=o[fH�|Ր!)������\��Ps�^��<����f����L ^�/��"kH0Z:�Ct���,�������M0�N�J<3Eҁ����_�k���D���t� �w�z��UskU��˂.8��g]���M-g�*�\l�Lp�s^����4�9z��K�Y��w4C���|�/��-z�í �Mn]ǬY�j&��h��/��(�v�9HI��LLqDk�����JW1� ��V�s[{}y��L���_��33�Q�hw5 �����3L}�u���>��zc�^�}·1�q�S�������In�@����Ȅ��~�urDÈ{����u����L�et�J�J�������i���hI }��p PN|�G
1
+ q}���Iޢ7ݎ��&W�K�'b���ZO��E8:=^%���{��ݬ�UŔ���dj/����Tz�*m��4���
2
+ m�ٲ�:��$�]�[Ic�Y�����#{�64;2�ɏ#�z �)�(����݄#S���o �8�'0�s�0Ev����u&���
3
+ u��͓�-Cơ.2�����€�.��/_������Fw9?w����0�t�K1БO�8��) Р �)�4��h�А�!��3ᩍcy�V(���WŇE$��w����lD��+��A01.�)�5��(fσ+E��Q�S�[{W�w�Δ�p��G�~r�k7~�R�j���]����,�~�R_� ���D5r�e*q?�
@@ -70,6 +70,12 @@ module TimeHelper
70
70
  Time.strptime(self, "%H:%M:%S")
71
71
  end
72
72
  end
73
+
74
+ refine Integer do
75
+ def to_hms
76
+ Subunit.new(units={minutes:60}, seconds: self).to_a
77
+ end
78
+ end
73
79
 
74
80
  end
75
81
 
@@ -122,17 +128,58 @@ class StepsRecorderAnalyser
122
128
  end
123
129
 
124
130
  # adds the audio track to the video file
131
+ # mp4 in avi out
125
132
  #
126
133
  def add_audio_track(audio_file, video_file, target_video)
127
134
 
128
135
  if block_given? then
129
136
  yield(audio_file, video_file, target_video)
130
137
  else
131
- `ffmpeg -i #{video_file} -i #{audio_file} -codec copy -shortest #{target_video}`
138
+ `ffmpeg -i #{video_file} -i #{audio_file} -codec copy -shortest #{target_video} -y`
139
+ end
140
+
141
+ end
142
+
143
+ # mp4 in mp4 out
144
+ #
145
+ def add_subtitles(source, destination)
146
+
147
+
148
+ subtitles = File.join(@working_dir, 's.srt')
149
+ File.write subtitles, to_srt()
150
+
151
+ if block_given? then
152
+ yield(source, subtitles, destination)
153
+ else
154
+ `ffmpeg -i #{source} -i #{subtitles} -c copy -c:s mov_text #{destination} -y`
132
155
  end
133
156
 
134
157
  end
135
158
 
159
+ def build_video(source, destination)
160
+
161
+ dir = File.dirname(source)
162
+ file = File.basename(source)
163
+
164
+ tidy!
165
+
166
+ vid2 = File.join(dir, file.sub(/\.mp4$/,'b\0'))
167
+ trim_video source, vid2
168
+
169
+ vid3 = File.join(dir, file.sub(/\.mp4$/,'c.avi'))
170
+
171
+ generate_audio
172
+ add_audio_track File.join(@working_dir, 'audio.wav'), vid2, vid3
173
+
174
+
175
+ vid4 = File.join(dir, file.sub(/\.avi$/,'d\0'))
176
+ resize_video vid3, vid4
177
+
178
+ vid5 = File.join(dir, file.sub(/\.mp4$/,'e\0'))
179
+ transcode_video(vid4, vid5)
180
+ add_subtitles(vid5, destination)
181
+
182
+ end
136
183
 
137
184
 
138
185
  def generate_audio(wav: true)
@@ -149,22 +196,33 @@ class StepsRecorderAnalyser
149
196
  @pollyspeech.tts(x.desc.force_encoding('UTF-8'), file)
150
197
 
151
198
  x.audio_duration = OggInfo.open(file) {|ogg| ogg.length.to_i }
152
- x.silence_duration = x.duration - x.audio_duration
199
+
200
+ if @debug then
201
+ puts ('x.duration: ' + x.duration.inspect).debug
202
+ puts ('x.audio_duration: ' + x.audio_duration.inspect).debug
203
+ end
204
+
205
+ duration = x.duration - x.audio_duration
206
+ x.silence_duration = duration >= 0 ? duration : 0
153
207
 
154
208
  if wav then
155
209
 
156
210
  silent_file = File.join(@working_dir, "silence#{(i+1).to_s}.wav")
211
+ puts 'x.silence_duration: ' + x.silence_duration.inspect if @debug
157
212
  wav_silence silent_file, duration: x.silence_duration
158
213
  ogg_to_wav File.join(@working_dir, "voice#{i+1}.ogg")
159
214
 
160
215
  end
161
216
 
162
- sleep 0.6
217
+ sleep 0.02
163
218
 
164
219
  end
165
220
 
166
221
  if wav then
167
222
 
223
+ intro = File.join(@working_dir, 'intro.wav')
224
+ wav_silence intro
225
+
168
226
  files = @steps.length.times.flat_map do |n|
169
227
  [
170
228
  File.join(@working_dir, "voice#{n+1}.wav"),
@@ -172,6 +230,8 @@ class StepsRecorderAnalyser
172
230
  ]
173
231
  end
174
232
 
233
+ files.prepend intro
234
+
175
235
  wav_concat files, File.join(@working_dir, 'audio.wav')
176
236
  end
177
237
 
@@ -184,6 +244,16 @@ class StepsRecorderAnalyser
184
244
 
185
245
  end
186
246
 
247
+ def remove_steps(a)
248
+ a.each {|n| @steps[n] = nil }
249
+ @steps.compact!
250
+ end
251
+
252
+ # avi in avi out
253
+ def resize_video(source, destination)
254
+ `ffmpeg -i #{source} -vf scale="720:-1" #{destination} -y`
255
+ end
256
+
187
257
  def tidy!()
188
258
 
189
259
  verbose_level = 0
@@ -219,7 +289,28 @@ class StepsRecorderAnalyser
219
289
 
220
290
  end
221
291
 
222
- end
292
+ end
293
+
294
+ def transcode_video(avi, mp4)
295
+
296
+ if block_given? then
297
+ yield(avi, mp4)
298
+ else
299
+ `ffmpeg -i #{avi} #{mp4} -y`
300
+ end
301
+
302
+ end
303
+
304
+ def trim_video(video, newvideo)
305
+
306
+ start = @steps.first.time - 4
307
+ t1, t2 = [start, @steps.last.time - 2 ].map do |step|
308
+ "%02d:%02d:%02d" % (step.to_hms.reverse + [0,0]).take(3).reverse
309
+ end
310
+
311
+ `ffmpeg -i #{video} -ss #{t1} -t #{t2} -async 1 #{newvideo} -y`
312
+
313
+ end
223
314
 
224
315
  # Returns a Dynarex object
225
316
  #
@@ -307,17 +398,17 @@ EOF
307
398
  @sliml
308
399
  end
309
400
 
310
- def to_srt(offset=0)
401
+ def to_srt(offset=-(@steps.first.time - 2))
311
402
 
312
403
  lines = to_subtitles(offset).strip.lines.map.with_index do |x, i|
313
404
 
314
405
  raw_times, subtitle = x.split(/ /,2)
315
-
406
+ puts ('raw_times: ' + raw_times.inspect).debug if @debug
316
407
  start_time, end_time = raw_times.split('-',2)
317
- times = [("%02d:%02d:%02d" % ([0, 0 ] + start_time.split(/\D/)\
408
+ times = [("%02d:%02d:%02d,000" % ([0, 0 ] + start_time.split(/\D/)\
318
409
  .map(&:to_i)).reverse.take(3).reverse), \
319
410
  '-->', \
320
- ("%02d:%02d:%02d" % ([0, 0 ] + end_time.split(/\D/).map(&:to_i))\
411
+ ("%02d:%02d:%02d,000" % ([0, 0 ] + end_time.split(/\D/).map(&:to_i))\
321
412
  .reverse.take(3).reverse)].join(' ')
322
413
 
323
414
  [i+1, times, subtitle].join("\n")
@@ -328,12 +419,12 @@ EOF
328
419
 
329
420
  end
330
421
 
331
- def to_subtitles(offset=0)
422
+ def to_subtitles(offset=-(@steps.first.time - 2))
423
+
424
+ raw_times = @steps.map {|x| [x.time, x.time + x.audio_duration + 1]}
332
425
 
333
- raw_times = @all_steps.map(&:time)
334
- raw_times << raw_times.last + 10
335
426
 
336
- times = raw_times.each_cons(2).map do |x|
427
+ times = raw_times.map do |x|
337
428
 
338
429
  x.map do |sec|
339
430
  a = Subunit.new(units={minutes:60}, seconds: sec+offset).to_h.to_a
@@ -342,7 +433,7 @@ EOF
342
433
 
343
434
  end
344
435
 
345
- times.zip(@all_steps.map(&:desc)).map {|x| x.join(' ')}.join("\n")
436
+ times.zip(@steps.map(&:desc)).map {|x| x.join(' ')}.join("\n")
346
437
 
347
438
  end
348
439
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sra2019
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -35,7 +35,7 @@ cert_chain:
35
35
  YgXo0DU1HUhuKAAuA0aZdb6DV5BqgZx9e27CLIKqRk5P7TikW49mFaelQfSRi675
36
36
  ugi0V/wkIOHFlKLS87IPnc09
37
37
  -----END CERTIFICATE-----
38
- date: 2019-04-30 00:00:00.000000000 Z
38
+ date: 2019-05-01 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: hlt
@@ -61,22 +61,22 @@ dependencies:
61
61
  name: subunit
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: 0.3.0
67
64
  - - "~>"
68
65
  - !ruby/object:Gem::Version
69
66
  version: '0.3'
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 0.3.0
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- version: 0.3.0
77
74
  - - "~>"
78
75
  - !ruby/object:Gem::Version
79
76
  version: '0.3'
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 0.3.0
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: ruby-ogginfo
82
82
  requirement: !ruby/object:Gem::Requirement
@@ -101,42 +101,42 @@ dependencies:
101
101
  name: wavefile
102
102
  requirement: !ruby/object:Gem::Requirement
103
103
  requirements:
104
- - - ">="
105
- - !ruby/object:Gem::Version
106
- version: 1.1.0
107
104
  - - "~>"
108
105
  - !ruby/object:Gem::Version
109
106
  version: '1.1'
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 1.1.0
110
110
  type: :runtime
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- version: 1.1.0
117
114
  - - "~>"
118
115
  - !ruby/object:Gem::Version
119
116
  version: '1.1'
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: 1.1.0
120
120
  - !ruby/object:Gem::Dependency
121
121
  name: archive-zip
122
122
  requirement: !ruby/object:Gem::Requirement
123
123
  requirements:
124
- - - ">="
125
- - !ruby/object:Gem::Version
126
- version: 0.12.0
127
124
  - - "~>"
128
125
  - !ruby/object:Gem::Version
129
126
  version: '0.12'
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: 0.12.0
130
130
  type: :runtime
131
131
  prerelease: false
132
132
  version_requirements: !ruby/object:Gem::Requirement
133
133
  requirements:
134
- - - ">="
135
- - !ruby/object:Gem::Version
136
- version: 0.12.0
137
134
  - - "~>"
138
135
  - !ruby/object:Gem::Version
139
136
  version: '0.12'
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: 0.12.0
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: wicked_pdf
142
142
  requirement: !ruby/object:Gem::Requirement
@@ -161,22 +161,22 @@ dependencies:
161
161
  name: pollyspeech
162
162
  requirement: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - ">="
165
- - !ruby/object:Gem::Version
166
- version: 0.2.0
167
164
  - - "~>"
168
165
  - !ruby/object:Gem::Version
169
166
  version: '0.2'
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: 0.2.0
170
170
  type: :runtime
171
171
  prerelease: false
172
172
  version_requirements: !ruby/object:Gem::Requirement
173
173
  requirements:
174
- - - ">="
175
- - !ruby/object:Gem::Version
176
- version: 0.2.0
177
174
  - - "~>"
178
175
  - !ruby/object:Gem::Version
179
176
  version: '0.2'
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: 0.2.0
180
180
  - !ruby/object:Gem::Dependency
181
181
  name: mini_magick
182
182
  requirement: !ruby/object:Gem::Requirement
@@ -223,7 +223,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
223
223
  - !ruby/object:Gem::Version
224
224
  version: '0'
225
225
  requirements: []
226
- rubygems_version: 3.0.1
226
+ rubyforge_project:
227
+ rubygems_version: 2.5.2.1
227
228
  signing_key:
228
229
  specification_version: 4
229
230
  summary: Steps Recorder (MS Windows) Analyser 2019
metadata.gz.sig CHANGED
@@ -1 +1,4 @@
1
-
1
+ I����6�]D����@�oh3�T�Uq`��TB���a��c!Qa&�7U[��+-��LP8i {�"��("G/�\�k��K�as��6�aXh�N"%g暴
2
+ i�1ع�*}IR'j�����z�� zһ�@Al'�̺�� �S-ow������j�Q�I�
3
+ �����53�e1��uR .��)0@ �B$Q3��� \;3�tk�{���>O�VI�.�¬6R��L4y����l�WtXd�`�(���KT���_���̛��v`�E;F�CI��}ҵ��I� ��K��u�g�^����u��ڦ2��P\���'<��d�����ȩ��Ѓ�@ot�~�"�5.���ҭ<�m������l���u
4
+ T���4A&?[?�F�Uj�B��