shuffler_fm 0.0.1
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.
- data/.gitignore +21 -0
- data/.rspec +1 -0
- data/.travis.yml +10 -0
- data/.yardopts +2 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +121 -0
- data/Rakefile +37 -0
- data/lib/shuffler_fm/api/artists.rb +53 -0
- data/lib/shuffler_fm/api/blogs.rb +52 -0
- data/lib/shuffler_fm/api/channels.rb +88 -0
- data/lib/shuffler_fm/api/charts.rb +28 -0
- data/lib/shuffler_fm/api/genres.rb +28 -0
- data/lib/shuffler_fm/api/tracks.rb +33 -0
- data/lib/shuffler_fm/api.rb +54 -0
- data/lib/shuffler_fm/configuration.rb +44 -0
- data/lib/shuffler_fm/errors.rb +37 -0
- data/lib/shuffler_fm/http.rb +25 -0
- data/lib/shuffler_fm/middleware/error_handler.rb +49 -0
- data/lib/shuffler_fm/request.rb +25 -0
- data/lib/shuffler_fm/version.rb +3 -0
- data/lib/shuffler_fm.rb +67 -0
- data/shuffler_fm.gemspec +37 -0
- data/spec/config.yml.sample +3 -0
- data/spec/fixtures/vcr_cassettes/api.yml +26 -0
- data/spec/fixtures/vcr_cassettes/artists.yml +187 -0
- data/spec/fixtures/vcr_cassettes/blogs.yml +187 -0
- data/spec/fixtures/vcr_cassettes/channels.yml +95 -0
- data/spec/fixtures/vcr_cassettes/charts.yml +95 -0
- data/spec/fixtures/vcr_cassettes/genres.yml +95 -0
- data/spec/fixtures/vcr_cassettes/tracks.yml +95 -0
- data/spec/helper.rb +39 -0
- data/spec/shuffler_fm/api/artists_spec.rb +25 -0
- data/spec/shuffler_fm/api/blogs_spec.rb +25 -0
- data/spec/shuffler_fm/api/channels_spec.rb +23 -0
- data/spec/shuffler_fm/api/charts_spec.rb +15 -0
- data/spec/shuffler_fm/api/genres_spec.rb +15 -0
- data/spec/shuffler_fm/api/tracks_spec.rb +15 -0
- data/spec/shuffler_fm/api_spec.rb +15 -0
- data/spec/shuffler_fm/configuration_spec.rb +9 -0
- data/spec/shuffler_fm/middleware/error_handler_spec.rb +29 -0
- data/spec/shufflerfm_spec.rb +29 -0
- metadata +315 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
-r ./spec/helper.rb -c -f documentation
|
data/.travis.yml
ADDED
data/.yardopts
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Miguel Guinada
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
# ShufflerFM [](http://travis-ci.org/mguinada/shuffler_fm) [](https://codeclimate.com/github/mguinada/shuffler_fm)
|
2
|
+
|
3
|
+
[travis]: http://travis-ci.org/mguinada/shuffler_fm
|
4
|
+
[codeclimate]: https://codeclimate.com/github/mguinada/shuffler_fm
|
5
|
+
|
6
|
+
Ruby API wrapper for [shuffler.fm v1 API](http://developers.shuffler.fm/)
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Add this line to your application's Gemfile:
|
11
|
+
|
12
|
+
gem 'shuffler_fm'
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
|
16
|
+
$ bundle
|
17
|
+
|
18
|
+
Or install it yourself as:
|
19
|
+
|
20
|
+
$ gem install shuffler_fm
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
### Create an API instance
|
25
|
+
```ruby
|
26
|
+
|
27
|
+
require 'shuffler_fm'
|
28
|
+
|
29
|
+
# Get and API key from http://shuffler.fm/developers
|
30
|
+
api = ShufflerFM.api('YOUR-KEY')
|
31
|
+
=> #<ShufflerFM::API:0x000000027fa2b8 @key="YOUR-KEY">
|
32
|
+
```
|
33
|
+
|
34
|
+
### Read track data
|
35
|
+
```ruby
|
36
|
+
|
37
|
+
# list tracks
|
38
|
+
tracks = api.tracks
|
39
|
+
=> [#<Hashie::Rash blog=#<Hashie::Rash about=\"\" channel_url=\"http://api.shuffler.fm/v1/channels/blog:963?api-key=YOUR-KEY\" genres=[\"indie\", \"folk\", \"singer-songwriter\"] id=963 images=[#<Hashie::Rash height=240 url=\"http://assets.shuffler.fm/feeds/963/argeheartedboy_large.jpg\" width=240>] permalink=\"largehearted-boy\" profiles=#<Hashie::Rash facebook=nil twitter=nil> ...
|
40
|
+
|
41
|
+
# list operations are paginated
|
42
|
+
tracks = api.tracks(page: 2)
|
43
|
+
|
44
|
+
# request a particular track
|
45
|
+
track = api.track(1134715)
|
46
|
+
|
47
|
+
track.blog.title
|
48
|
+
=> "Cover Freak"
|
49
|
+
|
50
|
+
track.post.url
|
51
|
+
=> "http://coverfreak.com/2012/09/23/satisfaction/"
|
52
|
+
|
53
|
+
track.metadata.title
|
54
|
+
=> "Satisfaction"
|
55
|
+
|
56
|
+
track.metadata.artist.name
|
57
|
+
=> "Bjork & PJ Harvey"
|
58
|
+
```
|
59
|
+
|
60
|
+
### Search for an artist
|
61
|
+
```ruby
|
62
|
+
api.search_artists('radiohead').map(&:name)
|
63
|
+
=> ["Radiohead", "Radiohead at Lollapalooza 2008", "REM & Radiohead", "Radiohead 6. Permanent Daylight live", "Radiohead @ Optimus Alive'12", "I Can't Take The Hurt (Johnny Cash vs Tegan and Sarah and Radiohead)"]
|
64
|
+
```
|
65
|
+
|
66
|
+
### Read a channel's activity stream
|
67
|
+
```ruby
|
68
|
+
|
69
|
+
activity = []
|
70
|
+
api.genre_channels('punk', 'rock').each do |act|
|
71
|
+
activity << "#{act.verb.capitalize} on #{act.actor.title} refering music track #{act.object.metadata.title}"
|
72
|
+
end
|
73
|
+
|
74
|
+
activity
|
75
|
+
=> ["Post on The KEXP Blog refering music track Sunshine/Pretty Girls (Live on KEXP)",
|
76
|
+
"Post on PropertyOfZack refering music track Always Summer (Live Video)",
|
77
|
+
"Post on Nialler9 Music Blog refering music track Honningbarna (2012)",
|
78
|
+
"Post on This Is Fake DIY refering music track Coffin Song", ...
|
79
|
+
```
|
80
|
+
|
81
|
+
and more ...
|
82
|
+
|
83
|
+
### Configuration
|
84
|
+
```ruby
|
85
|
+
|
86
|
+
ShufflerFM.configure do |config|
|
87
|
+
config.connection_timeout = 1 #seconds
|
88
|
+
config.read_timeout = 5 #seconds
|
89
|
+
config.proxy = { uri: 'http://192.168.1.1:8080', user: 'user1', password: 'passwd'}
|
90
|
+
end
|
91
|
+
|
92
|
+
#or
|
93
|
+
|
94
|
+
api = ShufflerFM.api("your-api-key", connection_timeout: 1, read_timeout: 5, proxy: 'http://192.168.1.1:8080')
|
95
|
+
```
|
96
|
+
|
97
|
+
## Reference
|
98
|
+
|
99
|
+
[shuffler_fm reference](http://rdoc.info/github/mguinada/shuffler_fm)
|
100
|
+
|
101
|
+
## Contributing
|
102
|
+
|
103
|
+
1. Fork it
|
104
|
+
2. Create your topic branch (`git checkout -b my-topic-branch`)
|
105
|
+
3. Add/change specs for your unimplemented feature or bug fix
|
106
|
+
4. Make sure specs fail by running `bundle exec rake spec`. If not return to step 3
|
107
|
+
5. Hack it
|
108
|
+
6. Make sure specs pass (`bundle exec rake spec`). If not return to step 5
|
109
|
+
7. Edit the documentation so it is coherent with your feature or fix. Run `bundle exec rake yard` to review
|
110
|
+
8. Commit changes (`git commit -am 'Add some feature/fix'`) and push to the branch (`git push origin my-topic-branch`)
|
111
|
+
9. Submit a pull request for your branch.
|
112
|
+
|
113
|
+
## Influence
|
114
|
+
|
115
|
+
This API wrapper design is strongly influenced by the [Ocktokit gem](https://github.com/pengwynn/octokit)
|
116
|
+
|
117
|
+
## Copyright
|
118
|
+
Copyright (c) 2012 Miguel Guinada
|
119
|
+
[LICENSE][] for details.
|
120
|
+
|
121
|
+
[license]: https://github.com/mguinada/shuffler_fm/blob/master/LICENSE
|
data/Rakefile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'yard'
|
4
|
+
|
5
|
+
task :test => :spec
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
RSpec::Core::RakeTask.new do |task|
|
9
|
+
task.rspec_opts = ["-c", "-f documentation", "-r ./spec/helper.rb"]
|
10
|
+
task.pattern = 'spec/**/*_spec.rb'
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Open an interactive session preloaded with this gem's code"
|
14
|
+
task :console do
|
15
|
+
if gem_available?("pry")
|
16
|
+
sh "pry -I lib -r shuffler_fm.rb"
|
17
|
+
else
|
18
|
+
sh "irb -rubygems -I lib -r shuffler_fm.rb"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Generate documentation"
|
23
|
+
YARD::Rake::YardocTask.new do |t|
|
24
|
+
t.files = ['lib/**/*.rb']
|
25
|
+
t.options = ['--no-private', '--protected', '--markup', 'markdown']
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# Determins if a gem is available at the current runtime
|
30
|
+
#
|
31
|
+
def gem_available?(name)
|
32
|
+
Gem::Specification.find_by_name(name)
|
33
|
+
rescue Gem::LoadError
|
34
|
+
false
|
35
|
+
rescue
|
36
|
+
Gem.available?(name) #for backwards compatibility
|
37
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module ShufflerFM
|
2
|
+
class API
|
3
|
+
# Shuffler.fm API operations over artists
|
4
|
+
module Artists
|
5
|
+
# Requests a list of artists
|
6
|
+
#
|
7
|
+
# @param [Hash] options
|
8
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
9
|
+
#
|
10
|
+
# @return [Array] a list of artists
|
11
|
+
#
|
12
|
+
def artists(options = {})
|
13
|
+
get("/artists", :page => page(options))
|
14
|
+
end
|
15
|
+
|
16
|
+
# Requests a particular artist
|
17
|
+
#
|
18
|
+
# @param [Integer] id The artist id
|
19
|
+
#
|
20
|
+
# @return [Artist] the requested artist or nil if not found
|
21
|
+
#
|
22
|
+
def artist(id)
|
23
|
+
get("/artists/#{Integer(id)}")
|
24
|
+
rescue ShufflerFM::NotFound
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
# Requests an artist's top blogs
|
29
|
+
#
|
30
|
+
# @param [Integer] id the artist id
|
31
|
+
# @param [Hash] options
|
32
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
33
|
+
#
|
34
|
+
# @return [Array] an array of results
|
35
|
+
#
|
36
|
+
def artist_blogs(id, options= {})
|
37
|
+
get("artists/#{Integer(id)}/blogs", :page => page(options))
|
38
|
+
end
|
39
|
+
|
40
|
+
# Search artists
|
41
|
+
#
|
42
|
+
# @param [String] q your query
|
43
|
+
# @param [Hash] options
|
44
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
45
|
+
#
|
46
|
+
# @return [Array] an array of results
|
47
|
+
#
|
48
|
+
def search_artists(q, options = {})
|
49
|
+
get("/artists?q=#{String(q)}", :page => page(options))
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module ShufflerFM
|
2
|
+
class API
|
3
|
+
# Shuffler.fm API operations over blogs
|
4
|
+
module Blogs
|
5
|
+
# Requests a list of blogs
|
6
|
+
#
|
7
|
+
# @param [Hash] options
|
8
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
9
|
+
#
|
10
|
+
# @return [Array] a list of blogs
|
11
|
+
#
|
12
|
+
def blogs(options = {})
|
13
|
+
get("/blogs", :page => page(options))
|
14
|
+
end
|
15
|
+
|
16
|
+
# Requests a list of featured blogs
|
17
|
+
#
|
18
|
+
# @param [Hash] options
|
19
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
20
|
+
#
|
21
|
+
# @return [Array] a list of featured blogs
|
22
|
+
#
|
23
|
+
def featured_blogs(options = {})
|
24
|
+
get("/blogs", :page => page(options), :filter => 'featured')
|
25
|
+
end
|
26
|
+
|
27
|
+
# Requests a particular blog
|
28
|
+
#
|
29
|
+
# @param [Integer] id The blog id
|
30
|
+
#
|
31
|
+
# @return [Blog] the requested blog or nil if not found
|
32
|
+
#
|
33
|
+
def blog(id)
|
34
|
+
get("/blogs/#{Integer(id)}")
|
35
|
+
rescue ShufflerFM::NotFound
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
# Search blogs
|
40
|
+
#
|
41
|
+
# @param [String] q your query
|
42
|
+
# @param [Hash] options
|
43
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
44
|
+
#
|
45
|
+
# @return [Array] an array of results
|
46
|
+
#
|
47
|
+
def search_blogs(q, options = {})
|
48
|
+
get("/blogs?q=#{String(q)}", :page => page(options))
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module ShufflerFM
|
2
|
+
class API
|
3
|
+
# Shuffler.fm API operations over channels
|
4
|
+
module Channels
|
5
|
+
# Reads the media channels activity stream
|
6
|
+
#
|
7
|
+
# @param [String] key The channel key.
|
8
|
+
# Can be on of the following: mp3, youtube, vimeo, soundcloud or officialfm
|
9
|
+
# @param [Hash] options
|
10
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
11
|
+
#
|
12
|
+
# @return [Array] an array with the channel's activity stream
|
13
|
+
#
|
14
|
+
# @example
|
15
|
+
# api.media_channels('youtube', page: 2)
|
16
|
+
#
|
17
|
+
def media_channels(key, options = {})
|
18
|
+
channel(:media, key, options)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Reads the blog channels activity stream
|
22
|
+
#
|
23
|
+
# @param [String] key The channel key.
|
24
|
+
# @param [Hash] options
|
25
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
26
|
+
#
|
27
|
+
# @return [Array] an array with the channel's activity stream
|
28
|
+
#
|
29
|
+
# @example
|
30
|
+
# api.blog_channels(21)
|
31
|
+
#
|
32
|
+
def blog_channels(key, options = {})
|
33
|
+
channel(:blog, key, options)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Reads the artist channels activity stream
|
37
|
+
#
|
38
|
+
# @param key The channel key.
|
39
|
+
# @param [Hash] options
|
40
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
41
|
+
#
|
42
|
+
# @return [Array] an array with the channel's activity stream
|
43
|
+
#
|
44
|
+
# @example
|
45
|
+
# api.artist_channels('Pixies', page: 1)
|
46
|
+
#
|
47
|
+
def artist_channels(key, options = {})
|
48
|
+
channel(:artist, key, options)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Reads the genere channels activity stream.
|
52
|
+
#
|
53
|
+
# @param [Array] keys The channel keys.
|
54
|
+
#
|
55
|
+
# @return [Array] an array with the channel's activity stream
|
56
|
+
#
|
57
|
+
# @example
|
58
|
+
# api.genre_channels('rock')
|
59
|
+
# api.genre_channels('punk', 'rock', page: 2)
|
60
|
+
#
|
61
|
+
def genre_channels(*keys)
|
62
|
+
channel(:genre, *keys)
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
def channel(*args)
|
67
|
+
key, query, opts = process_args(args)
|
68
|
+
get((key == :genre ? "channels/" : "channels/#{key}:") << "#{String(query.join('+'))}", :page => page(opts))
|
69
|
+
rescue ShufflerFM::NotFound
|
70
|
+
[]
|
71
|
+
end
|
72
|
+
|
73
|
+
def process_args(args)
|
74
|
+
channels = %w(genre media blog artist)
|
75
|
+
|
76
|
+
if !channels.include?(args.first.to_s)
|
77
|
+
raise ArgumentError, "channel key must be one of: #{channels.join(', ')} but is #{args.first}"
|
78
|
+
end
|
79
|
+
|
80
|
+
if (query = Array(args[1..-1])).nil?
|
81
|
+
raise ArgumentError, "query value(s) must be provided"
|
82
|
+
end
|
83
|
+
|
84
|
+
return args.first.to_sym, query, query.last.is_a?(Hash) ? query.pop : {}
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module ShufflerFM
|
2
|
+
class API
|
3
|
+
# Shuffler.fm API operations over charts
|
4
|
+
module Charts
|
5
|
+
# Lists popular tracks charts
|
6
|
+
#
|
7
|
+
# @param [Hash] options
|
8
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
9
|
+
#
|
10
|
+
# @return [Array] a list of tracks merged with chart metadata
|
11
|
+
#
|
12
|
+
def popular_charts(options = {})
|
13
|
+
get("/charts/popular", :page => page(options))
|
14
|
+
end
|
15
|
+
|
16
|
+
# Lists tracks that were recently added to the popular list
|
17
|
+
#
|
18
|
+
# @param [Hash] options
|
19
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
20
|
+
#
|
21
|
+
# @return [Array] a list of tracks merged with chart metadata
|
22
|
+
#
|
23
|
+
def popular_charts_newest(options = {})
|
24
|
+
get("/charts/new", :page => page(options))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module ShufflerFM
|
2
|
+
class API
|
3
|
+
module Genres
|
4
|
+
# Requests a list of genres
|
5
|
+
#
|
6
|
+
# @param [Hash] options
|
7
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
8
|
+
#
|
9
|
+
# @return [Array] a list of genres
|
10
|
+
#
|
11
|
+
def genres(options = {})
|
12
|
+
get("/genres", :page => page(options))
|
13
|
+
end
|
14
|
+
|
15
|
+
# Requests a particular genre
|
16
|
+
#
|
17
|
+
# @param [Integer] id The genre id
|
18
|
+
#
|
19
|
+
# @return [Genre] the requested genre or nil if not found
|
20
|
+
#
|
21
|
+
def genre(id, options = {})
|
22
|
+
get("/genres/#{Integer(id)}", options)
|
23
|
+
rescue ShufflerFM::NotFound
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ShufflerFM
|
2
|
+
class API
|
3
|
+
# Shuffler.fm API operations over tracks
|
4
|
+
module Tracks
|
5
|
+
# Requests a list of tracks
|
6
|
+
#
|
7
|
+
# @param [Hash] options
|
8
|
+
# @option options [Integer] :page The page to request on paginated operation responses
|
9
|
+
#
|
10
|
+
# @return [Array] a list of tracks
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# tracks = api.tracks #first page
|
14
|
+
# #...
|
15
|
+
# tracks = api.tracks(page: 2)
|
16
|
+
#
|
17
|
+
def tracks(options = {})
|
18
|
+
get("/tracks", :page => page(options))
|
19
|
+
end
|
20
|
+
|
21
|
+
# Requests a particular track
|
22
|
+
#
|
23
|
+
# @param [Integer] id The track id
|
24
|
+
# @return [Track] the requested track or nil if not found
|
25
|
+
#
|
26
|
+
def track(id)
|
27
|
+
get("/tracks/#{Integer(id)}")
|
28
|
+
rescue ShufflerFM::NotFound
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'shuffler_fm/http'
|
2
|
+
require 'shuffler_fm/request'
|
3
|
+
require 'shuffler_fm/errors'
|
4
|
+
|
5
|
+
require 'shuffler_fm/api/blogs'
|
6
|
+
require 'shuffler_fm/api/tracks'
|
7
|
+
require 'shuffler_fm/api/artists'
|
8
|
+
require 'shuffler_fm/api/channels'
|
9
|
+
require 'shuffler_fm/api/charts'
|
10
|
+
require 'shuffler_fm/api/genres'
|
11
|
+
|
12
|
+
module ShufflerFM
|
13
|
+
class API
|
14
|
+
@base_uri = 'http://api.shuffler.fm/'
|
15
|
+
@version = 'v1'
|
16
|
+
|
17
|
+
include ShufflerFM::HTTP
|
18
|
+
include ShufflerFM::Request
|
19
|
+
|
20
|
+
include ShufflerFM::API::Blogs
|
21
|
+
include ShufflerFM::API::Tracks
|
22
|
+
include ShufflerFM::API::Artists
|
23
|
+
include ShufflerFM::API::Channels
|
24
|
+
include ShufflerFM::API::Charts
|
25
|
+
include ShufflerFM::API::Genres
|
26
|
+
|
27
|
+
class << self
|
28
|
+
attr_reader :base_uri, :version
|
29
|
+
end
|
30
|
+
|
31
|
+
# @!attribute [rw] key
|
32
|
+
# The API key
|
33
|
+
#
|
34
|
+
attr_reader :key
|
35
|
+
|
36
|
+
# Creates an API instance
|
37
|
+
#
|
38
|
+
# @param [String] key An api key provided by http://shuffler.fm
|
39
|
+
#
|
40
|
+
# @example get an API instance
|
41
|
+
# api = ShufflerFM::API.new("your-api-key")
|
42
|
+
# api.tracks # gets 1st page of the track list
|
43
|
+
#
|
44
|
+
def initialize(key)
|
45
|
+
raise ArgumentError, 'An API key must be provided' if key.nil?
|
46
|
+
@key = key
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
def page(options)
|
51
|
+
Integer(options.fetch(:page) { 1 })
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module ShufflerFM
|
4
|
+
# Configuration descriptor
|
5
|
+
class Configuration < Hashie::Dash
|
6
|
+
# @!attribute [rw] connection_timeout
|
7
|
+
# The connection timeout in seconds. Defaults to 2.
|
8
|
+
#
|
9
|
+
property :connection_timeout, :required => true, :default => 2
|
10
|
+
# @!attribute [rw] read_timeout
|
11
|
+
# The open/read timeout in seconds. Defaults to 5.
|
12
|
+
#
|
13
|
+
property :read_timeout, :required => true, :default => 5
|
14
|
+
# @!attribute [rw] proxy
|
15
|
+
# The proxy. Is unset by default.
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
# ShufflerFM.configure do |cfg|
|
19
|
+
# cfg.proxy = 'http://192.168.1.1:8080'
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# #or with authentication
|
23
|
+
#
|
24
|
+
# ShufflerFM.configure do |cfg|
|
25
|
+
# cfg.proxy = { uri: 'http://192.168.1.1:8080',
|
26
|
+
# user: 'user',
|
27
|
+
# password: 'passwd' }
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
property :proxy, :default => nil
|
31
|
+
|
32
|
+
def initialize(cfg = {})
|
33
|
+
super(cfg)
|
34
|
+
end
|
35
|
+
|
36
|
+
# The current configuration as an hash
|
37
|
+
#
|
38
|
+
# @return [Hash]
|
39
|
+
#
|
40
|
+
def values
|
41
|
+
to_hash(:symbolize_keys => true)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module ShufflerFM
|
2
|
+
# Root error class
|
3
|
+
class Error < StandardError; end
|
4
|
+
|
5
|
+
# Raised on the advent of a 400 HTTP status code
|
6
|
+
class BadRequest < Error; end
|
7
|
+
|
8
|
+
# Raised on the advent of a 401 HTTP status code
|
9
|
+
class Unauthorized < Error; end
|
10
|
+
|
11
|
+
# Raised on the advent of a 403 HTTP status code
|
12
|
+
class Forbidden < Error; end
|
13
|
+
|
14
|
+
# Raised on the advent of a 404 HTTP status code
|
15
|
+
class NotFound < Error; end
|
16
|
+
|
17
|
+
# Raised on the advent of a 406 HTTP status code
|
18
|
+
class NotAcceptable < Error; end
|
19
|
+
|
20
|
+
# Raised on the advent of a 422 HTTP status code
|
21
|
+
class UnprocessableEntity < Error; end
|
22
|
+
|
23
|
+
# Raised on the advent of a 429 HTTP status code
|
24
|
+
class TooManyRequests < Error; end
|
25
|
+
|
26
|
+
# Raised on the advent of a 500 HTTP status code
|
27
|
+
class InternalServerError < Error; end
|
28
|
+
|
29
|
+
# Raised on the advent of a 501 HTTP status code
|
30
|
+
class NotImplemented < Error; end
|
31
|
+
|
32
|
+
# Raised on the advent of a 502 HTTP status code
|
33
|
+
class BadGateway < Error; end
|
34
|
+
|
35
|
+
# Raised on the advent of a 503 HTTP status code
|
36
|
+
class ServiceUnavailable < Error; end
|
37
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
require 'shuffler_fm/middleware/error_handler'
|
4
|
+
|
5
|
+
module ShufflerFM
|
6
|
+
# @private
|
7
|
+
module HTTP
|
8
|
+
private
|
9
|
+
def connection
|
10
|
+
options = {:url => ShufflerFM::API.base_uri,
|
11
|
+
:params => {'api-key' => key}}.merge(ShufflerFM.configuration.values)
|
12
|
+
|
13
|
+
Faraday.new(options) do |builder|
|
14
|
+
builder.use FaradayMiddleware::Rashify
|
15
|
+
builder.use FaradayMiddleware::ParseJson
|
16
|
+
|
17
|
+
builder.use ShufflerFM::Middleware::ErrorHandler
|
18
|
+
|
19
|
+
builder.adapter Faraday.default_adapter
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
alias :http_connection :connection
|
24
|
+
end
|
25
|
+
end
|