* VRFS-3177 - add spinner to playback and stop preloading all media on page
This commit is contained in:
parent
9144efb8fa
commit
4d28915381
|
|
@ -52,87 +52,4 @@ class JamRuby::JamTrackTrack
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def generate_preview
|
|
||||||
|
|
||||||
begin
|
|
||||||
Dir.mktmpdir do |tmp_dir|
|
|
||||||
|
|
||||||
input = File.join(tmp_dir, 'in.ogg')
|
|
||||||
output = File.join(tmp_dir, 'out.ogg')
|
|
||||||
output_mp3 = File.join(tmp_dir, 'out.mp3')
|
|
||||||
|
|
||||||
start = self.preview_start_time.to_f / 1000
|
|
||||||
stop = start + 20
|
|
||||||
|
|
||||||
raise 'no track' unless self["url_44"]
|
|
||||||
|
|
||||||
s3_manager.download(self.url_by_sample_rate(44), input)
|
|
||||||
|
|
||||||
command = "sox \"#{input}\" \"#{output}\" trim #{sprintf("%.3f", start)} =#{sprintf("%.3f", stop)}"
|
|
||||||
|
|
||||||
@@log.debug("trimming using: " + command)
|
|
||||||
|
|
||||||
sox_output = `#{command}`
|
|
||||||
|
|
||||||
result_code = $?.to_i
|
|
||||||
|
|
||||||
if result_code != 0
|
|
||||||
@@log.debug("fail #{result_code}")
|
|
||||||
@preview_generate_error = "unable to execute cut command #{sox_output}"
|
|
||||||
else
|
|
||||||
# now create mp3 off of ogg preview
|
|
||||||
|
|
||||||
convert_mp3_cmd = "#{APP_CONFIG.ffmpeg_path} -i \"#{output}\" -ab 192k \"#{output_mp3}\""
|
|
||||||
|
|
||||||
@@log.debug("converting to mp3 using: " + convert_mp3_cmd)
|
|
||||||
|
|
||||||
convert_output = `#{convert_mp3_cmd}`
|
|
||||||
|
|
||||||
result_code = $?.to_i
|
|
||||||
|
|
||||||
if result_code != 0
|
|
||||||
@@log.debug("fail #{result_code}")
|
|
||||||
@preview_generate_error = "unable to execute mp3 convert command #{convert_output}"
|
|
||||||
else
|
|
||||||
ogg_digest = ::Digest::MD5.file(output)
|
|
||||||
mp3_digest = ::Digest::MD5.file(output_mp3)
|
|
||||||
self["preview_md5"] = ogg_md5 = ogg_digest.hexdigest
|
|
||||||
self["preview_mp3_md5"] = mp3_md5 = mp3_digest.hexdigest
|
|
||||||
|
|
||||||
@@log.debug("uploading ogg preview to #{self.preview_filename('ogg')}")
|
|
||||||
s3_public_manager.upload(self.preview_filename(ogg_md5, 'ogg'), output, content_type: 'audio/ogg', content_md5: ogg_digest.base64digest)
|
|
||||||
@@log.debug("uploading mp3 preview to #{self.preview_filename('mp3')}")
|
|
||||||
s3_public_manager.upload(self.preview_filename(mp3_md5, 'mp3'), output_mp3, content_type: 'audio/mpeg', content_md5: mp3_digest.base64digest)
|
|
||||||
|
|
||||||
self.skip_uploader = true
|
|
||||||
|
|
||||||
original_ogg_preview_url = self["preview_url"]
|
|
||||||
original_mp3_preview_url = self["preview_mp3_url"]
|
|
||||||
|
|
||||||
# and finally update the JamTrackTrack with the new info
|
|
||||||
self["preview_url"] = self.preview_filename(ogg_md5, 'ogg')
|
|
||||||
self["preview_length"] = File.new(output).size
|
|
||||||
# and finally update the JamTrackTrack with the new info
|
|
||||||
self["preview_mp3_url"] = self.preview_filename(mp3_md5, 'mp3')
|
|
||||||
self["preview_mp3_length"] = File.new(output_mp3).size
|
|
||||||
self.save!
|
|
||||||
|
|
||||||
# if all that worked, now delete old previews, if present
|
|
||||||
begin
|
|
||||||
s3_public_manager.delete(original_ogg_preview_url) if original_ogg_preview_url && original_ogg_preview_url != self["preview_url"]
|
|
||||||
s3_public_manager.delete(original_mp3_preview_url) if original_mp3_preview_url && original_mp3_preview_url != track["preview_mp3_url"]
|
|
||||||
rescue
|
|
||||||
puts "UNABLE TO CLEANUP OLD PREVIEW URL"
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
rescue Exception => e
|
|
||||||
@@log.error("error in sox command #{e.to_s}")
|
|
||||||
@preview_generate_error = e.to_s
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -130,7 +130,92 @@ module JamRuby
|
||||||
s3_public_manager.delete(self[:preview_mp3_url]) if self[:preview_mp3_url] && s3_public_manager.exists?(self[:preview_mp3_url])
|
s3_public_manager.delete(self[:preview_mp3_url]) if self[:preview_mp3_url] && s3_public_manager.exists?(self[:preview_mp3_url])
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
def generate_preview
|
||||||
|
|
||||||
|
begin
|
||||||
|
Dir.mktmpdir do |tmp_dir|
|
||||||
|
|
||||||
|
input = File.join(tmp_dir, 'in.ogg')
|
||||||
|
output = File.join(tmp_dir, 'out.ogg')
|
||||||
|
output_mp3 = File.join(tmp_dir, 'out.mp3')
|
||||||
|
|
||||||
|
start = self.preview_start_time.to_f / 1000
|
||||||
|
stop = start + 20
|
||||||
|
|
||||||
|
raise 'no track' unless self["url_44"]
|
||||||
|
|
||||||
|
s3_manager.download(self.url_by_sample_rate(44), input)
|
||||||
|
|
||||||
|
command = "sox \"#{input}\" \"#{output}\" trim #{sprintf("%.3f", start)} =#{sprintf("%.3f", stop)}"
|
||||||
|
|
||||||
|
@@log.debug("trimming using: " + command)
|
||||||
|
|
||||||
|
sox_output = `#{command}`
|
||||||
|
|
||||||
|
result_code = $?.to_i
|
||||||
|
|
||||||
|
if result_code != 0
|
||||||
|
@@log.debug("fail #{result_code}")
|
||||||
|
@preview_generate_error = "unable to execute cut command #{sox_output}"
|
||||||
|
else
|
||||||
|
# now create mp3 off of ogg preview
|
||||||
|
|
||||||
|
convert_mp3_cmd = "#{APP_CONFIG.ffmpeg_path} -i \"#{output}\" -ab 192k \"#{output_mp3}\""
|
||||||
|
|
||||||
|
@@log.debug("converting to mp3 using: " + convert_mp3_cmd)
|
||||||
|
|
||||||
|
convert_output = `#{convert_mp3_cmd}`
|
||||||
|
|
||||||
|
result_code = $?.to_i
|
||||||
|
|
||||||
|
if result_code != 0
|
||||||
|
@@log.debug("fail #{result_code}")
|
||||||
|
@preview_generate_error = "unable to execute mp3 convert command #{convert_output}"
|
||||||
|
else
|
||||||
|
ogg_digest = ::Digest::MD5.file(output)
|
||||||
|
mp3_digest = ::Digest::MD5.file(output_mp3)
|
||||||
|
self["preview_md5"] = ogg_md5 = ogg_digest.hexdigest
|
||||||
|
self["preview_mp3_md5"] = mp3_md5 = mp3_digest.hexdigest
|
||||||
|
|
||||||
|
@@log.debug("uploading ogg preview to #{self.preview_filename('ogg')}")
|
||||||
|
s3_public_manager.upload(self.preview_filename(ogg_md5, 'ogg'), output, content_type: 'audio/ogg', content_md5: ogg_digest.base64digest)
|
||||||
|
@@log.debug("uploading mp3 preview to #{self.preview_filename('mp3')}")
|
||||||
|
s3_public_manager.upload(self.preview_filename(mp3_md5, 'mp3'), output_mp3, content_type: 'audio/mpeg', content_md5: mp3_digest.base64digest)
|
||||||
|
|
||||||
|
self.skip_uploader = true
|
||||||
|
|
||||||
|
original_ogg_preview_url = self["preview_url"]
|
||||||
|
original_mp3_preview_url = self["preview_mp3_url"]
|
||||||
|
|
||||||
|
# and finally update the JamTrackTrack with the new info
|
||||||
|
self["preview_url"] = self.preview_filename(ogg_md5, 'ogg')
|
||||||
|
self["preview_length"] = File.new(output).size
|
||||||
|
# and finally update the JamTrackTrack with the new info
|
||||||
|
self["preview_mp3_url"] = self.preview_filename(mp3_md5, 'mp3')
|
||||||
|
self["preview_mp3_length"] = File.new(output_mp3).size
|
||||||
|
self.save!
|
||||||
|
|
||||||
|
# if all that worked, now delete old previews, if present
|
||||||
|
begin
|
||||||
|
s3_public_manager.delete(original_ogg_preview_url) if original_ogg_preview_url && original_ogg_preview_url != self["preview_url"]
|
||||||
|
s3_public_manager.delete(original_mp3_preview_url) if original_mp3_preview_url && original_mp3_preview_url != track["preview_mp3_url"]
|
||||||
|
rescue
|
||||||
|
puts "UNABLE TO CLEANUP OLD PREVIEW URL"
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue Exception => e
|
||||||
|
@@log.error("error in sox command #{e.to_s}")
|
||||||
|
@preview_generate_error = e.to_s
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
private
|
||||||
def normalize_position
|
def normalize_position
|
||||||
parent = self.jam_track
|
parent = self.jam_track
|
||||||
position = 0
|
position = 0
|
||||||
|
|
|
||||||
|
|
@ -197,7 +197,6 @@
|
||||||
configureTracksHelper.reset();
|
configureTracksHelper.reset();
|
||||||
voiceChatHelper.reset();
|
voiceChatHelper.reset();
|
||||||
voiceChatHelper.beforeShow();
|
voiceChatHelper.beforeShow();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function afterShow() {
|
function afterShow() {
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ context.JK.JamTrackPreview = class JamTrackPreview
|
||||||
@instrumentIcon = null
|
@instrumentIcon = null
|
||||||
@instrumentName = null
|
@instrumentName = null
|
||||||
@part = null
|
@part = null
|
||||||
|
@loading = null
|
||||||
|
|
||||||
template = $('#template-jam-track-preview')
|
template = $('#template-jam-track-preview')
|
||||||
throw "no jam track preview template" if not template.exists()
|
throw "no jam track preview template" if not template.exists()
|
||||||
|
|
@ -29,6 +30,7 @@ context.JK.JamTrackPreview = class JamTrackPreview
|
||||||
@instrumentIcon = @root.find('.instrument-icon')
|
@instrumentIcon = @root.find('.instrument-icon')
|
||||||
@instrumentName = @root.find('.instrument-name')
|
@instrumentName = @root.find('.instrument-name')
|
||||||
@part = @root.find('.part')
|
@part = @root.find('.part')
|
||||||
|
@loading = @root.find('.loading')
|
||||||
|
|
||||||
@playButton.on('click', @play)
|
@playButton.on('click', @play)
|
||||||
@stopButton.on('click', @stop)
|
@stopButton.on('click', @stop)
|
||||||
|
|
@ -71,16 +73,9 @@ context.JK.JamTrackPreview = class JamTrackPreview
|
||||||
urls = [@jamTrackTrack.preview_mp3_url]
|
urls = [@jamTrackTrack.preview_mp3_url]
|
||||||
if @jamTrackTrack.preview_ogg_url?
|
if @jamTrackTrack.preview_ogg_url?
|
||||||
urls.push(@jamTrackTrack.preview_ogg_url)
|
urls.push(@jamTrackTrack.preview_ogg_url)
|
||||||
|
@urls = urls
|
||||||
|
|
||||||
@no_audio = false
|
@no_audio = false
|
||||||
@root.on('remove', @onDestroyed);
|
|
||||||
|
|
||||||
@sound = new Howl({
|
|
||||||
src: urls,
|
|
||||||
autoplay: false,
|
|
||||||
loop: false,
|
|
||||||
volume: 1.0,
|
|
||||||
onend: @onHowlerEnd})
|
|
||||||
else
|
else
|
||||||
@no_audio = true
|
@no_audio = true
|
||||||
|
|
||||||
|
|
@ -103,6 +98,9 @@ context.JK.JamTrackPreview = class JamTrackPreview
|
||||||
@playButton.removeClass('hidden')
|
@playButton.removeClass('hidden')
|
||||||
@removeNowPlaying()
|
@removeNowPlaying()
|
||||||
|
|
||||||
|
onHowlerLoad: () =>
|
||||||
|
@loading.addClass('hidden')
|
||||||
|
|
||||||
play: (e) =>
|
play: (e) =>
|
||||||
if e?
|
if e?
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
|
|
@ -110,6 +108,21 @@ context.JK.JamTrackPreview = class JamTrackPreview
|
||||||
if @no_audio
|
if @no_audio
|
||||||
context.JK.prodBubble(@playButton, 'There is no preview available for this track.', {}, {duration:2000})
|
context.JK.prodBubble(@playButton, 'There is no preview available for this track.', {}, {duration:2000})
|
||||||
else
|
else
|
||||||
|
unless @sound?
|
||||||
|
@root.on('remove', @onDestroyed);
|
||||||
|
|
||||||
|
@sound = new Howl({
|
||||||
|
src: @urls,
|
||||||
|
autoplay: false,
|
||||||
|
loop: false,
|
||||||
|
volume: 1.0,
|
||||||
|
preload: true,
|
||||||
|
onload: @onHowlerLoad
|
||||||
|
onend: @onHowlerEnd})
|
||||||
|
|
||||||
|
@loading.removeClass('hidden')
|
||||||
|
|
||||||
|
|
||||||
@logger.debug("play issued for jam track preview")
|
@logger.debug("play issued for jam track preview")
|
||||||
@sound.play()
|
@sound.play()
|
||||||
for playingSound in context.JK.JamTrackPreview.nowPlaying
|
for playingSound in context.JK.JamTrackPreview.nowPlaying
|
||||||
|
|
@ -122,7 +135,7 @@ context.JK.JamTrackPreview = class JamTrackPreview
|
||||||
return false
|
return false
|
||||||
|
|
||||||
issueStop: () =>
|
issueStop: () =>
|
||||||
@logger.debug("stop issued for jam track preview")
|
@logger.debug("pause issued for jam track preview")
|
||||||
@sound.pause() # stop does not actually stop in windows client
|
@sound.pause() # stop does not actually stop in windows client
|
||||||
@stopButton.addClass('hidden')
|
@stopButton.addClass('hidden')
|
||||||
@playButton.removeClass('hidden')
|
@playButton.removeClass('hidden')
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
.jam-track-preview {
|
.jam-track-preview {
|
||||||
|
|
||||||
|
position:relative;
|
||||||
display:inline-block;
|
display:inline-block;
|
||||||
line-height:24px;
|
line-height:24px;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
|
@ -57,4 +58,14 @@
|
||||||
background-image: url('/assets/content/icon-pause-24-black.png');
|
background-image: url('/assets/content/icon-pause-24-black.png');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.spinner-small {
|
||||||
|
vertical-align: middle;
|
||||||
|
top: -4px;
|
||||||
|
right: -32px;
|
||||||
|
position:absolute;
|
||||||
|
&.hidden {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5,4 +5,5 @@ script type="text/template" id='template-jam-track-preview'
|
||||||
a.hidden href="#" class='stop-button {{data.color}}'
|
a.hidden href="#" class='stop-button {{data.color}}'
|
||||||
img.instrument-icon hoveraction="instrument" data-instrument-id="" width="24" height="24"
|
img.instrument-icon hoveraction="instrument" data-instrument-id="" width="24" height="24"
|
||||||
.instrument-name
|
.instrument-name
|
||||||
.part
|
.part
|
||||||
|
.loading.spinner-small.hidden
|
||||||
Loading…
Reference in New Issue