jam-cloud/web/app/assets/javascripts/jam_track_preview.js.coffee

189 lines
5.3 KiB
CoffeeScript

$ = jQuery
context = window
context.JK ||= {};
context.JK.JamTrackPreview = {}
context.JK.JamTrackPreview = class JamTrackPreview
constructor: (app, $root, jamTrack, jamTrackTrack, options) ->
@EVENTS = context.JK.EVENTS
@rest = context.JK.Rest()
@logger = context.JK.logger
@options = options || {master_shows_duration: false, color:'gray', add_line_break: false, preload_master:false}
@app = app
@jamTrack = jamTrack
@jamTrackTrack = jamTrackTrack
@root = $root
@playButton = null
@stopButton = null
@instrumentIcon = null
@instrumentName = null
@part = null
@loaded = false
@loading = null
@loadingText = null
template = $('#template-jam-track-preview')
throw "no jam track preview template" if not template.exists()
@root.html(context._.template(template.html(), @options, {variable:'data'}))
@playButton = @root.find('.play-button')
@stopButton = @root.find('.stop-button')
@instrumentIcon = @root.find('.instrument-icon')
@instrumentName = @root.find('.instrument-name')
@part = @root.find('.part')
@loading = @root.find('.loading')
@loadingText = @root.find('.loading-text')
@playButton.on('click', @play)
@stopButton.on('click', @stop)
@root.attr('data-track-type', @jamTrackTrack.track_type).attr('data-id', @jamTrackTrack.id)
instrumentId = null
instrumentDescription = '?'
if @jamTrackTrack.track_type == 'Track'
if @jamTrackTrack.instrument
instrumentId = @jamTrackTrack.instrument.id
instrumentDescription = @jamTrackTrack.instrument.description
else
instrumentId = 'other'
instrumentDescription= 'Master Mix'
instrument_src = context.JK.getInstrumentIcon24(instrumentId)
@instrumentIcon.attr('data-instrument-id', instrumentId).attr('src', instrument_src)
@instrumentName.text(instrumentDescription)
#context.JK.bindInstrumentHover(@root)
part = ''
if @jamTrackTrack.track_type == 'Track'
part = "#{@jamTrackTrack.part}" if @jamTrackTrack.part? && @jamTrackTrack.part != instrumentDescription
@part.text("(#{part})") if part != ''
else
if @options.master_adds_line_break
part = '"' + @jamTrack.name + '"' + ' by ' + @jamTrack.original_artist
@part.html("#{part}") if part != ''
@part.addClass('adds-line-break')
else
if @options.master_shows_duration
duration = 'entire song'
if @jamTrack.duration
duration = "#{context.JK.prettyPrintSeconds(@jamTrack.duration)}"
part = duration
else
part = @jamTrack.name + ' by ' + @jamTrack.original_artist
@part.text("(#{part})") if part != ''
if @jamTrackTrack.preview_mp3_url?
urls = [@jamTrackTrack.preview_mp3_url]
if @jamTrackTrack.preview_ogg_url?
urls.push(@jamTrackTrack.preview_ogg_url)
@urls = urls
@no_audio = false
else
@no_audio = true
if @no_audio
@playButton.addClass('disabled')
@stopButton.addClass('disabled')
else
if @options.preload_master && @jamTrackTrack.track_type == 'Master'
@sound = new Howl({
src: @urls,
autoplay: false,
loop: false,
volume: 1.0,
preload: true,
onload: @onHowlerLoad
onend: @onHowlerEnd})
onDestroyed: () =>
@sound.unload()
removeNowPlaying: () =>
context.JK.JamTrackPreview.nowPlaying.splice(this)
if context.JK.JamTrackPreview.nowPlaying.length > 0
@logger.warn("multiple jamtrack previews playing")
onHowlerEnd: () =>
@logger.debug("on end $(this)", $(this))
@stopButton.addClass('hidden')
@playButton.removeClass('hidden')
@removeNowPlaying()
onHowlerLoad: () =>
@loaded = true
@loading.fadeOut();
@loadingText.fadeOut(); #addClass('hidden')
play: (e) =>
if e?
e.stopPropagation()
$(this).triggerHandler(@EVENTS.PREVIEW_PLAYED)
if @no_audio
context.JK.prodBubble(@playButton, 'There is no preview available for this track.', {}, {duration:2000})
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})
unless @loaded
@loading.removeClass('hidden')
@loadingText.removeClass('hidden')
@logger.debug("play issued for jam track preview")
@sound.play()
for playingSound in context.JK.JamTrackPreview.nowPlaying
playingSound.issueStop()
context.JK.JamTrackPreview.nowPlaying = []
context.JK.JamTrackPreview.nowPlaying.push(this)
@playButton.addClass('hidden')
@stopButton.removeClass('hidden')
return false
issueStop: () =>
@logger.debug("pause issued for jam track preview")
@sound.pause() # stop does not actually stop in windows client
@stopButton.addClass('hidden')
@playButton.removeClass('hidden')
stop: (e) =>
if e?
e.stopPropagation()
if @no_audio
context.JK.helpBubble(@playButton, 'There is no preview available for this track.', {}, {duration:2000})
else
@issueStop()
@removeNowPlaying()
return false
context.JK.JamTrackPreview.nowPlaying = []