firstfm 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'fakeweb'
4
+ require File.dirname(__FILE__) + '/../lib/firstfm'
@@ -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