diff --git a/app/assets/javascripts/player.coffee b/app/assets/javascripts/player.coffee index 7dc7f4a..d07aa63 100644 --- a/app/assets/javascripts/player.coffee +++ b/app/assets/javascripts/player.coffee @@ -1,234 +1,233 @@ class window.Player - - bar_width: 263 - jp: null - scrobbled: false - albums: [] - playlist: [] - - 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') - self.scrobble $obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track') - _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 lose play' - $('.player .loaded, .player .played').width 0 - $('.playlist li').removeClass 'now' - else - self.setTrack next - false - - addTracks: (tracks, autoplay) -> - if not autoplay? - autoplay = false - initial_count = $('.playlist li').length - for item in tracks - $('.playlist').append ' -
  • -
    ' +item.duration+ '
    -
    remove
    + + bar_width: 263 + jp: null + scrobbled: false + albums: [] + playlist: [] + + 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') + self.scrobble $obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track') + _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 lose play' + $('.player .loaded, .player .played').width 0 + $('.playlist li').removeClass 'now' + else + self.setTrack next + false + + addTracks: (tracks, autoplay) -> + if not autoplay? + autoplay = false + initial_count = $('.playlist li').length + for item in tracks + $('.playlist').append ' +
  • +
    ' +item.duration+ '
    +
    remove
    ' +item.artist+ '
    ' +item.name+ '
    -
  • ' - _player.playlist.push item - $('.playlist').sortable axis: 'y', handle: '.drag' - if initial_count == 0 and not _player.hasTrack() - _player.setTrack($('.playlist li').first().attr('id').split('i')[1]) - false - - 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+ ' — ' +track.name - - $('.player .loaded, .player .played').width 0 - $('.player .now-playing').html query - $('.playlist li').removeClass 'now' - $obj.addClass 'now' - console.log(track) - _vkontakte.loadTracksData track.artist, track.name, track.duration, (url) -> - _player.playSource url - this.updateNowListening track.artist, track.album, track.name - false - - getTrackInfo: (id) -> - for track in _player.playlist - if track.id == parseInt(id, 10) - return track - false - - 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 - - playSource: (url) -> - @scrobbled = false - $('#jplayer').jPlayer 'setMedia', mp3: url - $('#jplayer').jPlayer 'play' - false - - nextTrack: (manual) -> - manual = manual? - cnt = $('.playlist li').length - 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 - return $('.playlist li').first().attr('id').split('i')[1] - else - false - else - return $('.playlist .now').next().attr('id').split('i')[1] - else if cnt == 1 # Single track in the playlist - return $('.playlist li').first().attr('id').split('i')[1] - else # Shuffle on - 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 - if not _player.onShuffle() # Shuffle off - if $('.playlist .now').prev().length == 0 # First track in the playlist - return $('.playlist li').last().attr('id').split('i')[1] - else - return $('.playlist .now').prev().attr('id').split('i')[1] - else if cnt == 1 # Single track in the playlist - return $('.playlist li').first().attr('id').split('i')[1] - else # Shuffle on - 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 'active' - - onRepeat: -> - #return $('#repeat').hasClass 'active' - - updateNowListening: (artist, album, track) -> - if _session.getUser().lastfm_username - _session.query '/lastfm/listening?r=' +Math.random(), artist: artist, album: album, track: track - false - - scrobble: (artist, album, track) -> - if _session.getUser().lastfm_username - _session.query '/lastfm/scrobble?r=' +Math.random(), artist: artist, album: album, track: track - false + ' + _player.playlist.push item + $('.playlist').sortable axis: 'y', handle: '.drag' + if initial_count == 0 and not _player.hasTrack() + _player.setTrack($('.playlist li').first().attr('id').split('i')[1]) + false + + 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+ ' — ' +track.name + + $('.player .loaded, .player .played').width 0 + $('.player .now-playing').html query + $('.playlist li').removeClass 'now' + $obj.addClass 'now' + console.log(track) + _vkontakte.loadTracksData track.artist, track.name, track.duration, (url) -> + _player.playSource url + this.updateNowListening track.artist, track.album, track.name + false + + getTrackInfo: (id) -> + for track in _player.playlist + if track.id == parseInt(id, 10) + return track + false + + 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 + + playSource: (url) -> + @scrobbled = false + $('#jplayer').jPlayer 'setMedia', mp3: url + $('#jplayer').jPlayer 'play' + false + + nextTrack: (manual) -> + manual = manual? + cnt = $('.playlist li').length + 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 + return $('.playlist li').first().attr('id').split('i')[1] + else + false + else + return $('.playlist .now').next().attr('id').split('i')[1] + else if cnt == 1 # Single track in the playlist + return $('.playlist li').first().attr('id').split('i')[1] + else # Shuffle on + 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 + if not _player.onShuffle() # Shuffle off + if $('.playlist .now').prev().length == 0 # First track in the playlist + return $('.playlist li').last().attr('id').split('i')[1] + else + return $('.playlist .now').prev().attr('id').split('i')[1] + else if cnt == 1 # Single track in the playlist + return $('.playlist li').first().attr('id').split('i')[1] + else # Shuffle on + 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 'active' + + onRepeat: -> + #return $('#repeat').hasClass 'active' + + updateNowListening: (artist, album, track) -> + if _session.getUser().lastfm_username + _session.query '/lastfm/listening?r=' +Math.random(), artist: artist, album: album, track: track + false + + scrobble: (artist, album, track) -> + if _session.getUser().lastfm_username + _session.query '/lastfm/scrobble?r=' +Math.random(), artist: artist, album: album, track: track + false # Player Controls $('.player .prev').live 'click', -> - _player.setTrack _player.prevTrack() - false + _player.setTrack _player.prevTrack() + false $('.player .next').live 'click', -> - _player.setTrack _player.nextTrack(true) - false + _player.setTrack _player.nextTrack(true) + false $('.player .play').live 'click', -> - if $('.playlist li').length > 0 and not _player.hasTrack() - _player.setTrack $('.playlist li').first().attr('id').split('i')[1] - false + if $('.playlist li').length > 0 and not _player.hasTrack() + _player.setTrack $('.playlist li').first().attr('id').split('i')[1] + false $('.player .progress').live 'click', (e) -> - $('#jplayer').jPlayer 'playHead', Math.round((e.offsetX / _player.bar_width) * 100) - false + $('#jplayer').jPlayer 'playHead', Math.round((e.offsetX / _player.bar_width) * 100) + false # Player Additional Controls $('#repeat, #shuffle').live 'click', -> - $(this).toggleClass 'active' - false + $(this).toggleClass 'active' + false $('#empty-playlist').live 'click', -> - if confirm('Are you sure?') - $('.playlist li').remove() - $('#jplayer').jPlayer 'clearMedia' - $('.player .now-playing').text 'Add some music to playlist' - $('.player .loaded, .player .played').width 0 - false + if confirm('Are you sure?') + $('.playlist li').remove() + $('#jplayer').jPlayer 'clearMedia' + $('.player .now-playing').text 'Add some music to playlist' + $('.player .loaded, .player .played').width 0 + false # Playlist Actions $('.playlist li .artist-name, .playlist li .song-title, .playlist li .song-duration, .playlist li .remove').live 'mousemove mouseover mouseout', (e) -> - if e.type in ['mouseover', 'mousemove'] and ($(window).width() - e.clientX) < 60 + - $(window).width() - $('.playlist').offset().left - $('.playlist').outerWidth() - $(this).parent().find('.song-duration').hide() - $(this).parent().find('.remove').show() - else - $(this).parent().find('.remove').hide() - $(this).parent().find('.song-duration').show() - false + if e.type in ['mouseover', 'mousemove'] and $('.playlist').offset().left + $('.playlist').outerWidth() - e.clientX < 60 + $(this).parent().find('.song-duration').hide() + $(this).parent().find('.remove').show() + else + $(this).parent().find('.remove').hide() + $(this).parent().find('.song-duration').show() + false $('.playlist li .remove').live 'click', (e) -> - $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 + $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 $('.playlist li').live 'click', -> - _player.setTrack $(this).attr('id').split('i')[1] - false - + _player.setTrack $(this).attr('id').split('i')[1] + false + # Adding To Playlist actions $('.add-album').live 'click', -> - artist = $('.artist-info h2').text() - album = _player.albums[$(this).attr('data-album-id')] - for item in album.tracks.album - item['artist'] = artist - item['album'] = album.name - _player.addTracks album.tracks.album - false + artist = $('.artist-info h2').text() + album = _player.albums[$(this).attr('data-album-id')] + for item in album.tracks.album + item['artist'] = artist + item['album'] = album.name + _player.addTracks album.tracks.album + false diff --git a/app/assets/stylesheets/player.scss b/app/assets/stylesheets/player.scss index e05dac4..b5e75fc 100644 --- a/app/assets/stylesheets/player.scss +++ b/app/assets/stylesheets/player.scss @@ -21,14 +21,14 @@ width: 94%; margin: 0 0 18px 3%; height: 5px; - background-color: #e0e0e0; + background-color: #f0f0f0; .loaded { - width: 66%; + width: 0; height: 5px; background-color: #d0e0e0; cursor: pointer; .played { - width: 66%; + width: 0; height: 5px; background-color: #0090AA; }