soundly 0.1.2 → 0.1.3

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: a6d8bf9107134324f78f29c81fc570d03e1a7d1d
4
- data.tar.gz: 134e8433ca1fed1b86207e8bbd0e9405af65f823
3
+ metadata.gz: 982a1a80bc9696fc2a87fde99ad336371b01b04a
4
+ data.tar.gz: 630fbde11a7f552b0ea8b5338bf70ca1abb2cf88
5
5
  SHA512:
6
- metadata.gz: 0959dbdccc117c87b86d98dc6a2fafe211398211f9b1bf9bb8e2d3a3f6e938e55578f5b886d6800340e2f232f2fdb6673497df6b13b4d67a2a383c0fee649456
7
- data.tar.gz: 585d2117e6f35015e505074df924845c37203349315460fffd48d0fc49ed71ccf96ddecfdacb74f38daabc7d31fd142dd578830f8741fb3a01132d9f0be1f30b
6
+ metadata.gz: f6b97db82e320dd6c264765a491cc3ea490ae4ebaf7171f50329523923af41507ff1279900df2528a801e72df92376a138c55b08462572e8ee82fee97c3f0095
7
+ data.tar.gz: a0ed2fb4a3b79a8fa58575c525bfe5fa3188cb8b5e8dd0f7fe22d1c7f0afbaa7d33f0c1429e91d638a3e025f75856854388d0e73023596451d646ec1aa96f147
data/.DS_Store CHANGED
Binary file
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ .env
1
2
  /.bundle/
2
3
  /.yardoc
3
4
  /Gemfile.lock
data/Rainbow.md ADDED
@@ -0,0 +1,224 @@
1
+ # Rainbow
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/rainbow.svg)](https://rubygems.org/gems/rainbow)
4
+ [![Build Status](https://travis-ci.org/sickill/rainbow.svg?branch=master)](https://travis-ci.org/sickill/rainbow)
5
+ [![Build status](https://ci.appveyor.com/api/projects/status/vq4acb2c38642s5q?svg=true)](https://ci.appveyor.com/project/sickill/rainbow)
6
+ [![Code Climate](https://codeclimate.com/github/sickill/rainbow.svg)](https://codeclimate.com/github/sickill/rainbow)
7
+ [![Coverage Status](https://coveralls.io/repos/sickill/rainbow/badge.svg)](https://coveralls.io/r/sickill/rainbow)
8
+
9
+ Rainbow is a ruby gem for colorizing printed text on ANSI terminals.
10
+
11
+ It provides a string presenter object, which adds several methods to your
12
+ strings for wrapping them in [ANSI escape
13
+ codes](http://en.wikipedia.org/wiki/ANSI_escape_code). These codes when printed
14
+ in a terminal change text attributes like text color, background color,
15
+ intensity etc.
16
+
17
+ ## Usage
18
+
19
+ To make your string colored wrap it with `Rainbow()` presenter and call
20
+ `.color(<color name>)` on it.
21
+
22
+ ### Example
23
+
24
+ ```ruby
25
+ require 'rainbow'
26
+
27
+ puts Rainbow("this is red").red + " and " + Rainbow("this on yellow bg").bg(:yellow) + " and " + Rainbow("even bright underlined!").underline.bright
28
+
29
+ # => "\e[31mthis is red\e[0m and \e[43mthis on yellow bg\e[0m and \e[4m\e[1meven bright underlined!\e[0m"
30
+ ```
31
+
32
+ Or, [watch this video example](https://asciinema.org/a/J928KpHoUQ0sl54ulOSOLE71E?rows=20&speed=2.5)
33
+
34
+ ### Rainbow presenter API
35
+
36
+ Rainbow presenter adds the following methods to presented string:
37
+
38
+ * `color(c)` (with `foreground`, and `fg` aliases)
39
+ * `background(c)` (with `bg` alias)
40
+ * `bright`
41
+ * `underline`
42
+ * `blink`
43
+ * `inverse`
44
+ * `hide`
45
+ * `faint` (not well supported by terminal emulators)
46
+ * `italic` (not well supported by terminal emulators)
47
+
48
+ Text color can also be changed by calling a method named by a color:
49
+
50
+ * `black`
51
+ * `red`
52
+ * `green`
53
+ * `yellow`
54
+ * `blue`
55
+ * `magenta`
56
+ * `cyan`
57
+ * `white`
58
+ * `aqua`
59
+ * `silver`
60
+ * `aliceblue`
61
+ * `indianred`
62
+
63
+ All of the methods return `self` (the presenter object) so you can chain method
64
+ calls:
65
+
66
+ ```ruby
67
+ Rainbow("hola!").blue.bright.underline
68
+ ```
69
+
70
+ ### Refinement
71
+
72
+ If you want to use the Refinements version, you can:
73
+
74
+ ```ruby
75
+ require 'rainbow/refinement'
76
+ using Rainbow
77
+ puts "Hi!".green
78
+ ```
79
+
80
+ Here's an IRB session example:
81
+
82
+ ```
83
+ >> 'Hello, World!'.blue.bright.underline
84
+ NoMethodError: undefined method `blue' for "Hello, World!":String
85
+ (ripl):1:in `<main>'
86
+ >> using Rainbow
87
+ => main
88
+ >> 'Hello, World!'.blue.bright.underline
89
+ => "\e[34m\e[1m\e[4mHello, World!\e[0m"
90
+ ```
91
+
92
+ ### Color specification
93
+
94
+ Both `color` and `background` accept color specified in any
95
+ of the following ways:
96
+
97
+ * ANSI color number (where 0 is black, 1 is red, 2 is green and so on):
98
+ `Rainbow("hello").color(1)`
99
+
100
+ * [ANSI color](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) name or [X11 color](https://en.wikipedia.org/wiki/X11_color_names) name as a symbol:
101
+ `Rainbow("hello").color(:yellow)`.
102
+ This can be simplified to `Rainbow("hello").yellow`
103
+
104
+ See [Color list](#user-content-color-list) for all available color names.
105
+ Note that ANSI colors can be changed in accordance with terminal setting.
106
+ But X11 color is just a syntax sugar for RGB triplet. So you always see what you specified.
107
+
108
+ * RGB triplet as separate values in the range 0-255:
109
+ `Rainbow("hello").color(115, 23, 98)`
110
+
111
+ * RGB triplet as a hex string:
112
+ `Rainbow("hello").color("FFC482")` or `Rainbow("hello").color("#FFC482")`
113
+
114
+ When you specify a color with a RGB triplet rainbow finds the nearest match
115
+ from 256 colors palette. Note that it requires a 256-colors capable terminal to
116
+ display correctly.
117
+
118
+ #### Example: Choose a random color
119
+
120
+ You can pick a random color with Rainbow, it's a one-liner:
121
+
122
+ ```ruby
123
+ colors = Range.new(0,7).to_a
124
+ "whoop dee doop".chars.map { |char| Rainbow(char).color(colors.sample) }.join
125
+ # => "\e[36mw\e[0m\e[37mh\e[0m\e[34mo\e[0m\e[34mo\e[0m\e[37mp\e[0m\e[34m \e[0m\e[36md\e[0m\e[33me\e[0m\e[34me\e[0m\e[37m \e[0m\e[32md\e[0m\e[35mo\e[0m\e[33mo\e[0m\e[36mp\e[0m"
126
+
127
+ colors = [:aliceblue, :antiquewhite, :aqua, :aquamarine, :azure, :beige, :bisque, :blanchedalmond, :blueviolet]
128
+ "whoop dee doop".chars.map { |char| Rainbow(char).color(colors.sample) }.join
129
+ # => "\e[38;5;135mw\e[0m\e[38;5;230mh\e[0m\e[38;5;231mo\e[0m\e[38;5;135mo\e[0m\e[38;5;231mp\e[0m\e[38;5;231m \e[0m\e[38;5;122md\e[0m\e[38;5;231me\e[0m\e[38;5;231me\e[0m\e[38;5;230m \e[0m\e[38;5;122md\e[0m\e[38;5;51mo\e[0m\e[38;5;51mo\e[0m\e[38;5;51mp\e[0m"
130
+ ```
131
+
132
+ ### Configuration
133
+
134
+ Rainbow can be enabled/disabled globally by setting:
135
+
136
+ ```ruby
137
+ Rainbow.enabled = true/false
138
+ ```
139
+
140
+ When disabled all the methods return an unmodified string
141
+ (`Rainbow("hello").red == "hello"`).
142
+
143
+ It's enabled by default, unless STDOUT/STDERR is not a TTY or a terminal is
144
+ dumb.
145
+
146
+ ### Advanced usage
147
+
148
+ `Rainbow()` and `Rainbow.enabled` operate on the global Rainbow wrapper
149
+ instance. If you would like to selectively enable/disable coloring in separate
150
+ parts of your application you can get a new Rainbow wrapper instance for each
151
+ of them and control the state of coloring during the runtime.
152
+
153
+ ```ruby
154
+ rainbow_one = Rainbow.new
155
+ rainbow_two = Rainbow.new
156
+
157
+ rainbow_one.enabled = false
158
+
159
+ Rainbow("hello").red # => "\e[31mhello\e[0m" ("hello" if not on TTY)
160
+ rainbow_one.wrap("hello").red # => "hello"
161
+ rainbow_two.wrap("hello").red # => "\e[31mhello\e[0m" ("hello" if not on TTY)
162
+ ```
163
+
164
+ By default each new instance inherits enabled/disabled state from the global
165
+ `Rainbow.enabled`.
166
+
167
+ This feature comes handy for example when you have multiple output formatters
168
+ in your application and some of them print to a terminal but others write to a
169
+ file. Normally rainbow would detect that STDIN/STDERR is a TTY and would
170
+ colorize all the strings, even the ones that go through file writing
171
+ formatters. You can easily solve that by disabling coloring for the Rainbow
172
+ instances that are used by formatters with file output.
173
+
174
+ ## Installation
175
+
176
+ Add it to your Gemfile:
177
+
178
+ ```ruby
179
+ gem 'rainbow'
180
+ ```
181
+
182
+ Or just install it via rubygems:
183
+
184
+ ```ruby
185
+ gem install rainbow
186
+ ```
187
+
188
+ ## Color list
189
+
190
+ ### ANSI colors
191
+
192
+ `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`
193
+
194
+ ### X11 colors
195
+
196
+ `aliceblue`, `antiquewhite`, `aqua`, `aquamarine`, `azure`, `beige`, `bisque`,
197
+ `blanchedalmond`, `blueviolet`, `brown`, `burlywood`, `cadetblue`, `chartreuse`,
198
+ `chocolate`, `coral`, `cornflower`, `cornsilk`, `crimson`, `darkblue`,
199
+ `darkcyan`, `darkgoldenrod`, `darkgray`, `darkgreen`, `darkkhaki`,
200
+ `darkmagenta`, `darkolivegreen`, `darkorange`, `darkorchid`, `darkred`,
201
+ `darksalmon`, `darkseagreen`, `darkslateblue`, `darkslategray`, `darkturquoise`,
202
+ `darkviolet`, `deeppink`, `deepskyblue`, `dimgray`, `dodgerblue`, `firebrick`,
203
+ `floralwhite`, `forestgreen`, `fuchsia`, `gainsboro`, `ghostwhite`, `gold`,
204
+ `goldenrod`, `gray`, `greenyellow`, `honeydew`, `hotpink`, `indianred`,
205
+ `indigo`, `ivory`, `khaki`, `lavender`, `lavenderblush`, `lawngreen`,
206
+ `lemonchiffon`, `lightblue`, `lightcoral`, `lightcyan`, `lightgoldenrod`,
207
+ `lightgray`, `lightgreen`, `lightpink`, `lightsalmon`, `lightseagreen`,
208
+ `lightskyblue`, `lightslategray`, `lightsteelblue`, `lightyellow`, `lime`,
209
+ `limegreen`, `linen`, `maroon`, `mediumaquamarine`, `mediumblue`,
210
+ `mediumorchid`, `mediumpurple`, `mediumseagreen`, `mediumslateblue`,
211
+ `mediumspringgreen`, `mediumturquoise`, `mediumvioletred`, `midnightblue`,
212
+ `mintcream`, `mistyrose`, `moccasin`, `navajowhite`, `navyblue`, `oldlace`,
213
+ `olive`, `olivedrab`, `orange`, `orangered`, `orchid`, `palegoldenrod`,
214
+ `palegreen`, `paleturquoise`, `palevioletred`, `papayawhip`, `peachpuff`,
215
+ `peru`, `pink`, `plum`, `powderblue`, `purple`, `rebeccapurple`, `rosybrown`,
216
+ `royalblue`, `saddlebrown`, `salmon`, `sandybrown`, `seagreen`, `seashell`,
217
+ `sienna`, `silver`, `skyblue`, `slateblue`, `slategray`, `snow`, `springgreen`,
218
+ `steelblue`, `tan`, `teal`, `thistle`, `tomato`, `turquoise`, `violet`,
219
+ `webgray`, `webgreen`, `webmaroon`, `webpurple`, `wheat`, `whitesmoke`,
220
+ `yellowgreen`
221
+
222
+ ## Authors
223
+
224
+ [Marcin Kulik](http://ku1ik.com/) and [great open-source contributors](https://github.com/sickill/rainbow/graphs/contributors).
data/lib/.DS_Store CHANGED
Binary file
data/lib/soundly.rb CHANGED
@@ -1,9 +1,12 @@
1
1
  #Environment
2
- require_relative "./soundly/version.rb"
3
- require_relative "./soundly/cli.rb"
4
- require_relative "soundly/tracks.rb"
5
-
6
2
  require 'pry'
3
+ require 'rainbow'
4
+ require 'net/ping'
7
5
  require 'rspotify'
8
- # require 'colorize'
9
- # require 'colorized_string'
6
+ require 'dotenv/load'
7
+
8
+ module Soundly
9
+ require_relative "./soundly/version.rb"
10
+ require_relative "./soundly/cli.rb"
11
+ require_relative "soundly/tracks.rb"
12
+ end
data/lib/soundly/cli.rb CHANGED
@@ -1,59 +1,93 @@
1
- require 'rspotify'
2
- require 'pry'
3
- require_relative 'tracks'
4
-
5
1
  class Soundly::CLI
2
+ def up?
3
+ if Net::Ping::External.new("www.google.com").ping? == true
4
+ true
5
+ end
6
+ end
7
+ def pass_go
8
+ if !up?
9
+ puts "You need an internet connection to run this program..."
10
+ puts "As if I needed to tell you that."
11
+ puts "Good bye for now, human."
12
+ exit
13
+ else
14
+ @@pills = Soundly::Tracks.new
15
+ menu
16
+ end
17
+ end
18
+
6
19
  def call
7
- pills
8
- greetings
9
- menu
10
- goodbye
20
+ pass_go
11
21
  end
12
22
 
13
- def pills
14
- @@pills = Soundly::Tracks.new
23
+ def menu
24
+ user_input = nil
25
+
26
+ greetings
27
+ puts Rainbow("Main Menu").green
28
+ puts Rainbow("Blue Pill").blue + " or" + Rainbow(" Red Pill").red + " or Exit?"
29
+
30
+ while user_input != "exit"
31
+ user_input = gets.strip.downcase
32
+ if user_input == "exit" || user_input == "3"
33
+ goodbye
34
+ elsif user_input == "blue" || user_input == "blue pill" || user_input == "1"
35
+ blue_pill
36
+ elsif user_input == "red" || user_input == "red pill" || user_input == "2"
37
+ red_pill
38
+ else
39
+ puts "Come again?"
40
+ end
41
+ end
15
42
  end
16
43
 
17
44
  def greetings
18
- string = printf %Q(Greetings human. Lend me your earholes, I will fill them with beautiful sounds👽); sleep 1
19
- print "\n"
20
- printf %Q(You have options: Blue pill, or Red pill.)
45
+ puts %Q(Hey there...)
46
+ print %Q(You like music?)
47
+ puts %Q( Cool, me too.)
21
48
  print "\n"
22
- printf %Q(• The blue pill, allows you to sample a playlist shaped by your fellow homosapien's listening habits (top 50 currently trending songs on spotify).)
23
- print "\n"
24
- printf %Q(• Take the red pill, you get to sample an ever evolving playlist of sounds I fancy.)
25
49
  end
26
50
 
27
- def red_playlist
28
- puts %Q(I like your style, hooman.)
29
- puts %Q(Heres what I am currently listening to.)
30
- @@pills.red_songs.each.with_index(1) {|object, index| puts "#{index}. #{object.name} by #{object.artists[0].name} \n"}
51
+ def inner_playlist_options
52
+ puts " "
31
53
  puts %Q(Type a song's listing number to learn more.)
32
54
  puts %Q(Type "Menu" to head back to the main menu.)
55
+ puts %Q(Type exit to peace out.)
56
+ puts " "
57
+ end
58
+
59
+ def red_playlist
60
+ puts " "
61
+ puts %Q(Heres what I am currently listening to.)
62
+ @@pills.red_songs.each.with_index(1) do |song, song_index|
63
+ puts "#{song_index}. #{song.name} by #{song.artists[0].name} \n"
64
+ end
65
+ inner_playlist_options
33
66
  end
34
67
 
35
68
  def blue_playlist
36
- puts %Q(:/ Okay, fine.)
69
+ puts %Q(America's top 50, coming up...)
37
70
  puts "\n"
38
- puts "Here's whats going on with music in your country, on planet E-Arth..."
39
- @@pills.blue_songs.each.with_index(1) {|object, index| puts "#{index}. #{object.name} by #{object.artists[0].name} \n"}
40
- # binding.pry
41
- puts %Q(Type a song's listing number to learn more.)
42
- puts %Q(Type "Menu" to head back to the main menu.)
71
+ @@pills.blue_songs.each.with_index(1) do |song, song_index|
72
+ puts "#{song_index}. #{song.name} by #{song.artists[0].name}"
73
+ end
74
+ inner_playlist_options
43
75
  end
44
76
 
45
77
  def blue_pill
46
78
  print "\n"
47
79
  puts "Blue Pill: Main Menu"
48
- sleep 1
49
80
  blue_playlist
50
81
 
51
82
  user_input = nil
52
83
  while user_input != "menu"
53
- user_input = gets.strip
84
+ user_input = gets.downcase.strip
54
85
  if user_input == "menu"
55
86
  menu
87
+ elsif user_input == "exit"
88
+ goodbye
56
89
  elsif (1..50).to_a.include?(user_input.to_i)
90
+ puts " "
57
91
  puts "Here are details on #{@@pills.blue_songs[user_input.to_i-1].name}"
58
92
  song = @@pills.blue_songs[user_input.to_i-1]
59
93
  puts "Song name: #{song.name}"
@@ -62,19 +96,20 @@ class Soundly::CLI
62
96
  puts "Duration: #{song.duration_ms}"
63
97
  puts "Popularity: #{song.popularity}"
64
98
  puts "Preview_url: #{song.preview_url}" if song.preview_url != nil
65
- print "\n"
99
+ puts " "
100
+ puts "Would you like to select another song, Main Menu or Exit?"
66
101
  else
67
- puts %(You've lost me human. Try again.)
68
- puts %(Select a number from the list to learn more about a song.)
69
- print "\n"
70
- puts %(Or you can type "Menu" to head back to main menu of course.)
71
- print "\n"
102
+ puts %(Try again.)
103
+ puts " "
104
+ puts %(Select a number from the list, Menu or Exit)
105
+ puts " "
72
106
  end
73
107
  end
74
108
  end
75
109
 
76
110
  def red_pill
77
- print "\n"
111
+ puts " "
112
+ puts %Q((I like your style human.))
78
113
  puts "Red Pill: Main Menu"
79
114
  red_playlist
80
115
 
@@ -82,10 +117,13 @@ class Soundly::CLI
82
117
  while user_input != "menu"
83
118
  user_input = gets.strip
84
119
  object = @@pills.red_songs.count.to_i
85
- # binding.pry
120
+
86
121
  if user_input == "menu"
87
122
  menu
123
+ elsif user_input == "exit"
124
+ goodbye
88
125
  elsif (1..object).include?(user_input.to_i)
126
+ puts " "
89
127
  puts "Here are details on #{@@pills.red_songs[user_input.to_i-1].name}"
90
128
  song = @@pills.red_songs[user_input.to_i-1]
91
129
  puts "Song name: #{song.name}"
@@ -95,41 +133,18 @@ class Soundly::CLI
95
133
  puts "Popularity: #{song.popularity}"
96
134
  puts "Preview_url: #{song.preview_url}" if song.preview_url != nil
97
135
  print "\n"
136
+ puts "Would you like to select another song, go back to the Main Menu or Exit?"
98
137
  else
99
- puts %(You've lost me human. Try again.)
100
- puts %(Select a number from the list to learn more about a song.)
101
- print "\n"
102
- puts %(Or you can type "Exit" to head back to main menu or course.)
138
+ puts %(Try again.)
139
+ print " \n"
140
+ puts %(Select a number from the list, "Menu" or "Exit")
103
141
  print "\n"
104
142
  end
105
143
  end
106
144
  end
107
145
 
108
- def menu
109
- user_input = nil
110
- puts "Main Menu"
111
- puts %Q(Type "Blue" for the Blue pill, and "Red" for the Red pill.)
112
- puts %Q(Type "Exit" to part ways.)
113
- print "\n"
114
- puts %Q(Choose wisely, human...)
115
-
116
- while user_input != "exit"
117
- user_input = gets.strip.downcase
118
- if user_input == "exit"
119
- goodbye
120
- elsif user_input == "blue"
121
- blue_pill
122
- elsif user_input == "red"
123
- red_pill
124
- else
125
- puts "Come again?"
126
- end
127
- end
128
- end
129
-
130
146
  def goodbye
131
- puts %Q(Goodbye human.)
132
- puts %Q(See you soon.)
147
+ puts %Q(Peace out.)
133
148
  exit
134
149
  end
135
- end
150
+ end
@@ -1,31 +1,35 @@
1
- require 'rspotify'
2
- require 'pry'
3
- require_relative 'cli'
4
-
5
1
  class Soundly::Tracks
6
- # attr_accessor :track_name, :artist, :album, :genre, :duration, :popularity, :position, :preview_url
7
-
8
2
  @@blue_playlist = []
9
3
  @@red_playlist = []
10
-
4
+ @@all = []
5
+
6
+ def authenticate #LOG IN
7
+ RSpotify.authenticate(ENV['CLIENT_ID'], ENV['CLIENT_SECRET'])
8
+ end
9
+
10
+ def self.all(playlist)
11
+ if playlist == "blue"
12
+ @@blue_playlist
13
+ else
14
+ @@red_playlist
15
+ end
16
+ end
11
17
 
12
18
  def initialize
13
19
  blue_playlist
14
20
  red_playlist
15
21
  end
16
22
 
17
- def blue_playlist
18
- RSpotify.authenticate("b866a06729ba441d8819fe317fa0d8b3", "f00fcf04738f4f73a8e880923f767a13")
23
+ def blue_playlist #SPOTIFY TOP 50 IN AMERICA
24
+ authenticate
19
25
  playlist = RSpotify::Playlist.find('spotifycharts', '37i9dQZEVXbLRQDuF5jeBp')
20
26
  playlist.tracks.each do |song|
21
27
  @@blue_playlist << song
22
-
23
- #Soundly::Tracks.save_song(song)
24
28
  end
25
29
  end
26
30
 
27
- def red_playlist
28
- RSpotify.authenticate("b866a06729ba441d8819fe317fa0d8b3", "f00fcf04738f4f73a8e880923f767a13")
31
+ def red_playlist #MY PERSONAL SPOTIFY PLAYLIST
32
+ authenticate
29
33
  playlist = RSpotify::Playlist.find('dwyn.hrmn', '7BQJkBkL5muBFOc7ok76XO')
30
34
  playlist.tracks.each do |song|
31
35
  @@red_playlist << song
@@ -39,13 +43,4 @@ class Soundly::Tracks
39
43
  def red_songs
40
44
  @@red_playlist
41
45
  end
42
-
43
- def self.all(playlist)
44
- if playlist == blue
45
- @@blue_playlist
46
- else
47
- @@red_playlist
48
- end
49
- end
50
-
51
46
  end
@@ -1,3 +1,3 @@
1
1
  module Soundly
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
data/rspotify.md ADDED
@@ -0,0 +1,255 @@
1
+ # RSpotify
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/rspotify.svg)](http://badge.fury.io/rb/rspotify)
4
+ [![Build Status](https://travis-ci.org/guilhermesad/rspotify.svg?branch=master)](https://travis-ci.org/guilhermesad/rspotify)
5
+
6
+ This is a ruby wrapper for the [Spotify Web API](https://developer.spotify.com/web-api).
7
+
8
+ ## Features
9
+
10
+ * [Full documentation](http://www.rubydoc.info/github/guilhermesad/rspotify/master)
11
+ * Full API Endpoint coverage
12
+ * OAuth and other authorization flows
13
+
14
+ ## Installation
15
+
16
+ Add this line to your application's Gemfile:
17
+
18
+ gem 'rspotify'
19
+
20
+ And then execute:
21
+
22
+ $ bundle
23
+
24
+ Or install it yourself as:
25
+
26
+ $ gem install rspotify
27
+
28
+ ## Usage
29
+
30
+ RSpotify was designed with usability as its primary goal, so that you can forget the API and intuitively interact with your playlists, favorite artists, users and so on.
31
+
32
+ You can write things like `my_playlist.tracks.sort_by(&:popularity).last.album` without having to think which API calls must be done. RSpotify fills the gaps for you.
33
+
34
+ Below are some basic usage examples. Check the [documentation](http://rdoc.info/github/guilhermesad/rspotify/master/frames) for the complete reference.
35
+
36
+ ```ruby
37
+ require 'rspotify'
38
+
39
+ artists = RSpotify::Artist.search('Arctic Monkeys')
40
+
41
+ arctic_monkeys = artists.first
42
+ arctic_monkeys.popularity #=> 74
43
+ arctic_monkeys.genres #=> ["Alternative Pop/Rock", "Indie", ...]
44
+ arctic_monkeys.top_tracks(:US) #=> (Track array)
45
+
46
+ albums = arctic_monkeys.albums
47
+ albums.first.name #=> "AM"
48
+
49
+ am = albums.first
50
+ am.release_date #=> "2013-09-10"
51
+ am.images #=> (Image array)
52
+ am.available_markets #=> ["AR", "BO", "BR", ...]
53
+
54
+ tracks = am.tracks
55
+ tracks.first.name #=> "Do I Wanna Know?"
56
+
57
+ do_i_wanna_know = tracks.first
58
+ do_i_wanna_know.duration_ms #=> 272386
59
+ do_i_wanna_know.track_number #=> 1
60
+ do_i_wanna_know.preview_url #=> "https://p.scdn.co/mp3-preview/<id>"
61
+
62
+ playlists = RSpotify::Playlist.search('Indie')
63
+ playlists.first.name #=> "The Indie Mix"
64
+
65
+ # You can search within other types too
66
+ albums = RSpotify::Album.search('The Wall')
67
+ tracks = RSpotify::Track.search('Thriller')
68
+ ```
69
+
70
+ Find by id:
71
+
72
+ ```ruby
73
+ arctic_monkeys = RSpotify::Artist.find('7Ln80lUS6He07XvHI8qqHH')
74
+ arctic_monkeys.related_artists #=> (Artist array)
75
+
76
+ am = RSpotify::Album.find('41vPD50kQ7JeamkxQW7Vuy')
77
+ am.album_type #=> "single"
78
+
79
+ do_i_wanna_know = RSpotify::Track.find('2UzMpPKPhbcC8RbsmuURAZ')
80
+ do_i_wanna_know.album #=> (Album object)
81
+
82
+ me = RSpotify::User.find('guilhermesad')
83
+ me.uri #=> "spotify:user:guilhermesad"
84
+
85
+ # Or find several objects at once:
86
+
87
+ ids = %w(2UzMpPKPhbcC8RbsmuURAZ 7Jzsc04YpkRwB1zeyM39wE)
88
+
89
+ my_tracks = RSpotify::Track.find(ids)
90
+ my_tracks.size #=> 2
91
+ ```
92
+
93
+ Some data require authentication to be accessed, such as playlists' details. You can easily get your credentials [here](https://developer.spotify.com/my-applications).
94
+
95
+ Then just copy and paste them like so:
96
+
97
+ ```ruby
98
+ RSpotify.authenticate("<your_client_id>", "<your_client_secret>")
99
+
100
+ # Now you can access playlists in detail, browse featured content and more
101
+
102
+ me = RSpotify::User.find('guilhermesad')
103
+ me.playlists #=> (Playlist array)
104
+
105
+ # Find by id
106
+ playlist = RSpotify::Playlist.find('guilhermesad', '1Xi8mgiuHHPLQYOw2Q16xv')
107
+ playlist.name #=> "d33p"
108
+ playlist.description #=> "d33p h0uz"
109
+ playlist.followers['total'] #=> 1
110
+ playlist.tracks #=> (Track array)
111
+
112
+ # Search by category
113
+ party = RSpotify::Category.find('party')
114
+ party.playlists #=> (Playlist array)
115
+ categories = RSpotify::Category.list # See all available categories
116
+
117
+ # Access featured content from Spotify's Browse tab
118
+ featured_playlists = RSpotify::Playlist.browse_featured(country: 'US')
119
+ new_releases = RSpotify::Album.new_releases(country: 'ES')
120
+
121
+ # Access tracks' audio features
122
+ sorry = RSpotify::Track.search("Sorry").first
123
+ sorry.audio_features.danceability #=> 0.605
124
+ sorry.audio_features.energy #=> 0.768
125
+ sorry.audio_features.tempo #=> 100.209
126
+
127
+ # Get recommendations
128
+ recommendations = RSpotify::Recommendations.generate(seed_genres: ['blues', 'country'])
129
+ recommendations = RSpotify::Recommendations.generate(seed_tracks: my_fav_tracks.map(&:id))
130
+ recommendations = RSpotify::Recommendations.generate(seed_artists: my_fav_artists.map(&:id))
131
+ recommendations.tracks #=> (Track array)
132
+ ```
133
+
134
+ ## Rails + OAuth
135
+
136
+ You might want your application to access a user's Spotify account.
137
+
138
+ For instance, suppose you want your app to create playlists for the user based on their taste, or to add a feature that syncs user's playlists with some external app.
139
+
140
+ If so, add the following to your application (Remember to [get your credentials](https://developer.spotify.com/my-applications))
141
+
142
+ ```ruby
143
+ # config/application.rb
144
+
145
+ RSpotify::authenticate("<your_client_id>", "<your_client_secret>")
146
+ ```
147
+
148
+ ```ruby
149
+ # config/initializers/omniauth.rb
150
+
151
+ require 'rspotify/oauth'
152
+
153
+ Rails.application.config.middleware.use OmniAuth::Builder do
154
+ provider :spotify, "<your_client_id>", "<your_client_secret>", scope: 'user-read-email playlist-modify-public user-library-read user-library-modify'
155
+ end
156
+ ```
157
+
158
+ You should replace the scope values for the ones your own app will require from the user. You can see the list of available scopes in [here](https://developer.spotify.com/web-api/using-scopes).
159
+
160
+ Next, make a link so the user can log in with his Spotify account:
161
+
162
+ ```ruby
163
+ <%= link_to 'Sign in with Spotify', '/auth/spotify' %>
164
+ ```
165
+
166
+ And create a route to receive the callback:
167
+
168
+ ```ruby
169
+ # config/routes.rb
170
+
171
+ get '/auth/spotify/callback', to: 'users#spotify'
172
+ ```
173
+
174
+ Remember you need to tell Spotify this address is white-listed. You can do this by adding it to the Redirect URIs list in your [application page](https://developer.spotify.com/my-applications). An example of Redirect URI would be http://localhost:3000/auth/spotify/callback.
175
+
176
+ Finally, create a new RSpotify User with the response received:
177
+
178
+ ```ruby
179
+ class UsersController < ApplicationController
180
+ def spotify
181
+ spotify_user = RSpotify::User.new(request.env['omniauth.auth'])
182
+ # Now you can access user's private data, create playlists and much more
183
+
184
+ # Access private data
185
+ spotify_user.country #=> "US"
186
+ spotify_user.email #=> "example@email.com"
187
+
188
+ # Create playlist in user's Spotify account
189
+ playlist = spotify_user.create_playlist!('my-awesome-playlist')
190
+
191
+ # Add tracks to a playlist in user's Spotify account
192
+ tracks = RSpotify::Track.search('Know')
193
+ playlist.add_tracks!(tracks)
194
+ playlist.tracks.first.name #=> "Somebody That I Used To Know"
195
+
196
+ # Access and modify user's music library
197
+ spotify_user.save_tracks!(tracks)
198
+ spotify_user.saved_tracks.size #=> 20
199
+ spotify_user.remove_tracks!(tracks)
200
+
201
+ albums = RSpotify::Album.search('launeddas')
202
+ spotify_user.save_albums!(albums)
203
+ spotify_user.saved_albums.size #=> 10
204
+ spotify_user.remove_albums!(albums)
205
+
206
+ # Use Spotify Follow features
207
+ spotify_user.follow(playlist)
208
+ spotify_user.follows?(artists)
209
+ spotify_user.unfollow(users)
210
+
211
+ # Get user's top played artists and tracks
212
+ spotify_user.top_artists #=> (Artist array)
213
+ spotify_user.top_tracks(time_range: 'short_term') #=> (Track array)
214
+
215
+ # Check doc for more
216
+ end
217
+ end
218
+ ```
219
+
220
+ The user's access token is automatically refreshed by RSpotify when needed. This is specially useful if you persist the user data on a database: this way he only needs to log in to Spotify once in his entire use of your application.
221
+
222
+ RSpotify provides a way to facilitate persistence:
223
+
224
+ ```ruby
225
+ hash = spotify_user.to_hash
226
+ # hash containing all user attributes, including access tokens
227
+
228
+ # Use the hash to persist the data the way you prefer...
229
+
230
+ # Then recover the Spotify user whenever you like
231
+ spotify_user = RSpotify::User.new(hash)
232
+ spotify_user.create_playlist!('my_awesome_playlist') # automatically refreshes token
233
+ ```
234
+
235
+ ## Getting raw response
236
+
237
+ To get the raw response from Spotify API requests, just toggle the `raw_response` variable:
238
+
239
+ ```ruby
240
+ RSpotify.raw_response = true
241
+ RSpotify::Artist.search('Cher') #=> (String with raw json response)
242
+ ```
243
+
244
+ ## Notes
245
+
246
+ If you'd like to use OAuth outside rails, have a look [here](https://developer.spotify.com/web-api/authorization-guide/#authorization_code_flow) for the requests that need to be made. You should be able to pass the response to RSpotify::User.new just as well, and from there easily create playlists and more for your user.
247
+
248
+ ## Contributing
249
+
250
+ 1. Fork it ( https://github.com/guilhermesad/rspotify/fork )
251
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
252
+ 3. Test your changes (`bundle exec rspec`)
253
+ 4. Commit your changes (`git commit -am 'Add some feature'`)
254
+ 5. Push to the branch (`git push origin my-new-feature`)
255
+ 6. Create a new Pull Request
data/soundly.gemspec CHANGED
@@ -25,9 +25,10 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  spec.add_development_dependency "bundler", "~> 1.14"
27
27
  spec.add_development_dependency "rake", "~> 10.0"
28
- spec.add_development_dependency "rspec", "~> 3.0"
29
- spec.add_development_dependency "rspotify"
30
- spec.add_development_dependency "spotify-client"
31
- spec.add_development_dependency "omniauth-spotify"
32
28
  spec.add_development_dependency "pry"
33
- end
29
+ spec.add_development_dependency "rspec", "~> 3.2"
30
+ spec.add_dependency "net-ping"
31
+ spec.add_dependency "dotenv"
32
+ spec.add_dependency "rspotify"
33
+ spec.add_dependency "rainbow"
34
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: soundly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - "<dwyn>"
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-06-18 00:00:00.000000000 Z
11
+ date: 2018-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,28 +38,42 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '3.0'
61
+ version: '3.2'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '3.0'
68
+ version: '3.2'
55
69
  - !ruby/object:Gem::Dependency
56
- name: rspotify
70
+ name: net-ping
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="
60
74
  - !ruby/object:Gem::Version
61
75
  version: '0'
62
- type: :development
76
+ type: :runtime
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
@@ -67,13 +81,13 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: spotify-client
84
+ name: dotenv
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ">="
74
88
  - !ruby/object:Gem::Version
75
89
  version: '0'
76
- type: :development
90
+ type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
@@ -81,13 +95,13 @@ dependencies:
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
- name: omniauth-spotify
98
+ name: rspotify
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - ">="
88
102
  - !ruby/object:Gem::Version
89
103
  version: '0'
90
- type: :development
104
+ type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
@@ -95,13 +109,13 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: pry
112
+ name: rainbow
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - ">="
102
116
  - !ruby/object:Gem::Version
103
117
  version: '0'
104
- type: :development
118
+ type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
@@ -122,6 +136,7 @@ files:
122
136
  - CODE_OF_CONDUCT.md
123
137
  - Gemfile
124
138
  - README.md
139
+ - Rainbow.md
125
140
  - Rakefile
126
141
  - bin/console
127
142
  - bin/setup
@@ -132,6 +147,7 @@ files:
132
147
  - lib/soundly/tracks.rb
133
148
  - lib/soundly/version.rb
134
149
  - notes.md
150
+ - rspotify.md
135
151
  - soundly.gemspec
136
152
  - spec.md
137
153
  homepage: https://github.com/dwyn/soundly
@@ -153,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
169
  version: '0'
154
170
  requirements: []
155
171
  rubyforge_project:
156
- rubygems_version: 2.6.11
172
+ rubygems_version: 2.6.14
157
173
  signing_key:
158
174
  specification_version: 4
159
175
  summary: This gem will play songs from a revolving playlist through the Spotify API