1
0
Fork 0
oldhaven/public/javascripts/coffee/player.js

307 lines
10 KiB
JavaScript
Raw Normal View History

2011-06-27 20:43:54 +00:00
var Player;
Player = (function() {
function Player() {}
Player.prototype.bar_width = 330;
Player.prototype.jp = null;
Player.prototype.scrobbled = false;
Player.prototype.initJplayer = function() {
var self;
self = this;
this.jp = $("#jplayer");
this.jp.jPlayer({
swfPath: "/js",
supplied: "mp3",
cssSelectorAncestor: "",
cssSelector: {
play: ".player .play",
pause: ".player .pause",
stop: "",
videoPlay: "",
seekBar: "",
playBar: "",
mute: "",
unmute: "",
volumeBar: "",
volumeBarValue: "",
currentTime: "",
duration: ""
}
});
this.jp.bind($.jPlayer.event.timeupdate, function(e) {
var $obj, data;
data = e.jPlayer.status;
if (!_player.scrobbled && data.currentPercentAbsolute > 50) {
$obj = $('.playlist-tracks 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);
return $('.player .progress .played').width(data.currentPercentAbsolute * self.bar_width / 100);
});
this.jp.bind($.jPlayer.event.ended, function(e) {
var next;
next = self.nextTrack();
if (!next) {
$('#jplayer').jPlayer('clearMedia');
$('.player .now-playing').html('Nothing left to <strike>lose</strike> play');
$('.player .loaded, .player .played').width(0);
return $('.playlist-tracks li').removeClass('now');
} else {
return self.setTrack(next);
2011-06-27 18:41:36 +00:00
}
2011-06-27 20:43:54 +00:00
});
return false;
};
Player.prototype.addTracks = function(tracks, autoplay) {
var initial_count, item, _i, _len;
2011-06-27 20:43:54 +00:00
if (!(autoplay != null)) {
autoplay = false;
}
initial_count = $('.playlist-tracks li').length;
for (_i = 0, _len = tracks.length; _i < _len; _i++) {
item = tracks[_i];
$('.playlist-tracks').append('\
<li id="i' + Math.round(Math.random() * 999999) + '" data-id="' + item.id + '" data-artist="' + item.artist.trim() + '" data-album="' + item.album.trim() + '" data-track="' + item.name.trim() + '" data-length="' + item.length + '">\
<div class="item">\
<div class="fade"></div>\
<div class="dragbox"></div>\
<span class="title">\
<span class="data artist" title="Open ' + item.artist.htmlsafe() + '\'s page">' + item.artist + '</span>\
&mdash;\
<span class="playtrack" title="Play ' + item.name.htmlsafe() + ' by ' + item.artist.htmlsafe() + '">' + item.name + '</span>\
</span>\
<span class="duration">' + item.length + '</span>\
<div class="remove">remove</div>\
</div>\
</li>');
}
2011-06-29 00:02:42 +00:00
$('.playlist').html($('.playlist-tracks')).scrollbar();
$('.playlist-tracks').sortable({
axis: 'y',
handle: '.dragbox'
});
2011-06-27 20:43:54 +00:00
if (autoplay) {
2011-06-28 23:40:23 +00:00
_player.setTrack($('.playlist-tracks li').last().attr('id').split('i')[1]);
2011-06-27 20:43:54 +00:00
} else if (initial_count === 0 && !_player.hasTrack()) {
2011-06-28 23:40:23 +00:00
_player.setTrack($('.playlist-tracks li').first().attr('id').split('i')[1]);
2011-06-27 20:43:54 +00:00
}
2011-06-28 23:40:23 +00:00
return false;
2011-06-27 20:43:54 +00:00
};
Player.prototype.getDataFromLi = function(obj) {
var id, length, track_name;
id = $(obj).attr('data-id');
track_name = $(obj).find('.trackname').html();
length = $(obj).find('.length').html();
return {
id: id,
name: track_name,
length: length
};
};
2011-06-27 20:43:54 +00:00
Player.prototype.setTrack = function(id) {
var $obj, query;
$obj = $('#i' + id);
query = $obj.attr('data-artist') + ' &mdash; ' + $obj.attr('data-track');
$('.player .loaded, .player .played').width(0);
2011-06-27 20:43:54 +00:00
$('.player .now-playing').html(query + '<div class="fade"></div>');
$('.playlist-tracks li').removeClass('now');
$obj.addClass('now');
$('.tracklist li').removeClass('now');
$('.tracklist li[data-id="' + $obj.attr('data-id') + '"]').addClass('now');
2011-06-27 20:43:54 +00:00
_vkontakte.loadTracksData($obj.attr('data-artist'), $obj.attr('data-track'), $obj.attr('data-length'), function(url) {
return _player.playSource(url);
});
2011-06-28 23:40:23 +00:00
this.updateNowListening($obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track'));
return false;
2011-06-27 20:43:54 +00:00
};
Player.prototype.hasTrack = function() {
if ($('#jplayer audio').length > 0) {
2011-06-28 23:44:39 +00:00
return ($('#jplayer audio').attr('src') != null) && $('#jplayer audio').attr('src') !== '';
2011-06-27 20:43:54 +00:00
} else if ($('#jplayer object').length > 0) {
2011-06-27 18:41:36 +00:00
$('#jplayer').jPlayer('play');
2011-06-27 20:43:54 +00:00
true;
}
return false;
};
Player.prototype.playSource = function(url) {
2011-06-28 23:40:23 +00:00
this.scrobbled = false;
2011-06-27 20:43:54 +00:00
$('#jplayer').jPlayer('setMedia', {
mp3: url
});
$('#jplayer').jPlayer('play');
2011-06-28 23:40:23 +00:00
return false;
2011-06-27 20:43:54 +00:00
};
Player.prototype.nextTrack = function(manual) {
var $li, cnt, rnd;
manual = manual != null;
cnt = $('.playlist-tracks li').length;
if (!this.onShuffle()) {
if ($('.playlist-tracks .now').next().length === 0) {
if (_player.onRepeat() || manual) {
return $('.playlist-tracks li').first().attr('id').split('i')[1];
2011-06-27 18:41:36 +00:00
} else {
2011-06-27 20:43:54 +00:00
false;
2011-06-27 18:41:36 +00:00
}
} else {
2011-06-27 20:43:54 +00:00
return $('.playlist-tracks .now').next().attr('id').split('i')[1];
2011-06-27 18:41:36 +00:00
}
2011-06-27 20:43:54 +00:00
} else if (cnt === 1) {
return $('.playlist-tracks li').first().attr('id').split('i')[1];
} else {
while (true) {
rnd = Math.floor(Math.random() * (cnt + .999));
$li = $('.playlist-tracks li').eq(rnd);
if ($li.length > 0 && !$li.hasClass('now')) {
return $li.attr('id').split('i')[1];
2011-06-27 18:41:36 +00:00
}
}
}
return false;
2011-06-27 20:43:54 +00:00
};
Player.prototype.prevTrack = function() {
var $li, cnt, rnd;
cnt = $('.playlist-tracks li').length;
if (!_player.onShuffle()) {
if ($('.playlist-tracks .now').prev().length === 0) {
return $('.playlist-tracks li').last().attr('id').split('i')[1];
} else {
return $('.playlist-tracks .now').prev().attr('id').split('i')[1];
}
} else if (cnt === 1) {
return $('.playlist-tracks li').first().attr('id').split('i')[1];
2011-06-27 18:41:36 +00:00
} else {
2011-06-27 20:43:54 +00:00
while (true) {
rnd = Math.floor(Math.random() * (cnt + .999));
$li = $('.playlist-tracks li').eq(rnd);
if ($li.length > 0 && !$li.hasClass('now')) {
return $li.attr('id').split('i')[1];
}
}
2011-06-27 18:41:36 +00:00
}
return false;
2011-06-27 20:43:54 +00:00
};
Player.prototype.onShuffle = function() {
return $('#shuffle').hasClass('active');
};
Player.prototype.onRepeat = function() {
return $('#repeat').hasClass('active');
};
Player.prototype.updateNowListening = function(artist, album, track) {
if (_session.getUser().lastfm_username) {
2011-06-28 23:40:23 +00:00
_session.query('/lastfm/listening?r=' + Math.random(), {
2011-06-27 20:43:54 +00:00
artist: artist,
album: album,
track: track
});
2011-06-27 18:41:36 +00:00
}
2011-06-28 23:40:23 +00:00
return false;
2011-06-27 20:43:54 +00:00
};
Player.prototype.scrobble = function(artist, album, track) {
if (_session.getUser().lastfm_username) {
2011-06-28 23:40:23 +00:00
_session.query('/lastfm/scrobble?r=' + Math.random(), {
2011-06-27 20:43:54 +00:00
artist: artist,
album: album,
track: track
});
2011-06-27 18:41:36 +00:00
}
2011-06-28 23:40:23 +00:00
return false;
2011-06-27 20:43:54 +00:00
};
return Player;
})();
$('.player .controls .prev').live('click', function() {
_player.setTrack(_player.prevTrack());
return false;
});
$('.player .controls .next').live('click', function() {
_player.setTrack(_player.nextTrack(true));
return false;
});
$('.player .play').live('click', function() {
if ($('.playlist-tracks li').length > 0 && !_player.hasTrack()) {
_player.setTrack($('.playlist-tracks li').first().attr('id').split('i')[1]);
}
return false;
});
$('.player .progress').live('click', function(e) {
$('#jplayer').jPlayer('playHead', Math.round((e.offsetX / _player.bar_width) * 100));
return false;
});
$('#repeat, #shuffle').live('click', function() {
$(this).toggleClass('active');
return false;
});
$('#empty-playlist').live('click', function() {
if (confirm('Are you sure?')) {
$('.playlist-tracks li').remove();
$('#jplayer').jPlayer('clearMedia');
$('.player .now-playing').text('Add some music to playlist');
$('.player .loaded, .player .played').width(0);
}
return false;
});
2011-06-29 00:02:42 +00:00
$('.playlist-tracks li .fade, .playlist-tracks li .duration, .playlist-tracks li .remove').live('mousemove mouseover mouseout', function(e) {
var _ref;
if (((_ref = e.type) === 'mouseover' || _ref === 'mousemove') && ($(window).width() - e.clientX) < 60) {
2011-06-27 20:43:54 +00:00
$(this).parent().find('.duration').hide();
$(this).parent().find('.remove').show();
} else {
$(this).parent().find('.remove').hide();
$(this).parent().find('.duration').show();
}
return false;
});
$('.playlist-tracks li .remove').live('click', function() {
var $li;
$li = $(this).parent().parent();
if ($li.hasClass('now')) {
$('#jplayer').jPlayer('clearMedia');
$('.player .now-playing').text('...');
$('.player .loaded, .player .played').width(0);
}
$li.remove();
return false;
});
$('.playlist-tracks li .title .playtrack').live('click', function() {
_player.setTrack($(this).parent().parent().parent().attr('id').split('i')[1]);
2011-06-27 20:43:54 +00:00
return false;
});
$('.add-album').live('click', function() {
var album, artist, item, track, tracks, _i, _len, _ref;
2011-06-27 20:43:54 +00:00
artist = $('.artist-info .name').html();
album = $(this).parent().parent().parent().find('h2.name').text().replace(/\s\([\d]{4}\)$/, '');
tracks = [];
2011-06-27 20:43:54 +00:00
_ref = $(this).parent().parent().parent().find('.tracklist li');
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
item = _ref[_i];
track = _player.getDataFromLi(item);
track['artist'] = artist;
track['album'] = album;
tracks.push(track);
2011-06-27 20:43:54 +00:00
}
_player.addTracks(tracks);
2011-06-27 20:43:54 +00:00
return false;
});
$('.add-track').live('click', function() {
var track;
track = _player.getDataFromLi($(this).parent());
track['artist'] = $('.artist-info .name').html();
track['album'] = $(this).parent().parent().parent().parent().find('h2.name').text().replace(/\s\([\d]{4}\)$/, '');
_player.addTracks([track]);
2011-06-27 20:43:54 +00:00
return false;
});
$('.tracklist li').live('mouseover mouseout', function(e) {
if (e.type === 'mouseover') {
$(this).find('.add-track').show();
} else {
$(this).find('.add-track').hide();
}
return false;
});
$('.tracklist li').live('click', function(e) {
var track;
track = _player.getDataFromLi(this);
track['artist'] = $('.artist-info .name').html();
track['album'] = $(this).parent().parent().parent().find('h2.name').text().replace(/\s\([\d]{4}\)$/, '');
_player.addTracks([track], true);
2011-06-27 20:43:54 +00:00
return false;
});