Skip to content

Instantly share code, notes, and snippets.

@ryanirilli
Created May 11, 2014 05:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryanirilli/91d588d8c710c323f4e6 to your computer and use it in GitHub Desktop.
Save ryanirilli/91d588d8c710c323f4e6 to your computer and use it in GitHub Desktop.
A Pen by Ryan Irilli.
<div id="container">
<!--header - contains search form and sorting controls -->
<div class="cf dark-bg">
<form id="search" class="float--left">
<input type="text" id="input" placeholder="enter music artist" class="float--left"/>
<input type="submit" id="submit" value="GO" />
</form>
<div class="float--left options-nav">
<span class = "label float--left block">Sort By</span>
<ul class="nav sort-options float--left padding-left">
<li data-sort-direction = "desc" class="active icon-heart"></li>
<li data-sort-direction = "asc" class="icon-heart-broken"></li>
</ul>
<div class="result-count"><span>0</span> Results</div>
</div>
</div>
<!-- results are rendered here -->
<div class="grid">
<div class="grid__item one-whole">
<div id="result">
<div class="grid"></div>
</div>
</div>
</div>
<!--search result template-->
<script type="text/template" id="spotify-template">
<% _.each(data, function(album, i){ %>
<% if(i > 0) {%>
</div><div class="grid__item one-whole">
<% } else { %>
<div class="grid__item one-whole">
<% } %>
<div class="album">
<p class="icon icon-link"><a class="padding-left" href="<%= album.href %>"><%= album.artists[0].name %> - <%= album.name %></a></p>
<div class="bar-container">
<div class="bar" style="width:<%= album.popularity * 100 %>%;">
<span class="icon icon-heart"></span><%= ~~(album.popularity * 100) %>%
</div>
</div>
</div>
<% if(i == data.length -1){ %> </div> <% } %>
<% }) %>
</script>
</div><!-- end container -->
$ ->
spotify = {
#set defaults and bind event handlers
init: ->
self = this
self.url = 'http://ws.spotify.com/search/1/album.json'
self.searchForm = $('form')
self.searchField = $('#input')
self.sortOptions = $('.sort-options li')
self.resultCount = $('.result-count span')
self.resultContainer = $('#result')
self.result = $('#result .grid')
self.template = $('#spotify-template').html()
self.sortDirection = 'desc'
self.data = {}
#events
this.searchForm.submit ->
artist = self.searchField.val()
if artist == ''
return
self.resultContainer.scrollTop 0
request = self.getData(artist)
request.done (data)->
self.data = data
self.sort self.sortDirection
self.render data.albums
return false;
this.sortOptions.click ->
if !$(this).hasClass 'active'
$('.active').removeClass 'active'
$(this).addClass 'active'
self.sortDirection = $(this).data 'sort-direction'
self.sort self.sortDirection
#returns jqxhr object, expects artist:String
getData: (artist)->
self = this
return $.ajax {
url: self.url
dataType: 'json'
data: {
q: artist
}
}
#returns undefined
sort: ->
this.resultContainer.scrollTop 0
albums = this.data.albums
sorted = albums.sort (a, b)->
return a.popularity - b.popularity
if this.sortDirection == 'desc'
this.render sorted.reverse()
else
this.render sorted
#returns undefined, expects album list:Array of Objects
render: (data)->
html = _.template this.template, {data: data}
this.resultCount.html data.length
this.result.html html
}
#let's do-tha-damn-thang
spotify.init()

Spotify Album Popularity

Enter your favorite musical artist and see their albums in order of popularity

A Pen by Ryan Irilli on CodePen.

License.

@import "compass/css3";
*{
-webkit-font-smoothing: antialiased;
}
html, body{
height:100%;
}
body{
padding:30px;
background: url('http://www.ryanirilli.com/images/dark-grey-grain.png') #373737;
}
a{ color:white; }
form{
overflow:hidden;
padding:20px;
}
.dark-bg{ background:rgba(0,0,0,0.2); }
#container{
max-width:800px;
margin:0 auto;
#result{
overflow-y: scroll;
height: 600px;
background: rgba(255,255,255,0.03);
}
#input{
padding:7px 5px;
border:none;
}
input[type="submit"]{
border: none;
line-height: 2.7rem;
padding-top: 0.5rem;
color: #FFF;
background-color: #9eca3b;
text-shadow: 0 -1px 0 #72942a;
font-family: nexa-bold;
-webkit-transition: all 0.3s ease-out;
-moz-transition: all 0.3s ease-out;
-o-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
&:hover{
background-color: #8db632;
}
}
.padding-left{
padding-left:10px;
}
.padding-right{
padding-right:90px;
}
.options-nav{
cursor:default;
padding:23px 20px 20px 20px;
color:white;
color:rgba(255,255,255,0.2);
li{ cursor:pointer; }
.active{color: #8ECF32 !important;}
}
.result-count{
font-size:1.2rem;
}
.album{
padding: 20px;
&:hover{
}
a{
color: rgba(255, 255,255,0.4);
&:hover{
color:rgba(255, 255,255,0.7);;
}
}
.icon{
color:white;
&.icon-heart{
color:rgba(255,255,255,0.1);
padding-right:5px;
}
}
.bar-container{
margin-top:10px;
background:rgba(0,0,0,0.1);
.bar{
background: rgba(0,0,0,0.1);
padding:10px;
color:rgba(142,207,50,0.5);
text-align:right;
border-radius: 3px;
position:relative;
-webkit-transition: all 0.3s ease-out;
-moz-transition: all 0.3s ease-out;
-o-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment