robut-rdio 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,72 @@
1
+ require 'robut'
2
+ require 'sinatra'
3
+ require 'json'
4
+
5
+ class Robut::Plugin::Rdio
6
+ include Robut::Plugin
7
+
8
+ # A simple server to communicate new Rdio sources to the Web
9
+ # Playback API. The client will update
10
+ # Robut::Plugin::Rdio::Server.queue with any new sources, and a call
11
+ # to /queue.json will pull those new sources as a json object.
12
+ class Server < Sinatra::Base
13
+
14
+ set :root, File.dirname(__FILE__)
15
+
16
+ class << self
17
+ # A list of items that haven't been fetched by the web playback
18
+ # API yet.
19
+ attr_accessor :queue
20
+
21
+ # A command list for the player to execute
22
+ attr_accessor :command
23
+
24
+ # The playback token for +domain+. If you're accessing Rdio over
25
+ # localhost, you shouldn't need to change this. Otherwise,
26
+ # download the rdio-python plugin:
27
+ #
28
+ # https://github.com/rdio/rdio-python
29
+ #
30
+ # and generate a new token for your domain:
31
+ #
32
+ # ./rdio-call --consumer-key=YOUR_CONSUMER_KEY --consumer-secret=YOUR_CONSUMER_SECRET getPlaybackToken domain=YOUR_DOMAIN
33
+ attr_accessor :token
34
+
35
+ # The domain associated with +token+. Defaults to localhost.
36
+ attr_accessor :domain
37
+ end
38
+ self.queue = []
39
+ self.command = []
40
+
41
+ # Renders a simple Rdio web player.
42
+ get '/' do
43
+ File.read(File.expand_path('public/index.html', File.dirname(__FILE__)))
44
+ end
45
+
46
+ get '/js/vars.js' do
47
+ content_type 'text/javascript'
48
+ <<END
49
+ var rdio_token = '#{self.class.token}';
50
+ var rdio_domain = '#{self.class.domain}';
51
+ END
52
+ end
53
+
54
+ # Returns the sources that haven't been fetched yet.
55
+ get '/queue.json' do
56
+ queue = self.class.queue.dup
57
+ self.class.queue = []
58
+ queue.to_json
59
+ end
60
+
61
+ # Returns the command for the player
62
+ get '/command.json' do
63
+ command = self.class.command.dup
64
+ self.class.command = []
65
+ command.to_json
66
+ end
67
+
68
+ # start the server if ruby file executed directly
69
+ run! if app_file == $0
70
+ end
71
+ end
72
+
@@ -0,0 +1 @@
1
+
data/plugin-tester.rb ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+ require 'robut'
3
+ require_relative 'lib/robut-rdio'
4
+ require 'highline/import'
5
+
6
+
7
+ Robut::Plugin::Rdio.key = ENV['RDIO_KEY']
8
+ Robut::Plugin::Rdio.secret = ENV['RDIO_SECRET']
9
+ puts "Starting sinatra..."
10
+ Robut::Plugin::Rdio.start_server
11
+
12
+ @plugin = Robut::Plugin::Rdio.new(nil)
13
+
14
+
15
+ def @plugin.nick
16
+ return 'dj'
17
+ end
18
+
19
+ def @plugin.reply(msg)
20
+ puts msg
21
+ end
22
+
23
+ def fade_out
24
+ puts
25
+ puts 'Exiting fake hipchat client...'
26
+ puts
27
+ exit
28
+ end
29
+
30
+ sleep(0.5)
31
+ puts <<-EOMSG
32
+ Welcome to the robut plugin test environment.
33
+
34
+ You can direct your messages to the bot using:
35
+ @#{@plugin.nick}
36
+
37
+ Type 'exit' or 'quit' to exit this session
38
+
39
+ EOMSG
40
+ while(true) do
41
+ begin
42
+ msg = ask('hipchat> ')
43
+
44
+ @plugin.handle(Time.now, 'Bob', msg)
45
+
46
+ if msg =~ /quit|exit/
47
+ fade_out
48
+ end
49
+ rescue Interrupt
50
+ fade_out
51
+ end
52
+ end
@@ -0,0 +1,92 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "robut-rdio"
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Adam Pearson"]
12
+ s.date = "2011-11-10"
13
+ s.description = ""
14
+ s.email = "ampearson@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.md",
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ ".document",
22
+ ".rspec",
23
+ ".rvmrc",
24
+ "Gemfile",
25
+ "Gemfile.lock",
26
+ "LICENSE.txt",
27
+ "README.md",
28
+ "README.rdoc",
29
+ "Rakefile",
30
+ "VERSION",
31
+ "lib/robut-rdio.rb",
32
+ "lib/server/public/css/rdio.css",
33
+ "lib/server/public/css/style.css",
34
+ "lib/server/public/css/style_after.css",
35
+ "lib/server/public/images/background.png",
36
+ "lib/server/public/images/no-album.png",
37
+ "lib/server/public/index.html",
38
+ "lib/server/public/js/libs/dd_belatedpng.js",
39
+ "lib/server/public/js/libs/jquery-1.5.1.min.js",
40
+ "lib/server/public/js/libs/modernizr-1.7.min.js",
41
+ "lib/server/public/js/rdio.js",
42
+ "lib/server/public/js/script.js",
43
+ "lib/server/server.rb",
44
+ "lib/tasks/shell.rake",
45
+ "plugin-tester.rb",
46
+ "robut-rdio.gemspec",
47
+ "spec/robut-rdio_spec.rb",
48
+ "spec/spec_helper.rb"
49
+ ]
50
+ s.homepage = "http://github.com/radamant/robut-rdio"
51
+ s.licenses = ["MIT"]
52
+ s.require_paths = ["lib"]
53
+ s.rubygems_version = "1.8.10"
54
+ s.summary = "An RDIO client/server plugin for Robut"
55
+
56
+ if s.respond_to? :specification_version then
57
+ s.specification_version = 3
58
+
59
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
60
+ s.add_runtime_dependency(%q<robut>, [">= 0"])
61
+ s.add_development_dependency(%q<thin>, [">= 0"])
62
+ s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
63
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
64
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
65
+ s.add_development_dependency(%q<rcov>, [">= 0"])
66
+ s.add_development_dependency(%q<rdio>, ["= 0.0.91"])
67
+ s.add_development_dependency(%q<sinatra>, [">= 0"])
68
+ s.add_development_dependency(%q<highline>, [">= 0"])
69
+ else
70
+ s.add_dependency(%q<robut>, [">= 0"])
71
+ s.add_dependency(%q<thin>, [">= 0"])
72
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
73
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
74
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
75
+ s.add_dependency(%q<rcov>, [">= 0"])
76
+ s.add_dependency(%q<rdio>, ["= 0.0.91"])
77
+ s.add_dependency(%q<sinatra>, [">= 0"])
78
+ s.add_dependency(%q<highline>, [">= 0"])
79
+ end
80
+ else
81
+ s.add_dependency(%q<robut>, [">= 0"])
82
+ s.add_dependency(%q<thin>, [">= 0"])
83
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
84
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
85
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
86
+ s.add_dependency(%q<rcov>, [">= 0"])
87
+ s.add_dependency(%q<rdio>, ["= 0.0.91"])
88
+ s.add_dependency(%q<sinatra>, [">= 0"])
89
+ s.add_dependency(%q<highline>, [">= 0"])
90
+ end
91
+ end
92
+
@@ -0,0 +1,101 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ # Wherein we test legacy code, and hopefully refactor and remove this file
4
+ describe "RobutRdio Super Integration Test" do
5
+ let(:plugin) do plugin = Robut::Plugin::Rdio.new(nil)
6
+ def plugin.nick
7
+ "dj"
8
+ end
9
+
10
+
11
+ plugin.stub(:reply){|msg|
12
+ @reply = msg
13
+ }
14
+
15
+ plugin
16
+ end
17
+
18
+ def say(msg)
19
+ plugin.handle(Time.now, 'foo bar', msg)
20
+ end
21
+
22
+ describe "searching for tracks" do
23
+
24
+
25
+ it 'should make an rdio search' do
26
+ stub_search('neil young', ['harvest', 'after the gold rush'])
27
+ say('@dj find neil young')
28
+ @reply.should == "result: harvest\nresult: after the gold rush\n"
29
+ end
30
+
31
+ def stub_search(mock_query, results)
32
+ plugin.stub(:search).with(['', mock_query]){results}
33
+ results.each do |result|
34
+ plugin.stub(:format_result).with(result, anything()){"result: #{result}"}
35
+ end
36
+ end
37
+
38
+
39
+ end
40
+
41
+ describe 'queuing tracks' do
42
+
43
+ describe 'when there is a search result' do
44
+ before do
45
+ plugin.stub(:result_at){|i| i.to_s}
46
+ plugin.stub(:queue){|result| @queued = result}
47
+ plugin.stub(:has_results?){true}
48
+ plugin.stub(:has_result?){true}
49
+ end
50
+
51
+ it 'should queue the track at the given position with "play <number>"' do
52
+ say '@dj play 1'
53
+ @queued.should == '1'
54
+
55
+ say '@dj 8'
56
+ @queued.should == '8'
57
+ end
58
+
59
+ end
60
+
61
+ describe 'when there are no search results' do
62
+ before do
63
+ plugin.stub(:has_results?){false}
64
+ end
65
+
66
+ it 'should say there are no results' do
67
+ say '@dj play 9'
68
+ @reply.should == "I don't have any search results"
69
+ end
70
+ end
71
+
72
+ describe 'when there are results but not at the requested index' do
73
+ before do
74
+ plugin.stub(:has_results?){true}
75
+ plugin.stub(:has_result?).with(5){false}
76
+ end
77
+ it 'should say the result does not exist' do
78
+ say '@dj play 5'
79
+ @reply.should == "I don't have that result"
80
+ end
81
+ end
82
+ end
83
+
84
+ describe "I'm feeling lucky play/search" do
85
+
86
+ end
87
+
88
+ describe 'running commands' do
89
+ before do
90
+ plugin.stub(:run_command){|command| @command = command}
91
+ end
92
+
93
+ %w{play unpause pause next restart back clear}.each do |command|
94
+ it "should run #{command}" do
95
+ say("@dj #{command}")
96
+ @command.should == command
97
+ end
98
+ end
99
+ end
100
+
101
+ end
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'robut-rdio'
5
+
6
+ # Requires supporting files with custom matchers and macros, etc,
7
+ # in ./support/ and its subdirectories.
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+
12
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: robut-rdio
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Adam Pearson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-10 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: robut
16
+ requirement: &70225959595020 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70225959595020
25
+ - !ruby/object:Gem::Dependency
26
+ name: thin
27
+ requirement: &70225959594500 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70225959594500
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: &70225959593940 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 2.3.0
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70225959593940
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: &70225959593440 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.0
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70225959593440
58
+ - !ruby/object:Gem::Dependency
59
+ name: jeweler
60
+ requirement: &70225959592960 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 1.6.4
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70225959592960
69
+ - !ruby/object:Gem::Dependency
70
+ name: rcov
71
+ requirement: &70225959592440 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70225959592440
80
+ - !ruby/object:Gem::Dependency
81
+ name: rdio
82
+ requirement: &70225959591920 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - =
86
+ - !ruby/object:Gem::Version
87
+ version: 0.0.91
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70225959591920
91
+ - !ruby/object:Gem::Dependency
92
+ name: sinatra
93
+ requirement: &70225959591380 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70225959591380
102
+ - !ruby/object:Gem::Dependency
103
+ name: highline
104
+ requirement: &70225959590900 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *70225959590900
113
+ description: ''
114
+ email: ampearson@gmail.com
115
+ executables: []
116
+ extensions: []
117
+ extra_rdoc_files:
118
+ - LICENSE.txt
119
+ - README.md
120
+ - README.rdoc
121
+ files:
122
+ - .document
123
+ - .rspec
124
+ - .rvmrc
125
+ - Gemfile
126
+ - Gemfile.lock
127
+ - LICENSE.txt
128
+ - README.md
129
+ - README.rdoc
130
+ - Rakefile
131
+ - VERSION
132
+ - lib/robut-rdio.rb
133
+ - lib/server/public/css/rdio.css
134
+ - lib/server/public/css/style.css
135
+ - lib/server/public/css/style_after.css
136
+ - lib/server/public/images/background.png
137
+ - lib/server/public/images/no-album.png
138
+ - lib/server/public/index.html
139
+ - lib/server/public/js/libs/dd_belatedpng.js
140
+ - lib/server/public/js/libs/jquery-1.5.1.min.js
141
+ - lib/server/public/js/libs/modernizr-1.7.min.js
142
+ - lib/server/public/js/rdio.js
143
+ - lib/server/public/js/script.js
144
+ - lib/server/server.rb
145
+ - lib/tasks/shell.rake
146
+ - plugin-tester.rb
147
+ - robut-rdio.gemspec
148
+ - spec/robut-rdio_spec.rb
149
+ - spec/spec_helper.rb
150
+ homepage: http://github.com/radamant/robut-rdio
151
+ licenses:
152
+ - MIT
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ! '>='
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ segments:
164
+ - 0
165
+ hash: 1997263942340461692
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ none: false
168
+ requirements:
169
+ - - ! '>='
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubyforge_project:
174
+ rubygems_version: 1.8.10
175
+ signing_key:
176
+ specification_version: 3
177
+ summary: An RDIO client/server plugin for Robut
178
+ test_files: []