youpy-itunes-observer 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,6 +1,7 @@
1
1
 
2
2
  = itunes-observer
3
3
 
4
+ Observe iTunes and notify when starting playng track
4
5
 
5
6
  == Description
6
7
 
@@ -25,6 +26,10 @@
25
26
  puts '%s - %s' % [result['Artist'], result['Name']]
26
27
  }.run
27
28
 
29
+ == See Also
30
+
31
+ * http://blog.8-p.info/articles/2006/12/24/rubycocoa-skype-itunes
32
+
28
33
  == Copyright
29
34
 
30
35
  Author:: youpy <youpy@buycheapviagraonlinenow.com>
@@ -0,0 +1,175 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # OSX only
5
+
6
+ require 'rubygems'
7
+ require 'json'
8
+ require 'pp'
9
+ require 'digest/md5'
10
+ require 'net/https'
11
+ require 'pit'
12
+ require 'cgi'
13
+
14
+ $KCODE = "UTF8"
15
+
16
+ def main
17
+ config = Pit.get("last.fm", :require => {
18
+ "api_key" => "your api key in last.fm",
19
+ "api_secret" => "your api secret in last.fm"
20
+ })
21
+
22
+ lastfm = Lastfm.new(
23
+ config['api_key'],
24
+ config['api_secret'])
25
+
26
+ unless session = config['session']
27
+ token = lastfm.get_token
28
+ auth(lastfm.api_key, token)
29
+ session = lastfm.get_session(token)
30
+ Pit.set('last.fm', :data => {
31
+ "session" => session
32
+ }.merge(config))
33
+
34
+ puts "Session key was generated."
35
+
36
+ return
37
+ end
38
+
39
+ lastfm.session = session
40
+
41
+ exit if fork
42
+ Process.setsid
43
+ File.open("/dev/null") {|f|
44
+ STDIN.reopen f
45
+ STDOUT.reopen f
46
+ STDERR.reopen f
47
+ }
48
+
49
+ require 'itunes_observer'
50
+
51
+ ITunesObserver.new {|result|
52
+ name = result['Name']
53
+ artist = result['Artist']
54
+ rating = result['Rating']
55
+
56
+ if rating.to_i > 80
57
+ begin
58
+ lastfm.love(artist, name)
59
+ rescue
60
+ end
61
+ end
62
+ }.run
63
+ end
64
+
65
+ def auth(api_key, token)
66
+ auth_url = 'http://www.last.fm/api/auth/?api_key=' + api_key + '&token=' + token
67
+
68
+ unless system('open', auth_url)
69
+ print 'open ' + auth_url + ' in your browser and '
70
+ end
71
+
72
+ print 'after authorization, push any key:'
73
+ STDIN.gets.chomp
74
+ puts
75
+ end
76
+
77
+ class Lastfm
78
+ attr_reader :api_key, :api_secret
79
+ attr_writer :session
80
+
81
+ def initialize(api_key, api_secret, connection =
82
+ REST::Connection.new('http://ws.audioscrobbler.com/2.0/'))
83
+ @api_key = api_key
84
+ @api_secret = api_secret
85
+ @connection = connection
86
+ @session = nil
87
+ end
88
+
89
+ def get_token
90
+ request('auth.getToken')['token']
91
+ end
92
+
93
+ def get_session(token)
94
+ response = request('auth.getSession', {
95
+ :token => token,
96
+ })
97
+
98
+ response['session']['key']
99
+ end
100
+
101
+ def love(artist, name)
102
+ # FIXME: response format will not be JSON...API bug?
103
+ request('track.love', {
104
+ :track => name,
105
+ :artist => artist,
106
+ :sk => @session
107
+ }, 'post')
108
+ end
109
+
110
+ private
111
+
112
+ def request(method, params = {}, http_method = 'get')
113
+ params[:method] = method
114
+ params[:api_key] = @api_key
115
+ # http://www.lastfm.jp/group/Last.fm+Web+Services/forum/21604/_/497978
116
+ #params[:format] = format
117
+
118
+ sig = params.to_a.sort_by do |param|
119
+ param.first.to_s
120
+ end.inject('') do |result, param|
121
+ result + param.join('')
122
+ end + @api_secret
123
+
124
+ params.update(:api_sig => Digest::MD5.hexdigest(sig), :format => 'json')
125
+
126
+ json = JSON.parse(@connection.send(http_method, '', params))
127
+ pp json
128
+ json
129
+ end
130
+ end
131
+
132
+ module REST
133
+ class Connection
134
+ def initialize(base_url)
135
+ @base_url = base_url
136
+ end
137
+
138
+ def get(resource, args = nil)
139
+ url = URI.join(@base_url, resource)
140
+
141
+ if args
142
+ url.query = query(args)
143
+ end
144
+
145
+ req = Net::HTTP::Get.new(url.request_uri)
146
+ request(req, url)
147
+ end
148
+
149
+ def post(resource, args = nil)
150
+ url = URI.join(@base_url, resource)
151
+
152
+ req = Net::HTTP::Post.new(url.request_uri)
153
+
154
+ if args
155
+ req.body = query(args)
156
+ end
157
+
158
+ request(req, url)
159
+ end
160
+
161
+ def request(req, url)
162
+ http = Net::HTTP.new(url.host, url.port)
163
+ http.use_ssl = (url.port == 443)
164
+
165
+ res = http.start() { |conn| conn.request(req) }
166
+ res.body
167
+ end
168
+
169
+ def query(params)
170
+ params.map { |k,v| "%s=%s" % [CGI.escape(k.to_s), CGI.escape(v.to_s)] }.join("&")
171
+ end
172
+ end
173
+ end
174
+
175
+ main
@@ -1,7 +1,7 @@
1
1
  require 'osx/cocoa'
2
2
 
3
3
  class ITunesObserver
4
- VERSION = '0.0.1'
4
+ VERSION = '0.0.2'
5
5
 
6
6
  def initialize(&callback)
7
7
  observer = Observer.alloc.init
@@ -19,8 +19,10 @@ class ITunesObserver
19
19
  # based on http://blog.8-p.info/articles/2006/12/24/rubycocoa-skype-itunes
20
20
  class Observer < OSX::NSObject
21
21
  def onPlayerInfo(info)
22
- result = Result.new(info.userInfo)
23
- @callback.call(result)
22
+ if info.userInfo['Player State'] == 'Playing'
23
+ result = Result.new(info.userInfo)
24
+ @callback.call(result)
25
+ end
24
26
  end
25
27
 
26
28
  def observe(&callback)
@@ -9,7 +9,7 @@ OSX.require_framework 'ScriptingBridge'
9
9
  describe ITunesObserver do
10
10
  before do
11
11
  @itunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
12
- raise 'iTunes should be running' unless @itunes.isRunning
12
+ raise 'iTunes must be running' unless @itunes.isRunning
13
13
  @result = nil
14
14
  @observer = ITunesObserver.new do |result|
15
15
  @result = result
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: youpy-itunes-observer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - youpy
@@ -9,7 +9,7 @@ autorequire: ""
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-07 00:00:00 -07:00
12
+ date: 2009-09-08 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -30,6 +30,7 @@ files:
30
30
  - spec/spec.opts
31
31
  - spec/spec_helper.rb
32
32
  - lib/itunes_observer.rb
33
+ - examples/love_daemon.rb
33
34
  has_rdoc: true
34
35
  homepage: http://itunes-observer.rubyforge.org
35
36
  licenses: