content-editing-movie-player 0.38.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitmodules +3 -0
- data/.rvmrc +1 -0
- data/LICENSE.TXT +20 -0
- data/README.TXT +225 -0
- data/Rakefile +206 -0
- data/TODO +740 -0
- data/VERSION +1 -0
- data/_DO_NOT_RUN_IT_FROM_HERE_DOWNLOAD_THE_RELEASE_ZIP_FROM_SOURCEFORGE_INSTEAD +0 -0
- data/bin/sensible-cinema +60 -0
- data/bin/sensible-cinema-cli +161 -0
- data/business_ideas.txt +21 -0
- data/change_log_with_feature_list.txt +952 -0
- data/documentation/DOCUMENTATION_README.TXT +44 -0
- data/documentation/how_to_get_files_from_dvd.txt +30 -0
- data/documentation/is_it_legal_to_copy_dvds.txt +97 -0
- data/documentation/troubleshooting.txt +30 -0
- data/documentation/upconversion.txt +4 -0
- data/experimental_online_player_ocr_readme.txt +45 -0
- data/go +1 -0
- data/go.bat +2 -0
- data/go.sh +1 -0
- data/go_ocr_tracker.bat +1 -0
- data/goc +1 -0
- data/goc.bat +1 -0
- data/goc.sh +1 -0
- data/gpl-2.0.txt +339 -0
- data/gplv3.txt +219 -0
- data/history_and_related_works_list.txt +108 -0
- data/inventionzy_files/cone.png +0 -0
- data/inventionzy_files/md5s.txt +53 -0
- data/inventionzy_files/play_with_inserted_scene.bat +8 -0
- data/inventionzy_files/play_with_overlay.bat +24 -0
- data/inventionzy_files/transcript_mute_vlc.txt +117 -0
- data/legal_draft +23 -0
- data/lib/add_any_bundled_gems_to_load_path.rb +32 -0
- data/lib/auto_window_finder.rb +41 -0
- data/lib/blanker.rb +104 -0
- data/lib/check_installed_mac.rb +34 -0
- data/lib/convert_thirty_fps.rb +20 -0
- data/lib/edl_parser.rb +387 -0
- data/lib/eight_three.rb +28 -0
- data/lib/extract/dumpstream.bat +1 -0
- data/lib/extract/get_init.bat +3 -0
- data/lib/extract/pause_early.rb +13 -0
- data/lib/fake_blanker.rb +35 -0
- data/lib/frame_accurate.rb +3 -0
- data/lib/gui/base.rb +748 -0
- data/lib/gui/create-file.rb +24 -0
- data/lib/gui/create.rb +581 -0
- data/lib/gui/dependencies.rb +219 -0
- data/lib/gui/normal.rb +123 -0
- data/lib/gui/upconvert.rb +284 -0
- data/lib/keyboard_input.rb +60 -0
- data/lib/media_info_parser.rb +27 -0
- data/lib/mouse_forever.rb +19 -0
- data/lib/movie_hasher.rb +27 -0
- data/lib/mplayer_edl.rb +42 -0
- data/lib/muter.rb +87 -0
- data/lib/ocr.rb +125 -0
- data/lib/ocr_seed/netflix_b9.bmp +0 -0
- data/lib/overlayer.rb +373 -0
- data/lib/screen_tracker.rb +269 -0
- data/lib/subtitle_profanity_finder.rb +294 -0
- data/lib/vlc_programmer.rb +112 -0
- data/lib/zoom_player_max_edl.rb +50 -0
- data/never_do +40 -0
- data/notes_for_potential_developers.txt +46 -0
- data/preamble +17 -0
- data/roadmap_possibilities +12 -0
- data/spec/arse.srt +41 -0
- data/spec/auto_window_finder.spec.rb +65 -0
- data/spec/bad_beginning.srt +3778 -0
- data/spec/blanker.spec.rb +60 -0
- data/spec/common.rb +81 -0
- data/spec/convert_image.rb +25 -0
- data/spec/deity_end.srt +11 -0
- data/spec/dragon.srt +34 -0
- data/spec/edl_parser.spec.rb +270 -0
- data/spec/frame_accurate.spec.rb +71 -0
- data/spec/keyboard_input.spec.rb +73 -0
- data/spec/media_info_parser.spec.rb +29 -0
- data/spec/mplayer_edl.spec.rb +100 -0
- data/spec/muter.spec.rb +50 -0
- data/spec/notes +4996 -0
- data/spec/ocr.spec.rb +119 -0
- data/spec/overlayer.spec.rb +440 -0
- data/spec/screen_tracker.spec.rb +318 -0
- data/spec/sensible_cinema_gui.spec.rb +452 -0
- data/spec/subtitle_profanity_finder.spec.rb +224 -0
- data/spec/test_yaml.yml +4 -0
- data/spec/tsmuxer.output +33 -0
- data/spec/vlc_programmer.spec.rb +124 -0
- data/spec/youtube_edl.spec.rb +28 -0
- data/spec/zoom_player_max_edl.spec.rb +29 -0
- data/template_bats/README_DISTRO.TXT +8 -0
- data/template_bats/RUN SENSIBLE CINEMA CLICK HERE WINDOWS.bat +25 -0
- data/template_bats/_DO_NOT_RUN_IT_FROM_HERE_DOWNLOAD_THE_RELEASE_ZIP_FROM_SOURCEFORGE_INSTEAD +0 -0
- data/template_bats/mac/RUN SENSIBLE CINEMA CLICK HERE.command +5 -0
- data/template_bats/mac/advanced--create or edit sensible cinema edit list files.command +3 -0
- data/template_bats/mac/advanced--run-upconverting-video-player.command +3 -0
- data/template_bats/pc/advanced--create or edit sensible cinema edit list files.bat +2 -0
- data/template_bats/pc/advanced--run-upconverting-video-player.bat +2 -0
- data/todo.build_library.txt +11 -0
- data/todo.inventionzy.txt +162 -0
- data/todo.open_edl_list_org.txt +169 -0
- data/todo.propaganda +107 -0
- data/todo.subtitle +17 -0
- data/todo.upconvert +53 -0
- data/upconvert.bat +1 -0
- data/upconvert_from_screen/go_upscaling.bat +12 -0
- data/upconvert_from_screen/go_upscaling_works +0 -0
- data/upconvert_from_screen/old/latest2/combine_video.avs +23 -0
- data/upconvert_from_screen/old/latest2/go_no_upscaling.bat +1 -0
- data/upconvert_from_screen/old/latest2/go_upscaling.bat +12 -0
- data/upconvert_from_screen/old/latest2/push2.GRF +0 -0
- data/upconvert_from_screen/old/latest2/push3.grf +0 -0
- data/upconvert_from_screen/old/latest2/setup_capture_coords.rb +27 -0
- data/upconvert_from_screen/old/latest2/setup_directshow_filter_params.rb +29 -0
- data/upconvert_from_screen/old/latest2/upconvert_from_screen_me2.avs +19 -0
- data/upconvert_from_screen/old/latest_now_possibly_oudated/push2.GRF +0 -0
- data/upconvert_from_screen/old/latest_now_possibly_oudated/upconvert_from_screen_me2.avs +18 -0
- data/upconvert_from_screen/old/position_window.png +0 -0
- data/upconvert_from_screen/old/push_source_desktop.GRF +0 -0
- data/upconvert_from_screen/old/record_screen/record.bat +2 -0
- data/upconvert_from_screen/old/upconvert_from_screen.avs +21 -0
- data/upconvert_from_screen/old/upconvert_from_screen_me.avs +21 -0
- data/upconvert_from_screen/old/upconvert_from_screen_me2.avs +3 -0
- data/upconvert_from_screen/old/upconvert_from_screen_me_push_source.avs +3 -0
- data/upconvert_from_screen/old/uscreen.GRF +0 -0
- data/upconvert_from_screen/old/uscreen_me.GRF +0 -0
- data/upconvert_from_screen/push3.grf +0 -0
- data/upconvert_from_screen/upconvert_from_screen_me2.avs +19 -0
- data/vendor/movie-content-editor-read-only/.metadata/.lock +0 -0
- data/vendor/movie-content-editor-read-only/.metadata/.mylyn/.tasks.xml.zip +0 -0
- data/vendor/movie-content-editor-read-only/.metadata/.mylyn/repositories.xml.zip +0 -0
- data/vendor/movie-content-editor-read-only/.metadata/.mylyn/tasks.xml.zip +0 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version +1 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index +0 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version +1 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.resources/.root/2.tree +0 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources +0 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs +3 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs +14 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs +3 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs +5 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs +3 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache +0 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat +0 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml +2 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml +2 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml +10 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml +11 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.ui.intro/dialog_settings.xml +4 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml +10 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml +232 -0
- data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml +4 -0
- data/vendor/movie-content-editor-read-only/.metadata/version.ini +1 -0
- data/vendor/movie-content-editor-read-only/.project +17 -0
- data/vendor/movie-content-editor-read-only/.pydevproject +11 -0
- data/vendor/movie-content-editor-read-only/.settings/org.eclipse.core.resources.prefs +6 -0
- data/vendor/movie-content-editor-read-only/SubIt.py +171 -0
- data/vendor/movie-content-editor-read-only/VLCMacVideo.py +257 -0
- data/vendor/movie-content-editor-read-only/VideoMac.ui +102 -0
- data/vendor/movie-content-editor-read-only/badwords.txt +4 -0
- data/vendor/movie-content-editor-read-only/blank.srt +4 -0
- data/vendor/movie-content-editor-read-only/edit.py +197 -0
- data/vendor/movie-content-editor-read-only/mergeCommands.py +73 -0
- data/vendor/movie-content-editor-read-only/mute.txt +5 -0
- data/vendor/movie-content-editor-read-only/panda.srt +4235 -0
- data/vendor/movie-content-editor-read-only/panda_custom.txt +3 -0
- data/vendor/movie-content-editor-read-only/panda_edit.srt +4235 -0
- data/vendor/movie-content-editor-read-only/subtitle.py +90 -0
- data/vendor/movie-content-editor-read-only/vlc.py +5579 -0
- data/vendor/movie-content-editor-read-only/vlcwidget.py +154 -0
- data/vendor/mplayer_patches/how_to_doze.bat +6 -0
- data/vendor/mplayer_patches/port_dir/PortIndex.quick +2 -0
- data/vendor/mplayer_patches/port_dir/how_to +20 -0
- data/vendor/mplayer_patches/port_dir/multimedia/mplayer-edl/Portfile +285 -0
- data/vendor/mplayer_patches/port_dir/multimedia/mplayer-edl/files/configure.x11.patch +20 -0
- data/vendor/mplayer_patches/port_dir/multimedia/mplayer-edl/files/llvm-gcc-workaround.patch +11 -0
- data/vendor/mplayer_patches/port_dir/multimedia/rdp-projects/Portfile +43 -0
- data/vendor/mplayer_patches/port_dir_is_for_mac +0 -0
- data/www/content_editor.html +92 -0
- data/www/index.html +47 -0
- data/www/upconverting_movie_player.html +62 -0
- data/www/video reel.jpg +0 -0
- data/www/youtube_edl/.htaccess +44 -0
- data/www/youtube_edl/control_youtube.rhtml +141 -0
- data/www/youtube_edl/dispatch.fcgi +25 -0
- data/www/youtube_edl/render_edited.rb +25 -0
- data/www/youtube_edl/server_this_dir.rb +6 -0
- data/www/youtube_edl/todo +23 -0
- data/www/zoomplayer_max.png +0 -0
- data/zamples/edit_decision_lists/dvds/Harry Potter 2 chamber of secrets.txt +22 -0
- data/zamples/edit_decision_lists/dvds/aa_example_delete_list_that_has_no_cuts_in_it.txt +10 -0
- data/zamples/edit_decision_lists/dvds/aladdin.txt +30 -0
- data/zamples/edit_decision_lists/dvds/bambi.txt +17 -0
- data/zamples/edit_decision_lists/dvds/big_buck_bunny_dvd.txt +23 -0
- data/zamples/edit_decision_lists/dvds/bob the builder pets in a pickle.txt +10 -0
- data/zamples/edit_decision_lists/dvds/bobs_big_plan.txt +10 -0
- data/zamples/edit_decision_lists/dvds/cars_2.txt +26 -0
- data/zamples/edit_decision_lists/dvds/cars_disney.txt +40 -0
- data/zamples/edit_decision_lists/dvds/condor_man_widescreen.txt +22 -0
- data/zamples/edit_decision_lists/dvds/cool runnings.txt +53 -0
- data/zamples/edit_decision_lists/dvds/court_jester.txt +24 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/amazing_grace.txt +49 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/father_goose.txt +41 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/harry_potter_and_the_goblet_of_fire.txt +45 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/hugo.txt +31 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/making_marriage_work.txt +15 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/national_treasure.txt +26 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/percy_jackson_lightening_thief.txt +40 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/percy_jackson_lightening_thief_mute_scary.txt +23 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/prince_of_egypt.txt +28 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/puss_in_boots.txt +33 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/ratatouille.txt +35 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/rio.txt +24 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/test_delete_list_for_experimenting_with.txt +10 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/the_explorers.txt +49 -0
- data/zamples/edit_decision_lists/dvds/finding_neverland.txt +32 -0
- data/zamples/edit_decision_lists/dvds/flight_of_the_navigator.txt +40 -0
- data/zamples/edit_decision_lists/dvds/happiest baby on the block.txt +9 -0
- data/zamples/edit_decision_lists/dvds/harry_potter_3_prisoner_of_azkaban.txt +37 -0
- data/zamples/edit_decision_lists/dvds/hitchhiker's_guide_to_the_galaxy.txt +32 -0
- data/zamples/edit_decision_lists/dvds/how_to_train_your_dragon.txt +25 -0
- data/zamples/edit_decision_lists/dvds/if_a_man_answers.txt +43 -0
- data/zamples/edit_decision_lists/dvds/innerspace.txt +77 -0
- data/zamples/edit_decision_lists/dvds/iq.txt +32 -0
- data/zamples/edit_decision_lists/dvds/king_of_kings.txt +28 -0
- data/zamples/edit_decision_lists/dvds/kung_fu_panda_1.txt +17 -0
- data/zamples/edit_decision_lists/dvds/legend_of_the_guardians_the_owls_of_gahoole.txt +18 -0
- data/zamples/edit_decision_lists/dvds/monsters_vs_aliens.txt +41 -0
- data/zamples/edit_decision_lists/dvds/muppet_treasure_island.txt +21 -0
- data/zamples/edit_decision_lists/dvds/nanny_mcphee.txt +31 -0
- data/zamples/edit_decision_lists/dvds/narnia_voyage_of_the_dawn_treader.txt +16 -0
- data/zamples/edit_decision_lists/dvds/pack_jackson_wedding_2007-03-03.txt +31 -0
- data/zamples/edit_decision_lists/dvds/peter_pan.txt +29 -0
- data/zamples/edit_decision_lists/dvds/remember_the_titans.txt +35 -0
- data/zamples/edit_decision_lists/dvds/sintel_open_source_blender_ntsc_dvd.txt +22 -0
- data/zamples/edit_decision_lists/dvds/snow_white_and_the_7_dwarfs_1937.txt +19 -0
- data/zamples/edit_decision_lists/dvds/speed_racer.txt +47 -0
- data/zamples/edit_decision_lists/dvds/tangled.txt +21 -0
- data/zamples/edit_decision_lists/dvds/tron_legacy.txt +29 -0
- data/zamples/edit_decision_lists/dvds/turn_around_alma_younger.txt +17 -0
- data/zamples/edit_decision_lists/files/conference_music_video.txt +10 -0
- data/zamples/edit_decision_lists/netflix_instant/avatar-last-air-bender-movie.txt +13 -0
- data/zamples/edit_decision_lists/netflix_instant/avatar-last-airbender-series.txt +1 -0
- data/zamples/edit_decision_lists/netflix_instant/greatest_story_ever_told_netflix.txt +10 -0
- data/zamples/edit_decision_lists/netflix_instant/wrinkle-in-time.txt +23 -0
- data/zamples/edit_decision_lists/notes_on_movies_without_edls_yet/tron.txt +10 -0
- data/zamples/edit_decision_lists/old_not_yet_updated/dvds/White Christmas.txt +15 -0
- data/zamples/edit_decision_lists/old_not_yet_updated/dvds/all_dogs_go_to_heaven.txt +9 -0
- data/zamples/edit_decision_lists/old_not_yet_updated/dvds/cars_disney.txt +24 -0
- data/zamples/edit_decision_lists/old_not_yet_updated/dvds/happy_feet.txt +12 -0
- data/zamples/edit_decision_lists/old_not_yet_updated/dvds/labyrinth.txt +17 -0
- data/zamples/edit_decision_lists/old_not_yet_updated/dvds/star_trek_generations_hulu.txt +8 -0
- data/zamples/edit_decision_lists/old_not_yet_updated/example_edit_decision_list.txt +14 -0
- data/zamples/edit_decision_lists/old_not_yet_updated/youtube/gummy_bear_song_youtube.txt +9 -0
- data/zamples/edit_decision_lists/youtube/demo_mutes.txt +12 -0
- data/zamples/edit_decision_lists/youtube/nuki_song_youtube.txt +14 -0
- data/zamples/edit_decision_lists/youtube/nuki_song_youtube_pointer.txt +3 -0
- data/zamples/players/how_to_create_more_players.txt +24 -0
- data/zamples/players/hulu/total_length_over_an_hour.txt +25 -0
- data/zamples/players/netflix/netflix_firefox_non_maximized.txt +25 -0
- data/zamples/players/vlc/full_screened_total_length_over_an_hour.txt +27 -0
- data/zamples/players/vlc/windowed_total_length_over_an_hour.txt +26 -0
- data/zamples/players/vlc/windowed_total_length_under_an_hour.txt +22 -0
- data/zamples/players/youtube/full_screened_1024x768.txt +20 -0
- data/zamples/players/youtube/full_screened_1152x864.txt +20 -0
- data/zamples/players/youtube/full_screened_1680x1050.txt +20 -0
- data/zamples/players/youtube/normal_in_youtube.com.chrome.txt +23 -0
- data/zamples/players/youtube/note_these_assume_less_than_10_minutes_length.txt +2 -0
- metadata +483 -0
data/spec/ocr.spec.rb
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2010, Roger Pack
|
3
|
+
This file is part of Sensible Cinema.
|
4
|
+
|
5
|
+
Sensible Cinema is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
Sensible Cinema is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU General Public License
|
16
|
+
along with Sensible Cinema. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
require File.expand_path(File.dirname(__FILE__) + '/common')
|
19
|
+
require_relative "../lib/ocr"
|
20
|
+
require 'benchmark'
|
21
|
+
|
22
|
+
describe OCR do
|
23
|
+
|
24
|
+
it "should be able to output help output" do
|
25
|
+
OCR.version.should_not be_blank
|
26
|
+
end
|
27
|
+
|
28
|
+
before do
|
29
|
+
OCR.clear_cache!
|
30
|
+
end
|
31
|
+
|
32
|
+
Dir['images/*[0-9].bmp'].sort_by{|f| File.stat(f).mtime}.reverse.each{ |file|
|
33
|
+
it "should be able to OCR #{file}" do
|
34
|
+
OCR.load_from_ocr_seed
|
35
|
+
options = {}
|
36
|
+
options[:should_invert] = true if file =~ /hulu|netflix/
|
37
|
+
options[:sharpen] = true if file =~ /youtube/ && file !~ /light/
|
38
|
+
|
39
|
+
# 130 for vlc, 100 for hulu, 0 for some youtube full screen
|
40
|
+
# 225, 200 for youtube "light" (windowed after awhile)
|
41
|
+
# 0 means autodetect [?] was that true for 0.48?
|
42
|
+
degrees = {'vlc' => [130], 'hulu' => [100], 'youtube_light' => [225,200], 'youtube' => [0], 'netflix' => [0]}
|
43
|
+
# youtube_light must be in just that order...
|
44
|
+
file =~ /(vlc|hulu|youtube_light|youtube|netflix)/
|
45
|
+
options[:levels] = degrees[$1]
|
46
|
+
assert options[:levels] && options[:levels].length > 0
|
47
|
+
file =~ /(.)\.bmp/
|
48
|
+
expected_digit = $1.to_i
|
49
|
+
got_digit = OCR.identify_digit(File.binread(file), options)
|
50
|
+
if got_digit != expected_digit
|
51
|
+
begin
|
52
|
+
p 'digit failed ' + file
|
53
|
+
OCR::CACHE.clear
|
54
|
+
require 'ruby-debug'
|
55
|
+
debugger # now allow to step into the same call...
|
56
|
+
OCR.identify_digit(File.binread(file), options)
|
57
|
+
rescue LoadError
|
58
|
+
puts 'unable to load ruby-debug!' # until I can get 1.9.2 to compile it...
|
59
|
+
end
|
60
|
+
got_digit.should == expected_digit
|
61
|
+
end
|
62
|
+
end
|
63
|
+
}
|
64
|
+
|
65
|
+
it "should be able to grab a colon" do
|
66
|
+
pending "caring about colons"
|
67
|
+
OCR.identify_digit(File.binread("images/colon.bmp"), :might_be_colon => true, :levels => [130]).should == ":"
|
68
|
+
end
|
69
|
+
|
70
|
+
def read_digit
|
71
|
+
OCR.identify_digit(File.binread("images/youtube_3_0.bmp"), :sharpen => true, :levels => [130])
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should return nil if it can't identify a digit" do
|
75
|
+
read_all_black.should be_nil
|
76
|
+
end
|
77
|
+
|
78
|
+
def read_all_black
|
79
|
+
OCR.identify_digit(File.binread("images/black.bmp"),:levels => [130])
|
80
|
+
end
|
81
|
+
|
82
|
+
context "cache" do
|
83
|
+
|
84
|
+
before do
|
85
|
+
OCR.clear_cache!
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should cache results from one time to the next" do
|
89
|
+
original_time = Benchmark.realtime { read_digit }
|
90
|
+
new_time = Benchmark.realtime { 3.times { read_digit } }
|
91
|
+
new_time.should be < original_time
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should not results for failed reads (at least for now)" do
|
95
|
+
original_time = Benchmark.realtime { read_all_black }
|
96
|
+
new_time = Benchmark.realtime { 3.times { read_all_black} }
|
97
|
+
new_time.should be < original_time
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should serialize creating a cache file" do
|
101
|
+
Pathname.new(OCR::CACHE_FILE).should_not exist
|
102
|
+
OCR.serialize_cache_to_disk
|
103
|
+
Pathname.new(OCR::CACHE_FILE).should exist
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should use the cache file to speed things up on startup" do
|
107
|
+
long = Benchmark.realtime { read_digit }
|
108
|
+
OCR.serialize_cache_to_disk
|
109
|
+
OCR::CACHE.clear
|
110
|
+
long2 = Benchmark.realtime { read_digit }
|
111
|
+
OCR.unserialize_cache_from_disk
|
112
|
+
short = Benchmark.realtime { 3.times { read_digit } }
|
113
|
+
long.should be > short
|
114
|
+
long2.should be > short
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,440 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2010, Roger Pack
|
3
|
+
This file is part of Sensible Cinema.
|
4
|
+
|
5
|
+
Sensible Cinema is free software: you can redistribute it and/or modify
|
6
|
+
it under the terms of the GNU General Public License as published by
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
Sensible Cinema is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU General Public License
|
16
|
+
along with Sensible Cinema. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
=end
|
18
|
+
# avoid full loading if testing impossible
|
19
|
+
if RUBY_VERSION < '1.9.2' && RUBY_PLATFORM !~ /java/
|
20
|
+
puts 'not compatible to MRI < 1.9.2'
|
21
|
+
exit 0 # this isn't a really real failure...
|
22
|
+
end
|
23
|
+
|
24
|
+
require File.expand_path(File.dirname(__FILE__) + '/common')
|
25
|
+
require_relative '../lib/overlayer'
|
26
|
+
|
27
|
+
$AM_IN_UNIT_TEST = true
|
28
|
+
|
29
|
+
def start_good_blank
|
30
|
+
assert !@o.blank?
|
31
|
+
end
|
32
|
+
|
33
|
+
def start_bad_blank
|
34
|
+
assert @o.blank?
|
35
|
+
end
|
36
|
+
|
37
|
+
describe OverLayer do
|
38
|
+
|
39
|
+
before do
|
40
|
+
File.write 'temp.yml', YAML.dump({:mutes => {2.0 => 4.0}} )
|
41
|
+
@o = OverLayer.new('temp.yml')
|
42
|
+
Blanker.startup
|
43
|
+
end
|
44
|
+
|
45
|
+
after do
|
46
|
+
Thread.join_all_others
|
47
|
+
File.delete 'temp.yml'
|
48
|
+
Blanker.shutdown
|
49
|
+
end
|
50
|
+
|
51
|
+
def start_good
|
52
|
+
assert !@o.muted?
|
53
|
+
sleep 1
|
54
|
+
end
|
55
|
+
|
56
|
+
def start_bad
|
57
|
+
assert @o.muted? # note this uses @o!
|
58
|
+
sleep 1
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should be able to mute' do
|
62
|
+
# several combinations...
|
63
|
+
assert !@o.muted?
|
64
|
+
@o.mute!
|
65
|
+
assert @o.muted?
|
66
|
+
@o.unmute!
|
67
|
+
assert !@o.muted?
|
68
|
+
@o.mute!
|
69
|
+
assert @o.muted?
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should mute based on time' do
|
73
|
+
@o.start_thread
|
74
|
+
# make sure we enter the mute section, 2-4
|
75
|
+
sleep 2.5
|
76
|
+
start_bad # sleeps 1
|
77
|
+
sleep 1.0
|
78
|
+
start_good
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should unmute after the ending scene, and also be able to go past the end of scenes at all' do
|
82
|
+
File.write 'temp.yml', YAML.dump({:mutes => {0.5 => 1.0}})
|
83
|
+
@o = OverLayer.new 'temp.yml'
|
84
|
+
@o.start_thread true
|
85
|
+
begin
|
86
|
+
# make sure we enter the mute section
|
87
|
+
sleep 0.75
|
88
|
+
start_bad # sleeps 1
|
89
|
+
start_good
|
90
|
+
start_good
|
91
|
+
ensure
|
92
|
+
@o.kill_thread!
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should handle multiple mutes in a row' do
|
97
|
+
File.write 'temp.yml', YAML.dump({:mutes => {2.0 => 4.0, 5.0 => 7.0}})
|
98
|
+
@o = OverLayer.new 'temp.yml'
|
99
|
+
@o.start_thread
|
100
|
+
sleep 2.5
|
101
|
+
start_bad # 1s
|
102
|
+
sleep 2 # => 5.5
|
103
|
+
start_bad # unfortunately this doesn't actually reproduce the bug,
|
104
|
+
# which is that it actually needs to barely "over sleep" or there is the race condition of
|
105
|
+
# wake up oh nothing to do *just* yet
|
106
|
+
# but by the time you check again, you just passed it, so you wait till the next one in an errant state
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'should be able to mute teeny timed sequences' do
|
110
|
+
# it once failed on this...
|
111
|
+
File.write 'temp.yml', YAML.dump({:mutes => {0.0001 => 0.0002, 1.0 => 1.0001}})
|
112
|
+
o = OverLayer.new 'temp.yml'
|
113
|
+
o.continue_until_past_all false
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
it 'should allow you to change the current time' do
|
118
|
+
@o.start_thread
|
119
|
+
sleep 0.1 # wow ruby is slow...
|
120
|
+
assert @o.cur_time > 0
|
121
|
+
@o.set_seconds 5
|
122
|
+
sleep 0.1
|
123
|
+
assert @o.cur_time > 5
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'should be able to accept keyboard input do adjust time' do
|
127
|
+
@o = OverLayer.new 'test_yaml.yml'
|
128
|
+
@o.cur_time
|
129
|
+
@o.keyboard_input 'm'
|
130
|
+
assert @o.cur_time > 59
|
131
|
+
@o.keyboard_input 'M'
|
132
|
+
assert @o.cur_time < 59
|
133
|
+
60.times {
|
134
|
+
@o.keyboard_input 's'
|
135
|
+
}
|
136
|
+
assert @o.cur_time > 59
|
137
|
+
60.times {
|
138
|
+
@o.keyboard_input 'S'
|
139
|
+
}
|
140
|
+
assert @o.cur_time < 59
|
141
|
+
600.times {
|
142
|
+
@o.keyboard_input 't'
|
143
|
+
}
|
144
|
+
assert @o.cur_time > 59
|
145
|
+
600.times {
|
146
|
+
@o.keyboard_input 'T'
|
147
|
+
}
|
148
|
+
assert @o.cur_time < 59
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'should have key list output on screen' do
|
153
|
+
@o.status.should include("ctrl+c to quit")
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'should allow for yaml input and parse it appropo' do
|
157
|
+
# 2 - 3 , 4-5 should be muted
|
158
|
+
@o = OverLayer.new 'test_yaml.yml'
|
159
|
+
@o.start_thread
|
160
|
+
start_good # takes 1s
|
161
|
+
sleep 1.25
|
162
|
+
start_bad
|
163
|
+
start_good
|
164
|
+
start_bad
|
165
|
+
start_good
|
166
|
+
end
|
167
|
+
|
168
|
+
def write_yaml yaml
|
169
|
+
File.write 'temp.yml', yaml
|
170
|
+
@o = OverLayer.new 'temp.yml'
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'should allow for 1:00.0 minute style input' do
|
174
|
+
write_yaml <<-YAML
|
175
|
+
mutes:
|
176
|
+
"0:02.0" : "0:03.0"
|
177
|
+
YAML
|
178
|
+
@o.start_thread
|
179
|
+
start_good
|
180
|
+
start_good
|
181
|
+
sleep 0.25
|
182
|
+
start_bad
|
183
|
+
start_good
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should reload the YAML file on the fly to allow for editing it" do
|
187
|
+
# start it with one set to mute far later
|
188
|
+
write_yaml <<-YAML
|
189
|
+
mutes:
|
190
|
+
"0:11.0" : "0:12.0"
|
191
|
+
YAML
|
192
|
+
@o.start_thread
|
193
|
+
start_good
|
194
|
+
File.write 'temp.yml', <<-YAML
|
195
|
+
mutes:
|
196
|
+
"0:00.0001" : "0:01.5"
|
197
|
+
YAML
|
198
|
+
@o.status # cause it to refresh from the file
|
199
|
+
sleep 0.1 # blugh avoid race condition since we use notify...
|
200
|
+
start_bad
|
201
|
+
start_good
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should not accept any of the input when you pass it any poor yaml" do
|
205
|
+
write_yaml <<-YAML
|
206
|
+
mutes:
|
207
|
+
a : 08:56.0 # first one there is invalid
|
208
|
+
YAML
|
209
|
+
out = OverLayer.new 'temp.yml'
|
210
|
+
out.all_sequences[:mutes].should be_blank
|
211
|
+
write_yaml <<-YAML
|
212
|
+
mutes:
|
213
|
+
01 : 02
|
214
|
+
YAML
|
215
|
+
out.reload_yaml!
|
216
|
+
out.all_sequences[:mutes].should == [[1,2]]
|
217
|
+
write_yaml <<-YAML
|
218
|
+
mutes:
|
219
|
+
05 : # failure
|
220
|
+
YAML
|
221
|
+
# should have kept the old
|
222
|
+
out.all_sequences[:mutes].should == [[1,2]]
|
223
|
+
end
|
224
|
+
|
225
|
+
it "should not accept any zero start input" do
|
226
|
+
yaml = <<-YAML
|
227
|
+
mutes:
|
228
|
+
0 : 1 # we don't like zeroes...for now at least, as they can mean parsing failure...
|
229
|
+
3 : 4
|
230
|
+
YAML
|
231
|
+
out = OverLayer.translate_yaml yaml
|
232
|
+
out[:mutes].should == [[3,4]]
|
233
|
+
end
|
234
|
+
|
235
|
+
it "should disallow zero or less length intervals" do
|
236
|
+
yaml = <<-YAML
|
237
|
+
mutes:
|
238
|
+
1 : 1
|
239
|
+
YAML
|
240
|
+
out = OverLayer.translate_yaml yaml
|
241
|
+
out[:mutes].should == []
|
242
|
+
end
|
243
|
+
|
244
|
+
|
245
|
+
it "should sort yaml input" do
|
246
|
+
yaml = <<-YAML
|
247
|
+
mutes:
|
248
|
+
3 : 4
|
249
|
+
1 : 2
|
250
|
+
YAML
|
251
|
+
out = OverLayer.translate_yaml yaml
|
252
|
+
out[:mutes].should == [[1,2], [3,4]]
|
253
|
+
end
|
254
|
+
|
255
|
+
it "should handle non quoted style numbers in yaml" do
|
256
|
+
yaml = <<-YAML
|
257
|
+
mutes:
|
258
|
+
08:55 : 08:56.0 # valid, will return large Fixnum's
|
259
|
+
YAML
|
260
|
+
out = OverLayer.translate_yaml yaml
|
261
|
+
out[:mutes].should == [[535, 536]]
|
262
|
+
yaml = <<-YAML
|
263
|
+
mutes:
|
264
|
+
01:08:55 : 01:09:55 # actually valid
|
265
|
+
YAML
|
266
|
+
out = OverLayer.translate_yaml yaml
|
267
|
+
out[:mutes].should == [[4135, 4195]]
|
268
|
+
end
|
269
|
+
|
270
|
+
it "should translate yaml with the two different types in it" do
|
271
|
+
yaml = <<-YAML
|
272
|
+
mutes:
|
273
|
+
"0:02.0" : "0:03.0"
|
274
|
+
blank_outs:
|
275
|
+
"0:02.0" : "0:03.0"
|
276
|
+
YAML
|
277
|
+
out = OverLayer.translate_yaml yaml
|
278
|
+
out[:mutes].should == [[2.0, 3.0]]
|
279
|
+
out[:blank_outs].should == [[2.0, 3.0]]
|
280
|
+
yaml = <<-YAML
|
281
|
+
mutes:
|
282
|
+
"1:02.11" : "1:03.0"
|
283
|
+
YAML
|
284
|
+
out = OverLayer.translate_yaml yaml
|
285
|
+
out[:mutes].first.should == [62.11, 63.0]
|
286
|
+
end
|
287
|
+
|
288
|
+
it "should accept fixnum 56 => 57 style input" do
|
289
|
+
yaml = <<-YAML
|
290
|
+
mutes:
|
291
|
+
"0:02" : "0:03"
|
292
|
+
3 : 4
|
293
|
+
YAML
|
294
|
+
out = OverLayer.translate_yaml yaml
|
295
|
+
out[:mutes].should == [[2.0, 3.0], [3, 4]]
|
296
|
+
end
|
297
|
+
|
298
|
+
it "should accept numbers that are unreasonably large" do
|
299
|
+
yaml = <<-YAML
|
300
|
+
mutes:
|
301
|
+
1000000 : 1000001
|
302
|
+
YAML
|
303
|
+
out = OverLayer.translate_yaml yaml
|
304
|
+
out[:mutes].should == [[1_000_000, 1_000_001]]
|
305
|
+
end
|
306
|
+
|
307
|
+
it "should accept blank yaml" do
|
308
|
+
out = OverLayer.translate_yaml ""
|
309
|
+
out[:mutes].should be_blank
|
310
|
+
end
|
311
|
+
|
312
|
+
it "should not translate symbols"
|
313
|
+
|
314
|
+
it "should translate strings as well as symbols" do
|
315
|
+
yaml = <<-YAML
|
316
|
+
mutes:
|
317
|
+
"1" : "3"
|
318
|
+
YAML
|
319
|
+
out = OverLayer.translate_yaml yaml
|
320
|
+
out[:mutes].should == [[1, 3]]
|
321
|
+
end
|
322
|
+
|
323
|
+
it 'should reject overlapping settings...maybe?'
|
324
|
+
|
325
|
+
it "should allow for 1:01:00.0 (double colon) style yaml input" do
|
326
|
+
write_yaml <<-YAML
|
327
|
+
mutes:
|
328
|
+
"1:00.11" : "1:03.0"
|
329
|
+
YAML
|
330
|
+
@o.start_thread
|
331
|
+
start_good
|
332
|
+
@o.set_seconds 61
|
333
|
+
sleep 0.1 # ruby rox again!
|
334
|
+
start_bad
|
335
|
+
sleep 2
|
336
|
+
start_good
|
337
|
+
end
|
338
|
+
|
339
|
+
it "should be able to handle it when the sync message includes a new timestamp" do
|
340
|
+
@o.start_thread
|
341
|
+
@o.timestamp_changed "1:00:01", 0
|
342
|
+
@o.cur_time.should be > 60*60
|
343
|
+
@o.timestamp_changed "0:00:01", 0
|
344
|
+
@o.cur_time.should be < 60*60
|
345
|
+
end
|
346
|
+
|
347
|
+
it "should handle deltas to input timestamps" do
|
348
|
+
@o.start_thread
|
349
|
+
@o.timestamp_changed "1:00:00", 1
|
350
|
+
@o.cur_time.should be >= 60*60 + 1
|
351
|
+
end
|
352
|
+
|
353
|
+
context "should handle blanks, too" do
|
354
|
+
|
355
|
+
it "should be able to discover next states well" do
|
356
|
+
for type in [:blank_outs, :mutes] do
|
357
|
+
@o = OverLayer.new_raw({type => {2.0 => 4.0}})
|
358
|
+
@o.discover_state(type, 3).should == [2.0, 4.0, true]
|
359
|
+
@o.discover_state(type, 0.5).should == [2.0, 4.0, false]
|
360
|
+
@o.discover_state(type, 5).should == [nil, nil, :done]
|
361
|
+
@o.discover_state(type, 2.0).should == [2.0, 4.0, true]
|
362
|
+
@o.discover_state(type, 4.0).should == [nil, nil, :done]
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
context "with a list of blanks" do
|
367
|
+
|
368
|
+
it "should allow for blanks" do
|
369
|
+
@o = OverLayer.new_raw({:blank_outs => {2.0 => 4.0}})
|
370
|
+
@o.start_thread
|
371
|
+
start_good_blank
|
372
|
+
sleep 1
|
373
|
+
start_good_blank
|
374
|
+
sleep 1.1
|
375
|
+
start_bad_blank
|
376
|
+
sleep 2
|
377
|
+
start_good_blank
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
def at time
|
382
|
+
@o.stub!(:cur_time) {
|
383
|
+
time
|
384
|
+
}
|
385
|
+
yield
|
386
|
+
end
|
387
|
+
|
388
|
+
context "mixed blanks and others" do
|
389
|
+
it "should allow for mixed" do
|
390
|
+
@o = OverLayer.new_raw({:mutes => {2.0 => 3.5}, :blank_outs => {3.0 => 4.0}})
|
391
|
+
at(1.5) do
|
392
|
+
@o.cur_time.should == 1.5
|
393
|
+
@o.get_current_state.should == [false, false, 2.0]
|
394
|
+
end
|
395
|
+
|
396
|
+
at(2.0) do
|
397
|
+
@o.get_current_state.should == [true, false, 3.0]
|
398
|
+
end
|
399
|
+
|
400
|
+
at(3.0) do
|
401
|
+
@o.get_current_state.should == [true, true, 3.5]
|
402
|
+
end
|
403
|
+
|
404
|
+
at(4) do
|
405
|
+
@o.get_current_state.should == [false, false, :done]
|
406
|
+
end
|
407
|
+
|
408
|
+
# now a bit more complex...
|
409
|
+
|
410
|
+
@o = OverLayer.new_raw({:mutes => {2.0 => 3.5, 5 => 6}, :blank_outs => {3.0 => 4.0}})
|
411
|
+
|
412
|
+
at(3.75) do
|
413
|
+
@o.get_current_state.should == [false, true, 4.0]
|
414
|
+
end
|
415
|
+
|
416
|
+
at(5) do
|
417
|
+
@o.get_current_state.should == [true, false, 6]
|
418
|
+
end
|
419
|
+
|
420
|
+
at(6) do
|
421
|
+
@o.get_current_state.should == [false, false, :done]
|
422
|
+
end
|
423
|
+
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
it "should not fail with verbose on, after it's past next states" do
|
428
|
+
at(500_000) do
|
429
|
+
@o.status.should include("138:53:20")
|
430
|
+
@o.status.should include("q") # for quit
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
it "should no longer accept human readable style as starting seconds" do
|
435
|
+
proc { OverLayer.new 'temp.yml', "01:01.5" }.should raise_error(ArgumentError)
|
436
|
+
end
|
437
|
+
|
438
|
+
end
|
439
|
+
|
440
|
+
end
|