shuffler_fm 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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 [![Build Status](https://secure.travis-ci.org/mguinada/shuffler_fm.png?branch=master)](http://travis-ci.org/mguinada/shuffler_fm) [![Code Climate](https://codeclimate.com/badge.png)](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
|