1
0
Fork 0

Update track length in db if empty. Closes #107

This commit is contained in:
Gregory Eremin 2011-10-12 13:24:07 +04:00
parent 20ee424e7f
commit 0ec0b14172
12 changed files with 47 additions and 236 deletions

View File

@ -1,6 +1,5 @@
source 'http://rubygems.org'
gem 'rack', '1.3.3'
gem 'rails', '3.1.0'
gem 'unicorn'

View File

@ -66,13 +66,13 @@ GEM
treetop (~> 1.4.8)
mime-types (1.16)
multi_json (1.0.3)
musicbrainz (0.4.10)
musicbrainz (0.5.0)
nokogiri
mysql2 (0.3.7)
nokogiri (1.5.0)
pg (0.11.0)
polyglot (0.3.2)
rack (1.3.3)
rack (1.3.4)
rack-cache (1.0.3)
rack (>= 0.4)
rack-mount (0.8.3)
@ -98,13 +98,14 @@ GEM
thor (~> 0.14.6)
raindrops (0.7.0)
rake (0.9.2)
rdoc (3.9.4)
sass (3.1.8)
rdoc (3.10)
json (~> 1.4)
sass (3.1.10)
sprockets (2.0.2)
hike (~> 1.2)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
therubyracer (0.9.5)
therubyracer (0.9.8)
libv8 (~> 3.3.10)
thor (0.14.6)
tilt (1.3.3)
@ -135,7 +136,6 @@ DEPENDENCIES
mysql2 (= 0.3.7)
nokogiri
pg
rack (= 1.3.3)
rails (= 3.1.0)
sass
therubyracer

View File

@ -81,8 +81,16 @@ class window.Player
$('.player .now-playing').html query
$('.playlist li').removeClass 'now'
$obj.addClass 'now'
_vk_music.search track.artist, track.name, track.duration, (url) ->
_player.playSource url
_vk_music.search track.artist, track.name, track.duration, (audio) ->
_player.playSource audio.url
if track.length == 0
len = parseInt(audio.duration, 10)
duration = Math.floor(len / 60)+':'+(len - Math.floor(len / 60) * 60)
_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)
this.updateNowListening track
false

View File

@ -1,20 +0,0 @@
Copyright (c) 2011 Gregory Eremin
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -1,28 +0,0 @@
# Vkontakte (VK.com) API music search tool
Don't forget to log in to [vk.com API](http://vk.com/developers.php?oid=-17680044&p=Open_API)
### CoffeeScript example
```coffeescript
vk_music = new VkontakteMusic
vk_music.search "Kasabian", "L.S.F. (Lost Souls Forever)", "2:17", (url) ->
audio = document.createElement "audio"
audio.setAttribute "src", url
document.getElementsByTagName("body")[0].appendChild audio
audio.play()
false
```
### JavaScript example
```javascript
var vk_music;
vk_music = new VkontakteMusic;
vk_music.search("Kasabian", "L.S.F. (Lost Souls Forever)", "2:17", function(url) {
var audio;
audio = document.createElement("audio");
audio.setAttribute("src", url);
document.getElementsByTagName("body")[0].appendChild(audio);
audio.play();
return false;
});
```

View File

@ -1,9 +0,0 @@
/*
* Vkontakte (VK.com) API music search tool
* https://github.com/magnolia-fan/vkontakte_music_search
*
* Copyright 2011, Gregory Eremin
* Licensed under the MIT license.
* https://raw.github.com/magnolia-fan/vkontakte_music_search/master/LICENSE
*/
var VkontakteMusic;VkontakteMusic=function(){function a(){}return a.prototype.query_results={},a.prototype.search=function(a,b,c,d,e){var f,g;return e==null&&(e=!1),f=this.prepareQuery(a,b),this.query_results[f]!=null&&!e&&d(this.query_results[f]),g=this,VK.Api.call("audio.search",{q:f},function(h){var i,j;return i=g.range(h.response,a,b,c),j=null,i.length>0&&(j=i[0].url),g.query_results[f]=i,d(e?i:j)})},a.prototype.range=function(a,b,c,d){var e,f,g,h,i;typeof d=="string"&&(d=d.split(":"),d=parseInt(d[0],10)*60+parseInt(d[1],10));for(f=0,i=a.length;f<i;f++){g=a[f];if(typeof g!="object")continue;g.score=0,g.artist=this.trim(g.artist),g.title=this.trim(g.title),h=0,g.artist.length>0&&(g.artist===b?h+=10:g.artist.split(b).length===2?h+=5:g.title.split(b).length===2&&(h+=4)),g.artist.length>0&&(g.title===c?h+=10:g.title.split(c).length===2&&(h+=5)),parseInt(g.duration,10)===d?h+=15:(e=Math.abs(parseInt(g.duration,10)-d),e<10&&(h+=10-e)),a[f].score=h}return a.length>0&&typeof a[0]!="object"&&(a.splice(0,1),a.sort(function(a,b){return b.score-a.score})),a},a.prototype.prepareQuery=function(a,b){return a+" "+b.replace(/\(.*\)/i,"").split("/")[0]},a.prototype.trim=function(a){while(a.indexOf(" ")!==-1)a=a.replace(" "," ");return a.charAt(0)===" "&&(a=a.substring(1)),a.charAt(a.length-1)===" "&&(a=a.substring(0,a.length-1)),a},a}()

View File

@ -1,70 +0,0 @@
###
* Vkontakte (VK.com) API music search tool
* https://github.com/magnolia-fan/vkontakte_music_search
*
* Copyright 2011, Gregory Eremin
* Licensed under the MIT license.
* https://raw.github.com/magnolia-fan/vkontakte_music_search/master/LICENSE
###
class window.VkontakteMusic
query_results: {}
search: (artist, track, duration, callback, return_all = false) ->
query = this.prepareQuery artist, track
if @query_results[query]? and not return_all
callback @query_results[query]
that = this
VK.Api.call 'audio.search', q: query, (r) ->
results = that.range r.response, artist, track, duration
top_result = null
if results.length > 0
top_result = results[0].url
that.query_results[query] = results
callback if return_all then results else top_result
range: (data, artist, track, duration) ->
if typeof duration is 'string'
duration = duration.split ':'
duration = parseInt(duration[0], 10) * 60 + parseInt(duration[1], 10)
for item, i in data
if typeof item isnt 'object'
continue
item.score = 0;
item.artist = this.trim(item.artist);
item.title = this.trim(item.title);
score = 0
if item.artist.length > 0
if item.artist == artist
score += 10
else if item.artist.split(artist).length is 2
score += 5
else if item.title.split(artist).length is 2
score += 4
if item.artist.length > 0
if item.title == track
score += 10
else if item.title.split(track).length is 2
score += 5
if parseInt(item.duration, 10) == duration
score += 15
else
delta = Math.abs parseInt(item.duration, 10) - duration
score += (10 - delta) if delta < 10
data[i].score = score
if data.length > 0 and typeof data[0] isnt 'object'
data.splice 0, 1
data.sort (a, b) ->
b.score - a.score
data
prepareQuery: (artist, track) ->
artist+" "+track.replace(/\(.*\)/i, '').split('/')[0]
trim: (str) ->
while str.indexOf(' ') isnt -1
str = str.replace ' ', ' '
if str.charAt(0) is ' '
str = str.substring 1
if str.charAt(str.length - 1) is ' '
str = str.substring 0, str.length - 1
str

View File

@ -18,7 +18,7 @@ class window.VkontakteMusic
results = that.range r.response, artist, track, duration
top_result = null
if results.length > 0
top_result = results[0].url
top_result = results[0]
that.query_results[query] = results
callback if return_all then results else top_result
@ -29,9 +29,9 @@ class window.VkontakteMusic
for item, i in data
if typeof item isnt 'object'
continue
item.score = 0;
item.artist = this.trim(item.artist);
item.title = this.trim(item.title);
item.score = 0
item.artist = this.trim(item.artist)
item.title = this.trim(item.title)
score = 0
if item.artist.length > 0
if item.artist == artist
@ -45,14 +45,15 @@ class window.VkontakteMusic
score += 10
else if item.title.split(track).length is 2
score += 5
if parseInt(item.duration, 10) == duration
if duration != 0 and parseInt(item.duration, 10) == duration
score += 15
else
delta = Math.abs parseInt(item.duration, 10) - duration
score += (10 - delta) if delta < 10
data[i].score = score
if data.length > 0 and typeof data[0] isnt 'object'
data.splice 0, 1
if data.length > 0
if typeof data[0] isnt 'object'
data.splice(0, 1)
data.sort (a, b) ->
b.score - a.score
data
@ -62,9 +63,9 @@ class window.VkontakteMusic
trim: (str) ->
while str.indexOf(' ') isnt -1
str = str.replace ' ', ' '
str = str.replace(' ', ' ')
if str.charAt(0) is ' '
str = str.substring 1
str = str.substring(1)
if str.charAt(str.length - 1) is ' '
str = str.substring 0, str.length - 1
str = str.substring(0, str.length - 1)
str

View File

@ -0,0 +1,18 @@
class TrackController < ApplicationController
before_filter :authorize
def update_length
unless params[:track_id].nil?
track = Track.find(params[:track_id])
unless track.nil? or params[:length].nil?
if track.length == nil or track.length.to_i == 0 and params[:length].to_i > 0
track.length = params[:length].to_i
track.save
render :json => { :result => :success }
return
end
end
end
render :json => { :result => :failed }
end
end

View File

@ -68,6 +68,8 @@ Beathaven::Application.routes.draw do
match 'lastfm/listening' => 'last_fm#listening'
match 'lastfm/scrobble' => 'last_fm#scrobble'
match 'track/update_length' => 'track#update_length'
match 'settings' => 'user#settings'
match 'artist/autocomplete' => 'artist#autocomplete'

View File

@ -1,47 +0,0 @@
worker_processes 1;
error_log logs/error.log debug;
events {
worker_connections 256;
}
http {
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
upstream mongrel {
server 127.0.0.1:3000;
}
server {
listen 80;
server_name bh.vim.me localhost susanna brooklyn;
#root /Users/chez/Sites;
#index index.html index.htm;
try_files $uri @mongrel;
location @mongrel {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://mongrel;
}
include proxy.conf;
#error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

View File

@ -1,43 +0,0 @@
# Proxy download
location ~* ^/proxy-stream/(.*?)/(.*?)/(.*?)/(.*?)/(.*) {
# Do not allow people to mess with this location directly
# Only internal redirects are allowed
internal;
# Location-specific logging
#access_log logs/proxy_stream.access.log debug;
#error_log logs/proxy_stream.error.log debug;
# Extract download url from the request
set $token $1;
set $remixsid $2;
set $remixchk $3;
set $download_host $4;
set $download_uri $5;
# Compose download url
set $download_url http://$download_host/$download_uri;
# Compose cookie string
set $cookie "remixsid=$remixsid;remixchk=$remixchk";
# Set download request headers
proxy_set_header Host $download_host;
proxy_set_header Cookie $cookie;
proxy_set_header Referer "http://vkontakte.ru/audio?album_id=0";
# The next two lines could be used if your storage
# backend does not support Content-Disposition
# headers used to specify file name browsers use
# when save content to the disk
proxy_ignore_headers Cache-Control Expires;
# Do not touch local disks when proxying
# content to clients
proxy_max_temp_file_size 0;
# Download the file and send it to client
resolver 192.168.0.1;
proxy_pass $download_url;
}