From da67276a9a311f394666b22795b10805414704be Mon Sep 17 00:00:00 2001 From: magnolia-fan Date: Wed, 15 Jun 2011 01:29:36 +0400 Subject: [PATCH] Artist import moved to a controller, added shiny buttons --- .gitignore | 2 +- app/controllers/artist_controller.rb | 4 +- app/controllers/import_controller.rb | 71 ++++++++++++++++++++++++++++ lib/tasks/db_import.rake | 70 +-------------------------- public/javascripts/ajax.js | 15 +++--- public/javascripts/pages.js | 13 +++-- public/javascripts/player.js | 24 ++++++++-- public/stylesheets/albums.css | 29 ++++++++---- public/stylesheets/layout.css | 2 +- public/stylesheets/misc.css | 13 +++++ public/stylesheets/player.css | 19 ++++---- 11 files changed, 156 insertions(+), 106 deletions(-) create mode 100644 app/controllers/import_controller.rb diff --git a/.gitignore b/.gitignore index 25bcea6..a11c5e1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ tmp/ log/ -.sqlite3 +*.sqlite3 diff --git a/app/controllers/artist_controller.rb b/app/controllers/artist_controller.rb index 9230afa..40b8610 100644 --- a/app/controllers/artist_controller.rb +++ b/app/controllers/artist_controller.rb @@ -1,8 +1,8 @@ class ArtistController < ApplicationController def data data = {} - artist = Artist.find_by_name(params[:name]) - data['artist'] = {name: artist.name, desc: artist.desc, pic: artist.pic_url} + artist = Artist.find_by_name(params[:name].gsub('+', ' ')) + data['artist'] = {name: artist.name, desc: ActionController::Base.helpers.strip_tags(artist.desc), pic: artist.pic_url} data['albums'] = [] albums = artist.albums albums.each do |album| diff --git a/app/controllers/import_controller.rb b/app/controllers/import_controller.rb new file mode 100644 index 0000000..6424bf8 --- /dev/null +++ b/app/controllers/import_controller.rb @@ -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(/<\!\[CDATA\[?(.*)\]\]><\/summary>/m)[0][0] + artist.pic_url = artist_xml.scan(/?(.*)<\/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>/)[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 diff --git a/lib/tasks/db_import.rake b/lib/tasks/db_import.rake index 6b95f2a..eb7c55a 100644 --- a/lib/tasks/db_import.rake +++ b/lib/tasks/db_import.rake @@ -3,75 +3,9 @@ require 'open-uri' namespace :db do desc 'Imports data from MusicBrainz database' task :import => :environment do - ati = ['Kasabian'] + ati = ['Foo Fighters'] ati.each do |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(/<\!\[CDATA\[?(.*)\]\]><\/summary>/m)[0][0] - artist.pic_url = artist_xml.scan(/?(.*)<\/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>/)[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 + ImportController.importArtist(name) end end end \ No newline at end of file diff --git a/public/javascripts/ajax.js b/public/javascripts/ajax.js index 5354e1f..3fa598f 100644 --- a/public/javascripts/ajax.js +++ b/public/javascripts/ajax.js @@ -1,11 +1,12 @@ +function loadArtistData(name) { + $.get('/artist/'+ name +'/', function(data){ + Pages.renderArtist(data); + }) +} + $(function(){ - $('a.data').live('click', function(){ - var button = this; - $.get(this.href, function(data){ - if ($(button).hasClass('artist')) { - Pages.renderArtist(data); - } - }) + $('a.data.artist').live('click', function(){ + loadArtistData($(this).html()); return false; }); $('a.data').trigger('click'); diff --git a/public/javascripts/pages.js b/public/javascripts/pages.js index 4b1c1e8..ada3fee 100644 --- a/public/javascripts/pages.js +++ b/public/javascripts/pages.js @@ -20,7 +20,9 @@ var Pages = {

'+ album.name +' ('+ album.year +')

\
\ '+ album.name +' by '+ data.artist.name +'\ -
Add to playlist
\ +
\ +
Add to Now Playing
\ +
\
\
\
    \ @@ -32,9 +34,12 @@ var Pages = { $.each(album.tracks.album, function(i, track){ var track_info = $('\
  • \ - '+ (i+1) +'\ -
    '+ track.name +'
    \ -
    '+ track.duration +'
    \ +
    +
    \ +
    \ + '+ (i+1) +'\ +
    '+ track.name +'
    \ +
    '+ track.duration +'
    \ +
    \
  • \ '); diff --git a/public/javascripts/player.js b/public/javascripts/player.js index 754dd76..e181d1d 100644 --- a/public/javascripts/player.js +++ b/public/javascripts/player.js @@ -1,6 +1,6 @@ var Player = { - bar_width: 290, + bar_width: 330, getTrackUrl: function(data) { @@ -42,18 +42,32 @@ var Player = { } $('.add-album').live('click', function() { - var artist = $(this).parent().parent().parent().parent().find('.artist-info .name').html(); - $(this).parent().parent().find('.tracklist li').each(function(i, item){ + var artist = $('.artist-info .name').html(); + $(this).parent().parent().parent().find('.tracklist li').each(function(i, item){ var track_name = $(item).find('.trackname').html(); var length = $(item).find('.length').html(); 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(){ Player.setTrack(this); -}) +}); $(function(){ Audio.init(); -}) \ No newline at end of file +}); \ No newline at end of file diff --git a/public/stylesheets/albums.css b/public/stylesheets/albums.css index d3500bd..5bcea2f 100644 --- a/public/stylesheets/albums.css +++ b/public/stylesheets/albums.css @@ -2,7 +2,7 @@ .artist-info { width: 100%; float: left; - margin: 25px 0; + margin: 0 0 25px 0; } .albums { width: 100%; @@ -36,28 +36,39 @@ .album .pic > * { margin-left: 25px; } + .add-album-button-container { + position: relative; + margin: 10px -25px 0 0; + text-align: center; + } .album .pic .add-album { - margin-top: 15px; - width: auto; - color: #04D; - cursor: pointer; + } .album .name { display: block; margin: 0 0 10px 300px; } .album .tracklist { - margin: 0 25px 30px 300px; + margin: 0 25px 30px 275px; } .album .tracklist ul { } .album .tracklist ul li { display: block; - height: 20px; - padding: 5px 0 0 0; - border-top: #EEE 1px solid; + padding-left: 25px; } + .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 { background-color: #FAFAFA; } diff --git a/public/stylesheets/layout.css b/public/stylesheets/layout.css index e3088bd..18dfd46 100644 --- a/public/stylesheets/layout.css +++ b/public/stylesheets/layout.css @@ -26,7 +26,7 @@ body { #player { width: 100%; - height: 200px; + height: 120px; } #playlist { width: 100%; diff --git a/public/stylesheets/misc.css b/public/stylesheets/misc.css index 76f922f..8be5963 100644 --- a/public/stylesheets/misc.css +++ b/public/stylesheets/misc.css @@ -28,6 +28,19 @@ font-weight: bold; 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 * #player-container { background-color: #CFC; } diff --git a/public/stylesheets/player.css b/public/stylesheets/player.css index 06bf1f7..dc3ddc3 100644 --- a/public/stylesheets/player.css +++ b/public/stylesheets/player.css @@ -8,24 +8,25 @@ line-height: 30px; } #player .progress { - width: 290px; - height: 10px; + width: 330px; + height: 5px; background-color: #333; - margin: 20px 30px; + margin: 0 10px; + cursor: pointer; } #player .progress .loaded { width: 0; - height: 10px; + height: 5px; background-color: #405050; } #player .progress .played { width: 0; - height: 10px; + height: 5px; background-color: #09A; } #player .controls { width: 290px; - margin: 40px 95px; + margin: 20px 95px; } #player .controls > div { width: 40px; @@ -35,13 +36,13 @@ cursor: pointer; } #player .controls .prev { - background-image: url('../icns/prev.png'); + background-image: url('/images/icns/prev.png'); } #player .controls .play { - background-image: url('../icns/play.png'); + background-image: url('/images/icns/play.png'); } #player .controls .next { - background-image: url('../icns/next.png'); + background-image: url('/images/icns/next.png'); } .playlist-tracks li {