sensible-cinema 0.14.4 → 0.14.5
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +4 -0
- data/LICENSE +23 -3
- data/README +19 -9
- data/Rakefile +66 -3
- data/TODO +29 -52
- data/VERSION +1 -1
- data/bin/sensible-cinema +49 -37
- data/bin/sensible-cinema-cli +11 -11
- data/lib/ocr.rb +10 -2
- data/lib/overlayer.rb +1 -1
- data/lib/screen_tracker.rb +7 -13
- data/lib/swing_helpers.rb +11 -0
- data/lib/vlc_programmer.rb +1 -1
- data/run_sensible_cinema.bat +5 -0
- data/sensible-cinema.gemspec +130 -147
- data/spec/swing_helpers.spec.rb +11 -2
- data/spec/vlc_programmer.spec.rb +1 -1
- data/todo_if_need_speed +6 -0
- data/zamples/{scene_lists → edit_decision_lists}/category descriptions.txt +0 -0
- data/zamples/{scene_lists → edit_decision_lists}/dvds/White Christmas.txt +0 -0
- data/zamples/{scene_lists → edit_decision_lists}/dvds/all_dogs_go_to_heaven_dvd.txt +1 -1
- data/zamples/{scene_lists → edit_decision_lists}/dvds/bobs_big_plan.txt +4 -1
- data/zamples/{scene_lists → edit_decision_lists}/dvds/cars_disney.txt +0 -0
- data/zamples/{scene_lists → edit_decision_lists}/dvds/happy_feet_dvd.txt +0 -0
- data/zamples/{scene_lists → edit_decision_lists}/dvds/labyrinth.txt +0 -0
- data/zamples/{scene_lists → edit_decision_lists}/dvds/making marriage work.txt +0 -0
- data/zamples/{scene_lists/example_scene_descriptions_list.txt → edit_decision_lists/example_edit_decision_list.txt} +0 -0
- data/zamples/{scene_lists → edit_decision_lists}/star_trek_generations_hulu.txt +0 -0
- data/zamples/{scene_lists → edit_decision_lists}/youtube/gummy_bear_song_youtube.txt +0 -0
- data/zamples/{scene_lists → edit_decision_lists}/youtube/nuki_song_youtube.txt +0 -0
- data/zamples/players/how_to_create_more_players.txt +1 -1
- metadata +287 -282
- data/vendor/imagemagick/CORE_RL_Magick++_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_bzlib_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_jbig_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_jp2_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_jpeg_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_lcms_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_libxml_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_magick_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_png_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_tiff_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_ttf_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_wand_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_xlib_.dll +0 -0
- data/vendor/imagemagick/CORE_RL_zlib_.dll +0 -0
- data/vendor/imagemagick/X11.dll +0 -0
- data/vendor/imagemagick/Xext.dll +0 -0
- data/vendor/imagemagick/atl90.dll +0 -0
- data/vendor/imagemagick/convert.exe +0 -0
- data/vendor/imagemagick/identify.exe +0 -0
- data/vendor/imagemagick/mfc90.dll +0 -0
- data/vendor/imagemagick/msvcp90.dll +0 -0
- data/vendor/imagemagick/msvcr90.dll +0 -0
- data/vendor/imagemagick/vcomp90.dll +0 -0
data/ChangeLog
CHANGED
data/LICENSE
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
All files released under the GPLv3 license [1] unless otherwise specified. Ping me if you
|
1
|
+
All files released under the GPLv3 license [1] unless otherwise specified. Ping me if you want this changed.
|
2
2
|
|
3
|
-
May contain some 3rd party libraries under their own (separate, open source)
|
3
|
+
May contain some 3rd party libraries under their own (separate, open source) licenses.
|
4
4
|
|
5
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]).
|
@@ -16,4 +16,24 @@ http://betterlogic.com/roger/?p=2618
|
|
16
16
|
Enjoy!
|
17
17
|
|
18
18
|
[1] http://www.gnu.org/licenses/gpl.html, also gplv3 file.
|
19
|
-
[2] http://www.videolan.org/support/faq.html
|
19
|
+
[2] http://www.videolan.org/support/faq.html
|
20
|
+
|
21
|
+
|
22
|
+
honest about DMCA (we don't distribute the cracker, we don't redistribute, don't perform any acts, etc.)
|
23
|
+
if you burn you'll eventually be using a DMCA compatible player :P
|
24
|
+
long list of players...we're not alone :)
|
25
|
+
the authors of the program might not be liable for damages. We don't feel dishonest about it, as long as
|
26
|
+
we own the DVD and have it with us when we watch the edited version.
|
27
|
+
|
28
|
+
|
29
|
+
not more unethical than ripping your DVD collection to hard drive so you can keep your DVD's all in one
|
30
|
+
place and don't have to worry about losing them. Then you edit them manually to remove cruft, and watch them
|
31
|
+
from there.
|
32
|
+
|
33
|
+
note that you are watching it using only bits and pieces of the original, similar to said bill. And the
|
34
|
+
authors of the program might not be cupable of copyright infringement themselves, since they distribute no infringed materials.
|
35
|
+
|
36
|
+
Not responsible for your actions. Don't redistribute. "You run the risk on your own"
|
37
|
+
"should the courts someday rule..." If DVD next to me...
|
38
|
+
|
39
|
+
fair use may apply
|
data/README
CHANGED
@@ -1,5 +1,10 @@
|
|
1
|
-
Sensible-cinema is a program that allows you to do pre-programmed
|
2
|
-
or "bleep out" scenes)
|
1
|
+
Sensible-cinema is a program that allows you to do pre-programmed edit decision lists (i.e. "mute out"
|
2
|
+
or "bleep out" scenes) for DVD's.
|
3
|
+
An experimental player also works on arbitrary media players like netflix online, vlc, hulu, etc.
|
4
|
+
|
5
|
+
Note that this README is outdated. Currently just run sensible-cinema in jruby and the GUI will guide you :)
|
6
|
+
|
7
|
+
== old Readme ==
|
3
8
|
|
4
9
|
Currently it takes as input a list of "skippable" scenes, and a player description.
|
5
10
|
It then tracks whichever player you are using, and mutes or blanks out the system appropriately,
|
@@ -39,7 +44,7 @@ Next install the gem by either opening up the command window or hitting windows+
|
|
39
44
|
It could theoretically be ported to MRI 1.9.2, if anybody wanted to do so.
|
40
45
|
Also if anybody would be interested in porting this to Linux I'd be happy to collaborate.
|
41
46
|
|
42
|
-
You can test that it's installed by running it (see above) and selecting the "
|
47
|
+
You can test that it's installed by running it (see above) and selecting the "example_edit_decision_list.txt", and
|
43
48
|
choosing the hulu player.
|
44
49
|
|
45
50
|
It will proceed do a few "demo" mutes and blank outs.
|
@@ -57,7 +62,7 @@ blank_outs:
|
|
57
62
|
|
58
63
|
Here's one with more detail
|
59
64
|
|
60
|
-
http://github.com/rdp/sensible-cinema/blob/master/zamples/
|
65
|
+
http://github.com/rdp/sensible-cinema/blob/master/zamples/edit_decision_lists/example_edit_decision_list.yml
|
61
66
|
|
62
67
|
Basically your job is to save an appropriate file like that somewhere,
|
63
68
|
then start sensible-cinema and instruct it to use your new file.
|
@@ -70,9 +75,9 @@ So here is a way to create your scene descriptions file.
|
|
70
75
|
First create a new file
|
71
76
|
|
72
77
|
The easiest way to do this is to start sensible-cinema, then instead of choosing an existing file,
|
73
|
-
"right click" on the existing file "
|
78
|
+
"right click" on the existing file "example_edit_decision_list.txt" and choose "Copy"
|
74
79
|
now right click below the list of files and choose "paste"
|
75
|
-
This will create the file "
|
80
|
+
This will create the file "example_edit_decision_list Copy.txt"
|
76
81
|
Right click on it, choose rename, and give it a better name.
|
77
82
|
Now open it.
|
78
83
|
You can make changes to this file *on the fly* while the player is still playing. It will notice
|
@@ -131,7 +136,7 @@ A. This enables your player to keep its on-screen time tracker, which in turn al
|
|
131
136
|
You could specify the scene descriptions list and player list on the command-line, if you don't want to have
|
132
137
|
to pick them each time, like:
|
133
138
|
|
134
|
-
C:\> jruby -S sensible-cinema
|
139
|
+
C:\> jruby -S sensible-cinema edit_decision_list.yml player_description.yml
|
135
140
|
|
136
141
|
Also if you specify "test" for the scene descriptions file, it will pause 4s, take a snapshot of the player, then exit.
|
137
142
|
You can also specify -v or -t if you want to enable more verbose (chatty) output.
|
@@ -158,18 +163,23 @@ The concept isn't too novel. Some examples:
|
|
158
163
|
Clean Flicks
|
159
164
|
http://en.wikipedia.org/wiki/Linear_video_editing
|
160
165
|
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). Sometimes it even lists the time signatures for events (ex: "Labyrinth" http://www.imdb.com/title/tt0091369/parentalguide) which you could use to translate into a sensible-cinema compatible list.
|
161
|
-
Edited "
|
166
|
+
Edited "airplane edit" style movies.
|
167
|
+
Normal movies versus "directors cut unedited" movies (one is sometimes preferable)
|
162
168
|
http://en.wikipedia.org/wiki/Edit_decision_list (it's a linear editing tool, after all--so see the vast list of those)
|
163
169
|
http://www.oreillynet.com/sysadmin/blog/2005/06/make_your_own_phantom_edit_wit.html (mplayer has had this ability for awhile).
|
164
170
|
http://clearplay.com commercial (tracks DVD's while they play--closed source, costs money, no user contribution possible), and only for DVD's (uses its own DVD-player in its current incantation).
|
165
171
|
http://forum.bsplayer.com/feature-requests-feedback-suggestions/7157-chapter-playlist-scene-cut-3.html
|
166
|
-
http://www.inmatrix.com
|
172
|
+
http://www.inmatrix.com "scene cut editor" of the zoom player
|
167
173
|
http://wiki.xbmc.org/?title=EDL_(commercial_skipping)_and_SceneMarker_support (XBMC's scene cut support--also contains links to some other editors)
|
174
|
+
htp://dvdshrink.info "Re-author" mode: to make "movie-only" backups, compilations, combine "flippers",.... DvdShrink has always had the ability to "crop or cut parts of a title" etc.
|
175
|
+
The VCR and the record button, coupled with the pause+rewind button (to edit out unwanted content).
|
168
176
|
http://code.google.com/p/movie-content-editor (written in Python, controls VLC based on captions and scene lists)
|
169
177
|
http://www.imdb.com/swiki/special?ParentalGuideHelp (search for "scene description")
|
170
178
|
http://www.mythtv.org/wiki/Removing_Commercials
|
171
179
|
The remote control with the pause, mute, stop, fast forward, and play buttons, along with previous knowledge of scene locations
|
172
180
|
The scissors and old VHS tapes (Clean Flicks' origin, BTW).
|
181
|
+
Windows Movie Maker allows for users to cut and copy scenes of movies to their heart's content.
|
182
|
+
http://forum.videolan.org/viewtopic.php?f=7&t=56998 VLC Media Player can do it with playlists for quite awhile
|
173
183
|
|
174
184
|
== Feedback ==
|
175
185
|
|
data/Rakefile
CHANGED
@@ -9,12 +9,13 @@ Jeweler::Tasks.new do |s|
|
|
9
9
|
s.add_dependency 'sane', '>= 0.22.0'
|
10
10
|
s.add_dependency 'rdp-win32screenshot', '>= 0.0.7.3'
|
11
11
|
s.add_dependency 'mini_magick', '>= 3.1' # for ocr...
|
12
|
+
s.add_dependency 'whichr', '>= 0.3.6'
|
12
13
|
s.add_dependency 'jruby-win32ole'
|
13
14
|
s.add_dependency 'rdp-ruby-wmi'
|
14
15
|
s.add_dependency 'ffi' # mouse, etc.
|
15
16
|
s.add_development_dependency 'rspec' # prefer rspec 2 I guess...
|
16
17
|
s.add_development_dependency 'jeweler'
|
17
|
-
s.add_development_dependency 'hitimes' # now jruby compat
|
18
|
+
s.add_development_dependency 'hitimes' # now jruby compat!
|
18
19
|
s.extensions = ["ext/mkrf_conf.rb"]
|
19
20
|
end
|
20
21
|
|
@@ -37,7 +38,69 @@ task 'spec' do
|
|
37
38
|
|
38
39
|
end
|
39
40
|
|
40
|
-
|
41
|
+
def get_transitive_dependencies dependencies
|
42
|
+
new_dependencies = []
|
43
|
+
dependencies.each{|d|
|
44
|
+
gem d.name # make sure it's loaded so that it'll be in Gem.loaded_specs
|
45
|
+
dependency_spec = Gem.loaded_specs.select{|name, spec| name == d.name}[0][1]
|
46
|
+
transitive_deps = dependency_spec.runtime_dependencies
|
47
|
+
new_dependencies << transitive_deps
|
48
|
+
}
|
49
|
+
new_dependencies.flatten
|
50
|
+
end
|
51
|
+
|
52
|
+
desc 'collect binary and gem deps for distribution'
|
41
53
|
task 'bundle_dependencies' => 'gemspec' do
|
54
|
+
require 'whichr'
|
55
|
+
require 'fileutils'
|
56
|
+
require 'net/http'
|
57
|
+
|
42
58
|
spec = eval File.read('sensible-cinema.gemspec')
|
43
|
-
|
59
|
+
dependencies = spec.runtime_dependencies
|
60
|
+
dependencies = dependencies + get_transitive_dependencies(dependencies)
|
61
|
+
Gem.loaded_specs.select{|name, spec| name == 'os'}
|
62
|
+
FileUtils.rm_rf 'vendor/cache'
|
63
|
+
Dir.mkdir 'vendor/cache'
|
64
|
+
Dir.chdir 'vendor/cache' do
|
65
|
+
dependencies.each{|d|
|
66
|
+
system("gem unpack #{d.name}")
|
67
|
+
}
|
68
|
+
# add imagemagick
|
69
|
+
Dir.mkdir 'imagemagick'
|
70
|
+
im_dir = RubyWhich.new.which('identify').select{|dir| dir =~ /ImageMagick/}[0]
|
71
|
+
# "d:\\installs\\ImageMagick-6.6.2-Q16\\identify.EXE",
|
72
|
+
Dir["#{File.dirname im_dir}/*"].each{|file|
|
73
|
+
FileUtils.cp(file, 'imagemagick') rescue nil # some fail for some odd reason
|
74
|
+
}
|
75
|
+
|
76
|
+
# jruby complete .jar file
|
77
|
+
Net::HTTP.start("jruby.org.s3.amazonaws.com") { |http|
|
78
|
+
resp = http.get("/downloads/1.5.5/jruby-complete-1.5.5.jar")
|
79
|
+
open("jruby-complete-1.5.5.jar", "wb") { |file|
|
80
|
+
file.write(resp.body)
|
81
|
+
}
|
82
|
+
}
|
83
|
+
# create a shunt win32ole file, so that require 'win32ole' will work.
|
84
|
+
Dir.mkdir 'lib'
|
85
|
+
File.write('lib/win32ole.rb', 'require "jruby-win32ole"')
|
86
|
+
|
87
|
+
end # chdir
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
desc 'create distro zippable file'
|
92
|
+
task 'create_distro_dir' do
|
93
|
+
raise 'need bundle_dependencies first' unless File.directory? 'vendor/cache'
|
94
|
+
require 'fileutils'
|
95
|
+
spec = eval File.read('sensible-cinema.gemspec')
|
96
|
+
require 'ruby-debug'
|
97
|
+
#debugger
|
98
|
+
dir_out = spec.name + "-" + spec.version.version + '/sensible-cinema'
|
99
|
+
FileUtils.rm_rf dir_out + '/..' # in case it exists
|
100
|
+
existing = Dir['*']
|
101
|
+
FileUtils.mkdir_p dir_out
|
102
|
+
FileUtils.cp_r(existing, dir_out)
|
103
|
+
# this one belongs in the trunk
|
104
|
+
FileUtils.cp("#{dir_out}/run_sensible_cinema.bat", "#{dir_out}/..")
|
105
|
+
p 'created ' + dir_out
|
106
|
+
end
|
data/TODO
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
== slightly lower than that ==
|
13
13
|
|
14
14
|
auto-select EDL
|
15
|
+
can even tell them a button "play movie x" or what not, has been detected
|
15
16
|
|
16
17
|
can parse IMDB (require they put in the URL by hand fer now)
|
17
18
|
add stuffs to imdb hmmm
|
@@ -29,24 +30,19 @@
|
|
29
30
|
can lop off sections to save space (?)
|
30
31
|
can burn the extra sections, too?
|
31
32
|
easy editor for this style of edit
|
32
|
-
split the two projects cleanly (project, distribution)
|
33
|
+
split the two projects loosely, then cleanly (project, distribution)
|
33
34
|
partner (Jon, Karlie if interested...give beta)
|
34
35
|
survey/beta release
|
35
36
|
a certified clean list (?)
|
37
|
+
better playlist names, like with the DVD title in there :)
|
36
38
|
|
37
|
-
== DVD backlog (unordered) ==
|
39
|
+
== DVD monetary backlog (unordered) ==
|
38
40
|
|
39
41
|
some way to choose between x,y,z when auto-select sees several
|
40
42
|
careful phrasing "if you can't afford it..."
|
41
43
|
authorize instead of paypal?
|
42
|
-
honest about DMCA (we don't distribute the cracker, we don't redistribute, don't perform any acts, etc.)
|
43
|
-
if you burn you'll eventually be using a DMCA compatible player :P
|
44
|
-
long list of players...we're not alone :)
|
45
|
-
one part is probably not against copyright
|
46
|
-
the authors of the program might not be liable for damages. We don't feel dishonest about it, as long as
|
47
|
-
we own the DVD and have it with us when we watch the edited version.
|
48
44
|
blu-ray support somehow (real-time? rip?)
|
49
|
-
|
45
|
+
legal shtuff (LICENSE)
|
50
46
|
some type of one click installer that can setup the registry...
|
51
47
|
auto-assignment of EDL's to media:
|
52
48
|
auto-play option for DVD's (auto-start?)
|
@@ -55,6 +51,12 @@ auto-assignment of EDL's to media:
|
|
55
51
|
DVD's (right click on DVD player, play with SC?)
|
56
52
|
a real website (github-y?)
|
57
53
|
instructions on how to do their own (private) or do one and submit it (public), or email their friends :P
|
54
|
+
double buffering hard drive/copying might speed things, if your HD is fast.
|
55
|
+
personalized copier might be faster than the "type" command.
|
56
|
+
merge with preferences
|
57
|
+
install VLC from .msi where needed. Pretty low prio...
|
58
|
+
For the monetized version: nothing but cut and paste, no merging et al
|
59
|
+
mplayer EDL's
|
58
60
|
|
59
61
|
== random backlog ... note: just plow forward, to "grab" available ideas...except that for now, just what *I* plan on needing for myself (filters for what I need/want). ==
|
60
62
|
|
@@ -62,10 +64,9 @@ screencast of things helpful (use, creation...).
|
|
62
64
|
tune up the levels...
|
63
65
|
prototypes of the experimental stuff (overlay, track time while recording -> map file, specifiable levels, more?)
|
64
66
|
|
65
|
-
|
66
|
-
|
67
|
-
0:01:
|
68
|
-
0:01:04.0 next will be at 0:01:06.5s (blanked) (r [or q to quit]): "warning--unable to track screen time for some reason" # *of course you can't track it now!*
|
67
|
+
fix:
|
68
|
+
0:01:01.9 next will be at 0:01:02.0s (r [or q to quit]):
|
69
|
+
0:01:04.0 next will be at 0:01:06.5s (blanked) (r [or q to quit]): "warning--unable to track screen time for some reason" # *of course you can't track it now!*
|
69
70
|
|
70
71
|
byu.tv descriptor
|
71
72
|
youtube non full screen: work with all browsers
|
@@ -76,20 +77,10 @@ a netflix player descriptor
|
|
76
77
|
beep at them when not tracking [?]
|
77
78
|
default on...hmm
|
78
79
|
|
79
|
-
note that you are watching it using only bits and pieces of the original, similar to said bill. And the
|
80
|
-
authors of the program might not be cupable of copyright infringement themselves, since they distribute no infringed materials.
|
81
|
-
|
82
|
-
Not responsible for your actions. Don't redistribute. "You run the risk on your own"
|
83
|
-
"should the courts someday rule..." If DVD next to me...
|
84
|
-
|
85
|
-
install VLC from .msi where needed. Pretty low prio...
|
86
|
-
|
87
80
|
An 'edit preferences' button et al.
|
88
81
|
|
89
82
|
Just fold if s....
|
90
83
|
|
91
|
-
For the monetized version: nothing but cut and paste, no merging et al
|
92
|
-
|
93
84
|
a descriptor for some closed source app player...
|
94
85
|
|
95
86
|
when saving to hard drive, you can "insert" streams where desired (experimental version only)
|
@@ -123,25 +114,21 @@ advertise on ruby flow
|
|
123
114
|
|
124
115
|
DRY up :levels--it's in the ocr spec as well as the others...
|
125
116
|
|
126
|
-
unit tests
|
117
|
+
unit tests run with normal ruby
|
127
118
|
|
128
|
-
|
129
|
-
|
130
|
-
when polling for bmp changes, just use two lines (if needed speed-wise?)
|
131
|
-
|
132
|
-
super duper VLC
|
119
|
+
back off on mouse jerking...only every so often?
|
120
|
+
maybe increase timings as you get farther along, to accomodate for drift?
|
133
121
|
|
134
|
-
|
122
|
+
screen time change only detected... [unexpected] [rid myself of it]
|
135
123
|
|
136
|
-
Do I *need* that other window always up or not? (Get rid of it
|
124
|
+
Do I *need* that other window always up or not? (Get rid of it?...only do this after have a real window of my own though, that's always up)
|
137
125
|
|
138
126
|
preference for beeping at them, et al
|
139
127
|
|
140
|
-
itunes video on demand
|
128
|
+
itunes video on demand player
|
141
129
|
|
142
130
|
blockbuster "rent" on demand player
|
143
131
|
|
144
|
-
|
145
132
|
no money making for now...all volunteer...more respectful.
|
146
133
|
or make it so it can work with an editor of some kind...like a "save here" command line snip this tuck that.
|
147
134
|
probably only possible after creating the desktop streamer hmm
|
@@ -160,25 +147,17 @@ an "online anybody can chat while watching this movie" (or anybody can edit this
|
|
160
147
|
|
161
148
|
an online applet web runnable? Why not?
|
162
149
|
click here to watch your favorite film edited on hulu! Just click! [* yea!]
|
163
|
-
a chrome plugin with imdb/community backing :)
|
164
150
|
|
165
|
-
a known list of "compatible" imdb'ers...
|
166
|
-
|
167
151
|
code refactors: "screen time change", order should be swapped in bin/x output (just cleanup)
|
168
152
|
|
169
|
-
easier
|
170
|
-
later:
|
171
|
-
suggestion: self-extractor
|
153
|
+
easier installation for windows: release a zip file that they can just click on a .bat file to run it
|
154
|
+
later: .msi?
|
172
155
|
|
173
156
|
can blank overlay with added text like "and you are one awesome klingon"
|
174
157
|
|
175
158
|
ability to record it from online/live, then apply edits.
|
176
159
|
|
177
|
-
|
178
|
-
|
179
|
-
add my stuff to imdb...? wiki?
|
180
|
-
|
181
|
-
make youtube work if you have *several* open
|
160
|
+
add my stuff to imdb...? make a wiki?
|
182
161
|
|
183
162
|
user customizable levels...
|
184
163
|
maybe even "I don't like ones that are x, y, z", or "boring level x"
|
@@ -215,8 +194,6 @@ control location programmatically (using mouse) on the player itself.
|
|
215
194
|
|
216
195
|
compare VLC (and other) timings with a real DVD player, and with netflix online, etc.
|
217
196
|
|
218
|
-
overlay with an alpha transparent pic (?)
|
219
|
-
|
220
197
|
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...
|
221
198
|
or known parseable imdb's
|
222
199
|
|
@@ -224,15 +201,15 @@ does my sweet heart have any suggestions? (make it work well for laymen)
|
|
224
201
|
|
225
202
|
web browser plugin?
|
226
203
|
|
227
|
-
Programmatically do all of the above, by driving VLC with its
|
204
|
+
Programmatically do all of the above, by driving VLC with libvlc (its API).
|
205
|
+
So this would be basically tracking VLC using its libvlc callbacks, instead of screen times
|
206
|
+
fork the Python project?
|
228
207
|
VLC
|
229
208
|
Allow it to record somehow (recordable)
|
230
209
|
use VLC's web interface? telnet?
|
231
210
|
optimize it with best appropriate iframes (LOL)
|
232
211
|
|
233
|
-
integrate with google TV
|
234
|
-
itunes TV? apple tv?
|
235
|
-
|
236
|
-
OCR the captioning as an auto profanity filter? (or perhaps download subtitles to be able to pre-screen), like the python fella does..
|
212
|
+
integrate with google TV...bravia...maybe...somehow...boxxee? roku?
|
213
|
+
itunes TV? apple tv? ps3?
|
237
214
|
|
238
|
-
|
215
|
+
OCR the captioning as an auto profanity filter? (or perhaps download subtitles to be able to pre-screen), like the python fella does.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.14.
|
1
|
+
0.14.5
|
data/bin/sensible-cinema
CHANGED
@@ -3,11 +3,20 @@
|
|
3
3
|
puts 'Loading Sensible Cinema...'
|
4
4
|
|
5
5
|
require 'rubygems'
|
6
|
+
|
7
|
+
def add_any_bundled_gems
|
8
|
+
Dir['vendor/cache/**/lib'].each{|lib_dir|
|
9
|
+
$: << lib_dir
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
add_any_bundled_gems
|
14
|
+
|
6
15
|
require 'sane' # File.write
|
7
|
-
require
|
16
|
+
require 'ruby-wmi'
|
17
|
+
require_relative '../lib/swing_helpers'
|
8
18
|
load File.dirname(__FILE__) + '/sensible-cinema-cli'
|
9
19
|
require 'tmpdir'
|
10
|
-
require 'ruby-wmi'
|
11
20
|
|
12
21
|
module SensibleSwing
|
13
22
|
class MainWindow < JFrame
|
@@ -25,7 +34,7 @@ module SensibleSwing
|
|
25
34
|
jlabel.set_bounds(44,44,136,14)
|
26
35
|
panel.add jlabel
|
27
36
|
b = JButton.new( "Play Hulu, Youtube, or a DVD (Tracking)" ).on_clicked {
|
28
|
-
Thread.new { go_sc } # needs to be in its own thread becuase it blocks,
|
37
|
+
Thread.new { go_sc([]) } # needs to be in its own thread becuase it blocks,
|
29
38
|
# so "this thread" is the uni-swing thread, gets blocked, and the overlayer can't repaint
|
30
39
|
self.close
|
31
40
|
}
|
@@ -33,7 +42,7 @@ module SensibleSwing
|
|
33
42
|
b.set_bounds(44,120,button_width,23)
|
34
43
|
panel.add b
|
35
44
|
|
36
|
-
c=JButton.new( "Copy edited DVD to Hard Drive" )
|
45
|
+
c=JButton.new( "Copy edited copy of DVD to Hard Drive" )
|
37
46
|
c.on_clicked {
|
38
47
|
do_copy_dvd_to_hard_drive true
|
39
48
|
}
|
@@ -54,26 +63,39 @@ module SensibleSwing
|
|
54
63
|
@exit.set_bounds(44,320,button_width,23)
|
55
64
|
panel.add @exit
|
56
65
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
@
|
68
|
-
|
66
|
+
if ARGV.find{|a| a == '--test'}
|
67
|
+
reload = JButton.new( "reload code" ).on_clicked {
|
68
|
+
eval File.read(__FILE__), nil, __FILE__
|
69
|
+
p 're-evaled the code ...'
|
70
|
+
}
|
71
|
+
reload.set_bounds(20,300,20,20)
|
72
|
+
panel.add reload
|
73
|
+
end
|
74
|
+
|
75
|
+
@progress_bar = JProgressBar.new(0, 100)
|
76
|
+
@progress_bar.set_bounds(44,280,button_width,23)
|
77
|
+
@progress_bar.visible=false
|
78
|
+
panel.add @progress_bar
|
79
|
+
@buttons = [b,c,d,@exit]
|
80
|
+
end
|
81
|
+
|
82
|
+
def vlc_currently_installed?
|
83
|
+
if !system("vlc --qt-start-minimized vlc://quit")
|
84
|
+
JOptionPane.showMessageDialog(nil, "Appears you do not yet have VLC Media Player installed. Click ok to download it.", "VLC Player not found", JOptionPane::ERROR_MESSAGE)
|
85
|
+
system("start http://www.videolan.org/")
|
86
|
+
false
|
87
|
+
else
|
88
|
+
true
|
89
|
+
end
|
69
90
|
end
|
70
91
|
|
71
92
|
def do_copy_dvd_to_hard_drive should_save_file
|
93
|
+
return unless vlc_currently_installed?
|
72
94
|
drive = choose_dvd_drive
|
73
95
|
fc = JFileChooser.new
|
74
96
|
fc.setFileSelectionMode(nil)
|
75
97
|
fc.set_dialog_title "Please pick a DVD Edit List File"
|
76
|
-
fc.set_current_directory(JFile.new( __dir__ + "/../zamples/
|
98
|
+
fc.set_current_directory(JFile.new( __dir__ + "/../zamples/edit_decision_lists/dvds"))
|
77
99
|
edit_list_path = fc.go
|
78
100
|
descriptors = YAML.load_file edit_list_path
|
79
101
|
|
@@ -81,7 +103,7 @@ module SensibleSwing
|
|
81
103
|
fc = JFileChooser.new
|
82
104
|
# LODO allow for spaces in save to file
|
83
105
|
fc.set_dialog_title "Pick where to save the file to"
|
84
|
-
save_to_file_name = ((descriptors["title"] || "my dvd") + ' edited').gsub(' ', '_').gsub( /\W/, '') # no punctuation for now...
|
106
|
+
save_to_file_name = ((descriptors["title"] || "my dvd") + ' edited copy').gsub(' ', '_').gsub( /\W/, '') # no punctuation for now...
|
85
107
|
fc.setSelectedFile(JFile.new(get_drive_with_most_space_with_slash + save_to_file_name))
|
86
108
|
save_to = fc.go
|
87
109
|
else
|
@@ -100,8 +122,9 @@ module SensibleSwing
|
|
100
122
|
temp_file = temp_dir + '/' + 'vlc.xspf'
|
101
123
|
File.write(temp_file, bat_file_or_xspf)
|
102
124
|
command = "vlc \"#{temp_file.to_filename}\" vlc://quit"
|
103
|
-
p 'running', command
|
104
|
-
system(
|
125
|
+
p 'running playlist: ', command
|
126
|
+
system(command) # blocks the current window while running...
|
127
|
+
p 'done running playlist'
|
105
128
|
end
|
106
129
|
# TODO warn if they don't have VLC installed, with instructions...
|
107
130
|
# LODO warn if they will overwrite a file in the end
|
@@ -116,15 +139,15 @@ module SensibleSwing
|
|
116
139
|
success = true
|
117
140
|
lines = batch_file.lines.to_a
|
118
141
|
total_size = lines.length.to_f
|
142
|
+
@progress_bar.visible=true
|
143
|
+
@progress_bar.set_value(0)
|
119
144
|
lines.each_with_index{|l, idx|
|
120
145
|
if success
|
121
|
-
|
122
|
-
|
123
|
-
@p.set_value(idx/total_size*100)
|
124
|
-
sleep 1
|
146
|
+
success = system(l) unless ARGV.find{|a| a == '--test'} # this doesn't seem to cancel out early for some reason..
|
147
|
+
@progress_bar.set_value(idx/total_size*100)
|
125
148
|
end
|
126
|
-
}
|
127
|
-
@
|
149
|
+
}
|
150
|
+
@progress_var.visible=false
|
128
151
|
@buttons.each{|b| b.set_enabled true}
|
129
152
|
popup.dispose
|
130
153
|
if success
|
@@ -171,7 +194,6 @@ module SensibleSwing
|
|
171
194
|
|
172
195
|
end
|
173
196
|
|
174
|
-
|
175
197
|
class GetDisk < JDialog
|
176
198
|
attr_reader :selected
|
177
199
|
def initialize parent, options_array
|
@@ -198,16 +220,6 @@ module SensibleSwing
|
|
198
220
|
|
199
221
|
end
|
200
222
|
|
201
|
-
require 'os'
|
202
|
-
class String
|
203
|
-
def to_filename
|
204
|
-
if OS.windows?
|
205
|
-
self.gsub('/', "\\")
|
206
|
-
else
|
207
|
-
self
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
223
|
|
212
224
|
SensibleSwing::MainWindow.new.set_visible true
|
213
225
|
|
data/bin/sensible-cinema-cli
CHANGED
@@ -25,7 +25,7 @@ def go_sc(args)
|
|
25
25
|
|
26
26
|
puts <<-END
|
27
27
|
|
28
|
-
syntax: player_description.yml|test
|
28
|
+
syntax: [player_description.yml|test] edit_decision_list.txt [-t -v --clear-cache] (or nothing at all--it will prompt)
|
29
29
|
END
|
30
30
|
|
31
31
|
for file in Dir[__dir__ + '../zamples/mute*/*']
|
@@ -44,27 +44,27 @@ def go_sc(args)
|
|
44
44
|
player_description = FileChooser.choose_file(" SELECT COMPUTER PLAYER", __dir__ + "/../zamples/players")
|
45
45
|
end
|
46
46
|
|
47
|
-
|
47
|
+
edit_decision_list = args.shift.to_s
|
48
48
|
|
49
|
-
if
|
49
|
+
if edit_decision_list == 'test'
|
50
50
|
overlay = nil
|
51
51
|
p 'got test...just doing screen dump'
|
52
52
|
$VERBOSE=true # adds some extra output
|
53
53
|
else
|
54
|
-
if !File.exist?
|
55
|
-
puts 'Select
|
56
|
-
|
54
|
+
if !File.exist? edit_decision_list
|
55
|
+
puts 'Select Edit Decision List'
|
56
|
+
edit_decision_list = FileChooser.choose_file(" SELECT EDIT DECISION LIST", __dir__ + "/../zamples/edit_decision_lists")
|
57
57
|
end
|
58
58
|
|
59
|
-
if !
|
59
|
+
if !edit_decision_list
|
60
60
|
puts "error: have to specify a scene descriptions file\n or specify \"test\" on the command line if you just want to snapshot your player"
|
61
61
|
exit 1
|
62
62
|
end
|
63
63
|
|
64
|
-
puts 'Selected scene descriptions file ' + File.basename(
|
64
|
+
puts 'Selected scene descriptions file ' + File.basename(edit_decision_list) + "\n\t(full path: #{edit_decision_list})"
|
65
65
|
Blanker.startup
|
66
66
|
# todo start it late as it has an annoying startup blip
|
67
|
-
overlay = OverLayer.new(
|
67
|
+
overlay = OverLayer.new(edit_decision_list )
|
68
68
|
end
|
69
69
|
|
70
70
|
if File.exist? player_description.to_s
|
@@ -88,7 +88,7 @@ def go_sc(args)
|
|
88
88
|
|
89
89
|
OCR.unserialize_cache_from_disk # do this every time so we don't delete it if they don't have one...
|
90
90
|
|
91
|
-
puts "Opening the curtains... (please play in player now)"
|
91
|
+
puts "Opening the curtains... (please play in your other player now)"
|
92
92
|
overlay.start_thread true
|
93
93
|
key_input = KeyboardInput.new overlay
|
94
94
|
key_input.start_thread # status thread
|
@@ -96,7 +96,7 @@ def go_sc(args)
|
|
96
96
|
Blanker.shutdown # lodo move this and the 'q' key to within overlayer
|
97
97
|
OCR.serialize_cache_to_disk
|
98
98
|
}
|
99
|
-
puts
|
99
|
+
puts "syntax from command line: #{player_description} #{edit_decision_list}"
|
100
100
|
key_input.handle_keystrokes_forever # blocking...
|
101
101
|
|
102
102
|
end
|
data/lib/ocr.rb
CHANGED
@@ -1,5 +1,13 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require 'sane' # gem
|
2
|
+
require 'whichr' # gem
|
3
|
+
require_relative 'swing_helpers' # to_filename lodo not have it there
|
4
|
+
im_path = File.expand_path(File.dirname(__FILE__) + "/../vendor/cache/imagemagick") # convert.exe wants to only be chosen from here...
|
5
|
+
ENV['PATH'] = im_path.to_filename + ';' + ENV['PATH']
|
6
|
+
|
7
|
+
if RubyWhich.new.which('identify').length == 0 || RubyWhich.new.which('convert').length == 0
|
8
|
+
# for gem users, so I don't have to bundle it :P
|
9
|
+
raise 'appears you do not have imagemagick installed (or not in your path) -- please install it! http://www.imagemagick.org/script/binary-releases.php'
|
10
|
+
end
|
3
11
|
|
4
12
|
# helper for OCR'ing single digits that were screen captured
|
5
13
|
module OCR
|
data/lib/overlayer.rb
CHANGED
@@ -106,7 +106,7 @@ class OverLayer
|
|
106
106
|
start2 = translate_string_to_seconds(start) if start
|
107
107
|
endy2 = translate_string_to_seconds(endy) if endy
|
108
108
|
if start2 == 0 || endy2 == 0 || start == nil || endy == nil
|
109
|
-
p 'warning--possible error in the
|
109
|
+
p 'warning--possible error in the Edit Decision List 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
|
110
110
|
# drop this line into the bitbucket...
|
111
111
|
next
|
112
112
|
end
|