firstfm 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +23 -0
- data/lib/firstfm/event.rb +39 -0
- data/lib/firstfm/geo.rb +28 -0
- data/lib/firstfm/location.rb +22 -0
- data/lib/firstfm/venue.rb +52 -0
- data/lib/firstfm.rb +14 -0
- data/test/test_helper.rb +4 -0
- data/test/unit/geo_test.rb +32 -0
- data/test/unit/venue_test.rb +54 -0
- metadata +96 -0
data/README.rdoc
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
=Firstfm
|
2
|
+
|
3
|
+
Firstfm is a ruby wrapper for the Last.fm APIs ( http://www.last.fm/api ).
|
4
|
+
|
5
|
+
My main focus is to import events from Last.FM, but with time I will try to add support for all API methods.
|
6
|
+
|
7
|
+
== Installation
|
8
|
+
|
9
|
+
sudo gem install firstfm
|
10
|
+
|
11
|
+
create a ~/.firstfm file with this content
|
12
|
+
|
13
|
+
api_key: YOUR_API_KEY
|
14
|
+
|
15
|
+
== Usage
|
16
|
+
|
17
|
+
Firstfm::Venue.search("arena")
|
18
|
+
|
19
|
+
Firstfm::Venue.get_events(8908030)
|
20
|
+
|
21
|
+
Firstfm::Geo.get_events :location => "Berlin"
|
22
|
+
|
23
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Firstfm
|
2
|
+
|
3
|
+
class Event
|
4
|
+
|
5
|
+
attr_accessor :id, :title, :url, :venue, :tag, :description, :attendance, :website, :start_date, :reviews, :artists, :headliner, :tags, :images
|
6
|
+
|
7
|
+
def self.init_events_from_hash(hash)
|
8
|
+
return [] unless hash["events"] && hash["events"]["event"]
|
9
|
+
return [init_event_from_hash(hash["events"]["event"])] if hash["events"]["event"].is_a?(Hash)
|
10
|
+
|
11
|
+
hash["events"]["event"].inject([]) do |arr, venue_hash|
|
12
|
+
arr << init_event_from_hash(venue_hash)
|
13
|
+
arr
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.init_event_from_hash(hash)
|
18
|
+
return nil unless hash.is_a?(Hash)
|
19
|
+
event = Event.new
|
20
|
+
event.id = hash["id"]
|
21
|
+
event.title = hash["title"]
|
22
|
+
event.url = hash["url"]
|
23
|
+
event.tag = hash["tag"]
|
24
|
+
event.venue = Venue.init_venue_from_hash(hash["venue"])
|
25
|
+
event.description = hash["description"]
|
26
|
+
event.attendance = hash["attendance"]
|
27
|
+
event.reviews = hash["reviews"]
|
28
|
+
event.website = hash["website"]
|
29
|
+
event.start_date = hash['startDate']
|
30
|
+
event.artists = hash['artists']['artist'] if hash['artists']
|
31
|
+
event.headliner = hash['artists']['headliner'] if hash['artists']
|
32
|
+
event.tags = hash["tags"]["tag"] if hash["tags"]
|
33
|
+
event.images = hash["image"]
|
34
|
+
event
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
data/lib/firstfm/geo.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module Firstfm
|
2
|
+
|
3
|
+
class Geo
|
4
|
+
|
5
|
+
include HTTParty
|
6
|
+
base_uri 'ws.audioscrobbler.com'
|
7
|
+
format :xml
|
8
|
+
|
9
|
+
def self.get_events(params = {})
|
10
|
+
location = params.delete(:location)
|
11
|
+
lat = params.delete(:lat)
|
12
|
+
lng = params.delete(:lng)
|
13
|
+
page = params.delete(:page) || 1
|
14
|
+
distance = params.delete(:distance)
|
15
|
+
|
16
|
+
response = get("/2.0/", {:query => {:method => 'geo.getevents', :location => location, :page => page, :lat => lat, :lng => lng, :distance => distance, :api_key => Firstfm::CONFIG['api_key']}})
|
17
|
+
events = response && response['lfm'] ? Event.init_events_from_hash(response['lfm']) : []
|
18
|
+
|
19
|
+
collection = WillPaginate::Collection.create(page, 10) do |pager|
|
20
|
+
pager.replace events
|
21
|
+
pager.total_entries = response['lfm']['events']['total'].to_i
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Firstfm
|
2
|
+
|
3
|
+
class Location
|
4
|
+
|
5
|
+
attr_accessor :city, :country, :postalcode, :lat, :long, :street
|
6
|
+
|
7
|
+
def self.init_location_from_hash(hash)
|
8
|
+
return nil unless hash.is_a?(Hash)
|
9
|
+
|
10
|
+
location = Location.new
|
11
|
+
location.city = hash["city"]
|
12
|
+
location.country = hash["country"]
|
13
|
+
location.postalcode = hash["postalcode"]
|
14
|
+
location.street = hash["street"]
|
15
|
+
location.lat = hash["geo:point"]["geo:lat"] if hash["geo:point"]
|
16
|
+
location.long = hash["geo:point"]["geo:lat"] if hash["geo:point"]
|
17
|
+
location
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Firstfm
|
2
|
+
|
3
|
+
class Venue
|
4
|
+
|
5
|
+
attr_accessor :id, :name, :url, :location, :website, :phonenumber, :images
|
6
|
+
|
7
|
+
include HTTParty
|
8
|
+
base_uri 'ws.audioscrobbler.com'
|
9
|
+
format :xml
|
10
|
+
|
11
|
+
def self.search(venue, page = 1, limit = 50, country = nil)
|
12
|
+
response = get("/2.0/", {:query => {:method => 'venue.search', :venue => venue, :page => page, :limit => limit, :country => country, :api_key => Firstfm::CONFIG['api_key']}})
|
13
|
+
venues = response && response['lfm'] ? Venue.init_venues_from_hash(response['lfm']) : []
|
14
|
+
collection = WillPaginate::Collection.create(page, limit) do |pager|
|
15
|
+
pager.replace venues
|
16
|
+
pager.total_entries = response['lfm']['results']['opensearch:totalResults'].to_i
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.get_events(venue_id)
|
21
|
+
response = get("/2.0/", {:query => {:method => 'venue.getEvents', :venue => venue_id, :api_key => Firstfm::CONFIG['api_key']}})
|
22
|
+
events = response && response['lfm'] ? Event.init_events_from_hash(response['lfm']) : []
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_events
|
26
|
+
self.class.get_events(self.id)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.init_venues_from_hash(hash)
|
30
|
+
return [] unless hash["results"] && hash["results"]["venuematches"] && hash["results"]["venuematches"]["venue"]
|
31
|
+
return [init_venue_from_hash(hash["results"]["venuematches"]["venue"])] if hash["results"]["venuematches"]["venue"].is_a?(Hash)
|
32
|
+
hash["results"]["venuematches"]["venue"].inject([]) do |arr, venue_hash|
|
33
|
+
arr << init_venue_from_hash(venue_hash)
|
34
|
+
arr
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.init_venue_from_hash(hash)
|
39
|
+
venue = Venue.new
|
40
|
+
venue.id = hash["id"]
|
41
|
+
venue.name = hash["name"]
|
42
|
+
venue.url = hash["url"]
|
43
|
+
venue.location = Location.init_location_from_hash(hash["location"])
|
44
|
+
venue.website = hash["website"]
|
45
|
+
venue.phonenumber = hash["phonenumber"]
|
46
|
+
venue.images = hash["image"]
|
47
|
+
venue
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
data/lib/firstfm.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'yaml'
|
3
|
+
require 'httparty'
|
4
|
+
require 'will_paginate'
|
5
|
+
require 'firstfm/event'
|
6
|
+
require 'firstfm/location'
|
7
|
+
require 'firstfm/venue'
|
8
|
+
require 'firstfm/geo'
|
9
|
+
|
10
|
+
module Firstfm
|
11
|
+
|
12
|
+
CONFIG = YAML::load(File.read(File.join(ENV['HOME'], '.firstfm')))
|
13
|
+
|
14
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
2
|
+
|
3
|
+
class GeoTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_should_get_events
|
6
|
+
FakeWeb.register_uri(:get, %r|http://ws.audioscrobbler.com/|, :body => File.read(File.dirname(__FILE__) + "/../fixtures/geo_events.xml"))
|
7
|
+
events = Firstfm::Geo.get_events
|
8
|
+
assert_equal 2, events.size
|
9
|
+
|
10
|
+
event = events.first
|
11
|
+
assert_equal "Entre Coche", event.title
|
12
|
+
assert_equal "1405068", event.id
|
13
|
+
assert_equal "La Boite", event.venue.name
|
14
|
+
|
15
|
+
event = events.last
|
16
|
+
assert_equal "Bonafide", event.title
|
17
|
+
assert_equal "1443807", event.id
|
18
|
+
assert_equal "Ritmo y Compás", event.venue.name
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_should_get_events_with_one_event_as_result
|
22
|
+
FakeWeb.register_uri(:get, %r|http://ws.audioscrobbler.com/|, :body => File.read(File.dirname(__FILE__) + "/../fixtures/geo_event.xml"))
|
23
|
+
events = Firstfm::Geo.get_events
|
24
|
+
assert_equal 1, events.size
|
25
|
+
|
26
|
+
event = events.first
|
27
|
+
assert_equal "Entre Coche", event.title
|
28
|
+
assert_equal "1405068", event.id
|
29
|
+
assert_equal "La Boite", event.venue.name
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
2
|
+
|
3
|
+
class VenueTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_should_search_venues
|
6
|
+
FakeWeb.register_uri(:get, %r|http://ws.audioscrobbler.com/|, :body => File.read(File.dirname(__FILE__) + "/../fixtures/venues.xml"))
|
7
|
+
venues = Firstfm::Venue.search("arena")
|
8
|
+
assert_equal 2, venues.size
|
9
|
+
venue = venues.first
|
10
|
+
assert_equal "Arena", venue.name
|
11
|
+
assert_equal "Baumgasse 80", venue.location.street
|
12
|
+
venue = venues.last
|
13
|
+
assert_equal "8781374", venue.id
|
14
|
+
assert_equal "41.056222", venue.location.lat
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_should_search_venues_with_one_venue_as_result
|
18
|
+
FakeWeb.register_uri(:get, %r|http://ws.audioscrobbler.com/|, :body => File.read(File.dirname(__FILE__) + "/../fixtures/venue.xml"))
|
19
|
+
venues = Firstfm::Venue.search("arena")
|
20
|
+
assert_equal 1, venues.size
|
21
|
+
venue = venues.first
|
22
|
+
assert_equal "Arena", venue.name
|
23
|
+
assert_equal "8778545", venue.id
|
24
|
+
assert_equal "Baumgasse 80", venue.location.street
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_should_get_events
|
28
|
+
FakeWeb.register_uri(:get, %r|http://ws.audioscrobbler.com/|, :body => File.read(File.dirname(__FILE__) + "/../fixtures/events.xml"))
|
29
|
+
events = Firstfm::Venue.get_events(8908030)
|
30
|
+
assert_equal 2, events.size
|
31
|
+
|
32
|
+
event = events.first
|
33
|
+
assert_equal "U.S. Girls", event.title
|
34
|
+
assert_equal "1313175", event.id
|
35
|
+
assert_equal "Cafe OTO", event.venue.name
|
36
|
+
|
37
|
+
event = events.last
|
38
|
+
assert_equal "Shogun Kunitoki", event.title
|
39
|
+
assert_equal "1372916", event.id
|
40
|
+
assert_equal "Cafe OTO", event.venue.name
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_should_get_events_with_one_event_as_result
|
44
|
+
FakeWeb.register_uri(:get, %r|http://ws.audioscrobbler.com/|, :body => File.read(File.dirname(__FILE__) + "/../fixtures/event.xml"))
|
45
|
+
events = Firstfm::Venue.get_events(8908030)
|
46
|
+
assert_equal 1, events.size
|
47
|
+
|
48
|
+
event = events.first
|
49
|
+
assert_equal "U.S. Girls", event.title
|
50
|
+
assert_equal "1313175", event.id
|
51
|
+
assert_equal "Cafe OTO", event.venue.name
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: firstfm
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Aleksandr Lossenko
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-03-10 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: will_paginate
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 2
|
29
|
+
- 3
|
30
|
+
- 12
|
31
|
+
version: 2.3.12
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: httparty
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 5
|
44
|
+
- 2
|
45
|
+
version: 0.5.2
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
description: Firstfm is a ruby wrapper for the Last.fm APIs ( http://www.last.fm/api ). My main focus is to import events from Last.FM, but with time I will try to add support for all API methods.
|
49
|
+
email: aleksandr @nospam@ cligs.ee
|
50
|
+
executables: []
|
51
|
+
|
52
|
+
extensions: []
|
53
|
+
|
54
|
+
extra_rdoc_files:
|
55
|
+
- README.rdoc
|
56
|
+
files:
|
57
|
+
- lib/firstfm.rb
|
58
|
+
- lib/firstfm/event.rb
|
59
|
+
- lib/firstfm/geo.rb
|
60
|
+
- lib/firstfm/location.rb
|
61
|
+
- lib/firstfm/venue.rb
|
62
|
+
- README.rdoc
|
63
|
+
has_rdoc: true
|
64
|
+
homepage: http://github.com/egze/firstfm
|
65
|
+
licenses: []
|
66
|
+
|
67
|
+
post_install_message:
|
68
|
+
rdoc_options:
|
69
|
+
- --charset=UTF-8
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
segments:
|
77
|
+
- 0
|
78
|
+
version: "0"
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
segments:
|
84
|
+
- 0
|
85
|
+
version: "0"
|
86
|
+
requirements: []
|
87
|
+
|
88
|
+
rubyforge_project:
|
89
|
+
rubygems_version: 1.3.6
|
90
|
+
signing_key:
|
91
|
+
specification_version: 3
|
92
|
+
summary: A ruby wrapper for the Last.fm APIs
|
93
|
+
test_files:
|
94
|
+
- test/test_helper.rb
|
95
|
+
- test/unit/geo_test.rb
|
96
|
+
- test/unit/venue_test.rb
|