firstfm 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/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
|