itunes-observer 0.0.3 → 0.1.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/Rakefile CHANGED
@@ -4,9 +4,6 @@ require 'rake/clean'
4
4
  require 'rake/testtask'
5
5
  require 'rake/packagetask'
6
6
  require 'rake/gempackagetask'
7
- require 'rake/rdoctask'
8
- require 'rake/contrib/rubyforgepublisher'
9
- require 'rake/contrib/sshpublisher'
10
7
  require 'spec/rake/spectask'
11
8
  require 'fileutils'
12
9
  include FileUtils
@@ -40,7 +37,6 @@ task :package => [:clean]
40
37
  Spec::Rake::SpecTask.new do |t|
41
38
  t.spec_opts = ['--options', "spec/spec.opts"]
42
39
  t.spec_files = FileList['spec/*_spec.rb']
43
- t.rcov = true
44
40
  end
45
41
 
46
42
  spec = Gem::Specification.new do |s|
@@ -63,6 +59,7 @@ spec = Gem::Specification.new do |s|
63
59
  s.test_files = Dir["test/test_*.rb"]
64
60
 
65
61
  #s.add_dependency('')
62
+ s.add_development_dependency('eventmachine')
66
63
  #s.required_ruby_version = '>= 1.8.2'
67
64
 
68
65
  s.files = %w(README.rdoc ChangeLog Rakefile) +
@@ -89,21 +86,6 @@ task :uninstall => [:clean] do
89
86
  sh %{sudo gem uninstall #{NAME}}
90
87
  end
91
88
 
92
-
93
- Rake::RDocTask.new do |rdoc|
94
- rdoc.rdoc_dir = 'html'
95
- rdoc.options += RDOC_OPTS
96
- rdoc.template = "resh"
97
- #rdoc.template = "#{ENV['template']}.rb" if ENV['template']
98
- if ENV['DOC_FILES']
99
- rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
100
- else
101
- rdoc.rdoc_files.include('README.rdoc', 'ChangeLog')
102
- rdoc.rdoc_files.include('lib/**/*.rb')
103
- rdoc.rdoc_files.include('ext/**/*.c')
104
- end
105
- end
106
-
107
89
  desc "Show information about the gem"
108
90
  task :debug_gem do
109
91
  puts spec.to_ruby
data/examples/love.rb CHANGED
@@ -23,14 +23,14 @@ def main
23
23
  unless session = config['session']
24
24
  token = lastfm.auth.get_token
25
25
  auth(config['api_key'], token)
26
- session = lastfm.auth.get_session(token)
26
+ session = lastfm.auth.get_session(token)['key']
27
27
  Pit.set('last.fm', :data => {
28
28
  "session" => session
29
29
  }.merge(config))
30
30
 
31
31
  puts "Session key was generated."
32
32
 
33
- return
33
+ exit
34
34
  end
35
35
 
36
36
  lastfm.session = session
@@ -1,11 +1,30 @@
1
1
  require 'osx/cocoa'
2
2
 
3
3
  class ITunesObserver
4
- VERSION = '0.0.3'
4
+ VERSION = '0.1.1'
5
+
6
+ STATES = {
7
+ :playing => 'Playing',
8
+ :paused => 'Paused',
9
+ :stopped => 'Stopped'
10
+ }
5
11
 
6
12
  def initialize(&callback)
7
- observer = Observer.alloc.init
8
- observer.observe(&callback)
13
+ @observer = Observer.alloc.init
14
+
15
+ add_callback(STATES[:playing], &callback)
16
+ end
17
+
18
+ def on_play(&callback)
19
+ add_callback(STATES[:playing], &callback)
20
+ end
21
+
22
+ def on_pause(&callback)
23
+ add_callback(STATES[:paused], &callback)
24
+ end
25
+
26
+ def on_stop(&callback)
27
+ add_callback(STATES[:stopped], &callback)
9
28
  end
10
29
 
11
30
  def run(stop_after = nil)
@@ -16,23 +35,55 @@ class ITunesObserver
16
35
  end
17
36
  end
18
37
 
38
+ def finish
39
+ @observer.finish
40
+ end
41
+
42
+ private
43
+
44
+ def add_callback(state, &callback)
45
+ if callback
46
+ @observer.add_callback(state, &callback)
47
+ end
48
+ end
49
+
19
50
  # based on http://blog.8-p.info/articles/2006/12/24/rubycocoa-skype-itunes
20
51
  class Observer < OSX::NSObject
52
+ def initialize
53
+ @callbacks = {}
54
+
55
+ notification_centor.addObserver_selector_name_object_(self,
56
+ 'onPlayerInfo:',
57
+ 'com.apple.iTunes.playerInfo',
58
+ 'com.apple.iTunes.player')
59
+ end
60
+
21
61
  def onPlayerInfo(info)
22
- if info.userInfo['Player State'] == 'Playing'
23
- result = Result.new(info.userInfo)
24
- @callback.call(result)
62
+ result = Result.new(info.userInfo)
63
+
64
+ STATES.each do |k, state|
65
+ if info.userInfo['Player State'] == state
66
+ (@callbacks[state] || []).each do |callback|
67
+ callback.call(result)
68
+ end
69
+ end
25
70
  end
26
71
  end
27
72
 
28
- def observe(&callback)
29
- @callback = callback
30
- center = OSX::NSDistributedNotificationCenter.defaultCenter
31
- center.addObserver_selector_name_object_(self,
32
- 'onPlayerInfo:',
73
+ def add_callback(state, &callback)
74
+ @callbacks[state] ||= []
75
+ @callbacks[state] << callback
76
+ end
77
+
78
+ def finish
79
+ notification_centor.removeObserver_name_object_(self,
33
80
  'com.apple.iTunes.playerInfo',
34
81
  'com.apple.iTunes.player')
35
82
  end
83
+
84
+ def notification_centor
85
+ OSX::NSDistributedNotificationCenter.defaultCenter
86
+ end
36
87
  end
37
88
 
38
89
  class Result
@@ -46,6 +97,8 @@ class ITunesObserver
46
97
  value.to_s
47
98
  when OSX::NSCFString
48
99
  value.to_s
100
+ when OSX::NSNumber
101
+ value.to_i
49
102
  else
50
103
  value
51
104
  end
@@ -1,7 +1,9 @@
1
1
  $:.unshift File.dirname(__FILE__)
2
2
 
3
+ require 'rubygems'
3
4
  require 'spec_helper'
4
5
  require 'osx/cocoa'
6
+ require 'eventmachine'
5
7
 
6
8
  include OSX
7
9
  OSX.require_framework 'ScriptingBridge'
@@ -10,11 +12,6 @@ describe ITunesObserver do
10
12
  before do
11
13
  @itunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
12
14
  raise 'iTunes must be running' unless @itunes.isRunning
13
- @result = nil
14
- @observer = ITunesObserver.new do |result|
15
- @result = result
16
- end
17
-
18
15
  @itunes.stop
19
16
  end
20
17
 
@@ -22,11 +19,108 @@ describe ITunesObserver do
22
19
  @itunes.stop
23
20
  end
24
21
 
25
- it "should observe playing" do
26
- @itunes.playpause
27
- @observer.run(1)
28
- @result.should_not be_nil
29
- @result['Name'].should_not be_nil
30
- @result['Player State'].should eql('Playing')
22
+ describe ".new" do
23
+ it "should observe playing" do
24
+ result = nil
25
+
26
+ observer = ITunesObserver.new do |result|
27
+ result = result
28
+ end
29
+
30
+ run_loop(observer) do
31
+ @itunes.playpause
32
+ end
33
+
34
+ result.should_not be_nil
35
+ result['Name'].should_not be_nil
36
+ result['Player State'].should eql('Playing')
37
+ result['Total Time'].should be_kind_of(Fixnum)
38
+ end
39
+ end
40
+
41
+ describe "#on_stop" do
42
+ it "should observe stopping" do
43
+ observer = ITunesObserver.new
44
+ result = nil
45
+
46
+ observer.on_stop do |result|
47
+ result = result
48
+ end
49
+
50
+ run_loop(observer) do
51
+ @itunes.playpause
52
+ @itunes.stop
53
+ end
54
+
55
+ observer.finish
56
+
57
+ result.should_not be_nil
58
+ result['Name'].should_not be_nil
59
+ result['Player State'].should eql('Stopped')
60
+ result['Total Time'].should be_kind_of(Fixnum)
61
+ end
62
+ end
63
+
64
+ describe "#on_play" do
65
+ it "should observe playing" do
66
+ observer = ITunesObserver.new
67
+ result = nil
68
+
69
+ observer.on_play do |result|
70
+ result = result
71
+ end
72
+
73
+ run_loop(observer) do
74
+ @itunes.playpause
75
+ end
76
+
77
+ result.should_not be_nil
78
+ result['Name'].should_not be_nil
79
+ result['Player State'].should eql('Playing')
80
+ result['Total Time'].should be_kind_of(Fixnum)
81
+ end
82
+ end
83
+
84
+ describe "#on_pause" do
85
+ it "should observe pausing" do
86
+ observer = ITunesObserver.new
87
+ result = nil
88
+
89
+ observer.on_pause do |result|
90
+ result = result
91
+ end
92
+
93
+ run_loop(observer) do
94
+ @itunes.playpause
95
+
96
+ EM::Timer.new(1) do
97
+ @itunes.pause
98
+ end
99
+ end
100
+
101
+ observer.run(0)
102
+ observer.finish
103
+
104
+ result.should_not be_nil
105
+ result['Name'].should_not be_nil
106
+ result['Player State'].should eql('Paused')
107
+ result['Total Time'].should be_kind_of(Fixnum)
108
+ end
109
+ end
110
+
111
+ def run_loop(observer)
112
+ EM.run do
113
+ yield
114
+
115
+ EM::Timer.new(3) do
116
+ EM.stop
117
+ end
118
+
119
+ EM::add_periodic_timer(1) do
120
+ observer.run(0)
121
+ end
122
+ end
123
+ ensure
124
+ observer.finish
31
125
  end
32
126
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itunes-observer
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 25
5
+ prerelease:
5
6
  segments:
6
7
  - 0
7
- - 0
8
- - 3
9
- version: 0.0.3
8
+ - 1
9
+ - 1
10
+ version: 0.1.1
10
11
  platform: ruby
11
12
  authors:
12
13
  - youpy
@@ -14,10 +15,22 @@ autorequire: ""
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2011-08-31 00:00:00 +09:00
18
- default_executable:
19
- dependencies: []
20
-
18
+ date: 2012-03-20 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: eventmachine
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :development
33
+ version_requirements: *id001
21
34
  description: ""
22
35
  email: youpy@buycheapviagraonlinenow.com
23
36
  executables: []
@@ -36,7 +49,6 @@ files:
36
49
  - spec/spec_helper.rb
37
50
  - lib/itunes_observer.rb
38
51
  - examples/love.rb
39
- has_rdoc: true
40
52
  homepage: http://itunes-observer.rubyforge.org
41
53
  licenses: []
42
54
 
@@ -57,23 +69,27 @@ rdoc_options:
57
69
  require_paths:
58
70
  - lib
59
71
  required_ruby_version: !ruby/object:Gem::Requirement
72
+ none: false
60
73
  requirements:
61
74
  - - ">="
62
75
  - !ruby/object:Gem::Version
76
+ hash: 3
63
77
  segments:
64
78
  - 0
65
79
  version: "0"
66
80
  required_rubygems_version: !ruby/object:Gem::Requirement
81
+ none: false
67
82
  requirements:
68
83
  - - ">="
69
84
  - !ruby/object:Gem::Version
85
+ hash: 3
70
86
  segments:
71
87
  - 0
72
88
  version: "0"
73
89
  requirements: []
74
90
 
75
91
  rubyforge_project: itunes-observer
76
- rubygems_version: 1.3.6
92
+ rubygems_version: 1.8.17
77
93
  signing_key:
78
94
  specification_version: 3
79
95
  summary: ""