vlc-client 0.0.1.beta
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/.gitignore +21 -0
- data/.rspec +1 -0
- data/.travis.yml +10 -0
- data/.yardopts +2 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +108 -0
- data/Rakefile +40 -0
- data/lib/vlc-client.rb +102 -0
- data/lib/vlc-client/client/connection_management.rb +23 -0
- data/lib/vlc-client/client/media_controls.rb +98 -0
- data/lib/vlc-client/client/video_controls.rb +10 -0
- data/lib/vlc-client/connection.rb +77 -0
- data/lib/vlc-client/core_ext/array.rb +12 -0
- data/lib/vlc-client/errors.rb +16 -0
- data/lib/vlc-client/null_object.rb +24 -0
- data/lib/vlc-client/server.rb +73 -0
- data/lib/vlc-client/system.rb +58 -0
- data/lib/vlc-client/version.rb +3 -0
- data/spec/helper.rb +40 -0
- data/spec/system_spec.rb +31 -0
- data/spec/vlc-client/client/connection_management_spec.rb +24 -0
- data/spec/vlc-client/client/media_controls_spec.rb +188 -0
- data/spec/vlc-client/client/video_controls_spec.rb +13 -0
- data/spec/vlc-client/connection_spec.rb +70 -0
- data/spec/vlc-client/server_spec.rb +19 -0
- data/spec/vlc_client_spec.rb +42 -0
- data/vlc.gemspec +29 -0
- metadata +159 -0
data/.gitignore
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
.rvmrc
|
19
|
+
.sublime/
|
20
|
+
Guardfile
|
21
|
+
trials
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
-r ./spec/helper.rb -c -f documentation
|
data/.travis.yml
ADDED
data/.yardopts
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Miguel Guinada
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
# vlc-client [](http://travis-ci.org/mguinada/vlc-client)
|
2
|
+
|
3
|
+
vlc-client manages a [VLC media player](http://www.videolan.org/vlc/) through it's RC interface.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'vlc-client'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install vlc-client
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
### Create a client and connect to a running VLC media play instance.
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
|
25
|
+
#Expects a VLC media player running on 192.168.1.10:9999
|
26
|
+
#e.g. vlc --extraintf rc --rc-host 192.168.1.10:9999"
|
27
|
+
|
28
|
+
vlc = VLC::Client.new('192.168.1.10', 9999)
|
29
|
+
# => "#<VLC::Client:0x0000000229c370 @server=#<VLC::Server:0x0000000229c6e0 @headless=false, @port=9999, @host=\"192.168.1.10\", @pid=10514>, @self_managed=true, @connection=#<VLC::Connection:0x0000000229c258 @port=9999, @host=\"192.168.1.10\", @socket=#<TCPSocket:fd 5>>>"
|
30
|
+
|
31
|
+
vlc.connect
|
32
|
+
# => true
|
33
|
+
vlc.play('http://example.org/media.mp3') #play media
|
34
|
+
=> true
|
35
|
+
vlc.playing?
|
36
|
+
=> true
|
37
|
+
vlc.fullscreen
|
38
|
+
=> true
|
39
|
+
#...
|
40
|
+
|
41
|
+
```
|
42
|
+
|
43
|
+
### Create a self managed client/server system.
|
44
|
+
_(requires a local installation of VLC media player)_
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
|
48
|
+
vlc = VLC::System.new #A local VLC client/server system where a local VLC server is automaticaly managed
|
49
|
+
# => "#<VLC::System:0x00000001bbb1a0 @client=#<VLC::Client:0x00000001bbade0 @server=#<VLC::Server:0x00000001bbb178 @headless=false, @port=9595, @host=\"localhost\", @pid=11225>, @connection=#<VLC::Connection:0x00000001bbacc8 @port=9595, @host=\"localhost\", @socket=#<TCPSocket:fd 5>>>>"
|
50
|
+
|
51
|
+
vlc.connected? #auto_connect
|
52
|
+
=> true
|
53
|
+
|
54
|
+
vlc.play('http://example.org/media.mp3')
|
55
|
+
=> true
|
56
|
+
|
57
|
+
vlc.progress
|
58
|
+
=> 1 #%
|
59
|
+
#...
|
60
|
+
|
61
|
+
#Technically this the same as
|
62
|
+
vlc = VLC::Client.new(VLC::Server.new('localhost', 9595, false))
|
63
|
+
# => "#<VLC::Client:0x000000011de128 @server=#<VLC::Server:0x000000011de380 @headless=false, @port=9595, @host=\"localhost\", @pid=12656>, @connection=#<VLC::Connection:0x000000011de038 @port=9595, @host=\"localhost\", @socket=#<TCPSocket:fd 5>>>"
|
64
|
+
```
|
65
|
+
|
66
|
+
###Get local VLC server lifecycle management control
|
67
|
+
_(requires a local installation of VLC media player)_
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
|
71
|
+
vlc = VLC::System.new('127.0.0.1', 9999, auto_start: false)
|
72
|
+
=> "#<VLC::System:0x00000001695f68 @client=#<VLC::Client:0x0000000169d718 @server=#<VLC::Server:0x00000001695ec8 @headless=false, @port=9999, @host=\"127.0.0.1\", @pid=VLC::NullObject>, @connection=#<VLC::Connection:0x0000000169d588 @port=9999, @host=\"127.0.0.1\", @socket=VLC::NullObject>>>"
|
73
|
+
|
74
|
+
vlc.server.running?
|
75
|
+
# => false
|
76
|
+
vlc.server.start
|
77
|
+
# => 12672
|
78
|
+
vlc.connect
|
79
|
+
# => true
|
80
|
+
```
|
81
|
+
|
82
|
+
## Reference
|
83
|
+
|
84
|
+
[reference](http://rdoc.info/github/mguinada/vlc-client)
|
85
|
+
|
86
|
+
## Support
|
87
|
+
|
88
|
+
vlc-client has been tested on linux only.
|
89
|
+
If you need support for other OS a pull request is welcome.
|
90
|
+
|
91
|
+
## Contributing
|
92
|
+
|
93
|
+
1. Fork it
|
94
|
+
2. Create your topic branch (`git checkout -b my-topic-branch`)
|
95
|
+
3. Add/change specs for your unimplemented feature or bug fix
|
96
|
+
4. Make sure specs fail by running `bundle exec rake spec`. If not return to step 3
|
97
|
+
5. Hack it
|
98
|
+
6. Make sure specs pass (`bundle exec rake spec`). If not return to step 5
|
99
|
+
7. Edit the documentation so it is coherent with your feature or fix. Run `bundle exec rake yard` to review
|
100
|
+
8. Commit changes (`git commit -am 'Add some feature/fix'`) and push to the branch (`git push origin my-topic-branch`)
|
101
|
+
9. Submit a pull request for your branch.
|
102
|
+
|
103
|
+
## Copyright
|
104
|
+
|
105
|
+
Copyright (c) 2012 Miguel Guinada
|
106
|
+
[LICENSE][] for details.
|
107
|
+
|
108
|
+
[license]: https://github.com/mguinada/vlc-client/blob/master/LICENSE
|
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
require 'yard'
|
5
|
+
|
6
|
+
task :test => :spec
|
7
|
+
task :default => :spec
|
8
|
+
|
9
|
+
RSpec::Core::RakeTask.new do |task|
|
10
|
+
task.rspec_opts = ["-c", "-f documentation", "-r ./spec/helper.rb"]
|
11
|
+
task.pattern = 'spec/**/*_spec.rb'
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Open an interactive session preloaded with this gem's code"
|
15
|
+
task :console do
|
16
|
+
if gem_available?("pry")
|
17
|
+
sh "pry -I lib -r vlc-client.rb"
|
18
|
+
else
|
19
|
+
sh "irb -rubygems -I lib -r vlc-client.rb"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
namespace :doc do
|
24
|
+
desc "Generate documentation"
|
25
|
+
YARD::Rake::YardocTask.new do |t|
|
26
|
+
t.files = ['lib/**/*.rb']
|
27
|
+
t.options = ['--no-private', '--protected', '--markup', 'markdown']
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
# Determins if a gem is available at the current runtime
|
33
|
+
#
|
34
|
+
def gem_available?(name)
|
35
|
+
Gem::Specification.find_by_name(name)
|
36
|
+
rescue Gem::LoadError
|
37
|
+
false
|
38
|
+
rescue
|
39
|
+
Gem.available?(name) #for backwards compatibility
|
40
|
+
end
|
data/lib/vlc-client.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'socket'
|
3
|
+
require 'retryable'
|
4
|
+
|
5
|
+
require 'vlc-client/version'
|
6
|
+
|
7
|
+
require 'vlc-client/null_object'
|
8
|
+
|
9
|
+
require 'vlc-client/core_ext/array'
|
10
|
+
|
11
|
+
require 'vlc-client/server'
|
12
|
+
require 'vlc-client/connection'
|
13
|
+
require 'vlc-client/errors'
|
14
|
+
|
15
|
+
require 'vlc-client/client/media_controls'
|
16
|
+
require 'vlc-client/client/video_controls'
|
17
|
+
require 'vlc-client/client/connection_management'
|
18
|
+
|
19
|
+
require 'vlc-client/system'
|
20
|
+
|
21
|
+
module VLC
|
22
|
+
# The VLC client
|
23
|
+
class Client
|
24
|
+
include VLC::Client::MediaControls
|
25
|
+
include VLC::Client::VideoControls
|
26
|
+
include VLC::Client::ConnectionManagement
|
27
|
+
|
28
|
+
attr_accessor :host,
|
29
|
+
:port,
|
30
|
+
:server
|
31
|
+
|
32
|
+
# Creates a client to manage VLC media player
|
33
|
+
#
|
34
|
+
# @overload initialize(host, port) sets the host and port
|
35
|
+
#
|
36
|
+
# @param [String] host The ip to connect to
|
37
|
+
# @param [Integer] port the port
|
38
|
+
#
|
39
|
+
# @example
|
40
|
+
# vlc = VLC::Client.new('10.10.0.10', 9000)
|
41
|
+
#
|
42
|
+
# @overload initialize(server, options) handle a server wrapper for a self-managed operation mode. This requires a local VLC media play instalation.
|
43
|
+
#
|
44
|
+
# @param [Server] server a VLC server lifecycle manager
|
45
|
+
# @param [Hash] options
|
46
|
+
# @option options [Boolean] :auto_start When false, the server lifecycle is not managed automatically and controll is passed to the developer
|
47
|
+
# @option options [Integer] :conn_retries Number of connection retries (each separated by a second) to make on auto-connect. Defaults to 5.
|
48
|
+
#
|
49
|
+
# @example
|
50
|
+
# vlc = VLC::Client.new(VLC::Server.new)
|
51
|
+
# vlc.server.started?
|
52
|
+
# => true
|
53
|
+
#
|
54
|
+
# vlc = VLC::Client.new(VLC::Server.new, auto_start: false)
|
55
|
+
# vlc.server.started?
|
56
|
+
# => false
|
57
|
+
#
|
58
|
+
# @return [VLC::VLC] a VLC client
|
59
|
+
#
|
60
|
+
# @raise [VLC::ConnectionRefused] if the connection fails
|
61
|
+
#
|
62
|
+
def initialize(*args)
|
63
|
+
args = NullObject.Null?(args)
|
64
|
+
options = args.extract_options!
|
65
|
+
|
66
|
+
process_args(args)
|
67
|
+
@connection = Connection.new(host, port)
|
68
|
+
bind_server(server, options) unless server.nil?
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
attr_reader :connection
|
73
|
+
|
74
|
+
def bind_server(server, options = {})
|
75
|
+
@connection.host = server.host
|
76
|
+
@connection.port = server.port
|
77
|
+
|
78
|
+
if options.fetch(:auto_start, true)
|
79
|
+
begin
|
80
|
+
@server.start
|
81
|
+
retryable(:tries => options.fetch(:conn_retries, 5), :on => VLC::ConnectionRefused) { connect }
|
82
|
+
rescue VLC::ConnectionRefused => e
|
83
|
+
@server.stop
|
84
|
+
raise e
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def process_args(args)
|
90
|
+
case args.size
|
91
|
+
when 1
|
92
|
+
@server = args.first
|
93
|
+
when 2
|
94
|
+
@host = args.first.to_s
|
95
|
+
@port = Integer(args.last)
|
96
|
+
else
|
97
|
+
@host, @port = 'localhost', 9595
|
98
|
+
end
|
99
|
+
args
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module VLC
|
2
|
+
class Client
|
3
|
+
module ConnectionManagement
|
4
|
+
# Connects to VLC RC interface on Client#host and Client#port
|
5
|
+
def connect
|
6
|
+
connection.connect
|
7
|
+
end
|
8
|
+
|
9
|
+
# Disconnects from VLC RC interface
|
10
|
+
def disconnect
|
11
|
+
connection.disconnect
|
12
|
+
end
|
13
|
+
|
14
|
+
# Queries if there is an active connection to VLC RC interface
|
15
|
+
#
|
16
|
+
def connected?
|
17
|
+
connection.connected?
|
18
|
+
end
|
19
|
+
|
20
|
+
def disconnected?; not connected?; end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module VLC
|
2
|
+
class Client
|
3
|
+
module MediaControls
|
4
|
+
# Plays media or resumes playback
|
5
|
+
#
|
6
|
+
# @overload play(media)
|
7
|
+
# addes the given media and plays it
|
8
|
+
#
|
9
|
+
# @param media [String, File, URI] the media to be played
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# vlc.play('http://example.org/media.mp3')
|
13
|
+
#
|
14
|
+
# @overload play
|
15
|
+
# plays the current media or resume playback is paused
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
# vlc.play('http://example.org/media.mp3')
|
19
|
+
# vlc.pause
|
20
|
+
# vlc.play #resume playback
|
21
|
+
#
|
22
|
+
def play(media = nil)
|
23
|
+
connection.write(media.nil? ? "play" : "add #{media_arg(media)}")
|
24
|
+
end
|
25
|
+
|
26
|
+
# Pauses playback
|
27
|
+
#
|
28
|
+
def pause
|
29
|
+
connection.write("pause")
|
30
|
+
end
|
31
|
+
|
32
|
+
# Stops media currently playing
|
33
|
+
#
|
34
|
+
def stop
|
35
|
+
connection.write("stop")
|
36
|
+
end
|
37
|
+
|
38
|
+
# Gets the title of the media at play
|
39
|
+
#
|
40
|
+
def title
|
41
|
+
connection.write("get_title", false)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Gets the current playback progress in time
|
45
|
+
#
|
46
|
+
# @return [Integer] time in seconds
|
47
|
+
#
|
48
|
+
def time
|
49
|
+
Integer(connection.write("get_time", false))
|
50
|
+
rescue ArgumentError
|
51
|
+
0
|
52
|
+
end
|
53
|
+
|
54
|
+
# Gets the length of the media being played
|
55
|
+
#
|
56
|
+
# @return [Integer] time in seconds
|
57
|
+
#
|
58
|
+
def length
|
59
|
+
Integer(connection.write("get_length", false))
|
60
|
+
rescue ArgumentError
|
61
|
+
0
|
62
|
+
end
|
63
|
+
|
64
|
+
# Get the progress of the the media being played
|
65
|
+
#
|
66
|
+
# @return [Integer] a relative value on percentage
|
67
|
+
#
|
68
|
+
def progress
|
69
|
+
l = length
|
70
|
+
l.zero? ? 0 : 100 * time / l
|
71
|
+
end
|
72
|
+
|
73
|
+
# Queries VLC if media is being played
|
74
|
+
#
|
75
|
+
def playing?
|
76
|
+
connection.write("is_playing", false) == "1"
|
77
|
+
end
|
78
|
+
|
79
|
+
# Queries VLC if playback is currently stopped
|
80
|
+
#
|
81
|
+
def stopped?
|
82
|
+
connection.write("is_playing", false) == "0"
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
def media_arg(media)
|
87
|
+
case media
|
88
|
+
when File
|
89
|
+
media.path
|
90
|
+
when String, URI
|
91
|
+
media
|
92
|
+
else
|
93
|
+
raise ArgumentError, "Can play: #{media}"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|