top_100 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f6a3918efad8b3cacb60d1516ebbc5d4d487d074
4
- data.tar.gz: 0483d33e3c8a6c5ff042e560ddda3d9028c3101d
3
+ metadata.gz: 1cdc6f615b54a430d8c734a1c3613b0e09489b7e
4
+ data.tar.gz: fb4f3c3c601ba5739a01252f5e2e7ebe24b4814f
5
5
  SHA512:
6
- metadata.gz: 00ae5dcf8c0e9b1dde4de7962efe77a0880b17fee76f77056a4267113a4002cc50e86b704b78629f3491824360868f10c0b075a5cff2c7a88a37157c079770d3
7
- data.tar.gz: 44b7acb6b3cdb7d4dbfe0bb81e3b3d667936d13cc121ff2a118619235a4d5b356020dcdef160fd7cc83a87007617268987f145d43baa3f4e3d7b20779424a2c8
6
+ metadata.gz: 16d01ed501358d0be5a3dd7c37b279c8a4348b5d0e4dc1d568af31a4bd46ad781bf53d150a18171141bc314c0eba679ab5f93fc05c8d3c637a090cf50799c021
7
+ data.tar.gz: b5b28d3fd233c9fb0a094ed8e7e92e096f8b19e7eb4d5e651980dfea07a4acc83412d65d29000fc174f99f420a8bc4cb5c28ecba039ceb620e302d82fd8f462b
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /top_100-2.0.0.gem/
@@ -17,7 +17,7 @@ class Artist
17
17
  puts "Name: #{self.name}"
18
18
  puts "From: #{self.location}"
19
19
  puts "Formed: #{self.date} "
20
- song_names = self.songs.map {|s| s.name}
20
+ song_names = self.songs.map {|song| song.name}
21
21
  puts "Currently Trending Songs: #{song_names.join(", ")}"
22
22
  puts "Bio: #{self.bio}"
23
23
  end
@@ -28,7 +28,7 @@ class Artist
28
28
 
29
29
  #Artists have unique names, search for a match using the name or create a new Artist object.
30
30
  def self.find_or_create(artist_name)
31
- Artist.all.each {|a| return a if a.name == artist_name}
31
+ Artist.all.each {|artist| return artist if artist.name == artist_name}
32
32
  Artist.new(artist_name)
33
33
  end
34
34
 
@@ -1,17 +1,17 @@
1
1
  class BillboardScraper
2
2
 
3
+
4
+ # will only use class methods, no need to create instances as there's nothing unique between these scrapers and we only need one.
5
+
3
6
  def self.scrape_from_chart_page
4
7
  nokogiri_object = Nokogiri::HTML(open('http://www.billboard.com/charts/hot-100'))
5
8
  nokogiri_object.css('div.chart-row__primary').each do |song|
6
- url = song.css('a.chart-row__player-link')
7
9
  name = song.css('h3.chart-row__artist').text.strip.split(//)
8
10
  song_hash = {
9
11
  rank: song.css('span.chart-row__current-week').text,
10
12
  name: song.css('h2.chart-row__song').text,
11
13
  artist_bio_url: song.css('a.chart-row__link').attribute('href').value + '/biography',
12
14
  artist_name: song.css('h3.chart-row__artist').text.strip,
13
- # missing url for some songs due to copyright issues, save url as nil for such songs
14
- url: url.empty? ? nil : url.attribute('href').value
15
15
  }
16
16
  Song.new(song_hash)
17
17
  end
data/lib/top_100/cli.rb CHANGED
@@ -31,7 +31,7 @@ class CLI
31
31
  end
32
32
 
33
33
  def present_options
34
- puts "Options: 1. type in 'exit' to exit. 2. type in 'next' for the next twenty songs. 3. type 'song' to choose a song to play. 4. type in the full artist title of a song to learn more about the main artist."
34
+ puts "Options: 1. type in 'exit' to exit. 2. type in 'next' for the next twenty songs. 3. type 'song' to play a song sample. 4. type in the full artist title of a song to learn more about the main artist."
35
35
  choice = gets.chomp
36
36
  case choice
37
37
  when 'exit'
data/lib/top_100/song.rb CHANGED
@@ -7,18 +7,33 @@ class Song
7
7
  @@songs << self
8
8
  end
9
9
 
10
- def self.all
11
- @@songs
12
- end
13
-
14
10
  def display
15
11
  puts "##{self.rank}: #{self.name} by #{self.artist_name}."
16
12
  puts "--------------------------------"
17
13
  end
18
14
 
19
- def self.play(rank)
20
- song = Song.all.find {|s| s.rank == rank }
15
+ #slug method used to help make query for spotify API request
16
+ def slug
17
+ self.name.gsub(/\s+/, "%20").delete('^a-zA-Z0-9\-').downcase
18
+ end
21
19
 
20
+
21
+ def spotify_link
22
+ response = open("https://api.spotify.com/v1/search?q=#{self.slug}&type=track").read
23
+ json_info = JSON.parse(response)
24
+ song_details = json_info["tracks"]["items"].find { |info| self.artist_name.downcase.include?(info["artists"][0]["name"].downcase) }
25
+ song_details == nil ? nil : song_details["preview_url"]
26
+ end
27
+
28
+ # class methods
29
+
30
+ def self.all
31
+ @@songs
32
+ end
33
+
34
+ def self.play(rank)
35
+ song = Song.all.find {|song| song.rank == rank }
36
+ song.url = song.spotify_link
22
37
  if song.nil?
23
38
  puts "You've entered an invalid chart name."
24
39
  #check if song has a valid url, copyright issues with certain songs
@@ -1,3 +1,3 @@
1
1
  module Top100
2
- VERSION = "2.0.0"
2
+ VERSION = "2.1.0"
3
3
  end
data/lib/top_100.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'open-uri'
2
2
  require 'nokogiri'
3
+ require 'json'
3
4
 
4
5
  require_relative "./top_100/version.rb"
5
6
  require_relative "./top_100/billboard_scraper.rb"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: top_100
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - viparthasarathy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-04-13 00:00:00.000000000 Z
11
+ date: 2016-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler