mplayer-ruby 0.1.0

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.
@@ -0,0 +1,228 @@
1
+ module MPlayer
2
+ module SlaveVideoCommands
3
+
4
+ # Set/adjust the audio delay.
5
+ # If type is :relative adjust the delay by <value> seconds.
6
+ # If type is :absolute, set the delay to <value> seconds.
7
+ def audio_delay(value,type = :relative)
8
+ adjust_set :audio_delay, value, type
9
+ end
10
+
11
+ # Adjust the subtitle delay
12
+ # :relative is adjust by +/- <value> seconds.
13
+ # :absolute is set it to <value>. (default)
14
+ def sub_delay(value,type = :absolute)
15
+ adjust_set :sub_delay, value, type
16
+ end
17
+
18
+ # Step forward in the subtitle list by <value> steps
19
+ # step backwards if <value> is negative
20
+ # can also set type to :backward or :forward and return postive <value>
21
+ def sub_step(value, type = :forward)
22
+ type = :backward if value < 0
23
+ send(type == :forward ? "sub_step #{value.abs}" : "sub_step -#{value.abs}" )
24
+ end
25
+
26
+ # Toggle OSD mode
27
+ # or set it to <level>
28
+ def osd(level=nil)
29
+ send(level.nil? ? "osd" : "osd #{level}")
30
+ end
31
+
32
+ # Show <string> on the OSD.
33
+ # :duration sets the length to display text.
34
+ # :level sets the osd level to display at. (default: 0 => always show)
35
+ def osd_show_text(string,options = {})
36
+ options.reverse_merge!({:duration => 0, :level => 0})
37
+ send("osd_show_text #{string} #{options[:duration]} #{options[:level]}")
38
+ end
39
+
40
+ # Show an expanded property string on the OSD
41
+ # see -playing-msg for a list of available expansions
42
+ # :duration sets the length to display text.
43
+ # :level sets the osd level to display at. (default: 0 => always show)
44
+ def osd_show_property_text(string,options={})
45
+ options.reverse_merge!({:duration => 0, :level => 0})
46
+ send("osd_show_property_text #{string} #{options[:duration]} #{options[:level]}")
47
+ end
48
+
49
+ # Set/adjust video parameters.
50
+ # If :relative, modifies parameter by <value>.
51
+ # If :absolute, parameter is set to <value>.
52
+ # <value> is in the range [-100, 100].
53
+ def contrast(value, type = :relative)
54
+ setting :contrast, value, type
55
+ end
56
+
57
+ # Set/adjust video parameters.
58
+ # If :relative, modifies parameter by <value>.
59
+ # If :absolute, parameter is set to <value>.
60
+ # <value> is in the range [-100, 100].
61
+ def gamma(value, type = :relative)
62
+ setting :gamma, value, type
63
+ end
64
+
65
+ # Set/adjust video parameters.
66
+ # If :relative, modifies parameter by <value>.
67
+ # If :absolute, parameter is set to <value>.
68
+ # <value> is in the range [-100, 100].
69
+ def hue(value, type = :relative)
70
+ setting :hue, value, type
71
+ end
72
+
73
+ # Set/adjust video parameters.
74
+ # If :relative, modifies parameter by <value>.
75
+ # If :absolute, parameter is set to <value>.
76
+ # <value> is in the range [-100, 100].
77
+ def brightness(value, type = :relative)
78
+ setting :brightness, value, type
79
+ end
80
+
81
+ # Set/adjust video parameters.
82
+ # If :relative, modifies parameter by <value>.
83
+ # If :absolute, parameter is set to <value>.
84
+ # <value> is in the range [-100, 100].
85
+ def saturation(value, type = :relative)
86
+ setting :saturation, value, type
87
+ end
88
+
89
+ # Toggle/set frame dropping mode
90
+ # if :on, turns on dropping mode
91
+ # if :off, turns off dropping mode
92
+ # call by itself toggles dropping mode
93
+ def frame_drop(value = nil)
94
+ toggle :frame_drop, value
95
+ end
96
+
97
+ # Adjust/set subtitle position.
98
+ # If :relative, modifies parameter by <value>.
99
+ # If :absolute, parameter is set to <value>.
100
+ def sub_pos(value,type = :relative)
101
+ adjust_set :sub_pos, value, type
102
+ end
103
+
104
+ # Toggle/set subtitle alignment. [alignment]
105
+ # :top sets top alignment
106
+ # :center sets center alignment
107
+ # :bottom sets bottom alignment
108
+ def sub_alignment(alignment = nil)
109
+ send case alignment
110
+ when :top then "sub_alignment 0"
111
+ when :center then "sub_alignment 1"
112
+ when :bottom then "sub_alignment 2"
113
+ else "sub_alignment"
114
+ end
115
+ end
116
+
117
+ # Toggle/set subtitle visibility.
118
+ # :on turns on visilibity.
119
+ # :off turns off visilibility.
120
+ # else toggles visibility.
121
+ def sub_visibility(value = nil)
122
+ toggle :sub_visibility, value
123
+ end
124
+
125
+ # Loads subtitles from <file>.
126
+ def sub_load(file)
127
+ raise ArgumentError, "Invalid File" unless File.exists? file
128
+ send("sub_load #{file}")
129
+ end
130
+
131
+ # Removes the selected sub file
132
+ # :all removes all sub files. (Default)
133
+ # <value> removes the sub file at that index.
134
+ def sub_remove(value = :all)
135
+ cmd = (value == :all ? -1 : value)
136
+ send "sub_remove #{cmd}"
137
+ end
138
+
139
+ # Displays subtitle
140
+ # :cycle will cycle through all sub_titles. (Default)
141
+ # <value> will display the sub_title at that index.
142
+ def sub_select(value = :cycle)
143
+ cmd = (value == :cycle ? -2 : value)
144
+ send "sub_select #{cmd}"
145
+ end
146
+
147
+ # Display first subtitle from <value>
148
+ # :sub for SUB_SOURCE_SUBS for file subs
149
+ # :vobsub for SUB_SOURCE_VOBSUB for VOBsub files
150
+ # :demux SUB_SOURCE_DEMUX for subtitle embedded in the media file or DVD subs.
151
+ # :off will turn off subtitle display.
152
+ # :cycle will cycle between the first subtitle of each currently available sources.
153
+ def sub_source(value = :cycle)
154
+ switch = case value
155
+ when :sub then 0
156
+ when :vobsub then 1
157
+ when :demux then 2
158
+ when :off then -1
159
+ when :cycle then -2
160
+ end
161
+ send "sub_source #{switch}"
162
+ end
163
+
164
+ # Display subtitle specifid by <value> for file subs. corresponding to ID_FILE_SUB_ID
165
+ # :off turns off sub
166
+ # :cycle will cycle all file subs. (Default)
167
+ def sub_vob(value = :cycle)
168
+ select_cycle :sub_vob, value
169
+ end
170
+
171
+ # Display subtitle specifid by <value> for file subs. corresponding to ID_VOBSUB_ID
172
+ # :off turns off sub
173
+ # :cycle will cycle all file subs. (Default)
174
+ def sub_file(value = :cycle)
175
+ select_cycle :sub_file, value
176
+ end
177
+
178
+ # Display subtitle specifid by <value> for file subs. corresponding to ID_SUBTITLE_ID
179
+ # :off turns off sub
180
+ # :cycle will cycle all file subs. (Default)
181
+ def sub_demux(value = :cycle)
182
+ select_cycle :sub_demux, value
183
+ end
184
+
185
+ # Adjust the subtitle size by +/- <value>
186
+ # :set set it to <value>
187
+ # :relative adjusts it by value
188
+ def sub_scale(value,type = :relative)
189
+ adjust_set :sub_scale, value, type
190
+ end
191
+
192
+ # switch_audio [value] (currently MPEG*, AVI, Matroska and streams handled by libavformat)
193
+ # <value> Switch to the audio track with the ID <value>.
194
+ # :cycle available tracks if [value] is omitted or negative.
195
+ def switch_audio(value = :cycle)
196
+ select_cycle :switch_audio, value
197
+ end
198
+ # switch_angle [value] (DVDs only)
199
+ # <value> Switch to the DVD angle with the ID [value].
200
+ # :cycle available angles if [value] is omitted or negative.
201
+ def switch_angle(value = :cycle)
202
+ select_cycle :switch_angle, value
203
+ end
204
+
205
+ # switch_title [value] (DVDNAV only)
206
+ # <value> Switch to the DVD title with the ID [value].
207
+ # :cycle available titles if [value] is omitted or negative.
208
+ def switch_title(value = :cycle)
209
+ select_cycle :switch_title, value
210
+ end
211
+
212
+ # switch_ratio [value]
213
+ # <value> Change aspect ratio at runtime. [value] is the new aspect ratio expressed
214
+ # as a float (e.g. 1.77778 for 16/9).
215
+ # There might be problems with some video filters.
216
+ def switch_ratio(value); send("switch_ratio #{value}"); end
217
+
218
+ # switch_vsync [value]
219
+ # :on Toggle vsync on
220
+ # :off Toggle off
221
+ # nil for just Toggle
222
+ def switch_vsync(value = nil)
223
+ toggle :switch_vsync, value
224
+ end
225
+
226
+
227
+ end
228
+ end
@@ -0,0 +1,75 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{mplayer-ruby}
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 = ["Arthur Chiu"]
12
+ s.date = %q{2010-02-01}
13
+ s.description = %q{A Ruby wrapper for MPlayer}
14
+ s.email = %q{mr.arthur.chiu@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc",
18
+ "TODO"
19
+ ]
20
+ s.files = [
21
+ ".document",
22
+ ".gitignore",
23
+ "LICENSE",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "TODO",
27
+ "VERSION",
28
+ "examples/general_playback.rb",
29
+ "lib/mplayer-ruby.rb",
30
+ "lib/mplayer-ruby/slave.rb",
31
+ "lib/mplayer-ruby/slave_commands.rb",
32
+ "lib/mplayer-ruby/slave_video_commands.rb",
33
+ "mplayer-ruby.gemspec",
34
+ "test.watchr",
35
+ "test/mplayer-ruby_test.rb",
36
+ "test/slave_commands_test.rb",
37
+ "test/slave_test.rb",
38
+ "test/slave_video_commands_test.rb",
39
+ "test/test.mp3",
40
+ "test/teststrap.rb"
41
+ ]
42
+ s.homepage = %q{http://github.com/achiu/mplayer-ruby}
43
+ s.rdoc_options = ["--charset=UTF-8"]
44
+ s.require_paths = ["lib"]
45
+ s.rubygems_version = %q{1.3.5}
46
+ s.summary = %q{Ruby wrapper for MPlayer}
47
+ s.test_files = [
48
+ "test/mplayer-ruby_test.rb",
49
+ "test/slave_commands_test.rb",
50
+ "test/slave_test.rb",
51
+ "test/slave_video_commands_test.rb",
52
+ "test/teststrap.rb",
53
+ "examples/general_playback.rb"
54
+ ]
55
+
56
+ if s.respond_to? :specification_version then
57
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
58
+ s.specification_version = 3
59
+
60
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
61
+ s.add_development_dependency(%q<riot>, [">= 0.10.11"])
62
+ s.add_development_dependency(%q<rr>, [">= 0.10.5"])
63
+ s.add_runtime_dependency(%q<open4>, [">= 1.0.1"])
64
+ else
65
+ s.add_dependency(%q<riot>, [">= 0.10.11"])
66
+ s.add_dependency(%q<rr>, [">= 0.10.5"])
67
+ s.add_dependency(%q<open4>, [">= 1.0.1"])
68
+ end
69
+ else
70
+ s.add_dependency(%q<riot>, [">= 0.10.11"])
71
+ s.add_dependency(%q<rr>, [">= 0.10.5"])
72
+ s.add_dependency(%q<open4>, [">= 1.0.1"])
73
+ end
74
+ end
75
+
@@ -0,0 +1,45 @@
1
+ #
2
+ # 'autotest' for riot
3
+ # install watchr
4
+ # $ sudo gem install watchr
5
+ #
6
+ # Run With:
7
+ # $ watchr test.watchr
8
+ #
9
+
10
+ # --------------------------------------------------
11
+ # Helpers
12
+ # --------------------------------------------------
13
+
14
+ def run(cmd)
15
+ puts(cmd)
16
+ system(cmd)
17
+ end
18
+
19
+ def run_all_tests
20
+ system( "rake test" )
21
+ end
22
+
23
+ def sudo(cmd)
24
+ run("sudo #{cmd}")
25
+ end
26
+
27
+ # --------------------------------------------------
28
+ # Watchr Rules
29
+ # --------------------------------------------------
30
+ watch("^lib.*/(.*)\.rb") { |m| run("ruby -rubygems test/#{m[1]}_test.rb") }
31
+ watch("test.*/teststrap\.rb") { run_all_tests }
32
+ watch('^test.*/(.*)_test\.rb') { |m| run("ruby -rubygems test/#{m[1]}_test.rb") }
33
+ watch('(.*)\.gemspec') { |m| sudo("rake install") }
34
+
35
+ # --------------------------------------------------
36
+ # Signal Handling
37
+ # --------------------------------------------------
38
+ # Ctrl-\
39
+ Signal.trap('QUIT') do
40
+ puts " --- Running all tests ---\n\n"
41
+ run_all_tests
42
+ end
43
+
44
+ # Ctrl-C
45
+ Signal.trap('INT') { abort("\n") }
@@ -0,0 +1,2 @@
1
+ require File.expand_path("teststrap", File.dirname(__FILE__))
2
+
@@ -0,0 +1,239 @@
1
+ require File.expand_path("teststrap", File.dirname(__FILE__))
2
+
3
+ context "MPlayer::Player" do
4
+ setup do
5
+ mock(Open4).popen4("/usr/bin/mplayer -slave -quiet test/test.mp3") { [true,true,true,true] }
6
+ stub(true).gets { "playback" }
7
+ @player = MPlayer::Slave.new('test/test.mp3')
8
+ end
9
+
10
+ context "pause" do
11
+ setup { mock_send @player, "pause" }
12
+ asserts("returns true") { @player.pause }
13
+ end
14
+
15
+ context "quit" do
16
+ setup do
17
+ mock_send @player, "quit"
18
+ mock(@player.stdin).close { true }
19
+ end
20
+ asserts("returns true") { @player.quit }
21
+ end
22
+
23
+ context "volume" do
24
+
25
+ context "increases" do
26
+ setup { mock_send @player, "volume 1","Volume: 10 %\n",/Volume/ }
27
+ asserts("returns true") { @player.volume :up }.equals "10"
28
+ end
29
+
30
+ context "decreases" do
31
+ setup { mock_send @player, "volume 0","Volume: 10 %\n",/Volume/ }
32
+ asserts("returns true") { @player.volume :down }.equals "10"
33
+ end
34
+
35
+ context "sets volume" do
36
+ setup { mock_send @player, "volume 40 1","Volume: 10 %\n",/Volume/ }
37
+ asserts("returns true") { @player.volume :set,40 }.equals "10"
38
+ end
39
+
40
+ context "incorrect action" do
41
+ setup { @player.volume :boo }
42
+ asserts("returns false").equals false
43
+ end
44
+ end
45
+
46
+ context "seek" do
47
+
48
+ context "by relative" do
49
+ setup { mock_send @player, "seek 5 0","Position: 10 %\n",/Position/ }
50
+ asserts("seek 5") { @player.seek 5 }
51
+ asserts("seek 5,:relative") { @player.seek 5,:relative }.equals "10"
52
+ end
53
+
54
+ context "by percentage" do
55
+ setup { mock_send @player, "seek 5 1","Position: 10 %\n",/Position/ }
56
+ asserts("seek 5,:percent") { @player.seek 5,:percent }.equals "10"
57
+ end
58
+
59
+ context "by absolute" do
60
+ setup { mock_send @player, "seek 5 2","Position: 10 %\n",/Position/ }
61
+ asserts("seek 5,:absolute") { @player.seek 5,:absolute }.equals "10"
62
+ end
63
+ end
64
+
65
+ context "edl_mark" do
66
+ setup { mock_send @player, "edl_mark"}
67
+ asserts("returns true") { @player.edl_mark }
68
+ end
69
+
70
+ context "speed_incr" do
71
+ setup { mock_send @player, "speed_incr 5","Speed: x 10",/Speed/ }
72
+ asserts("speed_incr 5") { @player.speed_incr 5 }.equals "10"
73
+ end
74
+
75
+ context "speed_mult" do
76
+ setup { mock_send @player, "speed_mult 5","Speed: x 10",/Speed/ }
77
+ asserts("speed_mult 5") { @player.speed_mult 5 }.equals "10"
78
+ end
79
+
80
+ context "speed_set" do
81
+ setup { mock_send @player, "speed_set 5","Speed: x 10",/Speed/ }
82
+ asserts("speed_set 5") { @player.speed_set 5 }.equals "10"
83
+ end
84
+
85
+ context "speed_set speed_mult speed_incr raise error" do
86
+ asserts("speed_incr 6") { @player.speed_incr 6 }.raises ArgumentError,"Value must be less than 6"
87
+ asserts("speed_mult 6") { @player.speed_mult 6 }.raises ArgumentError,"Value must be less than 6"
88
+ asserts("speed_set 6") { @player.speed_set 6 }.raises ArgumentError,"Value must be less than 6"
89
+ end
90
+
91
+ context "speed" do
92
+
93
+ context "increment" do
94
+ setup { mock(@player).speed_incr(5) { true } }
95
+ asserts("speed 5,:increment") { @player.speed 5,:increment }
96
+ end
97
+
98
+ context "multiply" do
99
+ setup { mock(@player).speed_mult(5) { true } }
100
+ asserts("speed 5,:multiply") { @player.speed 5,:multiply }
101
+ end
102
+
103
+ context "set" do
104
+ setup { mock(@player).speed_set(5) { true } }
105
+ asserts("speed 5") { @player.speed 5 }
106
+ asserts("speed 5, :set") { @player.speed 5,:set }
107
+ end
108
+ end
109
+
110
+ context "frame_step" do
111
+ setup { mock_send @player, "frame_step" }
112
+ asserts("returns true") { @player.frame_step }
113
+ end
114
+
115
+ context "pt_step" do
116
+
117
+ context "forced" do
118
+ setup { mock_send @player, "pt_step 5 1" }
119
+ asserts("pt_step 5, :force") { @player.pt_step 5, :force }
120
+ end
121
+
122
+ context "not forced" do
123
+ setup { mock_send @player, "pt_step 5 0" }
124
+ asserts("pt_step 5") { @player.pt_step 5 }
125
+ asserts("pt_step 5, :no_force") { @player.pt_step 5, :no_force }
126
+ end
127
+ end
128
+
129
+ context "pt_up_step" do
130
+
131
+ context "forced" do
132
+ setup { mock_send @player, "pt_up_step 5 1"}
133
+ asserts("pt_up_step 5, :force") { @player.pt_up_step 5, :force }
134
+ end
135
+
136
+ context "not forced" do
137
+ setup { mock_send @player, "pt_up_step 5 0" }
138
+ asserts("pt_up_step 5") { @player.pt_up_step 5 }
139
+ asserts("pt_up_step 5, :no_force") { @player.pt_up_step 5, :no_force }
140
+ end
141
+ end
142
+
143
+ context "alt_src_step" do
144
+ setup { mock_send @player, "alt_src_step 5" }
145
+ asserts("returns true") { @player.alt_src_step 5 }
146
+ end
147
+
148
+ context "loop" do
149
+
150
+ context "none" do
151
+ setup { mock_send @player,"loop -1" }
152
+ asserts("loop :none") { @player.loop :none }
153
+ end
154
+
155
+ context "forever" do
156
+ setup { mock_send @player, "loop 0" }
157
+ asserts("loop") { @player.loop }
158
+ asserts("loop :forever") { @player.loop :forever }
159
+ end
160
+
161
+ context "set value" do
162
+ setup { mock_send @player,"loop 5" }
163
+ asserts("loop :set, 5") { @player.loop :set, 5 }
164
+ end
165
+ end
166
+
167
+ context "use_master" do
168
+ setup { mock_send @player, "use_master" }
169
+ asserts("returns true") { @player.use_master }
170
+ end
171
+
172
+ context "mute" do
173
+
174
+ context "toggle" do
175
+ setup { mock_send @player, "mute", "Mute: enabled",/Mute/}
176
+ asserts("returns true") { @player.mute }.equals "enabled"
177
+ end
178
+
179
+ context "set on" do
180
+ setup { mock_send @player, "mute 1","Mute: enabled",/Mute/}
181
+ asserts("mute :on") { @player.mute :on }.equals "enabled"
182
+ end
183
+
184
+ context "set off" do
185
+ setup { mock_send @player, "mute 0","Mute: enabled",/Mute/}
186
+ asserts("mute :off") { @player.mute :off }.equals "enabled"
187
+ end
188
+ end
189
+
190
+ context "get" do
191
+
192
+ %w[time_pos time_length file_name video_codec video_bitrate video_resolution
193
+ audio_codec audio_bitrate audio_samples meta_title meta_artist meta_album
194
+ meta_year meta_comment meta_track meta_genre].each do |info|
195
+ context info do
196
+ resp = case info
197
+ when "time_pos" then "ANS_TIME_POSITION"
198
+ when "time_length" then "ANS_LENGTH"
199
+ when "file_name" then "ANS_FILENAME"
200
+ else "ANS_#{info.upcase}"
201
+ end
202
+ setup { mock_send @player, "get_#{info}","#{resp}='100'",/#{resp}/ }
203
+ asserts("get :#{info}") { @player.get info.to_sym }
204
+ end
205
+ end
206
+ end
207
+
208
+ context "load_file" do
209
+
210
+ asserts("invalid file") { @player.load_file 'booger' }.raises ArgumentError,"Invalid File"
211
+ context "append" do
212
+ setup { mock_send @player, "loadfile test/test.mp3 1" }
213
+ asserts("load_file test/test.mp3, :append") { @player.load_file 'test/test.mp3', :append }
214
+ end
215
+
216
+ context "no append" do
217
+ setup { mock_send @player, "loadfile test/test.mp3 0" }
218
+ asserts("load_file test/test.mp3") { @player.load_file 'test/test.mp3' }
219
+ asserts("load_file test/test.mp3, :no_append") { @player.load_file 'test/test.mp3', :no_append }
220
+ end
221
+ end
222
+
223
+ context "load_list" do
224
+
225
+ asserts("invalid playlist") { @player.load_list 'booger' }.raises ArgumentError,"Invalid File"
226
+ context "append" do
227
+ setup { mock_send @player, "loadlist test/test.mp3 1" }
228
+ asserts("load_list test/test.mp3, :append") { @player.load_list 'test/test.mp3', :append }
229
+ end
230
+
231
+ context "no append" do
232
+ setup { mock_send @player, "loadlist test/test.mp3 0" }
233
+ asserts("load_list test/test.mp3") { @player.load_list 'test/test.mp3' }
234
+ asserts("load_list test/test.mp3, :no_append") { @player.load_list 'test/test.mp3', :no_append }
235
+ end
236
+ end
237
+
238
+
239
+ end