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.
Files changed (26) hide show
  1. data/LICENSE +5 -2
  2. data/README +31 -24
  3. data/Rakefile +3 -3
  4. data/TODO +21 -11
  5. data/VERSION +1 -1
  6. data/lib/muter.rb +2 -1
  7. data/lib/overlayer.rb +26 -21
  8. data/lib/screen_tracker.rb +5 -4
  9. data/spec/common.rb +65 -1
  10. data/spec/{ocr.spec.orb → ocr.spec.rb} +0 -0
  11. data/spec/overlayer.spec.rb +81 -51
  12. data/spec/screen_tracker.spec.rb +24 -26
  13. data/zamples/players/{hulu_full_screen_total_length_over_an_hour.yml → total_length_over_an_hour/hulu_full_screened.yml} +0 -0
  14. data/zamples/players/{vlc_full_screened_total_length_over_an_hour.yml → total_length_over_an_hour/vlc_full_screened.yml} +0 -0
  15. data/zamples/players/{vlc_non_full_screened_and_total_length_over_an_hour.yml → total_length_over_an_hour/vlc_windowed.yml} +0 -0
  16. 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
  17. data/zamples/scene_lists/categories.yml +23 -0
  18. data/zamples/scene_lists/labyrinth.yml +14 -13
  19. data/zamples/scene_lists/star_trek_generations_hulu.yml +6 -7
  20. metadata +32 -45
  21. data/zamples/players/sample_snapshots/hulu full screen non hour.jpg +0 -0
  22. data/zamples/players/sample_snapshots/hulu full screen over hour.jpg +0 -0
  23. data/zamples/players/sample_snapshots/silence.bmp +0 -0
  24. data/zamples/players/sample_snapshots/vlc grab over one hour file over one hour play.bmp +0 -0
  25. data/zamples/players/sample_snapshots/vlc2.bmp +0 -0
  26. 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) licenses.
3
+ May contain some 3rd party libraries under their own (separate, open source) license.
4
4
 
5
- Note that this software should be legal at least in the EU,
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 the player you are using, and mutes or blanks out the system screen appropriately,
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
- Currently 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.
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 thus:
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 description file (ex: bambi.yml),
23
- and also for a player description file (ex: hulu_full_screen_with_total_length_over_an_hour.yml).
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 Description File ==
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 description file.
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 description file (changes will be automatically picked up),
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 description file if desired, back to the project [1].
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, the mini_magick gem authors, jruby guys, etc.
132
- Made programming this actually somewhat a pleasure.
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 (xp?)
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
- blank overlay "and you are one awesome klingon"
12
+ just plow forward, to "grab" available ideas...
13
13
 
14
- bump win32-screenshot version
14
+ make it "quieter" at certain parts, arbitrarily...
15
15
 
16
- screencast of something helpful.
16
+ release a zip file that they can just click on something to run it...self-extractor yeah.
17
17
 
18
- optimize imdb: http://www.imdb.com/board/bd0000042/thread/58361958?d=58361958, english friendlier url's
18
+ snag the close captioning for a profanity filter?
19
19
 
20
- bundle fewer imagemagick binaries
20
+ make it able to use multiple players so I can maximize VLC...
21
21
 
22
- TSR that monitors "oh you're opening VLC? you're playing the E drive? That's bob's big plan? You're maximized? Full screened? watching x on hulu?"
22
+ blank overlay "and you are one awesome klingon"
23
23
 
24
- just plow forward, to "grab" available ideas...
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
- netflix
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
- overlay alpha transparent pic
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.5
1
+ 0.7.7
@@ -35,7 +35,8 @@ module Muter
35
35
  #unmute! # just in case
36
36
  hit_mute_key
37
37
  end
38
- # TODO better for 7...
38
+
39
+ # TODO better for doze 7...
39
40
  def unmute!
40
41
  hit_mute_key # Windows XP...
41
42
  hit_volume_down_key
@@ -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
- # LTODO... @all_sequences = @all_sequences.map{|k, v| v.sort!} etc. and validate...
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, minutes = nil
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
- start = translate_string_to_seconds(start)
115
- endy = translate_string_to_seconds(endy)
116
- if start == 0 || endy == 0
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 $DEBUG
118
- # drop it in bitbucket...
119
- else
120
- new[start] = endy
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
- # returns [true, false, next_moment_of_importance|:done]
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
@@ -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
- sleep 4
55
- print ' trying again .'
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
@@ -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
- #end
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
@@ -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 error...
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
- # tell it not to actually mute during testing...
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 accept h for console help'
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
- File.write 'temp.yml', yaml
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
- :mutes:
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
- :mutes:
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
- write_yaml <<-YAML
182
- :mutes:
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 <<-YAML
193
- :mutes:
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
- :mutes:
193
+ mutes:
200
194
  01 : 02
201
195
  YAML
202
196
  out.reload_yaml!
203
- out.all_sequences[:mutes].should_not be_blank
197
+ out.all_sequences[:mutes].should == [[1,2]]
204
198
  write_yaml <<-YAML
205
- :mutes:
206
- 01 : # failure
199
+ mutes:
200
+ 05 : # failure
207
201
  YAML
208
202
  # should have kept the old
209
- out.all_sequences[:mutes].should_not be_blank
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
- :mutes:
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 be_blank
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
- :mutes:
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
- :mutes:
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
- :mutes:
253
+ mutes:
239
254
  "0:02.0" : "0:03.0"
240
- :blank_outs:
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
- :mutes:
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
- :mutes:
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
- end
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
- :mutes:
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(4) do
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 input" do
389
- o = OverLayer.new 'temp.yml', "01:01.5"
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
@@ -5,19 +5,22 @@ require 'pathname'
5
5
 
6
6
  describe ScreenTracker do
7
7
 
8
- if RUBY_PLATFORM =~ /java/
9
- it "is pending several java bugs..." # ffi, AND popen#pid...
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(/silence.wav/, 0) {}
16
+ Win32::Screenshot.window(SILENCE, 0) {}
16
17
  raise Exception.new('must kill old vlcs first')
17
18
  rescue
18
- # this way we'll only have one up...
19
- $pid1 = IO.popen('"/program files/VideoLan/VLC/vlc.exe" silence.wav').pid # jruby can't open it directly yet, too...
20
- sleep 2
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(/silence.*VLC/,10,10,20,20)
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(/silence.*VLC/,10,10,20,20)
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(/silence.*VLC/,-10,10,20,20) }.should raise_error
110
- proc { a = ScreenTracker.new(/silence.*VLC/,10,-10,20,20) }.should raise_error
111
- proc { a = ScreenTracker.new(/silence.*VLC/,-10,10,0,2) }.should raise_error
112
- proc { a = ScreenTracker.new(/silence.*VLC/,10,10,2,0) }.should raise_error
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("silence.wav", -111, -16, 86, 13)
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/vlc_non_full_screened_and_total_length_under_an_hour.yml"), nil
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("silence.wav", -111, -16, 86, 13,
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
- # bring redcar to the foreground
224
- # this seg faults on windows 7 for me for some reason when run inside the editor itself...swt bug?
225
- unless Socket.gethostname == "PACKRD-1GK7V"
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
@@ -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 # hurts like heck
3
- #4:00 : 4:02 # dang
4
- #0:33:00 : 0:33:01 # damg
5
- 0:39:45 : 0:39:46 # crap 37:21 check
6
- 54:36 : 54:37 # oh my gosh
7
- 1:04:33 : 1:04:36 # durn durn check #1:04:00 : 1:04:10 # dang
8
- #1:33:00 : 1:33:02 # dang
9
- 1:32:46 : 1:32:47 # dang
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/VLC
15
- missing: lots of fart noises in the swamp, some odd body parts from the red people, goblin violence, some swearing in credits song
16
- idea: quieter at parts...
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
- # these aren't actually accurate yet, except for Data's one
4
- # oh my ... at beginning
5
- 08:54.5 : 08:56 # what the he...
6
- 10:46.5 : 10:48 # durn
7
- 11:21 : 11:24.5 # the he...
8
- 19:45 : 19:50 # religious "...have mercy"
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
- - 5
10
- version: 0.7.5
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-11 00:00:00 -06:00
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: rspec
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
- version: "0"
33
- type: :development
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: jeweler
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
- version: "0"
47
- type: :development
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: rdp-rmagick
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: :development
62
+ type: :runtime
62
63
  version_requirements: *id003
63
64
  - !ruby/object:Gem::Dependency
64
- name: mini_magick
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: :runtime
75
+ type: :development
76
76
  version_requirements: *id004
77
77
  - !ruby/object:Gem::Dependency
78
- name: hitimes
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: sane
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
- - 22
103
- - 0
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: win32screenshot
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
- - 0
119
- - 6
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.orb
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/vlc_full_screened_total_length_over_an_hour.yml
219
- - zamples/players/vlc_non_full_screened_and_total_length_over_an_hour.yml
220
- - zamples/players/vlc_non_full_screened_and_total_length_under_an_hour.yml
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