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