vlsync 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fb0dc5fd7faa1b4807d045e212fa85d25e2ad727
4
+ data.tar.gz: dbda0f738e2d196595b4d7229a7658703416c46e
5
+ SHA512:
6
+ metadata.gz: 96b13d51c6edc1d4e7eccb7b51e2b36e046aed754d953704d04a138f12074be44bdc017bc739168cd165671ba0c9990413ee07474ae75df13183a73c66a9051e
7
+ data.tar.gz: 898dfe01feee276a41de2f51ec1ca2677843f4af49a470473d2df74ba9b8a740c1cefc945b90d18a75423087031c5998abb16de3b2603cfd36981149fb287076
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in VlSync.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/VlSync.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'VlSync/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "vlsync"
8
+ spec.version = VlSync::VERSION
9
+ spec.authors = ["Jaci R"]
10
+ spec.email = ["jaci.brunning@gmail.com"]
11
+
12
+ spec.summary = %q{Sync VLC playback across multiple computers}
13
+ spec.homepage = "http://www.github.com/JacisNonsense/VlSync"
14
+
15
+ # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
16
+ # delete this section to allow pushing this gem to any host.
17
+ # if spec.respond_to?(:metadata)
18
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
19
+ # else
20
+ # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
21
+ # end
22
+
23
+ spec.bindir = "bin"
24
+ spec.files = Dir.glob("lib/**/*") + ['Rakefile', 'VlSync.gemspec', 'Gemfile', 'Rakefile']
25
+ spec.executables = ["vlsync"]
26
+ spec.require_paths = ["lib"]
27
+
28
+ spec.add_development_dependency "bundler"
29
+ spec.add_development_dependency "rake"
30
+ end
data/bin/vlsync ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env ruby
2
+ require 'VlSync'
data/lib/VlSync.rb ADDED
@@ -0,0 +1,61 @@
1
+ require "optparse"
2
+ require "socket"
3
+ require_relative "VlSync/version"
4
+ require_relative "VlSync/server"
5
+ require_relative "VlSync/client"
6
+ require_relative "VlSync/handlers"
7
+
8
+ module VlSync
9
+
10
+ trap("INT") {exit;}
11
+
12
+ VLC_PATHS = { :win_64 => "C:/Program Files (x86)/VideoLAN/VLC/vlc.exe",
13
+ :win_32 => "C:/Program Files/VideoLAN/VLC/vlc.exe",
14
+ :mac => "/Applications/VLC.app/Contents/MacOS/VLC",
15
+ :linux => "vlc" }
16
+
17
+ @opts = { :mode => :client, :hostname => Socket::getaddrinfo(Socket.gethostname,"echo",Socket::AF_INET)[0][3], :port => 5957, :bind => "0.0.0.0" }
18
+ OptionParser.new do |o|
19
+ o.on("-v VLC", "--vlc", "Set the VLC executable location") { |v| @opts[:vlc] = v }
20
+ o.on("-c", "--client", "Set this instance as a client (DEFAULT)") { @opts[:mode] = :client }
21
+ o.on("-s", "--server", "Set this instance as a server") { @opts[:mode] = :server }
22
+ o.on("-h HOSTNAME", "--host", "Set the hostname of the client") { |h| @opts[:hostname] = h }
23
+ o.on("-p PORT", "--port", "Set the port of the client(s)") { |port| @opts[:port] = port.to_i }
24
+ o.on("-b BIND", "--bind", "Set the bind address of the client multicast") { |addr| @opts[:bind] = addr }
25
+ end.parse!
26
+
27
+ def self.opts
28
+ @opts
29
+ end
30
+
31
+ def self.os
32
+ if (/Windows/ =~ ENV['OS']) != nil
33
+ return :windows
34
+ elsif (/darwin/ =~ RUBY_PLATFORM) != nil
35
+ return :darwin
36
+ else
37
+ return :linux
38
+ end
39
+ end
40
+
41
+ def self.vlc
42
+ return @opts[:vlc] if @opts.include? :vlc
43
+ op_s = os
44
+ return (File.exist?(VLC_PATHS[:win_64]) ? VLC_PATHS[:win_64] : VLC_PATHS[:win_32]) if op_s == :windows
45
+ return VLC_PATHS[:mac] if op_s == :darwin
46
+ return VLC_PATHS[:linux] if op_s == :linux
47
+ end
48
+
49
+ def self.launch
50
+ if @opts[:mode] == :server
51
+ puts "Starting in Server mode..."
52
+ @instance = VlSync::Server.new
53
+ else
54
+ puts "Starting in Client mode..."
55
+ @instance = VlSync::Client.new
56
+ end
57
+ end
58
+
59
+ launch
60
+
61
+ end
@@ -0,0 +1,29 @@
1
+ module VlSync
2
+ class Client
3
+
4
+ def initialize
5
+ @args = ['--extraintf', 'rc', '--rc-host', "#{VlSync.opts[:hostname]}:#{VlSync.opts[:port]}"]
6
+ puts "Client started at #{VlSync.opts[:hostname]} on port #{VlSync.opts[:port]}"
7
+ @vlc = VlSync.vlc
8
+ @pid = Process.spawn @vlc, *@args
9
+ listener
10
+ end
11
+
12
+ def listener
13
+ BasicSocket.do_not_reverse_lookup = true
14
+ addr = [VlSync.opts[:bind], VlSync.opts[:port]+1]
15
+ puts "Starting multicast at bind: #{addr[0]} on port #{addr[1]}"
16
+ s = UDPSocket.new
17
+ s.bind(addr[0], addr[1])
18
+ loop do
19
+ message, addr = s.recvfrom(255)
20
+ if message =~ /DISCOVER_VLSYNC/
21
+ sock = UDPSocket.new(addr[0])
22
+ puts "Host Found: #{addr[2]}"
23
+ sock.send("PONG_VLSYNC", 0, addr[2], VlSync.opts[:port])
24
+ end
25
+ end
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,36 @@
1
+ module VlSync
2
+ class Handlers
3
+ @handlers = {}
4
+
5
+ def self.register handle, &block
6
+ @handlers[handle] = block
7
+ end
8
+ def self.handlers; @handlers; end
9
+
10
+ def self.get str
11
+ @handlers.select { |key, val| (key =~ str) != nil }.first[1]
12
+ end
13
+
14
+ def self.has str
15
+ @handlers.select { |key, val| (key =~ str) != nil }.size > 0
16
+ end
17
+
18
+ register /^re((scan)|(fresh))$/ do |server, handle, *args|
19
+ server.refresh
20
+ end
21
+
22
+ register /^play$/ do |server, handle, *args|
23
+ server.write "add #{args[0]}" if args.length > 0
24
+ end
25
+
26
+ register /^sync$/ do |server, handle, *args|
27
+ server.write "seek 0"
28
+ server.write "pause"
29
+ end
30
+
31
+ register /^clients$/ do |server, handle, *args|
32
+ puts "Server Connections: #{server.sockets.inspect}"
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,62 @@
1
+ module VlSync
2
+ class Server
3
+
4
+ def initialize
5
+ puts "Server Started on port #{VlSync.opts[:port]}"
6
+ @discovery = Thread.new {
7
+ s = UDPSocket.new
8
+ s.bind(VlSync.opts[:bind], VlSync.opts[:port])
9
+ loop do
10
+ message, addr = s.recvfrom(255)
11
+ if message =~ /PONG_VLSYNC/
12
+ puts "Client Found: #{addr[2]}"
13
+ @clients << addr
14
+
15
+ tcp = TCPSocket.new addr[2], VlSync.opts[:port]
16
+ @client_socks << tcp
17
+ end
18
+ end
19
+ }
20
+ @multisocket = UDPSocket.new
21
+ @multisocket.setsockopt Socket::SOL_SOCKET, Socket::SO_BROADCAST, true
22
+
23
+ refresh
24
+ input
25
+ end
26
+
27
+ def sockets
28
+ @client_socks
29
+ end
30
+
31
+ def input
32
+ loop do
33
+ line = gets.chop!
34
+ match = line.match /(\w*)\s*(.*)/
35
+ name = match[1].downcase
36
+ args = match[2].split /\s+/
37
+
38
+ if VlSync::Handlers.has name
39
+ VlSync::Handlers.get(name).call(self, name, *args)
40
+ else
41
+ write line
42
+ end
43
+ end
44
+ end
45
+
46
+ def refresh
47
+ puts "Refreshing list of Clients..."
48
+ @client_socks.each {|sock| begin; sock.close; rescue; end} if defined? @client_socks
49
+ @client_socks = []
50
+ @clients = []
51
+ @multisocket.send("DISCOVER_VLSYNC", 0, "<broadcast>", VlSync.opts[:port]+1)
52
+ end
53
+
54
+ def write message
55
+ @client_socks.each {|sock| begin;
56
+ sock.puts message
57
+ sock.flush
58
+ rescue; end}
59
+ end
60
+
61
+ end
62
+ end
@@ -0,0 +1,3 @@
1
+ module VlSync
2
+ VERSION = "0.1.2"
3
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vlsync
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Jaci R
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description:
42
+ email:
43
+ - jaci.brunning@gmail.com
44
+ executables:
45
+ - vlsync
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - Gemfile
50
+ - Rakefile
51
+ - VlSync.gemspec
52
+ - bin/vlsync
53
+ - lib/VlSync.rb
54
+ - lib/VlSync/client.rb
55
+ - lib/VlSync/handlers.rb
56
+ - lib/VlSync/server.rb
57
+ - lib/VlSync/version.rb
58
+ homepage: http://www.github.com/JacisNonsense/VlSync
59
+ licenses: []
60
+ metadata: {}
61
+ post_install_message:
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ requirements: []
76
+ rubyforge_project:
77
+ rubygems_version: 2.4.5
78
+ signing_key:
79
+ specification_version: 4
80
+ summary: Sync VLC playback across multiple computers
81
+ test_files: []