itunes-observer 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog ADDED
@@ -0,0 +1,4 @@
1
+ == 0.0.1 / 2009-09-07
2
+
3
+ * initial release
4
+
data/README.rdoc ADDED
@@ -0,0 +1,37 @@
1
+
2
+ = itunes-observer
3
+
4
+ Observe iTunes and notify when starting playng track
5
+
6
+ == Description
7
+
8
+
9
+ == Installation
10
+
11
+ === Archive Installation
12
+
13
+ rake install
14
+
15
+ === Gem Installation
16
+
17
+ gem sources -a http://gems.github.com/
18
+ gem install youpy-itunes-observer
19
+
20
+ == Features/Problems
21
+
22
+
23
+ == Synopsis
24
+
25
+ ITunesObserver.new {|result|
26
+ puts '%s - %s' % [result['Artist'], result['Name']]
27
+ }.run
28
+
29
+ == See Also
30
+
31
+ * http://blog.8-p.info/articles/2006/12/24/rubycocoa-skype-itunes
32
+
33
+ == Copyright
34
+
35
+ Author:: youpy <youpy@buycheapviagraonlinenow.com>
36
+ Copyright:: Copyright (c) 2009 youpy
37
+ License:: MIT
data/Rakefile ADDED
@@ -0,0 +1,110 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/clean'
4
+ require 'rake/testtask'
5
+ require 'rake/packagetask'
6
+ require 'rake/gempackagetask'
7
+ require 'rake/rdoctask'
8
+ require 'rake/contrib/rubyforgepublisher'
9
+ require 'rake/contrib/sshpublisher'
10
+ require 'spec/rake/spectask'
11
+ require 'fileutils'
12
+ include FileUtils
13
+
14
+ $LOAD_PATH.unshift "lib"
15
+ require "itunes_observer"
16
+
17
+ NAME = "itunes-observer"
18
+ AUTHOR = "youpy"
19
+ EMAIL = "youpy@buycheapviagraonlinenow.com"
20
+ DESCRIPTION = ""
21
+ RUBYFORGE_PROJECT = "itunes-observer"
22
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
23
+ BIN_FILES = %w( )
24
+ VERS = ITunesObserver::VERSION
25
+
26
+ REV = File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
27
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config']
28
+ RDOC_OPTS = [
29
+ '--title', "#{NAME} documentation",
30
+ "--charset", "utf-8",
31
+ "--opname", "index.html",
32
+ "--line-numbers",
33
+ "--main", "README.rdoc",
34
+ "--inline-source",
35
+ ]
36
+
37
+ task :default => [:spec]
38
+ task :package => [:clean]
39
+
40
+ Spec::Rake::SpecTask.new do |t|
41
+ t.spec_opts = ['--options', "spec/spec.opts"]
42
+ t.spec_files = FileList['spec/*_spec.rb']
43
+ t.rcov = true
44
+ end
45
+
46
+ spec = Gem::Specification.new do |s|
47
+ s.name = NAME
48
+ s.version = VERS
49
+ s.platform = Gem::Platform::RUBY
50
+ s.has_rdoc = true
51
+ s.extra_rdoc_files = ["README.rdoc", "ChangeLog"]
52
+ s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
53
+ s.summary = DESCRIPTION
54
+ s.description = DESCRIPTION
55
+ s.author = AUTHOR
56
+ s.email = EMAIL
57
+ s.homepage = HOMEPATH
58
+ s.executables = BIN_FILES
59
+ s.rubyforge_project = RUBYFORGE_PROJECT
60
+ s.bindir = "bin"
61
+ s.require_path = "lib"
62
+ s.autorequire = ""
63
+ s.test_files = Dir["test/test_*.rb"]
64
+
65
+ #s.add_dependency('')
66
+ #s.required_ruby_version = '>= 1.8.2'
67
+
68
+ s.files = %w(README.rdoc ChangeLog Rakefile) +
69
+ Dir.glob("{bin,doc,spec,test,lib,templates,generator,extras,website,script}/**/*") +
70
+ Dir.glob("ext/**/*.{h,c,rb}") +
71
+ Dir.glob("examples/**/*.rb") +
72
+ Dir.glob("tools/*.rb")
73
+
74
+ s.extensions = FileList["ext/**/extconf.rb"].to_a
75
+ end
76
+
77
+ Rake::GemPackageTask.new(spec) do |p|
78
+ p.need_tar = true
79
+ p.gem_spec = spec
80
+ end
81
+
82
+ task :install do
83
+ name = "#{NAME}-#{VERS}.gem"
84
+ sh %{rake package}
85
+ sh %{sudo gem install pkg/#{name}}
86
+ end
87
+
88
+ task :uninstall => [:clean] do
89
+ sh %{sudo gem uninstall #{NAME}}
90
+ end
91
+
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
+ desc "Show information about the gem"
108
+ task :debug_gem do
109
+ puts spec.to_ruby
110
+ end
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # OSX only
5
+
6
+ require 'rubygems'
7
+ require 'lastfm'
8
+ require 'pit'
9
+
10
+ $KCODE = "UTF8"
11
+
12
+ def main
13
+ config = Pit.get("last.fm", :require => {
14
+ "api_key" => "your api key in last.fm",
15
+ "api_secret" => "your api secret in last.fm"
16
+ })
17
+
18
+ lastfm = Lastfm.new(
19
+ config['api_key'],
20
+ config['api_secret'])
21
+
22
+ unless session = config['session']
23
+ token = lastfm.auth.get_token
24
+ auth(config['api_key'], token)
25
+ session = lastfm.auth.get_session(token)
26
+ Pit.set('last.fm', :data => {
27
+ "session" => session
28
+ }.merge(config))
29
+
30
+ puts "Session key was generated."
31
+
32
+ return
33
+ end
34
+
35
+ lastfm.session = session
36
+
37
+ require 'itunes_observer'
38
+
39
+ ITunesObserver.new {|result|
40
+ name = result['Name']
41
+ artist = result['Artist']
42
+ rating = result['Rating']
43
+
44
+ if rating.to_i > 80
45
+ begin
46
+ lastfm.track.love(artist, name)
47
+ rescue
48
+ end
49
+ end
50
+ }.run
51
+ end
52
+
53
+ def auth(api_key, token)
54
+ auth_url = 'http://www.last.fm/api/auth/?api_key=' + api_key + '&token=' + token
55
+
56
+ unless system('open', auth_url)
57
+ print 'open ' + auth_url + ' in your browser and '
58
+ end
59
+
60
+ print 'after authorization, push any key:'
61
+ STDIN.gets.chomp
62
+ puts
63
+ end
64
+
65
+ main
@@ -0,0 +1,52 @@
1
+ require 'osx/cocoa'
2
+
3
+ class ITunesObserver
4
+ VERSION = '0.0.2'
5
+
6
+ def initialize(&callback)
7
+ observer = Observer.alloc.init
8
+ observer.observe(&callback)
9
+ end
10
+
11
+ def run(stop_after = nil)
12
+ if stop_after
13
+ OSX::NSRunLoop.currentRunLoop.runUntilDate(Time.now + stop_after)
14
+ else
15
+ OSX::NSRunLoop.currentRunLoop.run
16
+ end
17
+ end
18
+
19
+ # based on http://blog.8-p.info/articles/2006/12/24/rubycocoa-skype-itunes
20
+ class Observer < OSX::NSObject
21
+ def onPlayerInfo(info)
22
+ if info.userInfo['Player State'] == 'Playing'
23
+ result = Result.new(info.userInfo)
24
+ @callback.call(result)
25
+ end
26
+ end
27
+
28
+ def observe(&callback)
29
+ @callback = callback
30
+ center = OSX::NSDistributedNotificationCenter.defaultCenter
31
+ center.addObserver_selector_name_object_(self,
32
+ 'onPlayerInfo:',
33
+ 'com.apple.iTunes.playerInfo',
34
+ 'com.apple.iTunes.player')
35
+ end
36
+ end
37
+
38
+ class Result
39
+ def initialize(attributes)
40
+ @attributes = attributes
41
+ end
42
+
43
+ def [](key)
44
+ case value = @attributes[key]
45
+ when OSX::NSCFString
46
+ value.to_s
47
+ else
48
+ value
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,32 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'spec_helper'
4
+ require 'osx/cocoa'
5
+
6
+ include OSX
7
+ OSX.require_framework 'ScriptingBridge'
8
+
9
+ describe ITunesObserver do
10
+ before do
11
+ @itunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
12
+ raise 'iTunes must be running' unless @itunes.isRunning
13
+ @result = nil
14
+ @observer = ITunesObserver.new do |result|
15
+ @result = result
16
+ end
17
+
18
+ @itunes.stop
19
+ end
20
+
21
+ after do
22
+ @itunes.stop
23
+ end
24
+
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')
31
+ end
32
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,2 @@
1
+ -c
2
+ -fs
@@ -0,0 +1,10 @@
1
+ $:.unshift File.dirname(__FILE__) + '/../lib/'
2
+
3
+ require "itunes_observer"
4
+
5
+ module SpecHelper
6
+ end
7
+
8
+ Spec::Runner.configure do |config|
9
+ config.include SpecHelper
10
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: itunes-observer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - youpy
8
+ autorequire: ""
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-01-10 00:00:00 +09:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: ""
17
+ email: youpy@buycheapviagraonlinenow.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.rdoc
24
+ - ChangeLog
25
+ files:
26
+ - README.rdoc
27
+ - ChangeLog
28
+ - Rakefile
29
+ - spec/itunes_observer_spec.rb
30
+ - spec/spec.opts
31
+ - spec/spec_helper.rb
32
+ - lib/itunes_observer.rb
33
+ - examples/love_daemon.rb
34
+ has_rdoc: true
35
+ homepage: http://itunes-observer.rubyforge.org
36
+ licenses: []
37
+
38
+ post_install_message:
39
+ rdoc_options:
40
+ - --title
41
+ - itunes-observer documentation
42
+ - --charset
43
+ - utf-8
44
+ - --opname
45
+ - index.html
46
+ - --line-numbers
47
+ - --main
48
+ - README.rdoc
49
+ - --inline-source
50
+ - --exclude
51
+ - ^(examples|extras)/
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: "0"
59
+ version:
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: "0"
65
+ version:
66
+ requirements: []
67
+
68
+ rubyforge_project: itunes-observer
69
+ rubygems_version: 1.3.5
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: ""
73
+ test_files: []
74
+