carrierwave-audio-waveform 1.0.3 → 1.0.4
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6497146ba653815208e4665a1ed1bfad567a9f1b
|
4
|
+
data.tar.gz: c727ed3c1b3b5575a026fc42fa6d3635640e2ceb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f475378005b85801917e5083709056a665e59441b36712b812956287947301bd70f81d671cd7e35adc68fe3ea978cefe02a6cf54b7abb2cdac02800d5bffa976
|
7
|
+
data.tar.gz: a26fd903358e1978545d4754524ed3f29f495e3eceac6c5d49d61556024963c035b7a13ca227609c9107c50bee4736fd7069bf8418191b49b9b8b254e77c6f75
|
@@ -21,7 +21,12 @@ module CarrierWave
|
|
21
21
|
|
22
22
|
image_filename = Waveformer.generate(current_path, options)
|
23
23
|
File.rename image_filename, current_path
|
24
|
-
|
24
|
+
|
25
|
+
if options[:type] == :svg
|
26
|
+
self.file.instance_variable_set(:@content_type, "image/svg+xml")
|
27
|
+
else
|
28
|
+
self.file.instance_variable_set(:@content_type, "image/png")
|
29
|
+
end
|
25
30
|
end
|
26
31
|
|
27
32
|
def waveform_data options={}
|
@@ -12,7 +12,8 @@ module CarrierWave
|
|
12
12
|
:height => 280,
|
13
13
|
:background_color => "#666666",
|
14
14
|
:color => "#00ccff",
|
15
|
-
:logger => nil
|
15
|
+
:logger => nil,
|
16
|
+
:type => :png
|
16
17
|
}
|
17
18
|
|
18
19
|
TransparencyMask = "#00ff00"
|
@@ -80,7 +81,7 @@ module CarrierWave
|
|
80
81
|
#
|
81
82
|
def generate(source, options={})
|
82
83
|
options = DefaultOptions.merge(options)
|
83
|
-
filename = options[:filename] || self.
|
84
|
+
filename = options[:filename] || self.generate_image_filename(source, options[:type])
|
84
85
|
|
85
86
|
raise ArgumentError.new("No source audio filename given, must be an existing sound file.") unless source
|
86
87
|
raise ArgumentError.new("No destination filename given for waveform") unless filename
|
@@ -117,7 +118,14 @@ module CarrierWave
|
|
117
118
|
end
|
118
119
|
|
119
120
|
image = draw samples, options
|
120
|
-
|
121
|
+
|
122
|
+
if options[:type] == :svg
|
123
|
+
File.open(filename, 'w') do |f|
|
124
|
+
f.puts image
|
125
|
+
end
|
126
|
+
else
|
127
|
+
image.save filename
|
128
|
+
end
|
121
129
|
end
|
122
130
|
|
123
131
|
if source != old_source
|
@@ -130,10 +138,15 @@ module CarrierWave
|
|
130
138
|
filename
|
131
139
|
end
|
132
140
|
|
133
|
-
def
|
141
|
+
def generate_image_filename(source, image_type)
|
134
142
|
ext = File.extname(source)
|
135
143
|
source_file_path_without_extension = File.join File.dirname(source), File.basename(source, ext)
|
136
|
-
|
144
|
+
|
145
|
+
if image_type == :svg
|
146
|
+
"#{source_file_path_without_extension}.svg"
|
147
|
+
else
|
148
|
+
"#{source_file_path_without_extension}.png"
|
149
|
+
end
|
137
150
|
end
|
138
151
|
|
139
152
|
private
|
@@ -189,8 +202,71 @@ module CarrierWave
|
|
189
202
|
raise RuntimeError.new("Source audio file #{source} could not be read by RubyAudio library -- Hint: non-WAV files are no longer supported, convert to WAV first using something like ffmpeg (RubyAudio: #{e.message})")
|
190
203
|
end
|
191
204
|
|
192
|
-
# Draws the given samples using the given options, returns a ChunkyPNG::Image.
|
193
205
|
def draw(samples, options)
|
206
|
+
if options[:type] == :svg
|
207
|
+
draw_svg(samples, options)
|
208
|
+
else
|
209
|
+
draw_png(samples, options)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
def draw_svg(samples, options)
|
214
|
+
image = "<svg viewbox=\"0 0 #{options[:width]} #{options[:height]}\" preserveAspectRatio=\"none\" width=\"100%\" height=\"100%\">"
|
215
|
+
if options[:hide_style].nil?
|
216
|
+
image+= "<style>"
|
217
|
+
image+= "svg {"
|
218
|
+
image+= "stroke: #000;"
|
219
|
+
image+= "stroke-width: 1;"
|
220
|
+
image+= "}"
|
221
|
+
image+= "use.waveform-progress {"
|
222
|
+
image+= "stroke-width: 2;"
|
223
|
+
image+= "clip-path: polygon(0% 0%, 0% 0%, 0% 100%, 0% 100%);"
|
224
|
+
image+= "}"
|
225
|
+
image+= "svg path {"
|
226
|
+
image+= "stroke: inherit;"
|
227
|
+
image+= "stroke-width: inherit;"
|
228
|
+
image+= "}"
|
229
|
+
image+= "</style>"
|
230
|
+
end
|
231
|
+
image+= "<defs>"
|
232
|
+
if options[:gradient]
|
233
|
+
options[:gradient].each_with_index do |grad, id|
|
234
|
+
image+= "<linearGradient id=\"linear#{id}\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">"
|
235
|
+
image+= "<stop offset=\"0%\" stop-color=\"#{grad[0]}\"/>"
|
236
|
+
image+= "<stop offset=\"100%\" stop-color=\"#{grad[1]}\"/>"
|
237
|
+
image+= "</linearGradient>"
|
238
|
+
end
|
239
|
+
end
|
240
|
+
uniqueWaveformID = "waveform-#{SecureRandom.uuid}"
|
241
|
+
image+= "<g id=\"#{uniqueWaveformID}\">"
|
242
|
+
image+= '<g transform="translate(0, 125.0)">'
|
243
|
+
image+= '<path stroke="currrentColor" d="'
|
244
|
+
|
245
|
+
samples = spaced_samples(samples, options[:sample_width], options[:gap_width]) if options[:sample_width]
|
246
|
+
max = samples.reject {|v| v.nil? }.max
|
247
|
+
height_factor = (options[:height] / 2.0) / max
|
248
|
+
|
249
|
+
samples.each_with_index do |sample, pos|
|
250
|
+
next if sample.nil?
|
251
|
+
|
252
|
+
amplitude = sample * height_factor
|
253
|
+
top = (0 - amplitude).round
|
254
|
+
bottom = (0 + amplitude).round
|
255
|
+
|
256
|
+
image+= " M#{pos},#{top} V#{bottom}"
|
257
|
+
end
|
258
|
+
|
259
|
+
image+= '"/>'
|
260
|
+
image+= "</g>"
|
261
|
+
image+= "</g>"
|
262
|
+
image+= "</defs>"
|
263
|
+
image+= "<use class=\"waveform-base\" href=\"##{uniqueWaveformID}\" />"
|
264
|
+
image+= "<use class=\"waveform-progress\" href=\"##{uniqueWaveformID}\" />"
|
265
|
+
image+= "</svg>"
|
266
|
+
end
|
267
|
+
|
268
|
+
# Draws the given samples using the given options, returns a ChunkyPNG::Image.
|
269
|
+
def draw_png(samples, options)
|
194
270
|
image = ChunkyPNG::Image.new(options[:width], options[:height],
|
195
271
|
options[:background_color] == :transparent ? ChunkyPNG::Color::TRANSPARENT : options[:background_color]
|
196
272
|
)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: carrierwave-audio-waveform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Trevor Hinesley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: carrierwave
|
@@ -147,4 +147,3 @@ signing_key:
|
|
147
147
|
specification_version: 4
|
148
148
|
summary: Generate waveform images from audio files within Carrierwave
|
149
149
|
test_files: []
|
150
|
-
has_rdoc:
|