content-editing-movie-player 0.38.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (273) hide show
  1. data/.gitmodules +3 -0
  2. data/.rvmrc +1 -0
  3. data/LICENSE.TXT +20 -0
  4. data/README.TXT +225 -0
  5. data/Rakefile +206 -0
  6. data/TODO +740 -0
  7. data/VERSION +1 -0
  8. data/_DO_NOT_RUN_IT_FROM_HERE_DOWNLOAD_THE_RELEASE_ZIP_FROM_SOURCEFORGE_INSTEAD +0 -0
  9. data/bin/sensible-cinema +60 -0
  10. data/bin/sensible-cinema-cli +161 -0
  11. data/business_ideas.txt +21 -0
  12. data/change_log_with_feature_list.txt +952 -0
  13. data/documentation/DOCUMENTATION_README.TXT +44 -0
  14. data/documentation/how_to_get_files_from_dvd.txt +30 -0
  15. data/documentation/is_it_legal_to_copy_dvds.txt +97 -0
  16. data/documentation/troubleshooting.txt +30 -0
  17. data/documentation/upconversion.txt +4 -0
  18. data/experimental_online_player_ocr_readme.txt +45 -0
  19. data/go +1 -0
  20. data/go.bat +2 -0
  21. data/go.sh +1 -0
  22. data/go_ocr_tracker.bat +1 -0
  23. data/goc +1 -0
  24. data/goc.bat +1 -0
  25. data/goc.sh +1 -0
  26. data/gpl-2.0.txt +339 -0
  27. data/gplv3.txt +219 -0
  28. data/history_and_related_works_list.txt +108 -0
  29. data/inventionzy_files/cone.png +0 -0
  30. data/inventionzy_files/md5s.txt +53 -0
  31. data/inventionzy_files/play_with_inserted_scene.bat +8 -0
  32. data/inventionzy_files/play_with_overlay.bat +24 -0
  33. data/inventionzy_files/transcript_mute_vlc.txt +117 -0
  34. data/legal_draft +23 -0
  35. data/lib/add_any_bundled_gems_to_load_path.rb +32 -0
  36. data/lib/auto_window_finder.rb +41 -0
  37. data/lib/blanker.rb +104 -0
  38. data/lib/check_installed_mac.rb +34 -0
  39. data/lib/convert_thirty_fps.rb +20 -0
  40. data/lib/edl_parser.rb +387 -0
  41. data/lib/eight_three.rb +28 -0
  42. data/lib/extract/dumpstream.bat +1 -0
  43. data/lib/extract/get_init.bat +3 -0
  44. data/lib/extract/pause_early.rb +13 -0
  45. data/lib/fake_blanker.rb +35 -0
  46. data/lib/frame_accurate.rb +3 -0
  47. data/lib/gui/base.rb +748 -0
  48. data/lib/gui/create-file.rb +24 -0
  49. data/lib/gui/create.rb +581 -0
  50. data/lib/gui/dependencies.rb +219 -0
  51. data/lib/gui/normal.rb +123 -0
  52. data/lib/gui/upconvert.rb +284 -0
  53. data/lib/keyboard_input.rb +60 -0
  54. data/lib/media_info_parser.rb +27 -0
  55. data/lib/mouse_forever.rb +19 -0
  56. data/lib/movie_hasher.rb +27 -0
  57. data/lib/mplayer_edl.rb +42 -0
  58. data/lib/muter.rb +87 -0
  59. data/lib/ocr.rb +125 -0
  60. data/lib/ocr_seed/netflix_b9.bmp +0 -0
  61. data/lib/overlayer.rb +373 -0
  62. data/lib/screen_tracker.rb +269 -0
  63. data/lib/subtitle_profanity_finder.rb +294 -0
  64. data/lib/vlc_programmer.rb +112 -0
  65. data/lib/zoom_player_max_edl.rb +50 -0
  66. data/never_do +40 -0
  67. data/notes_for_potential_developers.txt +46 -0
  68. data/preamble +17 -0
  69. data/roadmap_possibilities +12 -0
  70. data/spec/arse.srt +41 -0
  71. data/spec/auto_window_finder.spec.rb +65 -0
  72. data/spec/bad_beginning.srt +3778 -0
  73. data/spec/blanker.spec.rb +60 -0
  74. data/spec/common.rb +81 -0
  75. data/spec/convert_image.rb +25 -0
  76. data/spec/deity_end.srt +11 -0
  77. data/spec/dragon.srt +34 -0
  78. data/spec/edl_parser.spec.rb +270 -0
  79. data/spec/frame_accurate.spec.rb +71 -0
  80. data/spec/keyboard_input.spec.rb +73 -0
  81. data/spec/media_info_parser.spec.rb +29 -0
  82. data/spec/mplayer_edl.spec.rb +100 -0
  83. data/spec/muter.spec.rb +50 -0
  84. data/spec/notes +4996 -0
  85. data/spec/ocr.spec.rb +119 -0
  86. data/spec/overlayer.spec.rb +440 -0
  87. data/spec/screen_tracker.spec.rb +318 -0
  88. data/spec/sensible_cinema_gui.spec.rb +452 -0
  89. data/spec/subtitle_profanity_finder.spec.rb +224 -0
  90. data/spec/test_yaml.yml +4 -0
  91. data/spec/tsmuxer.output +33 -0
  92. data/spec/vlc_programmer.spec.rb +124 -0
  93. data/spec/youtube_edl.spec.rb +28 -0
  94. data/spec/zoom_player_max_edl.spec.rb +29 -0
  95. data/template_bats/README_DISTRO.TXT +8 -0
  96. data/template_bats/RUN SENSIBLE CINEMA CLICK HERE WINDOWS.bat +25 -0
  97. data/template_bats/_DO_NOT_RUN_IT_FROM_HERE_DOWNLOAD_THE_RELEASE_ZIP_FROM_SOURCEFORGE_INSTEAD +0 -0
  98. data/template_bats/mac/RUN SENSIBLE CINEMA CLICK HERE.command +5 -0
  99. data/template_bats/mac/advanced--create or edit sensible cinema edit list files.command +3 -0
  100. data/template_bats/mac/advanced--run-upconverting-video-player.command +3 -0
  101. data/template_bats/pc/advanced--create or edit sensible cinema edit list files.bat +2 -0
  102. data/template_bats/pc/advanced--run-upconverting-video-player.bat +2 -0
  103. data/todo.build_library.txt +11 -0
  104. data/todo.inventionzy.txt +162 -0
  105. data/todo.open_edl_list_org.txt +169 -0
  106. data/todo.propaganda +107 -0
  107. data/todo.subtitle +17 -0
  108. data/todo.upconvert +53 -0
  109. data/upconvert.bat +1 -0
  110. data/upconvert_from_screen/go_upscaling.bat +12 -0
  111. data/upconvert_from_screen/go_upscaling_works +0 -0
  112. data/upconvert_from_screen/old/latest2/combine_video.avs +23 -0
  113. data/upconvert_from_screen/old/latest2/go_no_upscaling.bat +1 -0
  114. data/upconvert_from_screen/old/latest2/go_upscaling.bat +12 -0
  115. data/upconvert_from_screen/old/latest2/push2.GRF +0 -0
  116. data/upconvert_from_screen/old/latest2/push3.grf +0 -0
  117. data/upconvert_from_screen/old/latest2/setup_capture_coords.rb +27 -0
  118. data/upconvert_from_screen/old/latest2/setup_directshow_filter_params.rb +29 -0
  119. data/upconvert_from_screen/old/latest2/upconvert_from_screen_me2.avs +19 -0
  120. data/upconvert_from_screen/old/latest_now_possibly_oudated/push2.GRF +0 -0
  121. data/upconvert_from_screen/old/latest_now_possibly_oudated/upconvert_from_screen_me2.avs +18 -0
  122. data/upconvert_from_screen/old/position_window.png +0 -0
  123. data/upconvert_from_screen/old/push_source_desktop.GRF +0 -0
  124. data/upconvert_from_screen/old/record_screen/record.bat +2 -0
  125. data/upconvert_from_screen/old/upconvert_from_screen.avs +21 -0
  126. data/upconvert_from_screen/old/upconvert_from_screen_me.avs +21 -0
  127. data/upconvert_from_screen/old/upconvert_from_screen_me2.avs +3 -0
  128. data/upconvert_from_screen/old/upconvert_from_screen_me_push_source.avs +3 -0
  129. data/upconvert_from_screen/old/uscreen.GRF +0 -0
  130. data/upconvert_from_screen/old/uscreen_me.GRF +0 -0
  131. data/upconvert_from_screen/push3.grf +0 -0
  132. data/upconvert_from_screen/upconvert_from_screen_me2.avs +19 -0
  133. data/vendor/movie-content-editor-read-only/.metadata/.lock +0 -0
  134. data/vendor/movie-content-editor-read-only/.metadata/.mylyn/.tasks.xml.zip +0 -0
  135. data/vendor/movie-content-editor-read-only/.metadata/.mylyn/repositories.xml.zip +0 -0
  136. data/vendor/movie-content-editor-read-only/.metadata/.mylyn/tasks.xml.zip +0 -0
  137. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version +1 -0
  138. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index +0 -0
  139. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version +1 -0
  140. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.resources/.root/2.tree +0 -0
  141. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources +0 -0
  142. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs +3 -0
  143. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs +14 -0
  144. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs +3 -0
  145. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs +5 -0
  146. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs +3 -0
  147. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache +0 -0
  148. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat +0 -0
  149. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml +2 -0
  150. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml +2 -0
  151. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml +10 -0
  152. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml +11 -0
  153. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.ui.intro/dialog_settings.xml +4 -0
  154. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml +10 -0
  155. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml +232 -0
  156. data/vendor/movie-content-editor-read-only/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml +4 -0
  157. data/vendor/movie-content-editor-read-only/.metadata/version.ini +1 -0
  158. data/vendor/movie-content-editor-read-only/.project +17 -0
  159. data/vendor/movie-content-editor-read-only/.pydevproject +11 -0
  160. data/vendor/movie-content-editor-read-only/.settings/org.eclipse.core.resources.prefs +6 -0
  161. data/vendor/movie-content-editor-read-only/SubIt.py +171 -0
  162. data/vendor/movie-content-editor-read-only/VLCMacVideo.py +257 -0
  163. data/vendor/movie-content-editor-read-only/VideoMac.ui +102 -0
  164. data/vendor/movie-content-editor-read-only/badwords.txt +4 -0
  165. data/vendor/movie-content-editor-read-only/blank.srt +4 -0
  166. data/vendor/movie-content-editor-read-only/edit.py +197 -0
  167. data/vendor/movie-content-editor-read-only/mergeCommands.py +73 -0
  168. data/vendor/movie-content-editor-read-only/mute.txt +5 -0
  169. data/vendor/movie-content-editor-read-only/panda.srt +4235 -0
  170. data/vendor/movie-content-editor-read-only/panda_custom.txt +3 -0
  171. data/vendor/movie-content-editor-read-only/panda_edit.srt +4235 -0
  172. data/vendor/movie-content-editor-read-only/subtitle.py +90 -0
  173. data/vendor/movie-content-editor-read-only/vlc.py +5579 -0
  174. data/vendor/movie-content-editor-read-only/vlcwidget.py +154 -0
  175. data/vendor/mplayer_patches/how_to_doze.bat +6 -0
  176. data/vendor/mplayer_patches/port_dir/PortIndex.quick +2 -0
  177. data/vendor/mplayer_patches/port_dir/how_to +20 -0
  178. data/vendor/mplayer_patches/port_dir/multimedia/mplayer-edl/Portfile +285 -0
  179. data/vendor/mplayer_patches/port_dir/multimedia/mplayer-edl/files/configure.x11.patch +20 -0
  180. data/vendor/mplayer_patches/port_dir/multimedia/mplayer-edl/files/llvm-gcc-workaround.patch +11 -0
  181. data/vendor/mplayer_patches/port_dir/multimedia/rdp-projects/Portfile +43 -0
  182. data/vendor/mplayer_patches/port_dir_is_for_mac +0 -0
  183. data/www/content_editor.html +92 -0
  184. data/www/index.html +47 -0
  185. data/www/upconverting_movie_player.html +62 -0
  186. data/www/video reel.jpg +0 -0
  187. data/www/youtube_edl/.htaccess +44 -0
  188. data/www/youtube_edl/control_youtube.rhtml +141 -0
  189. data/www/youtube_edl/dispatch.fcgi +25 -0
  190. data/www/youtube_edl/render_edited.rb +25 -0
  191. data/www/youtube_edl/server_this_dir.rb +6 -0
  192. data/www/youtube_edl/todo +23 -0
  193. data/www/zoomplayer_max.png +0 -0
  194. data/zamples/edit_decision_lists/dvds/Harry Potter 2 chamber of secrets.txt +22 -0
  195. data/zamples/edit_decision_lists/dvds/aa_example_delete_list_that_has_no_cuts_in_it.txt +10 -0
  196. data/zamples/edit_decision_lists/dvds/aladdin.txt +30 -0
  197. data/zamples/edit_decision_lists/dvds/bambi.txt +17 -0
  198. data/zamples/edit_decision_lists/dvds/big_buck_bunny_dvd.txt +23 -0
  199. data/zamples/edit_decision_lists/dvds/bob the builder pets in a pickle.txt +10 -0
  200. data/zamples/edit_decision_lists/dvds/bobs_big_plan.txt +10 -0
  201. data/zamples/edit_decision_lists/dvds/cars_2.txt +26 -0
  202. data/zamples/edit_decision_lists/dvds/cars_disney.txt +40 -0
  203. data/zamples/edit_decision_lists/dvds/condor_man_widescreen.txt +22 -0
  204. data/zamples/edit_decision_lists/dvds/cool runnings.txt +53 -0
  205. data/zamples/edit_decision_lists/dvds/court_jester.txt +24 -0
  206. data/zamples/edit_decision_lists/dvds/edls_being_edited/amazing_grace.txt +49 -0
  207. data/zamples/edit_decision_lists/dvds/edls_being_edited/father_goose.txt +41 -0
  208. data/zamples/edit_decision_lists/dvds/edls_being_edited/harry_potter_and_the_goblet_of_fire.txt +45 -0
  209. data/zamples/edit_decision_lists/dvds/edls_being_edited/hugo.txt +31 -0
  210. data/zamples/edit_decision_lists/dvds/edls_being_edited/making_marriage_work.txt +15 -0
  211. data/zamples/edit_decision_lists/dvds/edls_being_edited/national_treasure.txt +26 -0
  212. data/zamples/edit_decision_lists/dvds/edls_being_edited/percy_jackson_lightening_thief.txt +40 -0
  213. data/zamples/edit_decision_lists/dvds/edls_being_edited/percy_jackson_lightening_thief_mute_scary.txt +23 -0
  214. data/zamples/edit_decision_lists/dvds/edls_being_edited/prince_of_egypt.txt +28 -0
  215. data/zamples/edit_decision_lists/dvds/edls_being_edited/puss_in_boots.txt +33 -0
  216. data/zamples/edit_decision_lists/dvds/edls_being_edited/ratatouille.txt +35 -0
  217. data/zamples/edit_decision_lists/dvds/edls_being_edited/rio.txt +24 -0
  218. data/zamples/edit_decision_lists/dvds/edls_being_edited/test_delete_list_for_experimenting_with.txt +10 -0
  219. data/zamples/edit_decision_lists/dvds/edls_being_edited/the_explorers.txt +49 -0
  220. data/zamples/edit_decision_lists/dvds/finding_neverland.txt +32 -0
  221. data/zamples/edit_decision_lists/dvds/flight_of_the_navigator.txt +40 -0
  222. data/zamples/edit_decision_lists/dvds/happiest baby on the block.txt +9 -0
  223. data/zamples/edit_decision_lists/dvds/harry_potter_3_prisoner_of_azkaban.txt +37 -0
  224. data/zamples/edit_decision_lists/dvds/hitchhiker's_guide_to_the_galaxy.txt +32 -0
  225. data/zamples/edit_decision_lists/dvds/how_to_train_your_dragon.txt +25 -0
  226. data/zamples/edit_decision_lists/dvds/if_a_man_answers.txt +43 -0
  227. data/zamples/edit_decision_lists/dvds/innerspace.txt +77 -0
  228. data/zamples/edit_decision_lists/dvds/iq.txt +32 -0
  229. data/zamples/edit_decision_lists/dvds/king_of_kings.txt +28 -0
  230. data/zamples/edit_decision_lists/dvds/kung_fu_panda_1.txt +17 -0
  231. data/zamples/edit_decision_lists/dvds/legend_of_the_guardians_the_owls_of_gahoole.txt +18 -0
  232. data/zamples/edit_decision_lists/dvds/monsters_vs_aliens.txt +41 -0
  233. data/zamples/edit_decision_lists/dvds/muppet_treasure_island.txt +21 -0
  234. data/zamples/edit_decision_lists/dvds/nanny_mcphee.txt +31 -0
  235. data/zamples/edit_decision_lists/dvds/narnia_voyage_of_the_dawn_treader.txt +16 -0
  236. data/zamples/edit_decision_lists/dvds/pack_jackson_wedding_2007-03-03.txt +31 -0
  237. data/zamples/edit_decision_lists/dvds/peter_pan.txt +29 -0
  238. data/zamples/edit_decision_lists/dvds/remember_the_titans.txt +35 -0
  239. data/zamples/edit_decision_lists/dvds/sintel_open_source_blender_ntsc_dvd.txt +22 -0
  240. data/zamples/edit_decision_lists/dvds/snow_white_and_the_7_dwarfs_1937.txt +19 -0
  241. data/zamples/edit_decision_lists/dvds/speed_racer.txt +47 -0
  242. data/zamples/edit_decision_lists/dvds/tangled.txt +21 -0
  243. data/zamples/edit_decision_lists/dvds/tron_legacy.txt +29 -0
  244. data/zamples/edit_decision_lists/dvds/turn_around_alma_younger.txt +17 -0
  245. data/zamples/edit_decision_lists/files/conference_music_video.txt +10 -0
  246. data/zamples/edit_decision_lists/netflix_instant/avatar-last-air-bender-movie.txt +13 -0
  247. data/zamples/edit_decision_lists/netflix_instant/avatar-last-airbender-series.txt +1 -0
  248. data/zamples/edit_decision_lists/netflix_instant/greatest_story_ever_told_netflix.txt +10 -0
  249. data/zamples/edit_decision_lists/netflix_instant/wrinkle-in-time.txt +23 -0
  250. data/zamples/edit_decision_lists/notes_on_movies_without_edls_yet/tron.txt +10 -0
  251. data/zamples/edit_decision_lists/old_not_yet_updated/dvds/White Christmas.txt +15 -0
  252. data/zamples/edit_decision_lists/old_not_yet_updated/dvds/all_dogs_go_to_heaven.txt +9 -0
  253. data/zamples/edit_decision_lists/old_not_yet_updated/dvds/cars_disney.txt +24 -0
  254. data/zamples/edit_decision_lists/old_not_yet_updated/dvds/happy_feet.txt +12 -0
  255. data/zamples/edit_decision_lists/old_not_yet_updated/dvds/labyrinth.txt +17 -0
  256. data/zamples/edit_decision_lists/old_not_yet_updated/dvds/star_trek_generations_hulu.txt +8 -0
  257. data/zamples/edit_decision_lists/old_not_yet_updated/example_edit_decision_list.txt +14 -0
  258. data/zamples/edit_decision_lists/old_not_yet_updated/youtube/gummy_bear_song_youtube.txt +9 -0
  259. data/zamples/edit_decision_lists/youtube/demo_mutes.txt +12 -0
  260. data/zamples/edit_decision_lists/youtube/nuki_song_youtube.txt +14 -0
  261. data/zamples/edit_decision_lists/youtube/nuki_song_youtube_pointer.txt +3 -0
  262. data/zamples/players/how_to_create_more_players.txt +24 -0
  263. data/zamples/players/hulu/total_length_over_an_hour.txt +25 -0
  264. data/zamples/players/netflix/netflix_firefox_non_maximized.txt +25 -0
  265. data/zamples/players/vlc/full_screened_total_length_over_an_hour.txt +27 -0
  266. data/zamples/players/vlc/windowed_total_length_over_an_hour.txt +26 -0
  267. data/zamples/players/vlc/windowed_total_length_under_an_hour.txt +22 -0
  268. data/zamples/players/youtube/full_screened_1024x768.txt +20 -0
  269. data/zamples/players/youtube/full_screened_1152x864.txt +20 -0
  270. data/zamples/players/youtube/full_screened_1680x1050.txt +20 -0
  271. data/zamples/players/youtube/normal_in_youtube.com.chrome.txt +23 -0
  272. data/zamples/players/youtube/note_these_assume_less_than_10_minutes_length.txt +2 -0
  273. metadata +483 -0
@@ -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