Holy fuck. It works!

This commit is contained in:
magnolia-fan
2011-06-28 00:43:54 +04:00
parent b9ac20f575
commit 18b2b910ae
19 changed files with 948 additions and 929 deletions
+39 -31
View File
@@ -3,42 +3,46 @@ class Ajax
referer: false
loadArtistData: (name) ->
search.showSpinner()
_search.showSpinner()
name = name.split(' ').join('+')
$.get '/artist/' +name+ '/', (data) ->
if data.status?
if data.status is 'loading'
search.showArtistPics data.pics
_search.showArtistPics data.pics
setTimeout () ->
this.loadArtistData name
_ajax.loadArtistData name
, 3000
else if data.status is 'corrected'
ajax.loadArtistData data.page
_ajax.loadArtistData data.page
else if data.status is 'suggestions'
search.hideSpinner()
search.showSuggestions data.values
_search.hideSpinner()
_search.showSuggestions data.values
else if data.status == 'loading_failed'
search.hideSpinner()
search.showError()
_search.hideSpinner()
_search.showError()
else
this.setArchor '/artist/' +name+ '/'
pages.renderArtist data
beathaven.redrawScrollbar()
_ajax.setArchor '/artist/' +name+ '/'
_pages.renderArtist data
_beathaven.redrawScrollbar()
false
loadSearchPage: ->
$.get '/templates/search.html', (data) ->
this.setArchor '/search/'
pages.renderSearch data
_ajax.setArchor '/search/'
_pages.renderSearch data
false
loadSettingsPage: ->
$.get '/templates/settings.html', (data) ->
this.setArchor '/settings/'
pages.renderSettings data
_ajax.setArchor '/settings/'
_pages.renderSettings data
false
load404Page: ->
$.get '/404.html', (data) ->
$('.data-container .inner').html data
beathaven.redrawScrollbar()
_beathaven.redrawScrollbar()
false
setArchor: (anchor) ->
@referer = this.getAnchor()
@@ -49,22 +53,26 @@ class Ajax
setTitle: (title) ->
document.title = title+ ' @ BeatHaven'
go: (url) ->
this.setArchor url
false
detectPage: () ->
if m = this.getAnchor().match /\/artist\/(.+)\//
this.loadArtistData m[1]
else if this.getAnchor() == '' or Ajax.getAnchor().match /\/search\//
this.loadSearchPage();
else if this.getAnchor().match /\/settings\//
this.loadSearchPage()
if m = _ajax.getAnchor().match /\/artist\/(.+)\//
_ajax.loadArtistData m[1]
else if _ajax.getAnchor() == '' or _ajax.getAnchor().match /\/search\//
_ajax.loadSearchPage();
else if _ajax.getAnchor().match /\/settings\//
_ajax.loadSettingsPage()
else
this.load404Page()
$ ->
window.ajax = new Ajax()
$('a.data.artist').live 'click', ->
ajax.loadArtistData $(this).html()
_ajax.loadSearchPage()
false
$(window).bind 'hashchange', ->
ajax.detectPage()
$('a.data.artist').live 'click', ->
_ajax.loadArtistData $(this).html()
false
$(window).bind 'hashchange', ->
_ajax.detectPage()
false
+32 -10
View File
@@ -1,18 +1,25 @@
# Registering global objects
_beathaven = null
_session = 1
_vkontakte = null
_ajax = null
_player = null
_search = null
_pages = null
_settings = null
$ ->
l = document.location
if l.host not in ['beathaven.org', 'localhost']
l.href = 'http://beathaven.org/'+ l.hash
window.beathaven = new BeatHaven()
window.vkontakte = new Vkontakte(if l.host == 'beathaven.org' then 2335068 else 2383163)
beathaven.init()
vkontakte.init()
_beathaven = new BeatHaven()
_beathaven.init()
$(window).resize ->
beathaven.adjustSizes()
_beathaven.adjustSizes()
window.setTimeout ->
beathaven.checkRedrawScrollbar()
_beathaven.checkRedrawScrollbar()
, 500
class BeatHaven
@@ -20,9 +27,24 @@ class BeatHaven
last_height: false
init: ->
this.drawInterface()
this.adjustSizes()
ajax.detectPage()
this.checkRedrawScrollbar()
_vkontakte = new Vkontakte(if document.location.host == 'beathaven.org' then 2335068 else 2383163)
_vkontakte.init()
_ajax = new Ajax()
_player = new Player()
_player.initJplayer()
_search = new Search()
_pages = new Pages()
_settings = new Settings()
_ajax.detectPage()
adjustSizes: ->
$('.data-container').height $(window).height() - $('.header-container').height()
@@ -45,7 +67,7 @@ class BeatHaven
document.getElementById(focused_id).focus()
focused_id = false
window.setTimeout ->
beathaven.checkRedrawScrollbar()
_beathaven.checkRedrawScrollbar()
, 500
redrawScrollbar: ->
+10 -11
View File
@@ -47,8 +47,9 @@ class Pages
$('.data-container').css backgroundImage: 'none'
$('.data-container .inner').html('').append(artist_info).append(albums_info)
yaCounter7596904.hit ajax.getAnchor(), data.artist.name, ajax.referer
ajax.setTitle data.artist.name
yaCounter7596904.hit _ajax.getAnchor(), data.artist.name, _ajax.referer
_ajax.setTitle data.artist.name
false
renderSearch: (data) ->
$('.data-container').css background: 'url(/images/concrete_wall_2.png) 0 -30px repeat'
@@ -69,20 +70,18 @@ class Pages
zIndex: 9999 # z-index списка
deferRequestBy: 500 # Задержка запроса (мсек)
onSelect: ->
ajax.loadArtistData()
_ajax.loadArtistData $('#search_field').val()
$('#search_field').focus()
, 501
yaCounter7596904.hit ajax.getAnchor(), 'Artist Search', ajax.referer
ajax.setTitle 'Artist Search'
yaCounter7596904.hit _ajax.getAnchor(), 'Artist Search', _ajax.referer
_ajax.setTitle 'Artist Search'
false
renderSettings: (data) ->
$('.data-container').css background: 'none'
$('.data-container .inner').html data
yaCounter7596904.hit ajax.getAnchor(), 'Settings', ajax.referer
ajax.setTitle 'Settings'
yaCounter7596904.hit _ajax.getAnchor(), 'Settings', _ajax.referer
_ajax.setTitle 'Settings'
$('.settings-container .tabs .tab').first().trigger 'click'
$ ->
window.pages = new Pages()
false
false
+41 -47
View File
@@ -13,8 +13,8 @@ class Player
supplied: "mp3"
cssSelectorAncestor: ""
cssSelector:
play: "#player .play"
pause: "#player .pause"
play: ".player .play"
pause: ".player .pause"
stop: ""
videoPlay: ""
seekBar: ""
@@ -28,19 +28,19 @@ class Player
@jp.bind $.jPlayer.event.timeupdate, (e) ->
data = e.jPlayer.status
if not Player.scrobbled and data.currentPercentAbsolute > 50
if not _player.scrobbled and 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)
$('#player .progress .played').width(data.currentPercentAbsolute * self.bar_width / 100)
_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
$('.player .now-playing').html 'Nothing left to <strike>lose</strike> play'
$('.player .loaded, .player .played').width 0
$('.playlist-tracks li').removeClass 'now'
else
self.setTrack next
@@ -54,31 +54,31 @@ class Player
<li id="i' +Math.round(Math.random() * 999999)+ '" data-artist="' +artist.trim()+ '" data-album="' +album.trim()+ '" data-track="' +track.trim()+ '" data-length="' +length+ '">
<div class="item">
<div class="fade"></div>
<span class="title" title="' +artist.htmlsafe()+ ' &mdash ' +track.htmlsafe()+ '">' +artist+ ' &mdash ' +track+ '</span>
<span class="title" title="' +artist.htmlsafe()+ " &mdash; " +track.htmlsafe()+ '">' +artist+ ' &mdash; ' +track+ '</span>
<span class="duration">' +length+ '</span>
<div class="remove">remove</div>
</div>
</li>'
$('#playlist').html($('.playlist-tracks')).scrollbar()
$('.playlist').html($('.playlist-tracks')).scrollbar()
$('.playlist-tracks').sortable()
if autoplay
Player.setTrack($('.playlist-tracks li').last().attr('id').split('i')[1])
else if initial_count == 0 and not Player.hasTrack()
Player.setTrack($('.playlist-tracks li').first().attr('id').split('i')[1])
_player.setTrack($('.playlist-tracks li').last().attr('id').split('i')[1])
else if initial_count == 0 and not _player.hasTrack()
_player.setTrack($('.playlist-tracks li').first().attr('id').split('i')[1])
setTrack: (id) ->
$obj = $('#i' +id)
query = $obj.attr('data-artist')+ ' &mdash ' +$obj.attr('data-track')
query = $obj.attr('data-artist')+ ' &mdash; ' +$obj.attr('data-track')
$('#player .now-playing').html query+ '<div class="fade"></div>'
$('.player .now-playing').html query+ '<div class="fade"></div>'
$('.playlist-tracks li').removeClass 'now'
$obj.addClass 'now'
$('#player .loaded, #player .played').width 0
$('.player .loaded, .player .played').width 0
vkontakte.loadTracksData $obj.attr('data-artist'), $obj.attr('data-track'), $obj.attr('data-length'), ->
player.playSource()
_vkontakte.loadTracksData $obj.attr('data-artist'), $obj.attr('data-track'), $obj.attr('data-length'), (url)->
_player.playSource url
this.updateNowListening $obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track')
hasTrack: ->
@@ -99,7 +99,7 @@ class Player
cnt = $('.playlist-tracks li').length
if not this.onShuffle() # Shuffle off
if $('.playlist-tracks .now').next().length == 0 # Last track and repeat is on
if Player.onRepeat() or manual # Repeat or manual click
if _player.onRepeat() or manual # Repeat or manual click
return $('.playlist-tracks li').first().attr('id').split('i')[1]
else
false
@@ -117,7 +117,7 @@ class Player
prevTrack: ->
cnt = $('.playlist-tracks li').length
if not Player.onShuffle() # Shuffle off
if not _player.onShuffle() # Shuffle off
if $('.playlist-tracks .now').prev().length == 0 # First track in the playlist
return $('.playlist-tracks li').last().attr('id').split('i')[1]
else
@@ -139,37 +139,31 @@ class Player
return $('#repeat').hasClass 'active'
updateNowListening: (artist, album, track) ->
if session.user.lastfm_username
session.query '/lastfm/listening?r=' +Math.random(), artist: artist, album: album, track: track
if _session.getUser().lastfm_username
_session.query '/lastfm/listening?r=' +Math.random(), artist: artist, album: album, track: track
scrobble: (artist, album, track) ->
if session.user.lastfm_username
session.query '/lastfm/scrobble?r=' +Math.random(), artist: artist, album: album, track: track
$ ->
window.player = new Player()
window.player.initJplayer()
false
if _session.getUser().lastfm_username
_session.query '/lastfm/scrobble?r=' +Math.random(), artist: artist, album: album, track: track
# Player Controls
$('#player .controls .prev').live 'click', ->
Player.setTrack Player.prevTrack()
$('.player .controls .prev').live 'click', ->
_player.setTrack _player.prevTrack()
false
$('#player .controls .next').live 'click', ->
Player.setTrack Player.nextTrack(true)
$('.player .controls .next').live 'click', ->
_player.setTrack _player.nextTrack(true)
false
$('#player .play').live 'click', ->
if $('.playlist-tracks li').length > 0 and not Player.hasTrack()
player.setTrack $('.playlist-tracks li').first().attr('id').split('i')[1]
$('.player .play').live 'click', ->
if $('.playlist-tracks li').length > 0 and not _player.hasTrack()
_player.setTrack $('.playlist-tracks li').first().attr('id').split('i')[1]
false
$('#player .progress').live 'click', (e) ->
$('#jplayer').jPlayer 'playHead', Math.round((e.offsetX / Player.bar_width) * 100)
$('.player .progress').live 'click', (e) ->
$('#jplayer').jPlayer 'playHead', Math.round((e.offsetX / _player.bar_width) * 100)
false
# Player Additional Controls
@@ -182,8 +176,8 @@ $('#empty-playlist').live 'click', ->
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
$('.player .now-playing').text 'Add some music to playlist'
$('.player .loaded, .player .played').width 0
false
# Playlist Actions
@@ -201,13 +195,13 @@ $('.playlist-tracks li .remove').live 'click', ->
$li = $(this).parent().parent()
if $li.hasClass 'now'
$('#jplayer').jPlayer 'clearMedia'
$('#player .now-playing').text '...'
$('#player .loaded, #player .played').width 0
$('.player .now-playing').text '...'
$('.player .loaded, .player .played').width 0
$li.remove()
false
$('.playlist-tracks li').live 'dblclick', ->
player.setTrack $(this).attr('id').split('i')[1]
_player.setTrack $(this).attr('id').split('i')[1]
false
# Adding To Playlist actions
@@ -218,7 +212,7 @@ $('.add-album').live 'click', ->
for item in $(this).parent().parent().parent().find('.tracklist li')
track_name = $(item).find('.trackname').html()
length = $(item).find('.length').html()
Player.addTrack artist, album, track_name, length
_player.addTrack artist, album, track_name, length
false
$('.add-track').live 'click', ->
@@ -226,7 +220,7 @@ $('.add-track').live 'click', ->
album = $(this).parent().parent().parent().parent().find('h2.name').text().replace /\s\([\d]{4}\)$/, ''
track_name = $(this).parent().find('.trackname').html()
length = $(this).parent().find('.length').html()
Player.addTrack artist, album, track_name, length
_player.addTrack artist, album, track_name, length
false
$('.tracklist li').live 'mouseover mouseout', (e) ->
@@ -241,5 +235,5 @@ $('.tracklist li').live 'dblclick', (e) ->
album = $(this).parent().parent().parent().find('h2.name').text().replace /\s\([\d]{4}\)$/, ''
track_name = $(this).find('.trackname').html()
length = $(this).find('.length').html()
Player.addTrack artist, album, track_name, length, true
_player.addTrack artist, album, track_name, length, true
false
+3 -7
View File
@@ -21,7 +21,7 @@ class Search
$('.suggestions ul').append '
<li>
<a class="data artist">' +item.name+ '</a>
' +(if item.desc then '<br/><span>'+ item.desc +'</span>' else '')+ '
' +(if item.desc? then '<br/><span>'+item.desc+'</span>' else '')+ '
</li>'
$('.suggestions').show()
false
@@ -48,16 +48,12 @@ class Search
@pics = []
$ ->
window.search = new Search()
false
$('.search').live 'click', ->
ajax.loadSearchPage()
_ajax.go '/search/'
false
$('#search_form').live 'submit', ->
$('.autocomplete-container').remove()
ajax.loadArtistData $('#search_field').val()
_ajax.loadArtistData $('#search_field').val()
false
$('.suggestions a').live 'click', ->
$('#search_field').val $(this).text()
+15 -11
View File
@@ -3,7 +3,21 @@ class Session
vk_params: null
user: null
constructor: (@vk_params) ->
constructor: (params) ->
attrs = ['expire', 'mid', 'secret', 'sid', 'sig']
_params = {}
for key in attrs
if params[key]?
_params[key] = params[key]
@vk_params = _params
false
setUser: (user) ->
@user = user
false
getUser: ->
@user
query: (url, params, callback) ->
q_params = @vk_params
@@ -11,13 +25,3 @@ class Session
q_params[attr] = params[attr]
$.post url, q_params, callback
false
setVkParams: (params) ->
attrs = ['expire', 'mid', 'secret', 'sid', 'sig']
for key in attrs
@vk_params[key] = params[key]
false
$ ->
window.session = new Session()
false
+11 -14
View File
@@ -1,35 +1,32 @@
class Settings
getAccountInfo: (callback) ->
session.query '/user/update/', {}, callback
_session.query '/user/update/', {}, callback
saveAccountInfo: (params, callback) ->
session.query '/user/update', params, callback
_session.query '/user/update', params, callback
loadFormData: (form) ->
if form == 'account'
$('.settings-container .form input[name$="username"]').val session.user.name
$('.settings-container .form input[name$="email"]').val session.email
$('.settings-container .form input[name$="username"]').val _session.getUser().name
$('.settings-container .form input[name$="email"]').val _session.getUser().email
else if form == 'lastfm'
if @user.lastfm_username
$('.form-container input[name$="username"]').first().val session.lastfm_username
if _session.getUser().lastfm_username
$('.form-container input[name$="username"]').first().val _session.getUser().lastfm_username
$ ->
window.settings = new Settings()
false
$('.settings') .live 'click', ->
ajax.loadSettingsPage();
_ajax.go('/settings/');
$('.settings-container .tabs .tab').live 'click', ->
if $(this).hasClass 'active'
if not $(this).hasClass 'active'
$('.settings-container .tabs .tab').removeClass 'active'
$(this).addClass 'active'
$('.form-container').html $('.forms .'+ $(this).attr 'data-fieldset').html()
settings.loadFormData $(this).attr 'data-fieldset'
_settings.loadFormData $(this).attr 'data-fieldset'
$('.lastfm-connect') .live 'click', ->
window.open session.user.lastfm_login_url
window.open _session.getUser().lastfm_login_url
$('.settings-container .form input').live 'blur', ->
active_tab = $('.settings-container .tabs .tab.active').attr 'data-fieldset'
@@ -37,5 +34,5 @@ $('.settings-container .form input').live 'blur', ->
params =
username: $('.settings-container .form input[name$="username"]').first().val()
email: $('.settings-container .form input[name$="email"]').first().val()
settings.saveAccountInfo params, ->
_settings.saveAccountInfo params, ->
$('#header-container .hello .greating').text 'Hi there, ' +(if params.username.length > 0 then params.username else '%username%')+ '!'
+31 -20
View File
@@ -1,50 +1,53 @@
class Vkontakte
qr: []
qr: null
constructor: (@api_id) ->
init: ->
@qr = []
VK.init
apiId: @api_id
nameTransportPath: '/xd_receiver.html'
VK.Auth.getLoginStatus this.authInfo
authInfo: (response) ->
if typeof response isnt 'undefined' and response.session
session.setVkParams response.session
if typeof response isnt 'undefined' and response.session
_session = new Session(response.session)
$('#vk_login, .auth_notice').hide()
$('#vk_logout').css display: 'block'
$('#search_field').focus() if $('#search_field').length > 0
session.query '/user/auth', {}, (ar) ->
_session.query '/user/auth', {}, (ar) ->
if ar.newbie
VK.Api.call 'getVariable', key: 1281, (r) ->
Session.query '/user/update', name: r.response, (ar2) ->
session.user = ar2.user
$('#header-container .hello .greating')
.text 'Hi there, ' +(if session.user.name then session.user.name else '%username%')+ '!'
_session.query '/user/update', name: r.response, (ar2) ->
_session.setUser ar2.user
$('.header-container .hello .greating')
.text 'Hi there, ' +(if _session.getUser().name then _session.getUser().name else '%username%')+ '!'
else
session.user = ar.user
_session.setUser ar.user
$('#header-container .hello .greating')
.text 'Hi there, ' +( if session.user.name then session.user.name else '%username%')+ '!'
$('.header-container .hello .greating')
.text 'Hi there, ' +(if _session.getUser().name then _session.getUser().name else '%username%')+ '!'
else
_session = new Session({})
$('#vk_login, .auth_notice').css display: 'block'
$('#vk_logout').hide()
window._session = _session
loadTracksData: (artist, track, duration, callback) ->
track_prepared = track.replace(/\(.*\)/i, '').split('/')[0];
query = artist +' '+ track_prepared;
if @qr[query]?
callback @qr[query]
query = artist+' '+track_prepared;
if url = _vkontakte.getQR query
callback url
else
VK.Api.call 'audio.search', q: query, (r) ->
url = this.matchPerfectResult r.response, artist, track, duration
@qr[query] = url;
r.response.splice 0, 1
url = _vkontakte.matchPerfectResult r.response, artist, track, duration
_vkontakte.addQR query, url
callback url
matchPerfectResult: (data, artist, track, duration) ->
@@ -84,9 +87,17 @@ class Vkontakte
return best_result.url
return best_result.url
addQR: (query, url) ->
@qr[query] = url;
getQR: (query) ->
if @qr[query]?
@qr[query]
false
$ ->
$('#vk_login').click ->
VK.Auth.login vkontakte.authInfo, 8
VK.Auth.login _vkontakte.authInfo(), 8
$('#vk_logout').click ->
VK.Auth.logout vkontakte.authInfo
VK.Auth.logout _vkontakte.authInfo()