claudiob-yesradio 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.
- data/.gitignore +2 -0
- data/README.md +50 -5
- data/VERSION +1 -1
- data/features/step_definitions/yesradio_steps.rb +17 -0
- data/features/yesradio.feature +13 -8
- data/lib/item.rb +36 -0
- data/lib/main.rb +4 -21
- data/lib/song.rb +8 -14
- data/lib/station.rb +6 -13
- data/lib/yesradio.rb +112 -85
- data/yesradio.gemspec +2 -2
- metadata +2 -2
- data/lib/stations_search_criteria.rb +0 -33
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -5,18 +5,63 @@ Ruby gem to access Yes.com API
|
|
5
5
|
<a name="rubygem_install" />
|
6
6
|
## Installation ##
|
7
7
|
|
8
|
-
sudo gem install yesradio -s http://gems.github.com
|
8
|
+
sudo gem install claudiob-yesradio -s http://gems.github.com
|
9
|
+
|
10
|
+
## Documentation ##
|
11
|
+
|
12
|
+
http://rdoc.info/projects/claudiob/yesradio
|
9
13
|
|
10
14
|
## Examples ##
|
11
15
|
|
12
16
|
### To show a list of 'Rock' stations ###
|
13
17
|
|
14
18
|
require 'yesradio'
|
15
|
-
|
16
|
-
query.match = "KWOF"
|
17
|
-
result = Yesradio::search_stations query
|
19
|
+
Yesradio::search_stations :match => "Rock"
|
18
20
|
|
19
21
|
### To show details of 'WFNX' radio ###
|
20
22
|
|
21
23
|
require 'yesradio'
|
22
|
-
Yesradio::
|
24
|
+
Yesradio::get_station "WFNX"
|
25
|
+
|
26
|
+
### To show log of tracks played on 'WFNX' radio ###
|
27
|
+
|
28
|
+
require 'yesradio'
|
29
|
+
Yesradio::get_log "WFNX"
|
30
|
+
|
31
|
+
### To show recent tracks played on 'WFNX' radio ###
|
32
|
+
|
33
|
+
require 'yesradio'
|
34
|
+
Yesradio::get_recent "WFNX"
|
35
|
+
|
36
|
+
### To show a chart of popular Rock songs ###
|
37
|
+
|
38
|
+
require 'yesradio'
|
39
|
+
Yesradio::get_chart :genre => "Rock"
|
40
|
+
|
41
|
+
### To show a list of songs by artist Rihanna ###
|
42
|
+
|
43
|
+
require 'yesradio'
|
44
|
+
Yesradio::get_media :aid => 610471
|
45
|
+
|
46
|
+
### To show a list of songs related to Umbrella (Rihanna) ###
|
47
|
+
|
48
|
+
require 'yesradio'
|
49
|
+
Yesradio::get_related :mid => 11586843
|
50
|
+
|
51
|
+
|
52
|
+
## History ##
|
53
|
+
|
54
|
+
v0.0.2 2009/09/15
|
55
|
+
Added support for actions: chart, media, related.
|
56
|
+
Added documentation through RDoc.
|
57
|
+
Added cucumber features for listing stations.
|
58
|
+
|
59
|
+
v0.0.1 2009/09/15
|
60
|
+
Added support for actions: log, recent.
|
61
|
+
|
62
|
+
v0.0.0 2009/09/14
|
63
|
+
Added support for actions: station, stations
|
64
|
+
|
65
|
+
## Copyright ##
|
66
|
+
|
67
|
+
Copyright (c) 2009 Claudio Baccigalupo. See LICENSE for details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Given /^nothing$/ do
|
2
|
+
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I look for ([0-9]+) stations called "([^\"]*)"$/ do |max, match|
|
6
|
+
@stations = Yesradio::search_stations :match => match, :max => max
|
7
|
+
end
|
8
|
+
|
9
|
+
Then /^I should see a radio with name "([^\"]*)" and market "([^\"]*)"$/ do |name, market|
|
10
|
+
@stations.collect do |station|
|
11
|
+
station.name == name && station.market == market
|
12
|
+
end.inject{ |sum, el| sum || el }.should be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
Then /^I should see nothing$/ do
|
16
|
+
@stations.should be_nil
|
17
|
+
end
|
data/features/yesradio.feature
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
-
Feature:
|
2
|
-
In order to
|
3
|
-
|
4
|
-
|
1
|
+
Feature: Call Yes.com API using Ruby
|
2
|
+
In order to retrieve Yes.com data in Ruby code
|
3
|
+
programmers
|
4
|
+
want a Ruby interface to Yes.com API
|
5
5
|
|
6
|
-
Scenario:
|
7
|
-
Given
|
8
|
-
When I
|
9
|
-
Then
|
6
|
+
Scenario: List Stations
|
7
|
+
Given nothing
|
8
|
+
When I look for 10 stations called "KEXP"
|
9
|
+
Then I should see a radio with name "KEXP" and market "Seattle - Tacoma, WA"
|
10
|
+
|
11
|
+
Scenario: List Stations Empty
|
12
|
+
Given nothing
|
13
|
+
When I look for 10 stations called "ABCDEFGH"
|
14
|
+
Then I should see nothing
|
data/lib/item.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# Author:: Claudio Baccigalupo
|
2
|
+
# Copyright:: Copyright (c) 2009 - see LICENSE file
|
3
|
+
|
4
|
+
require 'date'
|
5
|
+
|
6
|
+
module Yesradio
|
7
|
+
class Item
|
8
|
+
class << self
|
9
|
+
attr_accessor :elements
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(element = nil)
|
13
|
+
self.class.elements.each do |name, type|
|
14
|
+
new_value = get_element_child element, name.gsub('_', '/'), type
|
15
|
+
self.instance_variable_set("@#{name}", new_value) unless new_value.nil?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def get_element_child(element, child, type = :text)
|
22
|
+
return if element.nil? || element.elements[child].nil?
|
23
|
+
child = element.elements[child][0].to_s
|
24
|
+
return case type
|
25
|
+
when :int then child.to_i
|
26
|
+
when :float then child.to_f
|
27
|
+
when :datetime then DateTime.parse(child)
|
28
|
+
else child
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
data/lib/main.rb
CHANGED
@@ -1,24 +1,7 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# 2009 Claudio Baccigalupo
|
4
|
-
#
|
5
|
-
# Licensed under the Ruby License
|
6
|
-
#
|
7
|
-
#=============================================================================
|
1
|
+
# Author:: Claudio Baccigalupo
|
2
|
+
# Copyright:: Copyright (c) 2009 - see LICENSE file
|
8
3
|
|
9
4
|
require 'yesradio'
|
10
5
|
|
11
|
-
#
|
12
|
-
|
13
|
-
query.match = "KWOF"
|
14
|
-
stations = Yesradio::search_stations query
|
15
|
-
p stations
|
16
|
-
|
17
|
-
# get the details of a radio station
|
18
|
-
Yesradio::match_station "WFNX"
|
19
|
-
|
20
|
-
# get the log of songs played on a radio
|
21
|
-
Yesradio::get_log "KEXP"
|
22
|
-
|
23
|
-
# get the recent songs played on a radio
|
24
|
-
Yesradio::get_recent "KEXP"
|
6
|
+
# TODO: a file that prompts the user for the action to take
|
7
|
+
# and the parameters, and returns the result (as a shell command)
|
data/lib/song.rb
CHANGED
@@ -1,20 +1,14 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# 2009 Claudio Baccigalupo
|
4
|
-
#
|
5
|
-
# Licensed under the Ruby License
|
6
|
-
#
|
7
|
-
#=============================================================================
|
1
|
+
# Author:: Claudio Baccigalupo
|
2
|
+
# Copyright:: Copyright (c) 2009 - see LICENSE file
|
8
3
|
|
4
|
+
require 'item'
|
9
5
|
module Yesradio
|
10
|
-
class Song
|
11
|
-
|
6
|
+
class Song < Item
|
7
|
+
@elements = {'at' => :datetime, 'by' => :text, 'title' => :text,
|
12
8
|
'id' => :int, 'type' => :text, 'rank' => :int,
|
13
|
-
'cover' => :text, 'video' => :text, '
|
14
|
-
|
15
|
-
|
16
|
-
@@elements
|
17
|
-
end
|
9
|
+
'cover' => :text, 'video' => :text, 'link' => :text,
|
10
|
+
'ago' => :int}
|
11
|
+
attr_accessor *@elements.keys
|
18
12
|
end
|
19
13
|
end
|
20
14
|
|
data/lib/station.rb
CHANGED
@@ -1,22 +1,15 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# 2009 Claudio Baccigalupo
|
4
|
-
#
|
5
|
-
# Licensed under the Ruby License
|
6
|
-
#
|
7
|
-
#=============================================================================
|
1
|
+
# Author:: Claudio Baccigalupo
|
2
|
+
# Copyright:: Copyright (c) 2009 - see LICENSE file
|
8
3
|
|
4
|
+
require 'item'
|
9
5
|
module Yesradio
|
10
|
-
class Station
|
11
|
-
|
6
|
+
class Station < Item
|
7
|
+
@elements = {'name' => :text, 'desc' => :text, 'genre' => :text,
|
12
8
|
'market' => :text, 'type' => :text, 'id' => :int,
|
13
9
|
'tz' => :text, 'stream' => :text, 'yes' => :text,
|
14
10
|
'relay' => :text, 'audiostream' => :text, 'array_id' => :int,
|
15
11
|
'array_song' => :text, 'array_artist' => :text}
|
16
|
-
attr_accessor
|
17
|
-
def elements
|
18
|
-
@@elements
|
19
|
-
end
|
12
|
+
attr_accessor *@elements.keys
|
20
13
|
end
|
21
14
|
end
|
22
15
|
|
data/lib/yesradio.rb
CHANGED
@@ -1,15 +1,9 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# 2009 Claudio Baccigalupo
|
4
|
-
#
|
5
|
-
# Licensed under the Ruby License
|
6
|
-
#
|
7
|
-
#=============================================================================
|
1
|
+
# Author:: Claudio Baccigalupo
|
2
|
+
# Copyright:: Copyright (c) 2009 - see LICENSE file
|
8
3
|
|
9
4
|
require 'cgi'
|
10
5
|
require 'net/http'
|
11
6
|
require 'rexml/document'
|
12
|
-
require 'date'
|
13
7
|
|
14
8
|
require 'station'
|
15
9
|
require 'stations_search_criteria'
|
@@ -20,103 +14,136 @@ module Yesradio
|
|
20
14
|
YESRADIO_VERSION = 1
|
21
15
|
YESRADIO_SERVER = "http://api.yes.com/#{YESRADIO_VERSION}"
|
22
16
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
17
|
+
# Get current information about a single station including now playing song,
|
18
|
+
# slogan, frequency, market, and links to any known webcast stream or site.
|
19
|
+
#
|
20
|
+
# == Parameters
|
21
|
+
# [+name+] The station name (for AM/FM it is just the call letters).
|
22
|
+
#
|
23
|
+
# == Examples
|
24
|
+
# get_station :name => "KEXP"
|
25
|
+
#--
|
26
|
+
def self.get_station(query_hash)
|
27
|
+
array = self.search('Station', "station", "//api", query_hash)
|
28
|
+
array[0] unless array.nil? || array[0].name.nil?
|
30
29
|
end
|
31
30
|
|
32
|
-
#
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
31
|
+
# Search and find a list of stations by name, frequency, genre, artist,
|
32
|
+
# or location.
|
33
|
+
#
|
34
|
+
# == Parameters
|
35
|
+
# [+match+] [optional] Used to search station names, call letters, slogans, frequency, or cities/states.
|
36
|
+
# [+freq+] [optional] Also match an exact AM/FM frequency.
|
37
|
+
# [+mid+] [optional] Also match only stations that have this media id (see #media call) in their top 100 charts.
|
38
|
+
# [+genre+] [optional] Also match any genre keywords like pop, rock, etc.
|
39
|
+
# [+loc+] [optional] Also match stations within 60 miles of the given zip code, "lat,lon", or city/state names.
|
40
|
+
# [+max+] [optional] Defaults to 10 stations returned.
|
41
|
+
#
|
42
|
+
# == Examples
|
43
|
+
# search_stations :match => "KEX"
|
44
|
+
#--
|
45
|
+
def self.search_stations(query_hash)
|
46
|
+
self.search('Station', "stations", "//api/array/stations", query_hash)
|
40
47
|
end
|
41
48
|
|
42
|
-
|
43
|
-
|
49
|
+
# Get the log of all the songs played on the given station in a selected day
|
50
|
+
# within the last week.
|
51
|
+
#
|
52
|
+
# == Parameters
|
53
|
+
# [+name+] The station name.
|
54
|
+
# [+ago+] [optional] The days ago from now for the given date you want, an integer from 0-6 and defaults to 0 (the log today so far).
|
55
|
+
#
|
56
|
+
# == Examples
|
57
|
+
# get_log :name => "KEXP", :ago => 3
|
58
|
+
#--
|
59
|
+
def self.get_log(query_hash)
|
60
|
+
self.search('Song', "log", "//api/array/songs", query_hash)
|
61
|
+
end
|
44
62
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
stations
|
63
|
+
# Get the most recent songs played on any station.
|
64
|
+
#
|
65
|
+
# == Parameters
|
66
|
+
# [+name+] The station name.
|
67
|
+
# [+max+] How many recent songs to return (default is 10).
|
68
|
+
#
|
69
|
+
# == Examples
|
70
|
+
# get_recent :name => "KEXP", :max => 3
|
71
|
+
#--
|
72
|
+
def self.get_recent(query_hash)
|
73
|
+
self.search('Song', "recent", "//api/array/songs", query_hash)
|
57
74
|
end
|
58
75
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
76
|
+
# Get the current top 100 songs for any station based on number of times
|
77
|
+
# played and user voting (calculated daily).
|
78
|
+
#
|
79
|
+
# == Parameters
|
80
|
+
# [+name+] [optional] The station name, defaults to US national top 100 if none given.
|
81
|
+
# [+date+] [optional] Return just the charts from a specific date in the format year-mm-dd (April 2008 and newer).
|
82
|
+
# [+genre+] [optional] Filter any request to a specific Genre ( Americana Blues Christian Classical Country Electronica Hip-Hop Jazz Latin Metal New Age Pop Punk R&B/Soul Rock Smooth Jazz World ).
|
83
|
+
# [+hot+] [optional] Alternative sorting, must be either "fresh" (by most increase in charts day-to-day, not supported in combination with date field) or "vote" (most votes via yes.com).
|
84
|
+
# [+max+] How many songs to return (default is 10).
|
85
|
+
#
|
86
|
+
# == Examples
|
87
|
+
# get_chart :genre => "Rock"
|
88
|
+
#--
|
89
|
+
def self.get_chart(query_hash)
|
90
|
+
self.search('Song', "chart", "//api/array/songs", query_hash)
|
69
91
|
end
|
70
92
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
songs
|
93
|
+
# Get a list of any matching artist names or song titles based on airtime
|
94
|
+
# popularity.
|
95
|
+
#
|
96
|
+
# == Parameters
|
97
|
+
# [+q+] The string to search with, can be partial (used for autocomplete) or full names.
|
98
|
+
# [+aid+] [optional] Instead of a general query, a known Artist ID can be passed to return just media from that artist.
|
99
|
+
# [+mid+] [optional] Instead of a general query, a known Media ID can be passed to return extra information (lyrics from Lyric Wiki and matching videos from YouTube and MTV) about just that song.
|
100
|
+
# [+max+] How many songs to return (default is 10, max is 50).
|
101
|
+
#
|
102
|
+
# == Examples
|
103
|
+
# get_media :aid => 610471
|
104
|
+
#--
|
105
|
+
# Run test with http://api.yes.com/1/media?mid=12812281&type=xml
|
106
|
+
# which returns an XML error (Yes.com's fault)
|
107
|
+
def self.get_media(query_hash)
|
108
|
+
self.search('Song', "media", "//api/array/songs", query_hash)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Given a song, return a list of related songs based on airtime in the last
|
112
|
+
# week.
|
113
|
+
#
|
114
|
+
# == Parameters
|
115
|
+
# [+mid+] The media ID (use media call to search for IDs).
|
116
|
+
# [+max+] Maximum number of related songs to return (default is 20).
|
117
|
+
#
|
118
|
+
# == Examples
|
119
|
+
# get_related :mid => 11586843
|
120
|
+
#--
|
121
|
+
def self.get_related(query_hash)
|
122
|
+
self.search('Song', "related", "//api/array/songs", query_hash)
|
87
123
|
end
|
88
124
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
url =
|
93
|
-
url = url + "&name=" + CGI::escape(station_name)
|
94
|
-
url = url + "&max=" + CGI::escape(max.to_s) unless max.nil?
|
125
|
+
protected
|
126
|
+
|
127
|
+
def self.search(item_class, action, xml_element, query_hash)
|
128
|
+
url = create_url(action, query_hash)
|
95
129
|
uri = URI.parse(url)
|
96
130
|
req = Net::HTTP::Get.new(uri.path + '?' + uri.query)
|
97
131
|
res = Net::HTTP.start(uri.host, uri.port) { |http|
|
98
132
|
http.request(req)
|
99
133
|
}
|
100
134
|
doc = REXML::Document.new res.body
|
101
|
-
doc.elements.
|
102
|
-
|
135
|
+
return if doc.elements[xml_element].nil?
|
136
|
+
doc.elements.collect(xml_element) do |element|
|
137
|
+
eval "#{item_class}.new(element)"
|
103
138
|
end
|
104
|
-
songs
|
105
139
|
end
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
child = element.elements[child][0].to_s
|
112
|
-
return case type
|
113
|
-
when :int then child.to_i
|
114
|
-
when :float then child.to_f
|
115
|
-
when :datetime then DateTime.parse(child)
|
116
|
-
else child
|
140
|
+
|
141
|
+
def self.create_url(action, query_hash)
|
142
|
+
url = Yesradio::YESRADIO_SERVER + "/#{action}?type=xml"
|
143
|
+
query_hash.each do |name, value|
|
144
|
+
url = url + "&#{name}=" + CGI::escape(value.to_s) unless value.nil?
|
117
145
|
end
|
118
|
-
|
146
|
+
url
|
119
147
|
end
|
120
148
|
|
121
149
|
end
|
122
|
-
|
data/yesradio.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{yesradio}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Claudio Baccigalupo"]
|
@@ -25,10 +25,10 @@ Gem::Specification.new do |s|
|
|
25
25
|
"features/step_definitions/yesradio_steps.rb",
|
26
26
|
"features/support/env.rb",
|
27
27
|
"features/yesradio.feature",
|
28
|
+
"lib/item.rb",
|
28
29
|
"lib/main.rb",
|
29
30
|
"lib/song.rb",
|
30
31
|
"lib/station.rb",
|
31
|
-
"lib/stations_search_criteria.rb",
|
32
32
|
"lib/yesradio.rb",
|
33
33
|
"test/test_helper.rb",
|
34
34
|
"test/yesradio_test.rb",
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: claudiob-yesradio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Claudio Baccigalupo
|
@@ -40,10 +40,10 @@ files:
|
|
40
40
|
- features/step_definitions/yesradio_steps.rb
|
41
41
|
- features/support/env.rb
|
42
42
|
- features/yesradio.feature
|
43
|
+
- lib/item.rb
|
43
44
|
- lib/main.rb
|
44
45
|
- lib/song.rb
|
45
46
|
- lib/station.rb
|
46
|
-
- lib/stations_search_criteria.rb
|
47
47
|
- lib/yesradio.rb
|
48
48
|
- test/test_helper.rb
|
49
49
|
- test/yesradio_test.rb
|
@@ -1,33 +0,0 @@
|
|
1
|
-
#=============================================================================
|
2
|
-
#
|
3
|
-
# 2009 Claudio Baccigalupo
|
4
|
-
#
|
5
|
-
# Licensed under the Ruby License
|
6
|
-
#
|
7
|
-
#=============================================================================
|
8
|
-
|
9
|
-
module Yesradio
|
10
|
-
class StationsSearchCriteria
|
11
|
-
|
12
|
-
attr_accessor :match, :freq, :mid, :genre, :loc, :max
|
13
|
-
|
14
|
-
def initialize(options = {})
|
15
|
-
options.each do |key, value|
|
16
|
-
eval("@#{key} = '#{value.to_s}'")
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def to_query_params_string
|
21
|
-
url = ''
|
22
|
-
url = url + "&match=" + CGI::escape(@match) if !@match.nil?
|
23
|
-
url = url + "&freq=" + CGI::escape(@freq) if !@freq.nil?
|
24
|
-
url = url + "&mid=" + CGI::escape(@mid.to_s) if !@mid.nil?
|
25
|
-
url = url + "&genre=" + CGI::escape(@genre) if !@genre.nil?
|
26
|
-
url = url + "&loc=" + CGI::escape(@loc) if !@loc.nil?
|
27
|
-
url = url + "&max=" + CGI::escape(@max.to_s) if !@max.nil?
|
28
|
-
url
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
|