shoutcast-api-client 0.0.1 → 0.0.2

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: 047b193a31dcd4eefe97edc0a15b9a46b93d249f
4
- data.tar.gz: f86bd2588fb027bc6f521ee849c5fe76d6bd5923
3
+ metadata.gz: 5976988c6aa0bc0b1d82bc453876140b4a4fa398
4
+ data.tar.gz: bc73d51e243f914efed4651c89b98992df3c3f64
5
5
  SHA512:
6
- metadata.gz: da627a4b652f19fc276c5a382303fd38ecec1816746a9187f7c54130f0ba836b29d35d02a023c65b68b9ee746e69ab3b0fcacefc4a62221af3e700b942584829
7
- data.tar.gz: e6b65f76c9631c4deafed6f8ce99c606bdda7d1145c8a69fdd042bafad65a9578dce29149f014f6b08d1d6046c384d60e8f93b4a383e7cf55e5777f813770105
6
+ metadata.gz: 56d7dfa5035e2e1403c5285a792d78825d4607d0d3a9b1bbcabff3134828c6f147987a920bdb934805a25946421235de5e4a55531d252e3e95a48df9b68d549f
7
+ data.tar.gz: 00436bb636759e7c64b1191ea170c9dae2220122a6c198b586952b932cf2c5103d7dfe03897fd7e2d399aebfaafceb91d99d52e240642009d4bc612b524a9a06
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ *.gem
@@ -4,5 +4,11 @@ AllCops:
4
4
  Style/FrozenStringLiteralComment:
5
5
  Enabled: false
6
6
 
7
+ Style/BlockDelimiters:
8
+ Enabled: false
9
+
10
+ Metrics/MethodLength:
11
+ Max: 20
12
+
7
13
  Documentation:
8
14
  Enabled: false
@@ -2,4 +2,7 @@ sudo: false
2
2
  language: ruby
3
3
  rvm:
4
4
  - 2.3.0
5
- before_install: gem install bundler -v 1.12.3
5
+ before_install:
6
+ - gem install bundler -v 1.12.3
7
+ after_success:
8
+ - bundle exec codeclimate-test-reporter
@@ -1,4 +1,4 @@
1
- Unreleased ([Changelog](https://github.com/colszowka/simplecov/compare/v0.0.1...master))
1
+ Unreleased ([Changelog](https://github.com/marcferna/shoutcast-api-client/compare/v0.0.2...master))
2
2
  ==========
3
3
  ## Features
4
4
 
@@ -6,6 +6,13 @@ Unreleased ([Changelog](https://github.com/colszowka/simplecov/compare/v0.0.1...
6
6
 
7
7
  ## Bugfixes
8
8
 
9
+ 0.0.2 ([Changelog](https://github.com/marcferna/shoutcast-api-client/compare/v0.0.1...v0.0.2))
10
+ =================
11
+ ## Features
12
+
13
+ * Added Search API interface.
14
+ * Added Searcy by genre API interface.
15
+
9
16
  0.0.1 ([Changelog](https://github.com/marcferna/shoutcast-api-client/compare/25b8f34...v0.0.1))
10
17
  =================
11
18
  ## Features
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # SHOUTcast API Client
2
- [![Build Status](https://travis-ci.org/marcferna/shoutcast-api-client.svg?branch=master)](https://travis-ci.org/marcferna/shoutcast-api-client) [![Code Climate](https://codeclimate.com/github/marcferna/shoutcast-api-client/badges/gpa.svg)](https://codeclimate.com/github/marcferna/shoutcast-api-client) [![Test Coverage](https://codeclimate.com/github/marcferna/shoutcast-api-client/badges/coverage.svg)](https://codeclimate.com/github/marcferna/shoutcast-api-client/coverage) [![Dependency Status](https://gemnasium.com/badges/github.com/marcferna/shoutcast-api-client.svg)](https://gemnasium.com/github.com/marcferna/shoutcast-api-client)
2
+ [![Build Status](https://travis-ci.org/marcferna/shoutcast-api-client.svg?branch=master)](https://travis-ci.org/marcferna/shoutcast-api-client) [![Code Climate](https://codeclimate.com/github/marcferna/shoutcast-api-client/badges/gpa.svg)](https://codeclimate.com/github/marcferna/shoutcast-api-client) [![Test Coverage](https://codeclimate.com/github/marcferna/shoutcast-api-client/badges/coverage.svg)](https://codeclimate.com/github/marcferna/shoutcast-api-client/coverage) [![Dependency Status](https://gemnasium.com/badges/github.com/marcferna/shoutcast-api-client.svg)](https://gemnasium.com/github.com/marcferna/shoutcast-api-client) [![Gem Version](https://badge.fury.io/rb/shoutcast-api-client.svg)](https://badge.fury.io/rb/shoutcast-api-client)
3
3
 
4
4
  :exclamation:**Important - You will need a SHOUTcast API key for this gem to work. You can request one from their [developer website](https://www.shoutcast.com/Developer)**
5
5
 
@@ -16,8 +16,8 @@ progress description you can check the [CHANGELOG.md](CHANGELOG.md)
16
16
  ### Stations
17
17
 
18
18
  - [x] Top 500 (Passing parameters not implemented yet)
19
- - [ ] Keyword Search
20
- - [ ] Stations by Genre
19
+ - [x] Keyword Search
20
+ - [x] Stations by Genre
21
21
  - [ ] Stations by Now Playing Info
22
22
  - [ ] Stations by Bitrate or Codec Type or Genre ID
23
23
  - [ ] Random Stations
@@ -39,16 +39,111 @@ gem 'shoutcast-api-client'
39
39
  ```
40
40
 
41
41
  And then execute:
42
+ ```ruby
43
+ $ bundle
44
+ ```
45
+ Or install it yourself as:
46
+ ```
47
+ $ gem install shoutcast-api-client
48
+ ```
49
+ ## Usage
42
50
 
43
- $ bundle
51
+ ### Initialization
44
52
 
45
- Or install it yourself as:
53
+ First need to initialize the client with your SHOUTcast API key
46
54
 
47
- $ gem install shoutcast-api-client
55
+ ```ruby
56
+ client = Shoutcast::Api::Client.new(key: 'YOUR_API_KEY_GOES_HERE')
57
+ ```
48
58
 
49
- ## Usage
59
+ ### Top 500
60
+ Get top 500 stations on SHOUTcast Radio directory.
61
+ ```ruby
62
+ client.top_500
63
+ ```
64
+
65
+ Returns an array of [Stations](lib/shoutcast/api/station.rb):
66
+ ```ruby
67
+ [
68
+ <Shoutcast::Api::Station:0x007fb3c40361d0 @id="9907", @name=".977 The Hitz Channel-[SHOUTcast.com]", @mt="audio/mpeg", @br="128", @genres=["Pop Rock Top 40"], @ct="The Fray - You Found Me", @lc="4670", @logo=nil>,
69
+ <Shoutcast::Api::Station:0x007fb3c5840b68 @id="120149", @name="HOT FM - Lebih Hangat Daripada Biasa : HOT fm-[SHOUTcast.com]", @mt="audio/mpeg", @br="24", @genres=["Malaysia Malay"], @ct="LELAKI IDAMAN MELLY_GOESLOW ", @lc="3961", @logo=nil>,
70
+ <Shoutcast::Api::Station:0x007fb3c583bf50 @id="1264", @name="S K Y . F M - Absolutely Smooth Jazz - the world's smoothest jazz 24 hours a day-[SHOUTcast.com]", @mt="audio/mpeg", @br="96", @genres=["Soft Smooth Jazz"], @ct="Oli Silk - De-stress Signal", @lc="3507", @logo=nil>,
71
+ <Shoutcast::Api::Station:0x007fb3c583b6b8 @id="6687", @name="Groove Salad: a nicely chilled plate of ambient beats and grooves. [SomaFM]-[SHOUTcast.com]", @mt="audio/mpeg", @br="128", @genres=["Ambient Chill"], @ct="Verbrilli Sound - Descender", @lc="2680", @logo=nil>,
72
+ <Shoutcast::Api::Station:0x007fb3c583ae70 @id="6803", @name=".977 The 80s Channel-[SHOUTcast.com]", @mt="audio/mpeg", @br="128", @genres=["80s Pop Rock"], @ct="Starship - Nothing`s gonna stop us now (1987)", @lc="2192", @logo=nil>,
73
+ <Shoutcast::Api::Station:0x007fb3c583a588 @id="5516", @name="The Alex Jones Show-[SHOUTcast.com]", @mt="audio/mpeg", @br="32", @genres=["Talk"], @ct="Refeed: Hour 1 (Listen by phone 512-646-5000)", @lc="1987", @logo=nil>
74
+ ]
75
+ ```
76
+
77
+
78
+ ### Station Search
79
+ Get stations which match the keyword searched on SHOUTcast Radio Directory.
80
+ ```ruby
81
+ client.search(
82
+ keyword: 'SEARCH_KEYWORD',
83
+ limit: PAGE_COUNT_LIMIT,
84
+ offset: PAGE_OFFSET,
85
+ bitrate: STATION_BITRATE,
86
+ media_type: 'STATION_MEDIA_TYPE'
87
+ )
88
+ ```
50
89
 
51
- TODO: Write usage instructions here
90
+ #### Parameters
91
+ `keyword`: The keyword to search stations for. Matches on Station Name, Now Playing info and Genre.
92
+
93
+ `limit`: The number of results to be returned by page.
94
+
95
+ `offset`: Specifies the number of the first station to return in the results.
96
+
97
+ `bitrate`: Station bitrate to search for. Ex: "128", "96".
98
+
99
+ `media_type`: The media type to search for. Ex: "audio/mpeg" or "audio/aacp"
100
+
101
+ Returns an array of [Stations](lib/shoutcast/api/station.rb):
102
+ ```ruby
103
+ [
104
+ <Shoutcast::Api::Station:0x007fb3c40361d0 @id="9907", @name=".977 The Hitz Channel-[SHOUTcast.com]", @mt="audio/mpeg", @br="128", @genres=["Pop Rock Top 40"], @ct="The Fray - You Found Me", @lc="4670", @logo=nil>,
105
+ <Shoutcast::Api::Station:0x007fb3c5840b68 @id="120149", @name="HOT FM - Lebih Hangat Daripada Biasa : HOT fm-[SHOUTcast.com]", @mt="audio/mpeg", @br="24", @genres=["Malaysia Malay"], @ct="LELAKI IDAMAN MELLY_GOESLOW ", @lc="3961", @logo=nil>,
106
+ <Shoutcast::Api::Station:0x007fb3c583bf50 @id="1264", @name="S K Y . F M - Absolutely Smooth Jazz - the world's smoothest jazz 24 hours a day-[SHOUTcast.com]", @mt="audio/mpeg", @br="96", @genres=["Soft Smooth Jazz"], @ct="Oli Silk - De-stress Signal", @lc="3507", @logo=nil>,
107
+ <Shoutcast::Api::Station:0x007fb3c583b6b8 @id="6687", @name="Groove Salad: a nicely chilled plate of ambient beats and grooves. [SomaFM]-[SHOUTcast.com]", @mt="audio/mpeg", @br="128", @genres=["Ambient Chill"], @ct="Verbrilli Sound - Descender", @lc="2680", @logo=nil>,
108
+ <Shoutcast::Api::Station:0x007fb3c583ae70 @id="6803", @name=".977 The 80s Channel-[SHOUTcast.com]", @mt="audio/mpeg", @br="128", @genres=["80s Pop Rock"], @ct="Starship - Nothing`s gonna stop us now (1987)", @lc="2192", @logo=nil>,
109
+ <Shoutcast::Api::Station:0x007fb3c583a588 @id="5516", @name="The Alex Jones Show-[SHOUTcast.com]", @mt="audio/mpeg", @br="32", @genres=["Talk"], @ct="Refeed: Hour 1 (Listen by phone 512-646-5000)", @lc="1987", @logo=nil>
110
+ ]
111
+ ```
112
+
113
+ ### Station Search By Genre
114
+ Get stations which match the genre specified as query.
115
+ ```ruby
116
+ client.search(
117
+ genre: 'GENRE_TO_SEARCH',
118
+ limit: PAGE_COUNT_LIMIT,
119
+ offset: PAGE_OFFSET,
120
+ bitrate: STATION_BITRATE,
121
+ media_type: 'STATION_MEDIA_TYPE'
122
+ )
123
+ ```
124
+
125
+ #### Parameters
126
+ `genre`: The genre to search stations for.
127
+
128
+ `limit`: The number of results to be returned by page.
129
+
130
+ `offset`: Specifies the number of the first station to return in the results.
131
+
132
+ `bitrate`: Station bitrate to search for. Ex: "128", "96".
133
+
134
+ `media_type`: The media type to search for. Ex: "audio/mpeg" or "audio/aacp"
135
+
136
+ Returns an array of [Stations](lib/shoutcast/api/station.rb):
137
+ ```ruby
138
+ [
139
+ <Shoutcast::Api::Station:0x007fb3c40361d0 @id="9907", @name=".977 The Hitz Channel-[SHOUTcast.com]", @mt="audio/mpeg", @br="128", @genres=["Pop Rock Top 40"], @ct="The Fray - You Found Me", @lc="4670", @logo=nil>,
140
+ <Shoutcast::Api::Station:0x007fb3c5840b68 @id="120149", @name="HOT FM - Lebih Hangat Daripada Biasa : HOT fm-[SHOUTcast.com]", @mt="audio/mpeg", @br="24", @genres=["Malaysia Malay"], @ct="LELAKI IDAMAN MELLY_GOESLOW ", @lc="3961", @logo=nil>,
141
+ <Shoutcast::Api::Station:0x007fb3c583bf50 @id="1264", @name="S K Y . F M - Absolutely Smooth Jazz - the world's smoothest jazz 24 hours a day-[SHOUTcast.com]", @mt="audio/mpeg", @br="96", @genres=["Soft Smooth Jazz"], @ct="Oli Silk - De-stress Signal", @lc="3507", @logo=nil>,
142
+ <Shoutcast::Api::Station:0x007fb3c583b6b8 @id="6687", @name="Groove Salad: a nicely chilled plate of ambient beats and grooves. [SomaFM]-[SHOUTcast.com]", @mt="audio/mpeg", @br="128", @genres=["Ambient Chill"], @ct="Verbrilli Sound - Descender", @lc="2680", @logo=nil>,
143
+ <Shoutcast::Api::Station:0x007fb3c583ae70 @id="6803", @name=".977 The 80s Channel-[SHOUTcast.com]", @mt="audio/mpeg", @br="128", @genres=["80s Pop Rock"], @ct="Starship - Nothing`s gonna stop us now (1987)", @lc="2192", @logo=nil>,
144
+ <Shoutcast::Api::Station:0x007fb3c583a588 @id="5516", @name="The Alex Jones Show-[SHOUTcast.com]", @mt="audio/mpeg", @br="32", @genres=["Talk"], @ct="Refeed: Hour 1 (Listen by phone 512-646-5000)", @lc="1987", @logo=nil>
145
+ ]
146
+ ```
52
147
 
53
148
  ## Contributing
54
149
 
@@ -1,6 +1,7 @@
1
1
  require 'shoutcast/api/version'
2
2
  require 'shoutcast/api/client'
3
3
  require 'shoutcast/api/station'
4
+ require 'shoutcast/api/url'
4
5
 
5
6
  module Shoutcast
6
7
  module Api
@@ -9,22 +9,81 @@ module Shoutcast
9
9
  end
10
10
 
11
11
  def top_500
12
- response = RestClient.get url('/legacy/Top500')
13
- Nori.new.parse(response)['stationlist']['station'].map do |attributes|
14
- Shoutcast::Api::Station.parse(attributes)
15
- end
12
+ response = RestClient.get(
13
+ url(path: '/legacy/Top500')
14
+ )
15
+ parse_stations(response)
16
+ end
17
+
18
+ def search(
19
+ keyword:,
20
+ limit: nil,
21
+ offset: nil,
22
+ bitrate: nil,
23
+ media_type: nil
24
+ )
25
+ response = RestClient.get(
26
+ url(
27
+ path: '/legacy/stationsearch',
28
+ parameters: {
29
+ search: keyword,
30
+ limit: build_limit_parameter(limit: limit, offset: offset),
31
+ br: bitrate,
32
+ mt: media_type
33
+ }
34
+ )
35
+ )
36
+ parse_stations(response)
37
+ end
38
+
39
+ def genre_search(
40
+ genre:,
41
+ limit: nil,
42
+ offset: nil,
43
+ bitrate: nil,
44
+ media_type: nil
45
+ )
46
+ response = RestClient.get(
47
+ url(
48
+ path: '/legacy/genresearch',
49
+ parameters: {
50
+ genre: genre,
51
+ limit: build_limit_parameter(limit: limit, offset: offset),
52
+ br: bitrate,
53
+ mt: media_type
54
+ }
55
+ )
56
+ )
57
+ parse_stations(response)
16
58
  end
17
59
 
18
60
  private
19
61
 
20
62
  attr_accessor :key
21
63
 
22
- def base_url
23
- 'http://api.shoutcast.com'
64
+ def url(path:, parameters: {})
65
+ Shoutcast::Api::Url.new(
66
+ path: path,
67
+ key: key,
68
+ parameters: parameters
69
+ ).to_s
70
+ end
71
+
72
+ def parse_stations(response)
73
+ return [] if response.nil?
74
+ parsed_response = Nori.new.parse(response)
75
+ return [] if parsed_response['stationlist'].nil?
76
+ return [] if parsed_response['stationlist']['station'].nil?
77
+ Nori.new.parse(response)['stationlist']['station'].map do |attributes|
78
+ Shoutcast::Api::Station.parse(attributes)
79
+ end
24
80
  end
25
81
 
26
- def url(path)
27
- "#{base_url}#{path}?k=#{key}"
82
+ def build_limit_parameter(limit: nil, offset: nil)
83
+ return nil if limit.nil?
84
+ parameter = limit.to_s
85
+ parameter += ",#{offset}" unless offset.nil?
86
+ parameter
28
87
  end
29
88
  end
30
89
  end
@@ -0,0 +1,41 @@
1
+ module Shoutcast
2
+ module Api
3
+ class Url
4
+ def initialize(path:, key:, parameters: {})
5
+ @path = path
6
+ @parameters = { k: key }
7
+ @parameters.merge!(parameters) unless parameters.nil?
8
+ @parameters.delete_if { |_, value| value.nil? }
9
+ end
10
+
11
+ def to_s
12
+ URI::HTTP.build(
13
+ host: base_uri.host,
14
+ path: base_uri.path,
15
+ query: parameters_query
16
+ ).to_s
17
+ end
18
+
19
+ private
20
+
21
+ attr_accessor :path, :parameters
22
+
23
+ def scheme
24
+ 'http'
25
+ end
26
+
27
+ def host
28
+ 'api.shoutcast.com'
29
+ end
30
+
31
+ def base_uri
32
+ @base_uri ||= URI.join("#{scheme}://#{host}", path)
33
+ end
34
+
35
+ def parameters_query
36
+ return '' if parameters.empty?
37
+ URI.encode_www_form(parameters)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,5 +1,5 @@
1
1
  module Shoutcast
2
2
  module Api
3
- VERSION = '0.0.1'.freeze
3
+ VERSION = '0.0.2'.freeze
4
4
  end
5
5
  end
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  # 'allowed_push_host' to allow pushing to a single host or delete this section
19
19
  # to allow pushing to any host.
20
20
  if spec.respond_to?(:metadata)
21
- spec.metadata['allowed_push_host'] = "https://rubygems.org"
21
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
22
22
  else
23
23
  raise 'RubyGems 2.0 or newer is required to protect against public gem '\
24
24
  'pushes.'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shoutcast-api-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marc Fernandez
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-14 00:00:00.000000000 Z
11
+ date: 2017-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -172,6 +172,7 @@ files:
172
172
  - lib/shoutcast/api.rb
173
173
  - lib/shoutcast/api/client.rb
174
174
  - lib/shoutcast/api/station.rb
175
+ - lib/shoutcast/api/url.rb
175
176
  - lib/shoutcast/api/version.rb
176
177
  - shoutcast-api-client.gemspec
177
178
  homepage: https://github.com/marcferna/shoutcast-api-client