sensible-cinema 0.7.1 → 0.7.2
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/README +8 -4
- data/VERSION +1 -1
- data/lib/ocr.rb +9 -15
- data/spec/ocr.spec.orb +4 -0
- data/spec/overlayer.spec.rb +7 -1
- data/spec/screen_tracker.spec.rb +3 -5
- data/zamples/scene_lists/example_scene_list.yml +11 -10
- data/zamples/scene_lists/star_trek_generations.yml +6 -5
- metadata +2 -2
data/README
CHANGED
|
@@ -40,7 +40,7 @@ Next install the gem by either opening up the command window or hitting windows+
|
|
|
40
40
|
C:\> jruby -S gem install sensible-cinema
|
|
41
41
|
|
|
42
42
|
it's jruby only currently (since jruby allows for proper thread concurrency, has an easy GUI, and feels actually sane on windows).
|
|
43
|
-
It could theoretically be ported to MRI 1.9.
|
|
43
|
+
It could theoretically be ported to MRI 1.9.2, if anybody wanted to do so.
|
|
44
44
|
Also if anybody would be interested in porting this to Linux I'd be happy to collaborate.
|
|
45
45
|
|
|
46
46
|
You can test that it's installed by running it (see above) and selecting the "example_scene_list.yml", and
|
|
@@ -48,9 +48,9 @@ choosing the hulu player.
|
|
|
48
48
|
|
|
49
49
|
It will proceed do a few "demo" mutes and blank outs.
|
|
50
50
|
|
|
51
|
-
== How to
|
|
51
|
+
== How to Program ==
|
|
52
52
|
|
|
53
|
-
To
|
|
53
|
+
To program sensible-cinema to play what you'd like, first "preview" the on-computer movie you'd like to create a scene-list for.
|
|
54
54
|
As questionable scenes occur, jot down their start and end times somewhere.
|
|
55
55
|
Then create an Edit Decision List (EDL) file that looks like this:
|
|
56
56
|
|
|
@@ -95,13 +95,17 @@ A. Not yet. Well maybe. Currently you'll either need to attach your computer to
|
|
|
95
95
|
Q. What movies are available to watch online?
|
|
96
96
|
|
|
97
97
|
A. Not many are available free (hulu, youtube have a few), but Netflix has quite a few. Plus you can watch your DVD's
|
|
98
|
-
on your computer monitor.
|
|
98
|
+
on your computer monitor, or rent or borrow them.
|
|
99
99
|
|
|
100
100
|
Q. Why does my mouse bounce up and down while this thing is playing?
|
|
101
101
|
|
|
102
102
|
A. This enables you to keep your on screen tracker visible, which allows sensible-cinema to track where you're at.
|
|
103
103
|
Message me if this bugs you too much and we'll see what we can do for it.
|
|
104
104
|
|
|
105
|
+
Q. Why does it seem really laggy at screen detection at the beginning?
|
|
106
|
+
|
|
107
|
+
A. It takes it awhile to warm up. Ping me if you want this fixed.
|
|
108
|
+
|
|
105
109
|
== Thanks ==
|
|
106
110
|
|
|
107
111
|
Thanks to Jarmo for the win32-screenshot gem, and the mini_magick gem authors, jruby guys, etc.
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.7.
|
|
1
|
+
0.7.2
|
data/lib/ocr.rb
CHANGED
|
@@ -2,12 +2,11 @@ im_path = File.expand_path(File.dirname(__FILE__) + "/../vendor/imagemagick") #
|
|
|
2
2
|
ENV['PATH'] = im_path + ';' + ENV['PATH']
|
|
3
3
|
|
|
4
4
|
require 'mini_magick'
|
|
5
|
-
require 'open3'
|
|
6
5
|
|
|
7
6
|
# helper for OCR'ing single digits that were screen captured
|
|
8
7
|
module OCR
|
|
9
8
|
|
|
10
|
-
GOCR = File.expand_path(File.dirname(__FILE__) + "/../vendor/gocr048.exe -C 0-9:/ ")
|
|
9
|
+
GOCR = File.expand_path(File.dirname(__FILE__) + "/../vendor/gocr048.exe -C 0-9:/S ")
|
|
11
10
|
|
|
12
11
|
CACHE = {}
|
|
13
12
|
|
|
@@ -15,31 +14,26 @@ module OCR
|
|
|
15
14
|
def identify_digit memory_bitmap, options = {}
|
|
16
15
|
if CACHE[memory_bitmap]
|
|
17
16
|
return CACHE[memory_bitmap]
|
|
18
|
-
else
|
|
19
17
|
end
|
|
20
|
-
|
|
21
|
-
should_invert = options[:should_invert]
|
|
22
|
-
if might_be_colon
|
|
18
|
+
if options[:might_be_colon]
|
|
23
19
|
# do processing in-line <sigh>
|
|
24
20
|
total = (memory_bitmap.scan /\x00{5}+/).length
|
|
25
21
|
if total >= 3 # really should be 4 for VLC
|
|
26
|
-
# it had some
|
|
22
|
+
# it had some darkness...therefore have been a colon!
|
|
23
|
+
CACHE[memory_bitmap] = ":"
|
|
24
|
+
return ":"
|
|
27
25
|
end
|
|
28
|
-
CACHE[memory_bitmap] = ":"
|
|
29
|
-
return ":"
|
|
30
26
|
end
|
|
31
27
|
image = MiniMagick::Image.from_blob(memory_bitmap)
|
|
32
28
|
image.format(:pnm) # expensive, requires convert.exe in path...
|
|
33
|
-
if should_invert
|
|
29
|
+
if options[:should_invert]
|
|
30
|
+
# mogrify calls it negate...
|
|
34
31
|
image.negate
|
|
35
32
|
end
|
|
36
33
|
for level in [130, 100] # 100 for hulu...
|
|
37
|
-
|
|
38
|
-
input.write image.to_blob
|
|
39
|
-
input.close
|
|
40
|
-
a = output.read
|
|
41
|
-
output.close
|
|
34
|
+
a = `#{GOCR} -l #{level} #{image.path} 2>NUL`
|
|
42
35
|
a.strip!
|
|
36
|
+
a = '3' if a == 'S' # sigh
|
|
43
37
|
if a =~ /[0-9]/
|
|
44
38
|
a = a.to_i
|
|
45
39
|
CACHE[memory_bitmap] = a
|
data/spec/ocr.spec.orb
CHANGED
|
@@ -16,6 +16,9 @@ describe OCR do
|
|
|
16
16
|
expected_digit = $1.to_i
|
|
17
17
|
if OCR.identify_digit(File.binread(file), options) != expected_digit
|
|
18
18
|
p "fail:" + file
|
|
19
|
+
require 'ruby-debug'
|
|
20
|
+
debugger
|
|
21
|
+
OCR.identify_digit(File.binread(file), options)
|
|
19
22
|
success = false
|
|
20
23
|
end
|
|
21
24
|
end
|
|
@@ -23,6 +26,7 @@ describe OCR do
|
|
|
23
26
|
end
|
|
24
27
|
|
|
25
28
|
it "should be able to grab a colon" do
|
|
29
|
+
pending "caring about colons"
|
|
26
30
|
OCR.identify_digit(File.binread("images/colon.bmp"), :might_be_colon => true).should == ":"
|
|
27
31
|
end
|
|
28
32
|
|
data/spec/overlayer.spec.rb
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
# avoid full loading if testing impossible
|
|
2
|
+
if RUBY_VERSION < '1.9.2' && RUBY_PLATFORM !~ /java/
|
|
3
|
+
puts 'not compatible to MRI < 1.9.2'
|
|
4
|
+
exit 0 # this isn't a real error...
|
|
5
|
+
end
|
|
6
|
+
|
|
1
7
|
require File.expand_path(File.dirname(__FILE__) + '/common')
|
|
2
8
|
require_relative '../lib/overlayer'
|
|
3
9
|
|
|
@@ -128,7 +134,7 @@ describe OverLayer do
|
|
|
128
134
|
end
|
|
129
135
|
|
|
130
136
|
it 'should have key list output on screen' do
|
|
131
|
-
@o.status.should include("
|
|
137
|
+
@o.status.should include("r,d,v,q to quit")
|
|
132
138
|
end
|
|
133
139
|
|
|
134
140
|
it 'should accept h for console help'
|
data/spec/screen_tracker.spec.rb
CHANGED
|
@@ -34,7 +34,7 @@ describe ScreenTracker do
|
|
|
34
34
|
it "should loop if unable to find the right window" do
|
|
35
35
|
proc {
|
|
36
36
|
Timeout::timeout(1) do
|
|
37
|
-
ScreenTracker.new("
|
|
37
|
+
ScreenTracker.new("this is supposed to be not running",10,10,20,20)
|
|
38
38
|
end
|
|
39
39
|
}.should raise_error(Timeout::Error)
|
|
40
40
|
end
|
|
@@ -154,12 +154,10 @@ describe ScreenTracker do
|
|
|
154
154
|
context "using OCR" do
|
|
155
155
|
|
|
156
156
|
before do
|
|
157
|
-
|
|
158
|
-
@a = ScreenTracker.new("silence.wav", -111, -16, 86, 13,
|
|
159
|
-
{:hours => nil, :minute_tens => [-90,7], :minute_ones => [-82, 7], :second_tens => [-72, 7], :second_ones => [-66, 7]} )
|
|
157
|
+
@a = ScreenTracker.new_from_yaml File.read("../zamples/players/vlc_non_full_screened_and_total_length_under_an_hour.yml"), nil
|
|
160
158
|
end
|
|
161
159
|
|
|
162
|
-
it "should be able to
|
|
160
|
+
it "should be able to disk dump snapshotted digits" do
|
|
163
161
|
@a.dump_bmp
|
|
164
162
|
Pathname.new('minute_tens.bmp').should exist
|
|
165
163
|
Pathname.new('minute_tens.bmp').size.should be > 0
|
|
@@ -3,16 +3,17 @@ source: Hulu
|
|
|
3
3
|
version: 0.4.8
|
|
4
4
|
mutes:
|
|
5
5
|
2.0 : 3.0 # comments can go after the # on each line
|
|
6
|
-
4.0 : 5.0
|
|
7
|
-
9.0 : 13.0
|
|
6
|
+
4.0 : 5.0 # mute from second 4 to second 5
|
|
7
|
+
9.0 : 13.0 # mute from second 9 to second 13
|
|
8
8
|
44.0 : 50.0 # mute for 6 seconds starting at second 44
|
|
9
|
-
# This next
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
#
|
|
14
|
-
# 01:01:01.05 does not work
|
|
9
|
+
# This next means mute from one minute to one minute one second
|
|
10
|
+
1:00 : 1:01
|
|
11
|
+
10:01 : 10:02 # mute from ten minutes, one second to ten minutes, 2 seconds
|
|
12
|
+
# if you use decimals, you'll have to put them in quotes
|
|
13
|
+
# 01:01:01.05 (for one hour, one minute, one second and a half) does not work
|
|
15
14
|
# "01:01:01.05" does
|
|
15
|
+
"01:01:00.5" : "01:01:01.5" # mute from one hour one minute and a half second to one hour one minute and 1.5s
|
|
16
|
+
|
|
16
17
|
blank_outs:
|
|
17
|
-
"00:15" : "00:18"
|
|
18
|
-
|
|
18
|
+
"00:15" : "00:18" # blank from second 15 to 18
|
|
19
|
+
01:01 : "01:02.0" # blank from one minute one second to one minute two seconds, etc.
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
source: "hulu"
|
|
2
2
|
mutes:
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
#
|
|
3
|
+
# these aren't actually accurate yet, except for Data's one
|
|
4
|
+
08:55 : 08:56 # what the he...
|
|
5
|
+
10:50 : 10:51 # durn
|
|
6
|
+
11:23 : "11:24" # ?
|
|
7
|
+
"01:15:39.5" : "01:15:41.5" # Data "oh s...."
|
|
8
|
+
# two onyx at beginning
|