oldhaven/app/assets/javascripts/player.coffee

320 lines
9.9 KiB
CoffeeScript
Raw Normal View History

2011-09-08 03:47:11 +04:00
class window.Player
2011-09-16 14:57:16 +04:00
bar_width: 263
jp: null
scrobbled: false
albums: []
playlist: []
library: {}
2011-09-16 14:57:16 +04:00
initJplayer: ->
self = this
@jp = $("#jplayer")
@jp.jPlayer
swfPath: "/js"
supplied: "mp3"
cssSelectorAncestor: ""
cssSelector:
play: ".player .play"
pause: ".player .pause"
stop: ""
videoPlay: ""
seekBar: ""
playBar: ""
mute: ""
unmute: ""
volumeBar: ""
volumeBarValue: ""
currentTime: ""
duration: ""
@jp.bind $.jPlayer.event.timeupdate, (e) ->
data = e.jPlayer.status
if not _player.scrobbled and data.currentPercentAbsolute > 50
$obj = $('.playlist li.now')
2011-09-17 23:00:08 +04:00
self.scrobble _player.getTrackInfo $obj.attr('data-id')
2011-09-16 14:57:16 +04:00
_player.scrobbled = true
$('.player .progress .loaded').width(data.seekPercent * self.bar_width / 100)
$('.player .progress .played').width(data.currentPercentAbsolute * self.bar_width / 100)
@jp.bind $.jPlayer.event.ended, (e) ->
next = self.nextTrack()
if not next
$('#jplayer').jPlayer 'clearMedia'
$('.player .now-playing').html 'Nothing left to <strike>lose</strike> play'
$('.player .loaded, .player .played').width 0
$('.playlist li').removeClass 'now'
else
self.setTrack next
false
2011-11-30 05:08:53 +04:00
addTrack: (track, autoplay) ->
if typeof track in ["number", "string"]
track = @library[track]
2011-09-16 14:57:16 +04:00
if not autoplay?
autoplay = false
initial_count = $('.playlist li').length
2011-12-01 10:09:18 +04:00
c = this.generateTrackHtml track
$('.playlist').append c.html
2011-11-30 05:08:53 +04:00
$('.playlist').sortable "refresh"
2011-12-01 10:09:18 +04:00
unless _player.currentTrack()?
_player.setTrack(c.uid)
2011-11-30 05:08:53 +04:00
false
generateTrackHtml: (track) ->
len = parseInt(track.length, 10)
m = Math.floor(len / 60)
s = len - Math.floor(len / 60) * 60
duration = m + ':' + (if s < 10 then '0' else '') + s
2011-11-30 05:08:53 +04:00
item_class = (if track.available == false then 'unavailable' else '')
2011-12-01 10:09:18 +04:00
uid = Math.round(Math.random() * 999999)
{
html: "<li id='i#{uid}' data-id='#{track.id}' class='#{item_class}'>
<div class='song-duration'>#{duration}</div>
<div class='label important remove'>remove</div>
<div class='artist-name'><a class='data artist'>#{track.artist}</a></div>
<div class='song-title'>#{track.name}</div>
</li>"
uid: uid
}
2011-09-16 14:57:16 +04:00
getDataFromLi: (obj) ->
id = $(obj).attr 'data-id'
track_name = $(obj).find('.trackname').html()
length = $(obj).find('.length').html()
id: id, name: track_name, length: length
setTrack: (id) ->
$obj = $('#i' +id)
track = _player.getTrackInfo $obj.attr('data-id')
query = track.artist+ ' &mdash; ' +track.name
$('.player .loaded, .player .played').width 0
$('.player .now-playing').html query
$('.playlist li').removeClass 'now'
$obj.addClass 'now'
2011-11-24 03:37:41 +04:00
_vk_music.search track.artist, track.name, track.length, (audio) ->
if audio is null
2011-12-01 10:09:18 +04:00
_session.query '/track/report_available', { id: track.id, available: false }, (r) ->
if r.result is 'success' or r.status is 'success'
$(".playlist li[data-id='#{track.id}']").addClass("unavailable")
2011-12-01 10:09:18 +04:00
$(".s-add[data-id='#{track.id}']").parent().parent().addClass("unavailable")
2011-11-24 03:37:41 +04:00
_player.setTrack _player.nextTrack()
else
_player.playSource audio.url
2011-12-01 10:09:18 +04:00
if track.available == false
_session.query '/track/report_available', { id: track.id, available: true }, (r) ->
if r.result is 'success' or r.status is 'success'
$(".playlist li[data-id='#{track.id}']").removeClass("unavailable")
$(".s-add[data-id='#{track.id}']").parent().parent().removeClass("unavailable")
if track.length == 0
len = parseInt(audio.duration, 10)
m = Math.floor(len / 60)
s = len - Math.floor(len / 60) * 60
duration = m + ':' + (if s < 10 then '0' else '') + s
_session.query '/track/update_length', { track_id: track.id, length: len }, (r) ->
if r.result is 'success'
$(".playlist li[data-id='#{track.id}'] .song-duration").text(duration)
$($(".album div[data-id='#{track.id}']").siblings()[0]).text(duration)
_player.updateNowListening track
false
2011-09-16 14:57:16 +04:00
false
getTrackInfo: (id) ->
@library[id]
2011-09-16 14:57:16 +04:00
2011-11-24 03:37:41 +04:00
getAlbumInfo: (id) ->
for album in _player.albums
if parseInt(album.id, 10) == parseInt(id, 10)
return album
false
2011-09-16 14:57:16 +04:00
hasTrack: ->
if $('#jplayer audio').length > 0
return $('#jplayer audio').attr('src')? and $('#jplayer audio').attr('src') != ''
else if $('#jplayer object').length > 0
$('#jplayer').jPlayer 'play'
true
false
2011-12-01 10:09:18 +04:00
currentTrack: ->
current_track = $('.playlist li.now')
false unless current_track?
@library[$(current_track).data('id')]
2011-09-16 14:57:16 +04:00
playSource: (url) ->
@scrobbled = false
$('#jplayer').jPlayer 'setMedia', mp3: url
$('#jplayer').jPlayer 'play'
false
nextTrack: (manual) ->
manual = manual?
cnt = $('.playlist li').length
2011-10-12 13:33:25 +04:00
if not this.onShuffle() # Shuffle off
if $('.playlist .now').next().length == 0 # Last track and repeat is on
if _player.onRepeat() or manual # Repeat or manual click
2011-09-16 14:57:16 +04:00
return $('.playlist li').first().attr('id').split('i')[1]
else
false
else
return $('.playlist .now').next().attr('id').split('i')[1]
2011-10-12 13:33:25 +04:00
else if cnt == 1 # Single track in the playlist
2011-09-16 14:57:16 +04:00
return $('.playlist li').first().attr('id').split('i')[1]
2011-10-12 13:33:25 +04:00
else # Shuffle on
2011-09-16 14:57:16 +04:00
while true
rnd = Math.floor(Math.random() * (cnt + .999))
$li = $('.playlist li').eq rnd
if $li.length > 0 and not $li.hasClass 'now'
return $li.attr('id').split('i')[1]
false
prevTrack: ->
cnt = $('.playlist li').length
2011-10-12 13:33:25 +04:00
if not _player.onShuffle() # Shuffle off
if $('.playlist .now').prev().length == 0 # First track in the playlist
2011-09-16 14:57:16 +04:00
return $('.playlist li').last().attr('id').split('i')[1]
else
return $('.playlist .now').prev().attr('id').split('i')[1]
2011-10-12 13:33:25 +04:00
else if cnt == 1 # Single track in the playlist
2011-09-16 14:57:16 +04:00
return $('.playlist li').first().attr('id').split('i')[1]
2011-10-12 13:33:25 +04:00
else # Shuffle on
2011-09-16 14:57:16 +04:00
while true
rnd = Math.floor(Math.random() * (cnt + .999))
$li = $('.playlist li').eq rnd
if $li.length > 0 and not $li.hasClass 'now'
return $li.attr('id').split('i')[1]
false
onShuffle: ->
return $('.shuffle').hasClass 'on'
2011-09-16 14:57:16 +04:00
onRepeat: ->
return $('.repeat').hasClass 'on'
2011-09-16 14:57:16 +04:00
2011-09-17 23:00:08 +04:00
updateNowListening: (track) ->
2011-09-16 14:57:16 +04:00
if _session.getUser().lastfm_username
2011-09-17 23:00:08 +04:00
_session.query '/lastfm/listening?r=' +Math.random(), track
2011-09-16 14:57:16 +04:00
false
2011-09-17 23:00:08 +04:00
scrobble: (track) ->
2011-11-29 23:42:21 +04:00
_session.query '/lastfm/scrobble?r=' +Math.random(), track
2011-09-16 14:57:16 +04:00
false
2011-11-26 19:03:33 +04:00
emptyPlaylist: ->
$('.playlist li').remove()
$('#jplayer').jPlayer 'clearMedia'
$('.player .now-playing').text 'Add some music to playlist'
$('.player .loaded, .player .played').width 0
false
setPlaylist: (data) ->
this.emptyPlaylist()
for track in data.tracks
this.addTrack track
false
updateLibrary: (data) ->
if data.albums?
for album in data.albums
for track in album.tracks
@library[track.id] = track
if data.tracks?
for track in data.tracks
@library[track.id] = track
2011-11-30 05:08:53 +04:00
$('.track').draggable
helper: 'clone'
2011-12-07 09:39:55 +04:00
connectToSortable: '.playlist',
drag: (e, ui) ->
$('.ui-draggable-dragging').addClass('dragging-track')
true
2011-11-26 19:03:33 +04:00
false
2011-06-27 22:41:36 +04:00
# Player Controls
2011-09-15 15:07:35 +04:00
$('.player .prev').live 'click', ->
2011-09-16 14:57:16 +04:00
_player.setTrack _player.prevTrack()
false
2011-06-27 22:41:36 +04:00
2011-09-15 15:07:35 +04:00
$('.player .next').live 'click', ->
2011-09-16 14:57:16 +04:00
_player.setTrack _player.nextTrack(true)
false
2011-06-27 22:41:36 +04:00
2011-06-28 00:43:54 +04:00
$('.player .play').live 'click', ->
2011-09-16 14:57:16 +04:00
if $('.playlist li').length > 0 and not _player.hasTrack()
_player.setTrack $('.playlist li').first().attr('id').split('i')[1]
false
2011-06-27 22:41:36 +04:00
2011-06-28 00:43:54 +04:00
$('.player .progress').live 'click', (e) ->
2011-09-16 14:57:16 +04:00
$('#jplayer').jPlayer 'playHead', Math.round((e.offsetX / _player.bar_width) * 100)
false
2011-06-27 22:41:36 +04:00
# Player Additional Controls
$('.repeat, .shuffle').live 'click', ->
$(this).toggleClass 'on'
2011-09-16 14:57:16 +04:00
false
2011-06-27 22:41:36 +04:00
$('.do_empty').live 'click', ->
2011-09-16 14:57:16 +04:00
if confirm('Are you sure?')
2011-11-26 19:03:33 +04:00
_player.emptyPlaylist()
2011-09-16 14:57:16 +04:00
false
2011-06-27 22:41:36 +04:00
# Playlist Actions
2011-11-30 05:08:53 +04:00
$ ->
$('.playlist').sortable
distance: 5
axis: 'y'
cursor: 'move'
stop: (e, ui) ->
if $(ui.item).prop("tagName") == "TR"
2011-12-01 10:09:18 +04:00
c = _player.generateTrackHtml(_player.library[$(ui.item).find('.s-add').data('id')])
ui.item.replaceWith(c.html)
2011-12-07 09:39:55 +04:00
return false
true
2011-11-30 05:08:53 +04:00
$('.playlist').droppable
accept: '.track'
drop: (e, ui) ->
$(this).sortable "refresh"
window.setTimeout ->
$('.playlist tr.track').remove()
, 0
false
false
2011-09-16 05:57:41 +04:00
$('.playlist li .remove').live 'click', (e) ->
2011-09-16 14:57:16 +04:00
$li = $(this).parent()
if $li.hasClass 'now'
$('#jplayer').jPlayer 'clearMedia'
$('.player .now-playing').text '...'
$('.player .loaded, .player .played').width 0
$li.remove()
e.preventDefault()
false
2011-06-27 22:41:36 +04:00
2011-09-16 05:57:41 +04:00
$('.playlist li').live 'click', ->
2011-09-16 14:57:16 +04:00
_player.setTrack $(this).attr('id').split('i')[1]
false
2011-06-27 22:41:36 +04:00
# Adding To Playlist actions
$('.add-album').live 'click', ->
for id in $(this).data('tracks').split(",")
_player.addTrack id
2011-09-16 14:57:16 +04:00
false
2011-09-26 17:34:18 +04:00
2011-10-05 14:51:50 +04:00
$('.s-add').live 'click', ->
_player.addTrack $(this).data('id')
2011-10-06 00:00:27 +04:00
false
2011-11-26 19:03:33 +04:00
$('.set-playlist').live 'click', ->
_search.showSpinner()
$.get "/playlist/#{$(this).data('playlist')}", (response) ->
_player.setPlaylist response.data
2011-11-27 00:56:09 +04:00
_search.hideSpinner()
false
false