Artist import moved to a controller, added shiny buttons
This commit is contained in:
parent
2b9db10ac2
commit
da67276a9a
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,3 @@
|
|||||||
tmp/
|
tmp/
|
||||||
log/
|
log/
|
||||||
.sqlite3
|
*.sqlite3
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
class ArtistController < ApplicationController
|
class ArtistController < ApplicationController
|
||||||
def data
|
def data
|
||||||
data = {}
|
data = {}
|
||||||
artist = Artist.find_by_name(params[:name])
|
artist = Artist.find_by_name(params[:name].gsub('+', ' '))
|
||||||
data['artist'] = {name: artist.name, desc: artist.desc, pic: artist.pic_url}
|
data['artist'] = {name: artist.name, desc: ActionController::Base.helpers.strip_tags(artist.desc), pic: artist.pic_url}
|
||||||
data['albums'] = []
|
data['albums'] = []
|
||||||
albums = artist.albums
|
albums = artist.albums
|
||||||
albums.each do |album|
|
albums.each do |album|
|
||||||
|
71
app/controllers/import_controller.rb
Normal file
71
app/controllers/import_controller.rb
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
class ImportController < ApplicationController
|
||||||
|
def self.importArtist name
|
||||||
|
# Get artist from MB
|
||||||
|
mb_artist = MusicBrainzArtist.getByName(name)
|
||||||
|
# # Save artist
|
||||||
|
artist_xml = open('http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&api_key=04fda005dbf61a50af5abc3e90f111f2&artist='+ URI.escape(name)).read
|
||||||
|
artist = Artist.new
|
||||||
|
artist.name = mb_artist.name
|
||||||
|
artist.desc = artist_xml.scan(/<summary><\!\[CDATA\[?(.*)\]\]><\/summary>/m)[0][0]
|
||||||
|
artist.pic_url = artist_xml.scan(/<image\ssize=\"extralarge\">?(.*)<\/image>/)[0][0]
|
||||||
|
artist.save
|
||||||
|
# Get albums from MB
|
||||||
|
mb_albums = MusicBrainzAlbum.where('artist_id = ? AND release_type = 1', mb_artist.id).order('year ASC, id ASC')
|
||||||
|
mb_albums.each do |mb_album|
|
||||||
|
# Saving album
|
||||||
|
album_xml = open('http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=04fda005dbf61a50af5abc3e90f111f2&artist='+ URI.escape(name) +'&album='+ URI.escape(mb_album.name)).read
|
||||||
|
album = Album.new
|
||||||
|
album.name = mb_album.name
|
||||||
|
album.year = mb_album.year
|
||||||
|
album.artist_id = artist.id
|
||||||
|
album.status = 1
|
||||||
|
album.pic_url = album_xml.scan(/<image\ssize=\"extralarge\">?(.*)<\/image>/)[0][0]
|
||||||
|
album.save
|
||||||
|
# Get album releases from MB
|
||||||
|
mb_releases = MusicBrainzRelease.where('album_id = ? AND release_type = 1', mb_album.id).order('date ASC, id ASC')
|
||||||
|
# Get tracks from the first release and then exclude release
|
||||||
|
mb_main_tracks = MusicBrainzTrack.where('release_id IN (?)', mb_releases.shift.id).order('position ASC')
|
||||||
|
# Creating hashed array for matching
|
||||||
|
mb_main_tracks_hashed = []
|
||||||
|
mb_main_tracks.each do |mb_track|
|
||||||
|
mb_main_tracks_hashed << mb_track.name.downcase.scan(/[a-z0-9]*/).join
|
||||||
|
end
|
||||||
|
# Getting other releases ids
|
||||||
|
release_ids = []
|
||||||
|
mb_releases.each do |mb_release|
|
||||||
|
release_ids << mb_release.id
|
||||||
|
end
|
||||||
|
# Searching for tracks in other releases
|
||||||
|
mb_other_tracks = MusicBrainzTrack.where('release_id IN (?)', release_ids).order('position ASC')
|
||||||
|
mb_bonus_tracks = []
|
||||||
|
mb_other_tracks.each do |mb_track|
|
||||||
|
unless mb_main_tracks_hashed.include? mb_track.name.downcase.scan(/[a-z0-9]*/).join
|
||||||
|
mb_bonus_tracks << mb_track
|
||||||
|
end
|
||||||
|
end
|
||||||
|
# Saving tracks
|
||||||
|
mb_main_tracks.each do |mb_track|
|
||||||
|
track = Track.new
|
||||||
|
track.name = mb_track.name
|
||||||
|
track.album_id = album.id
|
||||||
|
track.position = mb_track.position
|
||||||
|
track.length = mb_track.length
|
||||||
|
track.bonus = 0
|
||||||
|
track.live = mb_track.name.downcase.include? 'live'
|
||||||
|
track.acoustic = mb_track.name.downcase.include? 'acoustic'
|
||||||
|
track.save
|
||||||
|
end
|
||||||
|
mb_bonus_tracks.each do |mb_track|
|
||||||
|
track = Track.new
|
||||||
|
track.name = mb_track.name
|
||||||
|
track.album_id = album.id
|
||||||
|
track.position = mb_track.position
|
||||||
|
track.length = mb_track.length
|
||||||
|
track.bonus = 1
|
||||||
|
track.live = mb_track.name.downcase.include? 'live'
|
||||||
|
track.acoustic = mb_track.name.downcase.include? 'acoustic'
|
||||||
|
track.save
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -3,75 +3,9 @@ require 'open-uri'
|
|||||||
namespace :db do
|
namespace :db do
|
||||||
desc 'Imports data from MusicBrainz database'
|
desc 'Imports data from MusicBrainz database'
|
||||||
task :import => :environment do
|
task :import => :environment do
|
||||||
ati = ['Kasabian']
|
ati = ['Foo Fighters']
|
||||||
ati.each do |name|
|
ati.each do |name|
|
||||||
# Get artist from MB
|
ImportController.importArtist(name)
|
||||||
mb_artist = MusicBrainzArtist.getByName(name)
|
|
||||||
# # Save artist
|
|
||||||
artist_xml = open('http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&api_key=04fda005dbf61a50af5abc3e90f111f2&artist='+ URI.escape(name)).read
|
|
||||||
artist = Artist.new
|
|
||||||
artist.name = mb_artist.name
|
|
||||||
artist.desc = artist_xml.scan(/<summary><\!\[CDATA\[?(.*)\]\]><\/summary>/m)[0][0]
|
|
||||||
artist.pic_url = artist_xml.scan(/<image\ssize=\"extralarge\">?(.*)<\/image>/)[0][0]
|
|
||||||
artist.save
|
|
||||||
# Get albums from MB
|
|
||||||
mb_albums = MusicBrainzAlbum.where('artist_id = ? AND release_type = 1', mb_artist.id).order('year ASC, id ASC')
|
|
||||||
mb_albums.each do |mb_album|
|
|
||||||
# Saving album
|
|
||||||
album_xml = open('http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=04fda005dbf61a50af5abc3e90f111f2&artist='+ URI.escape(name) +'&album='+ URI.escape(mb_album.name)).read
|
|
||||||
album = Album.new
|
|
||||||
album.name = mb_album.name
|
|
||||||
album.year = mb_album.year
|
|
||||||
album.artist_id = artist.id
|
|
||||||
album.status = 1
|
|
||||||
album.pic_url = album_xml.scan(/<image\ssize=\"extralarge\">?(.*)<\/image>/)[0][0]
|
|
||||||
album.save
|
|
||||||
# Get album releases from MB
|
|
||||||
mb_releases = MusicBrainzRelease.where('album_id = ? AND release_type = 1', mb_album.id).order('date ASC, id ASC')
|
|
||||||
# Get tracks from the first release and then exclude release
|
|
||||||
mb_main_tracks = MusicBrainzTrack.where('release_id IN (?)', mb_releases.shift.id).order('position ASC')
|
|
||||||
# Creating hashed array for matching
|
|
||||||
mb_main_tracks_hashed = []
|
|
||||||
mb_main_tracks.each do |mb_track|
|
|
||||||
mb_main_tracks_hashed << mb_track.name.downcase.scan(/[a-z0-9]*/).join
|
|
||||||
end
|
|
||||||
# Getting other releases ids
|
|
||||||
release_ids = []
|
|
||||||
mb_releases.each do |mb_release|
|
|
||||||
release_ids << mb_release.id
|
|
||||||
end
|
|
||||||
# Searching for tracks in other releases
|
|
||||||
mb_other_tracks = MusicBrainzTrack.where('release_id IN (?)', release_ids).order('position ASC')
|
|
||||||
mb_bonus_tracks = []
|
|
||||||
mb_other_tracks.each do |mb_track|
|
|
||||||
unless mb_main_tracks_hashed.include? mb_track.name.downcase.scan(/[a-z0-9]*/).join
|
|
||||||
mb_bonus_tracks << mb_track
|
|
||||||
end
|
|
||||||
end
|
|
||||||
# Saving tracks
|
|
||||||
mb_main_tracks.each do |mb_track|
|
|
||||||
track = Track.new
|
|
||||||
track.name = mb_track.name
|
|
||||||
track.album_id = album.id
|
|
||||||
track.position = mb_track.position
|
|
||||||
track.length = mb_track.length
|
|
||||||
track.bonus = 0
|
|
||||||
track.live = mb_track.name.downcase.include? 'live'
|
|
||||||
track.acoustic = mb_track.name.downcase.include? 'acoustic'
|
|
||||||
track.save
|
|
||||||
end
|
|
||||||
mb_bonus_tracks.each do |mb_track|
|
|
||||||
track = Track.new
|
|
||||||
track.name = mb_track.name
|
|
||||||
track.album_id = album.id
|
|
||||||
track.position = mb_track.position
|
|
||||||
track.length = mb_track.length
|
|
||||||
track.bonus = 1
|
|
||||||
track.live = mb_track.name.downcase.include? 'live'
|
|
||||||
track.acoustic = mb_track.name.downcase.include? 'acoustic'
|
|
||||||
track.save
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
@ -1,11 +1,12 @@
|
|||||||
|
function loadArtistData(name) {
|
||||||
|
$.get('/artist/'+ name +'/', function(data){
|
||||||
|
Pages.renderArtist(data);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
$(function(){
|
$(function(){
|
||||||
$('a.data').live('click', function(){
|
$('a.data.artist').live('click', function(){
|
||||||
var button = this;
|
loadArtistData($(this).html());
|
||||||
$.get(this.href, function(data){
|
|
||||||
if ($(button).hasClass('artist')) {
|
|
||||||
Pages.renderArtist(data);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
$('a.data').trigger('click');
|
$('a.data').trigger('click');
|
||||||
|
@ -20,7 +20,9 @@ var Pages = {
|
|||||||
<h2 class="name">'+ album.name +' ('+ album.year +')</h2>\
|
<h2 class="name">'+ album.name +' ('+ album.year +')</h2>\
|
||||||
<div class="pic">\
|
<div class="pic">\
|
||||||
<img src="'+ album.pic +'" alt="'+ album.name +' by '+ data.artist.name +'" width="250" />\
|
<img src="'+ album.pic +'" alt="'+ album.name +' by '+ data.artist.name +'" width="250" />\
|
||||||
<div class="add-album">Add to playlist</div>\
|
<div class="add-album-button-container">\
|
||||||
|
<div class="add-album button gray">Add to Now Playing</div>\
|
||||||
|
</div>\
|
||||||
</div>\
|
</div>\
|
||||||
<div class="tracklist">\
|
<div class="tracklist">\
|
||||||
<ul>\
|
<ul>\
|
||||||
@ -32,9 +34,12 @@ var Pages = {
|
|||||||
$.each(album.tracks.album, function(i, track){
|
$.each(album.tracks.album, function(i, track){
|
||||||
var track_info = $('\
|
var track_info = $('\
|
||||||
<li>\
|
<li>\
|
||||||
<span class="index">'+ (i+1) +'</span>\
|
<div class="add-track button gray">+</div>\
|
||||||
<div class="trackname">'+ track.name +'</div>\
|
<div class="track-container">\
|
||||||
<div class="length">'+ track.duration +'</div>\
|
<span class="index">'+ (i+1) +'</span>\
|
||||||
|
<div class="trackname">'+ track.name +'</div>\
|
||||||
|
<div class="length">'+ track.duration +'</div>\
|
||||||
|
</div>\
|
||||||
</li>\
|
</li>\
|
||||||
');
|
');
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
var Player = {
|
var Player = {
|
||||||
|
|
||||||
bar_width: 290,
|
bar_width: 330,
|
||||||
|
|
||||||
getTrackUrl: function(data) {
|
getTrackUrl: function(data) {
|
||||||
|
|
||||||
@ -42,18 +42,32 @@ var Player = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('.add-album').live('click', function() {
|
$('.add-album').live('click', function() {
|
||||||
var artist = $(this).parent().parent().parent().parent().find('.artist-info .name').html();
|
var artist = $('.artist-info .name').html();
|
||||||
$(this).parent().parent().find('.tracklist li').each(function(i, item){
|
$(this).parent().parent().parent().find('.tracklist li').each(function(i, item){
|
||||||
var track_name = $(item).find('.trackname').html();
|
var track_name = $(item).find('.trackname').html();
|
||||||
var length = $(item).find('.length').html();
|
var length = $(item).find('.length').html();
|
||||||
Player.addTrack(artist, track_name, length);
|
Player.addTrack(artist, track_name, length);
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
$('.add-track').live('click', function(){
|
||||||
|
var artist = $('.artist-info .name').html();
|
||||||
|
var track_name = $(this).parent().find('.trackname').html();
|
||||||
|
var length = $(this).parent().find('.length').html();
|
||||||
|
Player.addTrack(artist, track_name, length);
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.tracklist li').live('mouseover mouseout', function(e){
|
||||||
|
if (e.type == 'mouseover') {
|
||||||
|
$(this).find('.add-track').show();
|
||||||
|
} else {
|
||||||
|
$(this).find('.add-track').hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
$('.playlist-tracks li').live('dblclick', function(){
|
$('.playlist-tracks li').live('dblclick', function(){
|
||||||
Player.setTrack(this);
|
Player.setTrack(this);
|
||||||
})
|
});
|
||||||
|
|
||||||
$(function(){
|
$(function(){
|
||||||
Audio.init();
|
Audio.init();
|
||||||
})
|
});
|
@ -2,7 +2,7 @@
|
|||||||
.artist-info {
|
.artist-info {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
float: left;
|
float: left;
|
||||||
margin: 25px 0;
|
margin: 0 0 25px 0;
|
||||||
}
|
}
|
||||||
.albums {
|
.albums {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -36,28 +36,39 @@
|
|||||||
.album .pic > * {
|
.album .pic > * {
|
||||||
margin-left: 25px;
|
margin-left: 25px;
|
||||||
}
|
}
|
||||||
|
.add-album-button-container {
|
||||||
|
position: relative;
|
||||||
|
margin: 10px -25px 0 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
.album .pic .add-album {
|
.album .pic .add-album {
|
||||||
margin-top: 15px;
|
|
||||||
width: auto;
|
|
||||||
color: #04D;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
}
|
||||||
.album .name {
|
.album .name {
|
||||||
display: block;
|
display: block;
|
||||||
margin: 0 0 10px 300px;
|
margin: 0 0 10px 300px;
|
||||||
}
|
}
|
||||||
.album .tracklist {
|
.album .tracklist {
|
||||||
margin: 0 25px 30px 300px;
|
margin: 0 25px 30px 275px;
|
||||||
}
|
}
|
||||||
.album .tracklist ul {
|
.album .tracklist ul {
|
||||||
|
|
||||||
}
|
}
|
||||||
.album .tracklist ul li {
|
.album .tracklist ul li {
|
||||||
display: block;
|
display: block;
|
||||||
height: 20px;
|
padding-left: 25px;
|
||||||
padding: 5px 0 0 0;
|
|
||||||
border-top: #EEE 1px solid;
|
|
||||||
}
|
}
|
||||||
|
.add-track {
|
||||||
|
display: none;
|
||||||
|
float: left;
|
||||||
|
padding: 1px 5px;
|
||||||
|
margin: 3px 0 0 -22px;
|
||||||
|
}
|
||||||
|
.album .tracklist ul li .track-container {
|
||||||
|
height: 20px;
|
||||||
|
padding: 5px 0 0 0;
|
||||||
|
border-top: #EEE 1px solid;
|
||||||
|
}
|
||||||
.album .tracklist ul li:hover {
|
.album .tracklist ul li:hover {
|
||||||
background-color: #FAFAFA;
|
background-color: #FAFAFA;
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ body {
|
|||||||
|
|
||||||
#player {
|
#player {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 200px;
|
height: 120px;
|
||||||
}
|
}
|
||||||
#playlist {
|
#playlist {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -28,6 +28,19 @@
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
margin-right: 12px;
|
margin-right: 12px;
|
||||||
}
|
}
|
||||||
|
.button {
|
||||||
|
display: inline;
|
||||||
|
width: auto;
|
||||||
|
padding: 5px 10px;
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.button.gray {
|
||||||
|
background-color: #EEE;
|
||||||
|
color: #444;
|
||||||
|
border-color: #DDD;
|
||||||
|
}
|
||||||
|
|
||||||
/* Colorizing *
|
/* Colorizing *
|
||||||
#player-container { background-color: #CFC; }
|
#player-container { background-color: #CFC; }
|
||||||
|
@ -8,24 +8,25 @@
|
|||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
}
|
}
|
||||||
#player .progress {
|
#player .progress {
|
||||||
width: 290px;
|
width: 330px;
|
||||||
height: 10px;
|
height: 5px;
|
||||||
background-color: #333;
|
background-color: #333;
|
||||||
margin: 20px 30px;
|
margin: 0 10px;
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
#player .progress .loaded {
|
#player .progress .loaded {
|
||||||
width: 0;
|
width: 0;
|
||||||
height: 10px;
|
height: 5px;
|
||||||
background-color: #405050;
|
background-color: #405050;
|
||||||
}
|
}
|
||||||
#player .progress .played {
|
#player .progress .played {
|
||||||
width: 0;
|
width: 0;
|
||||||
height: 10px;
|
height: 5px;
|
||||||
background-color: #09A;
|
background-color: #09A;
|
||||||
}
|
}
|
||||||
#player .controls {
|
#player .controls {
|
||||||
width: 290px;
|
width: 290px;
|
||||||
margin: 40px 95px;
|
margin: 20px 95px;
|
||||||
}
|
}
|
||||||
#player .controls > div {
|
#player .controls > div {
|
||||||
width: 40px;
|
width: 40px;
|
||||||
@ -35,13 +36,13 @@
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
#player .controls .prev {
|
#player .controls .prev {
|
||||||
background-image: url('../icns/prev.png');
|
background-image: url('/images/icns/prev.png');
|
||||||
}
|
}
|
||||||
#player .controls .play {
|
#player .controls .play {
|
||||||
background-image: url('../icns/play.png');
|
background-image: url('/images/icns/play.png');
|
||||||
}
|
}
|
||||||
#player .controls .next {
|
#player .controls .next {
|
||||||
background-image: url('../icns/next.png');
|
background-image: url('/images/icns/next.png');
|
||||||
}
|
}
|
||||||
|
|
||||||
.playlist-tracks li {
|
.playlist-tracks li {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user