sra2019 0.7.1 → 0.7.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.
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��