xbmc 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +17 -0
- data/lib/xbmc.rb +87 -0
- data/spec/xbmc_spec.rb +75 -0
- metadata +57 -0
data/README.textile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
h2. XBMC
|
2
|
+
|
3
|
+
A simple wrapper for XBMC's "HTTP API":http://www.xbmc.org/wiki/?title=WebServerHTTP-API
|
4
|
+
|
5
|
+
h3. Installation
|
6
|
+
|
7
|
+
The xbmc gem is hosted by "gemcutter":http://gemcutter.org
|
8
|
+
|
9
|
+
gem sources -a http://gemcutter.org
|
10
|
+
gem install xbmc
|
11
|
+
|
12
|
+
h3. Usage
|
13
|
+
|
14
|
+
rodeo:~ rob$ ruby -rubygems -e "require 'xbmc';x=XBMC.new('xbox');puts x.currently_playing[:artist]"
|
15
|
+
Bibio
|
16
|
+
|
17
|
+
For examples of usage, check out the spec file or an example of "controlling XBMC from iTunes":http://gist.github.com/212375
|
data/lib/xbmc.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'nokogiri'
|
4
|
+
require 'cgi'
|
5
|
+
|
6
|
+
def returning(value)
|
7
|
+
yield(value)
|
8
|
+
value
|
9
|
+
end
|
10
|
+
|
11
|
+
class XBMC
|
12
|
+
# Creates a new instance using the hostname or IP address, port, and
|
13
|
+
def initialize(host,port = 80, playlist = 0)
|
14
|
+
@host = host
|
15
|
+
@port = port
|
16
|
+
@paused = false
|
17
|
+
@playlist = playlist
|
18
|
+
|
19
|
+
set_playlist
|
20
|
+
end
|
21
|
+
|
22
|
+
# returns a hash with details on the currently_playing track
|
23
|
+
# xbox.currently_playing[:Title] #=> "La Vida Loca"
|
24
|
+
def currently_playing
|
25
|
+
returning(Hash.new) do |result|
|
26
|
+
send_command('getCurrentlyPlaying').search("//li").each do |item|
|
27
|
+
key,*value = item.inner_html.split(':')
|
28
|
+
result[key.downcase.to_sym] = value.join(':').chomp
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Whether or not a track is in progress
|
34
|
+
def playing?
|
35
|
+
currently_playing[:filename] == "[Nothing Playing]" ? false : (true && !paused?)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Whether or not xbmc is paused
|
39
|
+
def paused?
|
40
|
+
@paused
|
41
|
+
end
|
42
|
+
|
43
|
+
# An array of the currently loaded tracks
|
44
|
+
def playlist
|
45
|
+
send_command('getPlaylistContents',0).search("//li").map{|i| i.inner_html.chomp}.reject{|i| i == "[Empty]"}
|
46
|
+
end
|
47
|
+
|
48
|
+
# Add a file to the queue. Specify the path to the file as xbmc would access it.
|
49
|
+
def queue(song)
|
50
|
+
send_command('addToPlaylist',song,0)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Play the next track
|
54
|
+
def play_next
|
55
|
+
send_command('PlayNext')
|
56
|
+
end
|
57
|
+
|
58
|
+
# Pause or unpause the player.
|
59
|
+
# This is a simple toggle, it doesn't check current state.
|
60
|
+
def pause
|
61
|
+
send_command('Pause')
|
62
|
+
@paused = !@paused
|
63
|
+
end
|
64
|
+
alias :unpause :pause
|
65
|
+
|
66
|
+
def clear_playlist
|
67
|
+
send_command('ClearPlaylist',0)
|
68
|
+
end
|
69
|
+
|
70
|
+
# 0 = Music
|
71
|
+
# 1 = Video
|
72
|
+
def set_playlist(type=@playlist)
|
73
|
+
send_command('SetCurrentPlaylist',type)
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def send_command(command,*args)
|
79
|
+
args = '(' + args.join(';') + ')'
|
80
|
+
Nokogiri::HTML(open(url_for(command + args)))
|
81
|
+
end
|
82
|
+
|
83
|
+
def url_for(command)
|
84
|
+
"http://#{@host}:#{@port}/xbmcCmds/xbmcHttp?command=" + CGI.escape(command)
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
data/spec/xbmc_spec.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'lib/xbmc'
|
2
|
+
|
3
|
+
describe XBMC do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@xbox = XBMC.new('myxbox')
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "when a song is playing" do
|
10
|
+
|
11
|
+
describe "and the user needs detials about what's currently playing" do
|
12
|
+
before do
|
13
|
+
@xbox.should_receive(:open).at_least(:once).and_return(fixture('currently_playing'))
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should detect that a song is playing" do
|
17
|
+
@xbox.playing?.should be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should get currently playing song" do
|
21
|
+
@xbox.currently_playing[:title].should == 'Ambivalence Avenue'
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should know the path to the current song" do
|
25
|
+
@xbox.currently_playing[:filename].should == "smb://luna/music/Bibio/Ambivalence Avenue/01 Ambivalence Avenue.mp3"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "and the users asks about the playlist" do
|
31
|
+
|
32
|
+
before do
|
33
|
+
@xbox.should_receive(:open).at_least(:once).and_return(fixture('current_playlist'))
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return the playlist" do
|
37
|
+
@xbox.playlist.size.should == 2
|
38
|
+
@xbox.playlist.first.should == "smb://luna/music/Bibio/Ambivalence Avenue/01 Ambivalence Avenue.mp3"
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "when nothing is playing" do
|
46
|
+
|
47
|
+
it "should detect that nothing is playing" do
|
48
|
+
@xbox.should_receive(:open).at_least(:once).and_return(fixture('nothing_playing'))
|
49
|
+
@xbox.playing?.should be_false
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "and the users asks about the playlist" do
|
53
|
+
|
54
|
+
it "should return an empty list" do
|
55
|
+
@xbox.should_receive(:open).at_least(:once).and_return(fixture('empty_playlist'))
|
56
|
+
@xbox.playlist.size.should == 0
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "when queueing a song" do
|
64
|
+
it "should send a request with the file path" do
|
65
|
+
filepath = "smb://path/to/file.mp3"
|
66
|
+
@xbox.should_receive(:open).with("http://myxbox:80/xbmcCmds/xbmcHttp?command=addToPlaylist" + CGI.escape("(#{filepath};0)"))
|
67
|
+
@xbox.queue(filepath)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
def fixture(name)
|
74
|
+
IO.readlines("spec/fixtures/#{name}.xml").to_s
|
75
|
+
end
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: xbmc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rob Lingle
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-10-17 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: xbmc provides a super simple wrapper for controlling your Xbox Media Center.
|
17
|
+
email: rob.lingle@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- README.textile
|
26
|
+
- lib/xbmc.rb
|
27
|
+
- spec/xbmc_spec.rb
|
28
|
+
has_rdoc: true
|
29
|
+
homepage: http://github.com/roblingle/xbmc
|
30
|
+
licenses: []
|
31
|
+
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: "0"
|
42
|
+
version:
|
43
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: "0"
|
48
|
+
version:
|
49
|
+
requirements: []
|
50
|
+
|
51
|
+
rubyforge_project:
|
52
|
+
rubygems_version: 1.3.5
|
53
|
+
signing_key:
|
54
|
+
specification_version: 3
|
55
|
+
summary: A simple wrapper for XBMC's HTTP API
|
56
|
+
test_files: []
|
57
|
+
|