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.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +3 -1
- data/lib/sra2019.rb +104 -13
- metadata +28 -27
- metadata.gz.sig +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ef6fff18b33ade289433566faab793bf5a2f1e76
|
4
|
+
data.tar.gz: 30314b992672aa85ef961c2966cfbe889a0465e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 505db3abd23cc84977dd7f0b06a88bd5bd16e7eacb32dc662fb8e08d0c829e7b22833b9d99659b76d72985babeb6b081b666024a1bd3a36fe73e33c85a1fe579
|
7
|
+
data.tar.gz: 3e61bd59af19d5a4f2575942cee9e9f8580efc4efd94d2e28f3b0498b57bee052611f376711af067e1b73ff56605c702495c6fbfdb144131c439282a34f75cc0
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
@@ -1 +1,3 @@
|
|
1
|
-
|
1
|
+
q}���Iޢ7ݎ��&W�K�'b���ZO��E�8:=^%���{��ݬ�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?�
|
data/lib/sra2019.rb
CHANGED
@@ -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
|
-
|
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.
|
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
|
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
|
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.
|
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(@
|
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.
|
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-
|
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
|
-
|
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��
|