Skip to content
This repository has been archived by the owner on Jan 17, 2018. It is now read-only.

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
javallone committed Jan 25, 2012
0 parents commit 6d23176
Show file tree
Hide file tree
Showing 26 changed files with 1,324 additions and 0 deletions.
10 changes: 10 additions & 0 deletions Gemfile
@@ -0,0 +1,10 @@
source "http://rubygems.org"
gem "rack"
gem "sinatra"

gem "ken"
gem "data_mapper"
gem "dm-sqlite-adapter"
gem "amatch"

gem "redis"
88 changes: 88 additions & 0 deletions Gemfile.lock
@@ -0,0 +1,88 @@
GEM
remote: http://rubygems.org/
specs:
addressable (2.2.6)
amatch (0.2.9)
tins (~> 0.3)
bcrypt-ruby (3.0.1)
data_mapper (1.2.0)
dm-aggregates (~> 1.2.0)
dm-constraints (~> 1.2.0)
dm-core (~> 1.2.0)
dm-migrations (~> 1.2.0)
dm-serializer (~> 1.2.0)
dm-timestamps (~> 1.2.0)
dm-transactions (~> 1.2.0)
dm-types (~> 1.2.0)
dm-validations (~> 1.2.0)
data_objects (0.10.7)
addressable (~> 2.1)
dm-aggregates (1.2.0)
dm-core (~> 1.2.0)
dm-constraints (1.2.0)
dm-core (~> 1.2.0)
dm-core (1.2.0)
addressable (~> 2.2.6)
dm-do-adapter (1.2.0)
data_objects (~> 0.10.6)
dm-core (~> 1.2.0)
dm-migrations (1.2.0)
dm-core (~> 1.2.0)
dm-serializer (1.2.1)
dm-core (~> 1.2.0)
fastercsv (~> 1.5.4)
json (~> 1.6.1)
json_pure (~> 1.6.1)
multi_json (~> 1.0.3)
dm-sqlite-adapter (1.2.0)
dm-do-adapter (~> 1.2.0)
do_sqlite3 (~> 0.10.6)
dm-timestamps (1.2.0)
dm-core (~> 1.2.0)
dm-transactions (1.2.0)
dm-core (~> 1.2.0)
dm-types (1.2.1)
bcrypt-ruby (~> 3.0.0)
dm-core (~> 1.2.0)
fastercsv (~> 1.5.4)
json (~> 1.6.1)
multi_json (~> 1.0.3)
stringex (~> 1.3.0)
uuidtools (~> 2.1.2)
dm-validations (1.2.0)
dm-core (~> 1.2.0)
do_sqlite3 (0.10.7)
data_objects (= 0.10.7)
extlib (0.9.15)
fastercsv (1.5.4)
json (1.6.4)
json_pure (1.6.4)
ken (0.2.1)
addressable
extlib
json
multi_json (1.0.4)
rack (1.4.0)
rack-protection (1.2.0)
rack
redis (2.2.2)
sinatra (1.3.2)
rack (~> 1.3, >= 1.3.6)
rack-protection (~> 1.2)
tilt (~> 1.3, >= 1.3.3)
stringex (1.3.0)
tilt (1.3.3)
tins (0.3.7)
uuidtools (2.1.2)

PLATFORMS
ruby

DEPENDENCIES
amatch
data_mapper
dm-sqlite-adapter
ken
rack
redis
sinatra
3 changes: 3 additions & 0 deletions README
@@ -0,0 +1,3 @@
Web controller DVD player.

This was written as a personal project. I have no plans for expanding it to a full-fledged project, I'm just posting it here to have it somewhere safe.
16 changes: 16 additions & 0 deletions config.ru
@@ -0,0 +1,16 @@
require File.join(File.dirname(__FILE__), 'sideshow/sideshow')

Sideshow::Model.init(ENV['DB'])
Sideshow::App.init()

map "/static" do
run Rack::File.new(File.join(File.dirname(__FILE__), 'static'))
end

map "/control" do
run Sideshow::Controller
end

map "/" do
run Sideshow::App
end
143 changes: 143 additions & 0 deletions mplayer/control.rb
@@ -0,0 +1,143 @@
module Mplayer
class Control
attr_accessor :command
attr_accessor :env

def initialize(command, display = ":0")
self.command = command
self.env = { "DISPLAY" => display }
@open = false
end

def open(file)
self.stop if @open

@stdout, w = IO.pipe
r, @stdin = IO.pipe
@process = Process.spawn(self.env, self.command.sub("%DVD_IMAGE%", file),
:out => w,
:in => r,
:err => "/dev/null")
nil
@open = true
end

def send_command(cmd)
if @open
begin
while true
@stdout.read_nonblock(1000)
end
rescue Errno::EAGAIN
# Do nothing
end
@stdin.puts(cmd)
sleep(0.25)

result = ''
begin
while true
result += @stdout.read_nonblock(1000)
end
rescue
# Do nothing
end

result.sub(/\n$/, "")
end
end

def get_property(name)
result = self.send_command("pausing_keep_force get_property #{name}")

if result.match("ANS_#{name}=")
property = Property.new(name)
property.mplayer_value = result.sub("ANS_#{name}=", "")
return property.to_object
else
return result # TODO: Throw an exception
end
end

def set_property(name, value)
property = Property.new(name)
property.value = value;

if property.set?
self.send_command("pausing_keep_force set_property #{name} #{property.mplayer_value}")
end
end

def step_property(name, value = 0, direction = 1)
property = Property.new(name)

if property.step?
self.send_command("pausing_keep_force step_property #{name} #{value} #{direction}")
end
end

def nav(button)
self.send_command("dvdnav #{button.to_s}")

case button
when :select
self.set_property(:sub_forced_only, true)
when :menu
self.set_property(:sub_forced_only, false)
end
end

def pause
self.send_command("pause")
end

def paused?
self.get_property(:pause)
end

def stop
self.send_command("stop")
@open = false
end

def chapter
self.get_property(:chapter)
end

def chapter=(chapter)
self.set_property(:chapter, chapter)
end

def chapters
self.get_property(:chapters)
end

def pos
self.get_property(:time_pos)
end

def pos=(pos)
self.set_property(:stream_time_pos, pos) # Returns a more accurate value, but can't be set
end

def length
self.get_property(:length)
end

def seek(value, method = :relative)
case method
when :relative
type = 0
when :percent
type = 1
when :absolute
type = 2
end
self.send_command("seek #{value} #{type}")
end

def seek_chapter(direction)
self.step_property(:chapter, 1, direction)
end
end
end
2 changes: 2 additions & 0 deletions mplayer/mplayer.rb
@@ -0,0 +1,2 @@
require_relative 'property'
require_relative 'control'
82 changes: 82 additions & 0 deletions mplayer/property.rb
@@ -0,0 +1,82 @@
module Mplayer
class Property
def self.properties
{
:pause => { :type => :flag, :set => false, :step => false },
:chapter => { :type => :int, :set => true, :step => true },
:chapters => { :type => :int, :set => false, :step => false },
:length => { :type => :time, :set => false, :step => false },
:percent_pos => { :type => :int, :set => true, :step => true },
:time_pos => { :type => :time, :set => true, :step => true },
:stream_time_pos => { :type => :time, :set => false, :step => false },
:sub_forced_only => { :type => :flag, :set => true, :step => true }
}
end

attr_accessor :name
attr_accessor :value
attr_accessor :mplayer_value

def initialize(name)
self.name = name
self.value = value
end

def name=(name)
@name = name.to_sym
end

def value
case Property.properties[self.name][:type]
when :int
return @value.to_i
when :float
return @value.to_f
when :flag
return (@value == "1")
when :time
return @value.to_i
else
return @value
end
end

def value=(value)
case Property.properties[self.name][:type]
when :flag
@value = (value ? "1" : "0");
else
@value = value.to_s
end
end

def mplayer_value
@value
end

def mplayer_value=(value)
case Property.properties[self.name][:type]
when :flag
@value = (value == "yes" ? "1" : "0")
else
@value = value
end
end

def set?
Property.properties[self.name][:set]
end

def step?
Property.properties[self.name][:step]
end

def to_object
self.value
end

def to_mplayer
self.mplayer_value
end
end
end

0 comments on commit 6d23176

Please sign in to comment.