sensible-cinema 0.7.5 → 0.7.7
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +5 -2
- data/README +31 -24
- data/Rakefile +3 -3
- data/TODO +21 -11
- data/VERSION +1 -1
- data/lib/muter.rb +2 -1
- data/lib/overlayer.rb +26 -21
- data/lib/screen_tracker.rb +5 -4
- data/spec/common.rb +65 -1
- data/spec/{ocr.spec.orb → ocr.spec.rb} +0 -0
- data/spec/overlayer.spec.rb +81 -51
- data/spec/screen_tracker.spec.rb +24 -26
- data/zamples/players/{hulu_full_screen_total_length_over_an_hour.yml → total_length_over_an_hour/hulu_full_screened.yml} +0 -0
- data/zamples/players/{vlc_full_screened_total_length_over_an_hour.yml → total_length_over_an_hour/vlc_full_screened.yml} +0 -0
- data/zamples/players/{vlc_non_full_screened_and_total_length_over_an_hour.yml → total_length_over_an_hour/vlc_windowed.yml} +0 -0
- data/zamples/players/{vlc_non_full_screened_and_total_length_under_an_hour.yml → total_length_under_an_hour/vlc_non_full_screened.yml} +0 -0
- data/zamples/scene_lists/categories.yml +23 -0
- data/zamples/scene_lists/labyrinth.yml +14 -13
- data/zamples/scene_lists/star_trek_generations_hulu.yml +6 -7
- metadata +32 -45
- data/zamples/players/sample_snapshots/hulu full screen non hour.jpg +0 -0
- data/zamples/players/sample_snapshots/hulu full screen over hour.jpg +0 -0
- data/zamples/players/sample_snapshots/silence.bmp +0 -0
- data/zamples/players/sample_snapshots/vlc grab over one hour file over one hour play.bmp +0 -0
- data/zamples/players/sample_snapshots/vlc2.bmp +0 -0
- data/zamples/players/sample_snapshots/vlc_full_screen_slider under one hour.bmp +0 -0
data/LICENSE
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
All files released under the GPLv3 license [1] unless otherwise specified. Ping me if you need this changed.
|
2
2
|
|
3
|
-
May contain some 3rd party libraries under their own (separate, open source)
|
3
|
+
May contain some 3rd party libraries under their own (separate, open source) license.
|
4
4
|
|
5
|
-
Note that this software should be legal
|
5
|
+
Note that this software should be legal in the EU,
|
6
6
|
as it is only software and therefore theoretically not subject to patents (see "What about patent licenses?" in [2]).
|
7
7
|
|
8
8
|
If it's not legal in your country, don't use it!
|
9
9
|
|
10
|
+
http://en.wikipedia.org/wiki/Family_Entertainment_and_Copyright_Act describes a recent US law that appears related,
|
11
|
+
in its favor.
|
12
|
+
|
10
13
|
A history of various related thoughts can be found here: http://betterlogic.com/roger/?p=2618
|
11
14
|
|
12
15
|
[1] http://www.gnu.org/licenses/gpl.html, also gplv3 file.
|
data/README
CHANGED
@@ -2,35 +2,27 @@ Sensible-cinema is a program that allows you to do pre-programmed scene selectio
|
|
2
2
|
or "bleep out" scenes) on arbitrary media players like netflix online, vlc, etc.
|
3
3
|
|
4
4
|
Currently it takes as input a list of known "skip-worthy" scenes.
|
5
|
-
It then tracks
|
5
|
+
It then tracks whichever player you are using, and mutes or blanks out the system appropriately,
|
6
6
|
during the scenes specified.
|
7
7
|
|
8
|
-
|
9
|
-
add new players,and probably wouldn't be too hard to add more operating systems.
|
10
|
-
|
11
|
-
The concept isn't novel:
|
12
|
-
|
13
|
-
http://www.imdb.com/swiki/special?ParentalGuideHelp "scene description"
|
14
|
-
http://en.wikipedia.org/wiki/Edit_decision_list
|
8
|
+
It works out of the box with the hulu and VLC players on windows. It isn't hard to
|
9
|
+
add new players, and probably wouldn't be too hard to add more operating systems.
|
15
10
|
|
16
11
|
== How to use ==
|
17
12
|
|
18
|
-
Start playing your movie in its player, then startup sensible-cinema
|
13
|
+
Start playing your movie in its respective player, then startup sensible-cinema from
|
14
|
+
the command line thus:
|
19
15
|
|
20
16
|
C:\> jruby -S sensible-cinema
|
21
17
|
|
22
|
-
It prompts you for a scene
|
23
|
-
and
|
18
|
+
It prompts you for a scene descriptions file (ex: bambi.yml),
|
19
|
+
and then for a player description file (ex: hulu_full_screen.yml).
|
24
20
|
|
25
21
|
Sensible-cinema will now run in a console window, screen tracking the player to monitor its position,
|
26
22
|
and react appropriately.
|
27
23
|
|
28
24
|
It is presumed that you'll then minimize the console window and proceed to enjoy the movie.
|
29
25
|
|
30
|
-
You could also specify those same two filenames on the command-line, if desired, ex:
|
31
|
-
|
32
|
-
C:\> jruby -S sensible-cinema mute_list.yml player_description.yml
|
33
|
-
|
34
26
|
You'll know that it's working if, when you change the time of your player (ex: dragging it to a new spot
|
35
27
|
in the playback), the screen output in sensible-cinema's console should change to match the new time.
|
36
28
|
|
@@ -52,7 +44,7 @@ choosing the hulu player.
|
|
52
44
|
|
53
45
|
It will proceed do a few "demo" mutes and blank outs.
|
54
46
|
|
55
|
-
== Programming Your Own Scene
|
47
|
+
== Programming Your Own Scene Descriptions File ==
|
56
48
|
|
57
49
|
To program sensible-cinema, you create a scene description list it can use.
|
58
50
|
|
@@ -73,7 +65,7 @@ then start sensible-cinema and instruct it to use your new file.
|
|
73
65
|
To create it, basically you notice something you want to add to the list, add it, then go back a few seconds
|
74
66
|
in your media player, and it should now be muted/blanked out automatically.
|
75
67
|
|
76
|
-
So here is a way to create your scene
|
68
|
+
So here is a way to create your scene descriptions file.
|
77
69
|
First create a new file [2], and select it in sensible-cinema (even though it's still blank).
|
78
70
|
Now use sensible-cinema and select the new file you just created.
|
79
71
|
Now "preview" the movie, and as you do, you're going scenes to the file, and then test your additions.
|
@@ -82,11 +74,11 @@ controls. When you encounter the scene again, track its beginning and ending ti
|
|
82
74
|
is to, just before and just after the scene, hit the space bar *in the sensible-cinema window*.
|
83
75
|
Hitting the space bar outputs the current time. If you hit it twice, once before and once after,
|
84
76
|
you should now have two reasonably accurate "timestamps" displayed.
|
85
|
-
Add the beginning and ending times to your scene
|
77
|
+
Add the beginning and ending times to your scene descriptions file (changes will be automatically picked up),
|
86
78
|
then review your additions by rewinding your player and letting it play through the scene in question again.
|
87
79
|
It should now skip it appropriately. If not, adjust your timestamps and try again.
|
88
80
|
|
89
|
-
Once you're done then you can contribute your scene
|
81
|
+
Once you're done then you can contribute your scene descriptions file if desired, back to the project [1].
|
90
82
|
|
91
83
|
[1] http://github.com/rdp/sensible-cinema/issues
|
92
84
|
[2] The easiest way to do this is to start sensible-cinema, then instead of choosing an existing file,
|
@@ -126,17 +118,33 @@ A. It takes it awhile to warm up its digit detection. Ping me if you would like
|
|
126
118
|
|
127
119
|
[1] http://ps3mediaserver.org/forum/viewtopic.php?f=6&t=5731#p34279
|
128
120
|
|
121
|
+
== Advanced Usage ==
|
122
|
+
|
123
|
+
You could specify the scene descriptions list and player list on the command-line, if you don't want to have
|
124
|
+
to pick them each time, like:
|
125
|
+
|
126
|
+
C:\> jruby -S sensible-cinema scene_descriptions_list.yml player_description.yml
|
127
|
+
|
128
|
+
Also if you specify "test" for the scene descriptions file, it will pause 4s, take a snapshot of the player, then exit.
|
129
|
+
You can also specify -v or -t if you want to enable more verbose (chatty) output.
|
130
|
+
|
129
131
|
== Thanks ==
|
130
132
|
|
131
|
-
Thanks to Jarmo for the win32-screenshot gem,
|
132
|
-
|
133
|
+
Thanks to Jarmo for the win32-screenshot gem, mini_magick gem authors, jruby guys, etc.
|
134
|
+
The combination made programming this actually somewhat of a pleasure.
|
133
135
|
|
134
136
|
== License ==
|
135
137
|
|
136
|
-
See the LICENSE file for licensing, usage terms (gplv3).
|
138
|
+
See the LICENSE file for licensing, usage terms (basically gplv3).
|
137
139
|
|
138
140
|
== Related ==
|
139
141
|
|
142
|
+
The concept isn't too novel:
|
143
|
+
|
144
|
+
http://en.wikipedia.org/wiki/Edit_decision_list (linear editing tool)
|
145
|
+
http://www.imdb.com/swiki/special?ParentalGuideHelp search for "scene description"
|
146
|
+
http://www.oreillynet.com/sysadmin/blog/2005/06/make_your_own_phantom_edit_wit.html
|
147
|
+
|
140
148
|
http://imdb.com tends to have reasonably good lists of what occurs in movies (find a movie, click on "parent's guide" on the left).
|
141
149
|
Sometimes it even lists the time signatures for events (ex: "Labyrinth" http://www.imdb.com/title/tt0047673/parentalguide)
|
142
150
|
which you could use to translate into a sensible-cinema compatible list.
|
@@ -145,5 +153,4 @@ which you could use to translate into a sensible-cinema compatible list.
|
|
145
153
|
|
146
154
|
Feedback, including feature requests, welcome.
|
147
155
|
|
148
|
-
http://github.com/rdp/sensible-cinema
|
149
|
-
http://github.com/rdp me
|
156
|
+
http://github.com/rdp/sensible-cinema
|
data/Rakefile
CHANGED
@@ -6,13 +6,13 @@ Jeweler::Tasks.new do |s|
|
|
6
6
|
s.email = "rogerdpack@gmail.com"
|
7
7
|
s.homepage = "http://github.com/rdp"
|
8
8
|
s.authors = ["Roger Pack"]
|
9
|
+
s.add_dependency 'sane', '>= 0.22.0'
|
10
|
+
s.add_dependency 'rdp-win32screenshot', '>= 0.0.6.3'
|
11
|
+
s.add_dependency 'mini_magick' # for ocr...
|
9
12
|
s.add_development_dependency 'rspec' # prefer rspec 2 I guess...
|
10
13
|
s.add_development_dependency 'jeweler'
|
11
14
|
s.add_development_dependency 'rdp-rmagick'
|
12
|
-
s.add_dependency 'mini_magick' # ocr
|
13
15
|
s.add_development_dependency 'hitimes' # now jruby compat. yea!
|
14
|
-
s.add_dependency 'sane', '>= 0.22.0'
|
15
|
-
s.add_dependency 'win32screenshot', '>= 0.0.6'
|
16
16
|
s.extensions = ["ext/mkrf_conf.rb"]
|
17
17
|
end
|
18
18
|
|
data/TODO
CHANGED
@@ -4,26 +4,32 @@
|
|
4
4
|
|
5
5
|
release ruby-y-y why not, it's interesting
|
6
6
|
"Linux compat anyone?"
|
7
|
-
utube nuki (
|
8
|
-
generations first profanidade...
|
7
|
+
utube nuki (somewhere with a real sound card...which would be the home comp)
|
8
|
+
generations the first profanidade...
|
9
9
|
|
10
10
|
== random backlog ... based on user request..remember: just local files for my own needs...==
|
11
11
|
|
12
|
-
|
12
|
+
just plow forward, to "grab" available ideas...
|
13
13
|
|
14
|
-
|
14
|
+
make it "quieter" at certain parts, arbitrarily...
|
15
15
|
|
16
|
-
|
16
|
+
release a zip file that they can just click on something to run it...self-extractor yeah.
|
17
17
|
|
18
|
-
|
18
|
+
snag the close captioning for a profanity filter?
|
19
19
|
|
20
|
-
|
20
|
+
make it able to use multiple players so I can maximize VLC...
|
21
21
|
|
22
|
-
|
22
|
+
blank overlay "and you are one awesome klingon"
|
23
23
|
|
24
|
-
|
24
|
+
screencast of something helpful (use, creation).
|
25
|
+
|
26
|
+
optimize (tell them) imdb: http://www.imdb.com/board/bd0000042/thread/58361958?d=58361958, english friendlier url's
|
25
27
|
|
26
|
-
|
28
|
+
bundle fewer imagemagick binaries
|
29
|
+
|
30
|
+
TSR that monitors "oh you're opening a VLC? you're playing the E drive? That's bob's big plan? You're maximized? Full screened? watching x on hulu?"
|
31
|
+
|
32
|
+
netflix player
|
27
33
|
|
28
34
|
add my own stuff to imdb...
|
29
35
|
antz to imdb...
|
@@ -32,6 +38,8 @@ imdb parser...somehow
|
|
32
38
|
|
33
39
|
make it into a real live full functional app...like fully fully functional and good (for use, not editing), mostly with the drop down lists uh guess.
|
34
40
|
|
41
|
+
make a redcar installer for their use...
|
42
|
+
|
35
43
|
PISH
|
36
44
|
|
37
45
|
can overlay with a "fuzzer-outer" for specific coordinates somehow or other...
|
@@ -70,7 +78,9 @@ control volume programmatically (using mouse) on the player itself.
|
|
70
78
|
control mute programmatically (using mouse) on the player itself.
|
71
79
|
control location programmatically (using mouse) on the player itself.
|
72
80
|
|
73
|
-
|
81
|
+
compare labyrinth timings with a real DVD player...
|
82
|
+
|
83
|
+
overlay with alpha transparent pic
|
74
84
|
|
75
85
|
Have a "list of all known movies (url's)" and be able to open (IE et al) to the correct part, and start playing them, and they work...
|
76
86
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.7
|
data/lib/muter.rb
CHANGED
data/lib/overlayer.rb
CHANGED
@@ -4,7 +4,7 @@ require 'timeout'
|
|
4
4
|
require 'yaml'
|
5
5
|
require_relative 'muter'
|
6
6
|
require_relative 'blanker'
|
7
|
-
require 'pp' # pretty_inspect
|
7
|
+
require 'pp' # for pretty_inspect
|
8
8
|
|
9
9
|
class Time
|
10
10
|
def self.now_f
|
@@ -25,13 +25,13 @@ class OverLayer
|
|
25
25
|
def mute!
|
26
26
|
@am_muted = true
|
27
27
|
puts 'muting!' if $VERBOSE
|
28
|
-
Muter.mute!
|
28
|
+
Muter.mute! unless defined?($AM_IN_UNIT_TEST)
|
29
29
|
end
|
30
30
|
|
31
31
|
def unmute!
|
32
32
|
@am_muted = false
|
33
33
|
puts 'unmuting!' if $VERBOSE
|
34
|
-
Muter.unmute!
|
34
|
+
Muter.unmute! unless defined?($AM_IN_UNIT_TEST)
|
35
35
|
end
|
36
36
|
|
37
37
|
def blank!
|
@@ -58,8 +58,7 @@ class OverLayer
|
|
58
58
|
|
59
59
|
def reload_yaml!
|
60
60
|
@all_sequences = OverLayer.translate_yaml(File.read(@filename))
|
61
|
-
|
62
|
-
puts '(re) loaded mute sequences from ' + File.basename(@filename) + ' as', pretty_sequences.pretty_inspect, "" unless $DEBUG && !$VERBOSE # I hate these during unit tests...
|
61
|
+
puts '(re) loaded mute sequences from ' + File.basename(@filename) + ' as', pretty_sequences.pretty_inspect, "" unless $AM_IN_UNIT_TEST
|
63
62
|
signal_change
|
64
63
|
end
|
65
64
|
|
@@ -82,7 +81,7 @@ class OverLayer
|
|
82
81
|
OverLayer.new('temp.yml')
|
83
82
|
end
|
84
83
|
|
85
|
-
def initialize filename
|
84
|
+
def initialize filename
|
86
85
|
@filename = filename
|
87
86
|
@am_muted = false
|
88
87
|
@am_blanked = false
|
@@ -91,36 +90,41 @@ class OverLayer
|
|
91
90
|
@file_mtime = nil
|
92
91
|
check_reload_yaml
|
93
92
|
@start_time = Time.now_f # assume they want to start immediately...
|
94
|
-
if minutes
|
95
|
-
self.set_seconds self.class.translate_string_to_seconds(minutes)
|
96
|
-
end
|
97
93
|
end
|
98
94
|
|
99
95
|
def self.translate_yaml raw_yaml
|
100
96
|
begin
|
101
|
-
all = YAML.load(raw_yaml) || {}
|
102
|
-
|
97
|
+
all = YAML.load(raw_yaml) || {}
|
103
98
|
rescue NoMethodError
|
104
99
|
p 'appears your file has a syntax error in it--perhaps missing quotation marks'
|
105
100
|
return
|
106
101
|
end
|
107
102
|
# now it's like {:mutes => {"1:02.0" => "1:3.0"}}
|
108
103
|
# translate to floats like 62.0 => 63.0
|
104
|
+
|
109
105
|
for type in [:mutes, :blank_outs]
|
110
106
|
maps = all[type] || all[type.to_s] || {}
|
111
107
|
new = {}
|
112
108
|
maps.each{|start,endy|
|
113
109
|
# both are like 1:02.0
|
114
|
-
|
115
|
-
|
116
|
-
if
|
117
|
-
p 'warning--possible error in the scene descriptions file some line not parsed! (NB if you want one to start at time 0 please use 0.0001)', start, endy unless $
|
118
|
-
# drop
|
119
|
-
|
120
|
-
|
110
|
+
start2 = translate_string_to_seconds(start) if start
|
111
|
+
endy2 = translate_string_to_seconds(endy) if endy
|
112
|
+
if start2 == 0 || endy2 == 0 || start == nil || endy == nil
|
113
|
+
p 'warning--possible error in the scene descriptions file some line not parsed! (NB if you want one to start at time 0 please use 0.0001)', start, endy unless $AM_IN_UNIT_TEST
|
114
|
+
# drop this line into the bitbucket...
|
115
|
+
next
|
116
|
+
end
|
117
|
+
|
118
|
+
if start2 == endy2 || endy2 < start2
|
119
|
+
p 'warning--found a line that had poor interval', start, endy, type unless $AM_IN_UNIT_TEST
|
120
|
+
next
|
121
|
+
end
|
122
|
+
if(endy2 > 60*60*3)
|
123
|
+
p 'warning--found setting past 3 hours [?]', start, endy, type unless $AM_IN_UNIT_TEST
|
121
124
|
end
|
125
|
+
new[start2] = endy2
|
122
126
|
}
|
123
|
-
all.delete(type.to_s)
|
127
|
+
all.delete(type.to_s) # cleanup
|
124
128
|
all[type] = new.sort
|
125
129
|
end
|
126
130
|
all
|
@@ -270,7 +274,9 @@ class OverLayer
|
|
270
274
|
return [nil, nil, :done]
|
271
275
|
end
|
272
276
|
|
273
|
-
#
|
277
|
+
#
|
278
|
+
# returns [true, false, next_moment_of_importance|:done] ( true, false for if it should be currently muted, blanked )
|
279
|
+
#
|
274
280
|
def get_current_state
|
275
281
|
all = []
|
276
282
|
time = cur_time
|
@@ -279,7 +285,6 @@ class OverLayer
|
|
279
285
|
end
|
280
286
|
output = []
|
281
287
|
# all is [[start, end, active]...] or [:done, :done]
|
282
|
-
# so create [true, false, next_moment]
|
283
288
|
earliest_moment = 1_000_000
|
284
289
|
all.each{|start, endy, active|
|
285
290
|
if active == :done
|
data/lib/screen_tracker.rb
CHANGED
@@ -48,11 +48,11 @@ class ScreenTracker
|
|
48
48
|
else
|
49
49
|
@hwnd = Win32::Screenshot::BitmapMaker.hwnd(@name_or_regex)
|
50
50
|
end
|
51
|
+
|
51
52
|
unless @hwnd
|
52
|
-
print 'perhaps not running yet? [%s] START IT FAST' % @name_or_regex
|
53
53
|
until @hwnd
|
54
|
-
|
55
|
-
|
54
|
+
print 'perhaps not running yet? [%s]' % @name_or_regex
|
55
|
+
sleep 1
|
56
56
|
STDOUT.flush
|
57
57
|
@hwnd = Win32::Screenshot::BitmapMaker.hwnd(@name_or_regex)
|
58
58
|
end
|
@@ -112,7 +112,6 @@ class ScreenTracker
|
|
112
112
|
end
|
113
113
|
|
114
114
|
def wait_till_next_change
|
115
|
-
# dies in jruby currently...sigh...get_hwnd # reget it, just in case...
|
116
115
|
original = get_bmp
|
117
116
|
time_since_last = Time.now
|
118
117
|
loop {
|
@@ -129,6 +128,8 @@ class ScreenTracker
|
|
129
128
|
if(Time.now - time_since_last > 5)
|
130
129
|
p 'warning--unable to track for some reason--may need to restart sensible-cinema'
|
131
130
|
time_since_last = Time.now
|
131
|
+
# reget it, just in case...
|
132
|
+
get_hwnd
|
132
133
|
end
|
133
134
|
}
|
134
135
|
end
|
data/spec/common.rb
CHANGED
@@ -40,4 +40,68 @@ end
|
|
40
40
|
#for file in Dir[File.dirname(__FILE__) + "/../lib/*"] do
|
41
41
|
# don't load them here in case one or other fails...
|
42
42
|
# require file
|
43
|
-
|
43
|
+
#end
|
44
|
+
|
45
|
+
require 'ffi'
|
46
|
+
require 'ffi-inliner'
|
47
|
+
|
48
|
+
module GetPid
|
49
|
+
extend FFI::Library
|
50
|
+
extend Inliner
|
51
|
+
ffi_lib 'user32', 'kernel32'
|
52
|
+
ffi_convention :stdcall
|
53
|
+
attach_function :get_process_id_old, :GetProcessId, [ :ulong ], :uint
|
54
|
+
|
55
|
+
attach_function :GetWindowThreadProcessId, [:ulong, :pointer], :uint
|
56
|
+
|
57
|
+
|
58
|
+
def self.get_process_id_from_window hwnd
|
59
|
+
out = FFI::MemoryPointer.new(:uint)
|
60
|
+
GetWindowThreadProcessId(hwnd, out) # does translation automatically to ptr for us
|
61
|
+
out.get_uint32(0) # read_uint
|
62
|
+
end
|
63
|
+
|
64
|
+
inline <<-CODE
|
65
|
+
#include <windows.h>
|
66
|
+
//#include <strsafe.h> // not available in mingw...
|
67
|
+
|
68
|
+
void ErrorExit()
|
69
|
+
{
|
70
|
+
// Retrieve the system error message for the last-error code
|
71
|
+
LPTSTR lpszFunction = "abcdef";
|
72
|
+
LPVOID lpMsgBuf;
|
73
|
+
LPVOID lpDisplayBuf;
|
74
|
+
DWORD dw = GetLastError();
|
75
|
+
|
76
|
+
FormatMessage(
|
77
|
+
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
78
|
+
FORMAT_MESSAGE_FROM_SYSTEM |
|
79
|
+
FORMAT_MESSAGE_IGNORE_INSERTS,
|
80
|
+
NULL,
|
81
|
+
dw,
|
82
|
+
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
83
|
+
(LPTSTR) &lpMsgBuf,
|
84
|
+
0, NULL );
|
85
|
+
|
86
|
+
// Display the error message and exit the process
|
87
|
+
printf("here1");
|
88
|
+
lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
|
89
|
+
(lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR));
|
90
|
+
printf("here2");
|
91
|
+
snprintf((LPTSTR)lpDisplayBuf,
|
92
|
+
LocalSize(lpDisplayBuf) / sizeof(TCHAR),
|
93
|
+
TEXT("%s failed with error %d: %s"),
|
94
|
+
lpszFunction, dw, lpMsgBuf);
|
95
|
+
printf("here3");
|
96
|
+
MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);
|
97
|
+
printf("here4 ");
|
98
|
+
|
99
|
+
LocalFree(lpMsgBuf);
|
100
|
+
LocalFree(lpDisplayBuf);
|
101
|
+
// ExitProcess(dw);
|
102
|
+
}
|
103
|
+
|
104
|
+
|
105
|
+
CODE
|
106
|
+
|
107
|
+
end
|
File without changes
|
data/spec/overlayer.spec.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
# avoid full loading if testing impossible
|
2
2
|
if RUBY_VERSION < '1.9.2' && RUBY_PLATFORM !~ /java/
|
3
3
|
puts 'not compatible to MRI < 1.9.2'
|
4
|
-
exit 0 # this isn't a real
|
4
|
+
exit 0 # this isn't a really real failure...
|
5
5
|
end
|
6
6
|
|
7
7
|
require File.expand_path(File.dirname(__FILE__) + '/common')
|
8
8
|
require_relative '../lib/overlayer'
|
9
9
|
|
10
|
-
|
11
|
-
$DEBUG = true
|
10
|
+
$AM_IN_UNIT_TEST = true
|
12
11
|
|
13
12
|
def start_good_blank
|
14
13
|
assert !@o.blank?
|
@@ -18,7 +17,6 @@ def start_bad_blank
|
|
18
17
|
assert @o.blank?
|
19
18
|
end
|
20
19
|
|
21
|
-
|
22
20
|
describe OverLayer do
|
23
21
|
|
24
22
|
before do
|
@@ -61,7 +59,7 @@ describe OverLayer do
|
|
61
59
|
start_good
|
62
60
|
end
|
63
61
|
|
64
|
-
it 'should unmute after the ending scene' do
|
62
|
+
it 'should unmute after the ending scene, and also be able to go past the end of scenes at all' do
|
65
63
|
File.write 'temp.yml', YAML.dump({:mutes => {0.5 => 1.0}})
|
66
64
|
@o = OverLayer.new 'temp.yml'
|
67
65
|
@o.start_thread true
|
@@ -89,14 +87,13 @@ describe OverLayer do
|
|
89
87
|
# but by the time you check again, you just passed it, so you wait till the next one in an errant state
|
90
88
|
end
|
91
89
|
|
92
|
-
it 'should be able to mute teeny sequences' do
|
90
|
+
it 'should be able to mute teeny timed sequences' do
|
93
91
|
# it once failed on this...
|
94
92
|
File.write 'temp.yml', YAML.dump({:mutes => {0.0001 => 0.0002, 1.0 => 1.0001}})
|
95
93
|
o = OverLayer.new 'temp.yml'
|
96
94
|
o.continue_until_past_all false
|
97
95
|
end
|
98
96
|
|
99
|
-
it 'should be able to go past the end' # ??
|
100
97
|
|
101
98
|
it 'should allow you to change the current time' do
|
102
99
|
@o.start_thread
|
@@ -137,9 +134,7 @@ describe OverLayer do
|
|
137
134
|
@o.status.should include("r,d,v,q to quit")
|
138
135
|
end
|
139
136
|
|
140
|
-
it 'should
|
141
|
-
|
142
|
-
it 'should allow for yaml input and parse it well' do
|
137
|
+
it 'should allow for yaml input and parse it appropo' do
|
143
138
|
# 2 - 3 , 4-5 should be muted
|
144
139
|
@o = OverLayer.new 'test_yaml.yml'
|
145
140
|
@o.start_thread
|
@@ -152,15 +147,15 @@ describe OverLayer do
|
|
152
147
|
end
|
153
148
|
|
154
149
|
def write_yaml yaml
|
155
|
-
|
150
|
+
File.write 'temp.yml', yaml
|
151
|
+
@o = OverLayer.new 'temp.yml'
|
156
152
|
end
|
157
153
|
|
158
154
|
it 'should allow for 1:00.0 minute style input' do
|
159
155
|
write_yaml <<-YAML
|
160
|
-
|
156
|
+
mutes:
|
161
157
|
"0:02.0" : "0:03.0"
|
162
158
|
YAML
|
163
|
-
@o = OverLayer.new 'temp.yml'
|
164
159
|
@o.start_thread
|
165
160
|
start_good
|
166
161
|
start_good
|
@@ -172,14 +167,13 @@ describe OverLayer do
|
|
172
167
|
it "should reload the YAML file on the fly to allow for editing it" do
|
173
168
|
# start it with one set to mute far later
|
174
169
|
write_yaml <<-YAML
|
175
|
-
|
170
|
+
mutes:
|
176
171
|
"0:11.0" : "0:12.0"
|
177
172
|
YAML
|
178
|
-
@o = OverLayer.new 'temp.yml'
|
179
173
|
@o.start_thread
|
180
174
|
start_good
|
181
|
-
|
182
|
-
|
175
|
+
File.write 'temp.yml', <<-YAML
|
176
|
+
mutes:
|
183
177
|
"0:00.0001" : "0:01.5"
|
184
178
|
YAML
|
185
179
|
@o.status # cause it to refresh from the file
|
@@ -188,45 +182,66 @@ describe OverLayer do
|
|
188
182
|
start_good
|
189
183
|
end
|
190
184
|
|
191
|
-
it "should not accept the input when you pass it poor yaml" do
|
192
|
-
write_yaml
|
193
|
-
|
185
|
+
it "should not accept any of the input when you pass it any poor yaml" do
|
186
|
+
write_yaml <<-YAML
|
187
|
+
mutes:
|
194
188
|
a : 08:56.0 # first one there is invalid
|
195
189
|
YAML
|
196
190
|
out = OverLayer.new 'temp.yml'
|
197
191
|
out.all_sequences[:mutes].should be_blank
|
198
192
|
write_yaml <<-YAML
|
199
|
-
|
193
|
+
mutes:
|
200
194
|
01 : 02
|
201
195
|
YAML
|
202
196
|
out.reload_yaml!
|
203
|
-
out.all_sequences[:mutes].
|
197
|
+
out.all_sequences[:mutes].should == [[1,2]]
|
204
198
|
write_yaml <<-YAML
|
205
|
-
|
206
|
-
|
199
|
+
mutes:
|
200
|
+
05 : # failure
|
207
201
|
YAML
|
208
202
|
# should have kept the old
|
209
|
-
out.all_sequences[:mutes].
|
203
|
+
out.all_sequences[:mutes].should == [[1,2]]
|
210
204
|
end
|
211
205
|
|
212
|
-
it "should not accept zero start input" do
|
206
|
+
it "should not accept any zero start input" do
|
213
207
|
yaml = <<-YAML
|
214
|
-
|
215
|
-
0 : 1 # we don't like zeroes...for now at least
|
208
|
+
mutes:
|
209
|
+
0 : 1 # we don't like zeroes...for now at least, as they can mean parsing failure...
|
210
|
+
3 : 4
|
216
211
|
YAML
|
217
212
|
out = OverLayer.translate_yaml yaml
|
218
|
-
out[:mutes].should
|
213
|
+
out[:mutes].should == [[3,4]]
|
214
|
+
end
|
215
|
+
|
216
|
+
it "should disallow zero or less length intervals" do
|
217
|
+
yaml = <<-YAML
|
218
|
+
mutes:
|
219
|
+
1 : 1
|
220
|
+
YAML
|
221
|
+
out = OverLayer.translate_yaml yaml
|
222
|
+
out[:mutes].should == []
|
223
|
+
end
|
224
|
+
|
225
|
+
|
226
|
+
it "should sort yaml input" do
|
227
|
+
yaml = <<-YAML
|
228
|
+
mutes:
|
229
|
+
3 : 4
|
230
|
+
1 : 2
|
231
|
+
YAML
|
232
|
+
out = OverLayer.translate_yaml yaml
|
233
|
+
out[:mutes].should == [[1,2], [3,4]]
|
219
234
|
end
|
220
235
|
|
221
236
|
it "should handle non quoted style numbers in yaml" do
|
222
237
|
yaml = <<-YAML
|
223
|
-
|
238
|
+
mutes:
|
224
239
|
08:55 : 08:56.0 # valid, will return large Fixnum's
|
225
240
|
YAML
|
226
241
|
out = OverLayer.translate_yaml yaml
|
227
242
|
out[:mutes].should == [[535, 536]]
|
228
243
|
yaml = <<-YAML
|
229
|
-
|
244
|
+
mutes:
|
230
245
|
01:08:55 : 01:09:55 # actually valid
|
231
246
|
YAML
|
232
247
|
out = OverLayer.translate_yaml yaml
|
@@ -235,16 +250,16 @@ describe OverLayer do
|
|
235
250
|
|
236
251
|
it "should translate yaml with the two different types in it" do
|
237
252
|
yaml = <<-YAML
|
238
|
-
|
253
|
+
mutes:
|
239
254
|
"0:02.0" : "0:03.0"
|
240
|
-
|
255
|
+
blank_outs:
|
241
256
|
"0:02.0" : "0:03.0"
|
242
257
|
YAML
|
243
258
|
out = OverLayer.translate_yaml yaml
|
244
259
|
out[:mutes].should == [[2.0, 3.0]]
|
245
260
|
out[:blank_outs].should == [[2.0, 3.0]]
|
246
261
|
yaml = <<-YAML
|
247
|
-
|
262
|
+
mutes:
|
248
263
|
"1:02.11" : "1:03.0"
|
249
264
|
YAML
|
250
265
|
out = OverLayer.translate_yaml yaml
|
@@ -253,7 +268,7 @@ describe OverLayer do
|
|
253
268
|
|
254
269
|
it "should accept fixnum 56 => 57 style input" do
|
255
270
|
yaml = <<-YAML
|
256
|
-
|
271
|
+
mutes:
|
257
272
|
"0:02" : "0:03"
|
258
273
|
3 : 4
|
259
274
|
YAML
|
@@ -261,11 +276,21 @@ describe OverLayer do
|
|
261
276
|
out[:mutes].should == [[2.0, 3.0], [3, 4]]
|
262
277
|
end
|
263
278
|
|
279
|
+
it "should accept numbers that are unreasonably large" do
|
280
|
+
yaml = <<-YAML
|
281
|
+
mutes:
|
282
|
+
1000000 : 1000001
|
283
|
+
YAML
|
284
|
+
out = OverLayer.translate_yaml yaml
|
285
|
+
out[:mutes].should == [[1_000_000, 1_000_001]]
|
286
|
+
end
|
287
|
+
|
264
288
|
it "should accept blank yaml" do
|
265
289
|
out = OverLayer.translate_yaml ""
|
266
290
|
out[:mutes].should be_blank
|
267
|
-
end
|
291
|
+
end
|
268
292
|
|
293
|
+
it "should not translate symbols"
|
269
294
|
|
270
295
|
it "should translate strings as well as symbols" do
|
271
296
|
yaml = <<-YAML
|
@@ -274,19 +299,15 @@ describe OverLayer do
|
|
274
299
|
YAML
|
275
300
|
out = OverLayer.translate_yaml yaml
|
276
301
|
out[:mutes].should == [[1, 3]]
|
302
|
+
end
|
277
303
|
|
278
|
-
|
279
|
-
|
280
|
-
it "should disallow zero or less length intervals"
|
281
|
-
it "should disallow non-sorted intervals"
|
282
|
-
it 'should reject overlapping settings...I guess'
|
304
|
+
it 'should reject overlapping settings...maybe?'
|
283
305
|
|
284
306
|
it "should allow for 1:01:00.0 (double colon) style yaml input" do
|
285
307
|
write_yaml <<-YAML
|
286
|
-
|
308
|
+
mutes:
|
287
309
|
"1:00.11" : "1:03.0"
|
288
310
|
YAML
|
289
|
-
@o = OverLayer.new 'temp.yml'
|
290
311
|
@o.start_thread
|
291
312
|
start_good
|
292
313
|
@o.set_seconds 61
|
@@ -361,11 +382,23 @@ describe OverLayer do
|
|
361
382
|
@o.get_current_state.should == [true, true, 3.5]
|
362
383
|
end
|
363
384
|
|
385
|
+
at(4) do
|
386
|
+
@o.get_current_state.should == [false, false, :done]
|
387
|
+
end
|
388
|
+
|
389
|
+
# now a bit more complex...
|
390
|
+
|
391
|
+
@o = OverLayer.new_raw({:mutes => {2.0 => 3.5, 5 => 6}, :blank_outs => {3.0 => 4.0}})
|
392
|
+
|
364
393
|
at(3.75) do
|
365
394
|
@o.get_current_state.should == [false, true, 4.0]
|
366
395
|
end
|
367
|
-
|
368
|
-
at(
|
396
|
+
|
397
|
+
at(5) do
|
398
|
+
@o.get_current_state.should == [true, false, 6]
|
399
|
+
end
|
400
|
+
|
401
|
+
at(6) do
|
369
402
|
@o.get_current_state.should == [false, false, :done]
|
370
403
|
end
|
371
404
|
|
@@ -385,13 +418,10 @@ describe OverLayer do
|
|
385
418
|
@o.translate_time_to_human_readable(3661).should == "1:01:01.0"
|
386
419
|
end
|
387
420
|
|
388
|
-
it "should accept human readable style as
|
389
|
-
|
390
|
-
o.cur_time.should be >= 61.5
|
391
|
-
# somewhere in there
|
392
|
-
o.cur_time.should be <= 62
|
421
|
+
it "should no longer accept human readable style as starting seconds" do
|
422
|
+
proc { OverLayer.new 'temp.yml', "01:01.5" }.should raise_error(ArgumentError)
|
393
423
|
end
|
394
424
|
|
395
425
|
end
|
396
426
|
|
397
|
-
end
|
427
|
+
end
|
data/spec/screen_tracker.spec.rb
CHANGED
@@ -5,19 +5,22 @@ require 'pathname'
|
|
5
5
|
|
6
6
|
describe ScreenTracker do
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
else
|
11
|
-
|
8
|
+
SILENCE = /silence.*VLC/
|
9
|
+
|
12
10
|
def start_vlc
|
11
|
+
# unfortunately this is run before every context with rspec 1.3...
|
13
12
|
unless $pid1
|
13
|
+
assert !$pid1
|
14
|
+
# enforce we only have at most one running at a time...
|
14
15
|
begin
|
15
|
-
Win32::Screenshot.window(
|
16
|
+
Win32::Screenshot.window(SILENCE, 0) {}
|
16
17
|
raise Exception.new('must kill old vlcs first')
|
17
18
|
rescue
|
18
|
-
|
19
|
-
|
20
|
-
sleep
|
19
|
+
silence = File.expand_path("./silence.wav").gsub("/", "\\")
|
20
|
+
Dir.chdir("/program files/VideoLan/VLC") do; IO.popen("vlc.exe #{silence}").pid; end # work around for jruby...
|
21
|
+
sleep 4
|
22
|
+
|
23
|
+
$pid1 = GetPid.get_process_id_from_window(Win32::Screenshot::Util.window_hwnd(SILENCE)) # more jruby work-arounds...
|
21
24
|
end
|
22
25
|
end
|
23
26
|
end
|
@@ -27,11 +30,11 @@ describe ScreenTracker do
|
|
27
30
|
end
|
28
31
|
|
29
32
|
before do
|
30
|
-
@a = ScreenTracker.new(
|
33
|
+
@a = ScreenTracker.new(SILENCE,10,10,20,20)
|
31
34
|
end
|
32
35
|
|
33
36
|
it "can take a regex or string" do
|
34
|
-
ScreenTracker.new(
|
37
|
+
ScreenTracker.new(SILENCE,10,10,20,20)
|
35
38
|
ScreenTracker.new("silence",10,10,20,20)
|
36
39
|
end
|
37
40
|
|
@@ -106,10 +109,10 @@ describe ScreenTracker do
|
|
106
109
|
end
|
107
110
|
|
108
111
|
it "should fail with out of bounds or zero sizes" do
|
109
|
-
proc { a = ScreenTracker.new(
|
110
|
-
proc { a = ScreenTracker.new(
|
111
|
-
proc { a = ScreenTracker.new(
|
112
|
-
proc { a = ScreenTracker.new(
|
112
|
+
proc { a = ScreenTracker.new(SILENCE,-10,10,20,20) }.should raise_error
|
113
|
+
proc { a = ScreenTracker.new(SILENCE,10,-10,20,20) }.should raise_error
|
114
|
+
proc { a = ScreenTracker.new(SILENCE,-10,10,0,2) }.should raise_error
|
115
|
+
proc { a = ScreenTracker.new(SILENCE,10,10,2,0) }.should raise_error
|
113
116
|
end
|
114
117
|
|
115
118
|
end
|
@@ -149,7 +152,7 @@ describe ScreenTracker do
|
|
149
152
|
context "given a real player that is moving" do
|
150
153
|
|
151
154
|
before do
|
152
|
-
@a = ScreenTracker.new(
|
155
|
+
@a = ScreenTracker.new(SILENCE, -111, -16, 86, 13)
|
153
156
|
end
|
154
157
|
|
155
158
|
it "should be able to poll the screen to know when something changes" do
|
@@ -162,7 +165,7 @@ describe ScreenTracker do
|
|
162
165
|
context "using OCR" do
|
163
166
|
|
164
167
|
before do
|
165
|
-
@a = ScreenTracker.new_from_yaml File.read("../zamples/players/
|
168
|
+
@a = ScreenTracker.new_from_yaml File.read("../zamples/players/total_length_under_an_hour/vlc_non_full_screened.yml"), nil
|
166
169
|
end
|
167
170
|
|
168
171
|
it "should be able to disk dump snapshotted digits" do
|
@@ -190,11 +193,11 @@ describe ScreenTracker do
|
|
190
193
|
end
|
191
194
|
|
192
195
|
context "with an OCR that can change from hour to minutes during ads" do
|
193
|
-
it "should detect"
|
196
|
+
it "should detect this change"
|
194
197
|
end
|
195
198
|
|
196
199
|
it "should be able to use invert on images" do
|
197
|
-
@a = ScreenTracker.new(
|
200
|
+
@a = ScreenTracker.new(SILENCE, -111, -16, 86, 13,
|
198
201
|
{:should_invert => true, :hours => nil, :minute_tens => [-90,7], :minute_ones => [-82, 7], :second_tens => [-72, 7], :second_ones => [-66, 7]} )
|
199
202
|
got_it = nil
|
200
203
|
OCR.stub!(:identify_digit) {|*args|
|
@@ -205,7 +208,6 @@ describe ScreenTracker do
|
|
205
208
|
end
|
206
209
|
|
207
210
|
it "should be able to scan for/identify new windows, since VLC changes signatures" do
|
208
|
-
fail "not possible yet, so hangs"
|
209
211
|
output = @a.wait_till_next_change
|
210
212
|
output[0].should_not be_nil
|
211
213
|
old_handle = @a.hwnd
|
@@ -220,12 +222,9 @@ describe ScreenTracker do
|
|
220
222
|
|
221
223
|
def kill_vlc
|
222
224
|
assert $pid1
|
223
|
-
#
|
224
|
-
|
225
|
-
|
226
|
-
Win32::Screenshot.window(/universal/, 0) rescue nil
|
227
|
-
end
|
228
|
-
Process.kill 9, $pid1 # need this process re-started each time or the screen won't change for the screen changing test
|
225
|
+
# jruby...
|
226
|
+
system("taskkill /pid #{$pid1}")
|
227
|
+
Process.kill 9, $pid1 # MRI...sigh.
|
229
228
|
FileUtils.rm_rf Dir['*.bmp']
|
230
229
|
$pid1 = nil
|
231
230
|
end
|
@@ -235,4 +234,3 @@ describe ScreenTracker do
|
|
235
234
|
end
|
236
235
|
end
|
237
236
|
end
|
238
|
-
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,23 @@
|
|
1
|
+
"profanity categories, so you don't have to write them":
|
2
|
+
|
3
|
+
religious exclamation weak:
|
4
|
+
oh my gosh, etc. (anything euphemized)
|
5
|
+
|
6
|
+
religious exclamation:
|
7
|
+
da**...
|
8
|
+
he**
|
9
|
+
religious exclamation deity:
|
10
|
+
oh my ****
|
11
|
+
g** d*** ***
|
12
|
+
|
13
|
+
bodily function slang:
|
14
|
+
poop, crap, crud, suck
|
15
|
+
bodily function strong:
|
16
|
+
s***
|
17
|
+
|
18
|
+
innuendo:
|
19
|
+
language that has sexual overtones
|
20
|
+
sexual profanity:
|
21
|
+
f***
|
22
|
+
body parts:
|
23
|
+
dick, etc.
|
@@ -1,16 +1,17 @@
|
|
1
1
|
mutes:
|
2
|
-
3:08.5 : 3:13
|
3
|
-
#4:00 : 4:02 #
|
4
|
-
#0:33:00 : 0:33:01 #
|
5
|
-
0:39:45 : 0:39:46 #
|
6
|
-
54:36 : 54:37 #
|
7
|
-
1:04:33 : 1:04:36 #
|
8
|
-
#1:
|
9
|
-
1:
|
2
|
+
3:08.5 : 3:13 # religious exclamation
|
3
|
+
#4:00 : 4:02 # "
|
4
|
+
#0:33:00 : 0:33:01 # "
|
5
|
+
0:39:45 : 0:39:46 # bodily functionslang 37:21 check
|
6
|
+
54:36 : 54:37 # religious exclamation deity
|
7
|
+
1:04:33 : 1:04:36 # religious exclamation
|
8
|
+
#1:04:00 : 1:04:10 # "
|
9
|
+
#1:33:00 : 1:33:02 # "
|
10
|
+
1:32:46 : 1:32:47 # "
|
10
11
|
blank_outs:
|
11
|
-
11:50:00 : 12:00 # creature (Hoggle) standing and urinating (seen from behind) check
|
12
|
-
26:14 : 26:28 # she falls through scary hands check
|
12
|
+
11:50:00 : 12:00:00 # creature (Hoggle) standing and urinating (seen from behind) check
|
13
|
+
26:14 : 26:28 # she falls through scary hands check
|
13
14
|
title: Labyrinth
|
14
|
-
source: DVD
|
15
|
-
|
16
|
-
|
15
|
+
source: DVD played with VLC
|
16
|
+
not_yet_edited_out: "lots of fart noises in the swamp, some odd body parts flying all over from the red goblin dancing people,
|
17
|
+
goblin violence, some swearing in credits song, though the rest is reasonably complete"
|
@@ -1,9 +1,8 @@
|
|
1
1
|
source: "hulu"
|
2
2
|
mutes:
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
"01:15:38.5" : "01:15:41.5" # Data "oh s...."
|
3
|
+
08:54.5 : 08:56 # religious exclamation
|
4
|
+
10:46.5 : 10:48 # religious exclamation
|
5
|
+
11:21 : 11:24.5 # re
|
6
|
+
19:45 : 19:50 # religious exclamation weak "may *** have mercy on your soul"
|
7
|
+
"01:15:38.5" : "01:15:41.5" # "scatalogical" Data when they are about to plummet to earth
|
8
|
+
missing: "religious exclamation strong near beginning"
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensible-cinema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 9
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 7
|
9
|
-
-
|
10
|
-
version: 0.7.
|
8
|
+
- 7
|
9
|
+
version: 0.7.7
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Roger Pack
|
@@ -15,110 +14,104 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2010-08-
|
17
|
+
date: 2010-08-16 00:00:00 -06:00
|
19
18
|
default_executable: sensible-cinema
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
21
|
+
name: sane
|
23
22
|
prerelease: false
|
24
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
24
|
none: false
|
26
25
|
requirements:
|
27
26
|
- - ">="
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
28
|
segments:
|
31
29
|
- 0
|
32
|
-
|
33
|
-
|
30
|
+
- 22
|
31
|
+
- 0
|
32
|
+
version: 0.22.0
|
33
|
+
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
36
|
+
name: rdp-win32screenshot
|
37
37
|
prerelease: false
|
38
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
hash: 3
|
44
43
|
segments:
|
45
44
|
- 0
|
46
|
-
|
47
|
-
|
45
|
+
- 0
|
46
|
+
- 6
|
47
|
+
- 3
|
48
|
+
version: 0.0.6.3
|
49
|
+
type: :runtime
|
48
50
|
version_requirements: *id002
|
49
51
|
- !ruby/object:Gem::Dependency
|
50
|
-
name:
|
52
|
+
name: mini_magick
|
51
53
|
prerelease: false
|
52
54
|
requirement: &id003 !ruby/object:Gem::Requirement
|
53
55
|
none: false
|
54
56
|
requirements:
|
55
57
|
- - ">="
|
56
58
|
- !ruby/object:Gem::Version
|
57
|
-
hash: 3
|
58
59
|
segments:
|
59
60
|
- 0
|
60
61
|
version: "0"
|
61
|
-
type: :
|
62
|
+
type: :runtime
|
62
63
|
version_requirements: *id003
|
63
64
|
- !ruby/object:Gem::Dependency
|
64
|
-
name:
|
65
|
+
name: rspec
|
65
66
|
prerelease: false
|
66
67
|
requirement: &id004 !ruby/object:Gem::Requirement
|
67
68
|
none: false
|
68
69
|
requirements:
|
69
70
|
- - ">="
|
70
71
|
- !ruby/object:Gem::Version
|
71
|
-
hash: 3
|
72
72
|
segments:
|
73
73
|
- 0
|
74
74
|
version: "0"
|
75
|
-
type: :
|
75
|
+
type: :development
|
76
76
|
version_requirements: *id004
|
77
77
|
- !ruby/object:Gem::Dependency
|
78
|
-
name:
|
78
|
+
name: jeweler
|
79
79
|
prerelease: false
|
80
80
|
requirement: &id005 !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
83
83
|
- - ">="
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
hash: 3
|
86
85
|
segments:
|
87
86
|
- 0
|
88
87
|
version: "0"
|
89
88
|
type: :development
|
90
89
|
version_requirements: *id005
|
91
90
|
- !ruby/object:Gem::Dependency
|
92
|
-
name:
|
91
|
+
name: rdp-rmagick
|
93
92
|
prerelease: false
|
94
93
|
requirement: &id006 !ruby/object:Gem::Requirement
|
95
94
|
none: false
|
96
95
|
requirements:
|
97
96
|
- - ">="
|
98
97
|
- !ruby/object:Gem::Version
|
99
|
-
hash: 71
|
100
98
|
segments:
|
101
99
|
- 0
|
102
|
-
|
103
|
-
|
104
|
-
version: 0.22.0
|
105
|
-
type: :runtime
|
100
|
+
version: "0"
|
101
|
+
type: :development
|
106
102
|
version_requirements: *id006
|
107
103
|
- !ruby/object:Gem::Dependency
|
108
|
-
name:
|
104
|
+
name: hitimes
|
109
105
|
prerelease: false
|
110
106
|
requirement: &id007 !ruby/object:Gem::Requirement
|
111
107
|
none: false
|
112
108
|
requirements:
|
113
109
|
- - ">="
|
114
110
|
- !ruby/object:Gem::Version
|
115
|
-
hash: 19
|
116
111
|
segments:
|
117
112
|
- 0
|
118
|
-
|
119
|
-
|
120
|
-
version: 0.0.6
|
121
|
-
type: :runtime
|
113
|
+
version: "0"
|
114
|
+
type: :development
|
122
115
|
version_requirements: *id007
|
123
116
|
description:
|
124
117
|
email: rogerdpack@gmail.com
|
@@ -176,7 +169,7 @@ files:
|
|
176
169
|
- spec/mouse.spec.rb
|
177
170
|
- spec/mouse_forever.rb
|
178
171
|
- spec/muter.spec.rb
|
179
|
-
- spec/ocr.spec.
|
172
|
+
- spec/ocr.spec.rb
|
180
173
|
- spec/open.bat
|
181
174
|
- spec/overlayer.spec.rb
|
182
175
|
- spec/screen_tracker.spec.rb
|
@@ -206,18 +199,13 @@ files:
|
|
206
199
|
- vendor/imagemagick/msvcr90.dll
|
207
200
|
- vendor/imagemagick/vcomp90.dll
|
208
201
|
- zamples/players/how_to_create_a_new_player_description.txt
|
209
|
-
- zamples/players/hulu_full_screen_total_length_over_an_hour.yml
|
210
|
-
- zamples/players/sample_snapshots/hulu full screen non hour.jpg
|
211
|
-
- zamples/players/sample_snapshots/hulu full screen over hour.jpg
|
212
|
-
- zamples/players/sample_snapshots/silence.bmp
|
213
202
|
- zamples/players/sample_snapshots/utube.JPG
|
214
|
-
- zamples/players/sample_snapshots/vlc grab over one hour file over one hour play.bmp
|
215
|
-
- zamples/players/sample_snapshots/vlc2.bmp
|
216
|
-
- zamples/players/sample_snapshots/vlc_full_screen_slider under one hour.bmp
|
217
203
|
- zamples/players/sample_snapshots/youtube full screen big screen.jpg
|
218
|
-
- zamples/players/
|
219
|
-
- zamples/players/
|
220
|
-
- zamples/players/
|
204
|
+
- zamples/players/total_length_over_an_hour/hulu_full_screened.yml
|
205
|
+
- zamples/players/total_length_over_an_hour/vlc_full_screened.yml
|
206
|
+
- zamples/players/total_length_over_an_hour/vlc_windowed.yml
|
207
|
+
- zamples/players/total_length_under_an_hour/vlc_non_full_screened.yml
|
208
|
+
- zamples/scene_lists/categories.yml
|
221
209
|
- zamples/scene_lists/disney_cars.yml
|
222
210
|
- zamples/scene_lists/example_scene_list.yml
|
223
211
|
- zamples/scene_lists/happy_feet_dvd.yml
|
@@ -237,7 +225,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
237
225
|
requirements:
|
238
226
|
- - ">="
|
239
227
|
- !ruby/object:Gem::Version
|
240
|
-
hash: 3
|
241
228
|
segments:
|
242
229
|
- 0
|
243
230
|
version: "0"
|
@@ -246,7 +233,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
246
233
|
requirements:
|
247
234
|
- - ">="
|
248
235
|
- !ruby/object:Gem::Version
|
249
|
-
hash: 3
|
250
236
|
segments:
|
251
237
|
- 0
|
252
238
|
version: "0"
|
@@ -265,5 +251,6 @@ test_files:
|
|
265
251
|
- spec/mouse.spec.rb
|
266
252
|
- spec/mouse_forever.rb
|
267
253
|
- spec/muter.spec.rb
|
254
|
+
- spec/ocr.spec.rb
|
268
255
|
- spec/overlayer.spec.rb
|
269
256
|
- spec/screen_tracker.spec.rb
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|