sensible-cinema 0.7.5 → 0.7.7
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/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
|