sensible-cinema 0.24.0 → 0.24.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +7 -7
- data/TODO +26 -19
- data/VERSION +1 -1
- data/bin/sensible-cinema +126 -73
- data/change_log_with_feature_list.txt +7 -0
- data/lib/edl_parser.rb +7 -5
- data/lib/subtitle_profanity_finder.rb +21 -17
- data/spec/notes +19 -0
- data/spec/subtitle_profanity_finder.spec.rb +21 -15
- data/template_bats/run-upconverting-video-player.bat +1 -0
- data/todo.subtitle +2 -0
- data/todo.upconvert +3 -1
- data/zamples/edit_decision_lists/dvds/edls_being_edited/airplane_edited.txt +19 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/flight_of_the_navigator.txt +34 -0
- data/zamples/edit_decision_lists/dvds/edls_being_edited/hitchhiker's_guide_to_the_galaxy.txt +32 -0
- data/zamples/edit_decision_lists/dvds/snow_white_and_the_seven_dwarfs.txt +18 -0
- metadata +7 -2
data/README
CHANGED
@@ -3,7 +3,7 @@ Sensible-cinema [5] allows you to apply pre-programmed edit lists
|
|
3
3
|
I.e. you can edit a DVD to "mute out" or skip certain scenes.
|
4
4
|
This allows you to sit back and relax as you watch a more "sensiblized" showing of your DVD.
|
5
5
|
|
6
|
-
It is currently in beta, though will always be free software, even after
|
6
|
+
It is currently in alpha/beta, though will always be free software, even after releases.
|
7
7
|
It also includes a library of EDL's that go along with various DVD's, we need volunteers
|
8
8
|
to help it to grow!
|
9
9
|
|
@@ -58,7 +58,7 @@ I don't actually know how to do this I've never burned a DVD.
|
|
58
58
|
See also is_it_legal_to_copy_dvds.txt for some caveats you should understand first.
|
59
59
|
Windows DVD Maker might help, http://www.dvdflick.net might help.
|
60
60
|
iDVD might help on mac.
|
61
|
-
DO NOT MAKE ILLEGAL COPIES OF DVD's. See is_it_legal_to_copy_dvds.txt.
|
61
|
+
DO NOT MAKE ILLEGAL COPIES OF DVD's. See also is_it_legal_to_copy_dvds.txt.
|
62
62
|
|
63
63
|
== FAQ ==
|
64
64
|
|
@@ -71,10 +71,10 @@ A. One way is to plug your computer into your TV.
|
|
71
71
|
something in mind that could help, though hasn't been created yet. (Playon.tv does something like this, too, but
|
72
72
|
I might come up with a competitor to it if desired, as the existing one costs money).
|
73
73
|
You may be able to create your own edited DVD, see section "Creating an edited DVD"
|
74
|
-
Another good option is to purchase a clearplay
|
75
|
-
|
74
|
+
Another good option is to purchase and use a clearplay player.
|
75
|
+
|
76
76
|
Q. I want to give an edited DVD to a friend, how do I do that well?
|
77
|
-
A. Give them the original
|
77
|
+
A. Give them the original, non-edited DVD and email them a link to sensible-cinema's website :)
|
78
78
|
|
79
79
|
== Caveats ==
|
80
80
|
|
@@ -95,10 +95,10 @@ so we recommend to always clean your discs first!
|
|
95
95
|
|
96
96
|
The initial motivation for the project was that I dislike deity profanity in movies.
|
97
97
|
And really any profanity is jarring, if you're not used to it in real life, and can
|
98
|
-
put
|
98
|
+
put me a bit on edge when I watch an otherwise enjoyable movie.
|
99
99
|
Also sometimes producers put in certain scenes (read: sex scenes)
|
100
100
|
just to get a desired rating.
|
101
|
-
I don't want those scenes, but still want to be able to enjoy
|
101
|
+
I don't want those scenes, but still want to be able to enjoy more movies :)
|
102
102
|
|
103
103
|
I once tried Clearplay (a "filter"ed DVD player)
|
104
104
|
but (for me) it didn't cut it. It costs money monthly (I'm too cheap to pay--and many
|
data/TODO
CHANGED
@@ -31,11 +31,12 @@
|
|
31
31
|
just in case youtube takes over the world
|
32
32
|
|
33
33
|
== yes do ordered in conjunction with the above probably ==
|
34
|
-
subtitles 2 phase
|
35
34
|
unit tests
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
|
36
|
+
always use -dvd-device [yikes]
|
37
|
+
fullscreen now
|
38
|
+
subtitles 2 phase
|
39
|
+
auto-paste
|
39
40
|
lightning strike from various outlets...
|
40
41
|
try buy edit lists from all x,y,z [?] maybe ask for them for free first? ()
|
41
42
|
http://www.familysafemovies.com
|
@@ -53,13 +54,19 @@
|
|
53
54
|
movie mask wayback machine
|
54
55
|
|
55
56
|
== yes do, un-ordered currently, from the various future release options ==
|
56
|
-
|
57
|
-
|
57
|
+
play unedited doesn't use known title tracks
|
58
|
+
add a "scan for expected title, times" (basically all titles, times...)
|
59
|
+
complain if times looks wrong...
|
60
|
+
complain [accomodate option] if start time looks off...600
|
61
|
+
"1:07:5.718" , "1:07:10.447", "profanity", "ba.....", "Faraday that [ba.....] That ba He's gonna wish he never met us",
|
58
62
|
don't cache selections if they choose a local file...hmm...
|
63
|
+
tighten splits
|
59
64
|
"save to" -> same dir as "get from" yeah
|
60
|
-
@instructions "this is great for comparing srt's, except...then you have to..."
|
61
|
-
|
65
|
+
@instructions "this is great for comparing srt's, except...when it isn't, then you have to..."
|
66
|
+
@instructions: full srt how-to
|
67
|
+
test with cars-ws (at work), mac (to make sure volume name doesn't have spaces)
|
62
68
|
can I just use ffmpeg for an initial -> ts ? http://eotmsnotes.wordpress.com/2011/04/25/tsmuxer-notes/
|
69
|
+
add dvd_title_time option
|
63
70
|
volume_name => dvd_volume_name
|
64
71
|
make it load faster! this is cuh-razy! or splash screen! yes!
|
65
72
|
why is the Sintel's EDL seemingly off?
|
@@ -72,10 +79,10 @@
|
|
72
79
|
don't have to use eval!
|
73
80
|
EDL with JSON on top, full timestamps.
|
74
81
|
setpriority for several :)
|
75
|
-
bring to top after a conversion, and for prompts...
|
82
|
+
bring to top after a conversion, and for prompts...
|
76
83
|
can auto-use tsmuxer at all [?]
|
77
84
|
mac just die with instructions to use tsmuxer first...
|
78
|
-
check if some other buttons are outdated...
|
85
|
+
check if some other buttons are now outdated...
|
79
86
|
unit tests (all pass)
|
80
87
|
auto-copy to clipboard...should be cake, right?
|
81
88
|
can I avoid requiring use of tsmuxer first? hmm...
|
@@ -88,7 +95,6 @@
|
|
88
95
|
upconverter
|
89
96
|
check gl mac
|
90
97
|
check permutations
|
91
|
-
easier use/"options" setting buttons, remove that one button...
|
92
98
|
employee instructions: watch @ realtime after profanity filter first pass :P
|
93
99
|
@makemkv: timing feels broken weird-like!
|
94
100
|
clear runnings
|
@@ -121,11 +127,11 @@
|
|
121
127
|
inventionzy: blu-ray OCR
|
122
128
|
port to mac OS X--try everything out (all buttons), make sure all works...
|
123
129
|
ppc dvdid?
|
124
|
-
|
125
|
-
instructions for how to use mac ts muxer
|
130
|
+
use mplayerx well [?] like wrap it...
|
126
131
|
the final "edited.avi" really "could/should" be playable in WMP...if possible
|
127
132
|
do I need tsmuxer?
|
128
|
-
"guess" the best title...
|
133
|
+
auto-"guess" the best title...
|
134
|
+
add button "fast preview segment" (from dvd)
|
129
135
|
|
130
136
|
== other lists ==
|
131
137
|
|
@@ -138,13 +144,13 @@
|
|
138
144
|
|
139
145
|
== DVD decide later to move up or down ==
|
140
146
|
add button "fast preview one" (from file)
|
141
|
-
add button "fast preview one" (from dvd)
|
142
147
|
|
143
148
|
== DVD-realtime backlog once yes do, now not do, unordered ==
|
144
|
-
|
149
|
+
@makemkv: show us drive letters, labels over hardware type, also an option to "ignore failure"
|
150
|
+
slow cpu: mater tall tales: are my av sync values better or worse than smplayer defaults, with/without upsampling, blacky?
|
151
|
+
upconvert research/compare options
|
145
152
|
investigate boxee edl (just fer fun...maybe possible?) http://getsatisfaction.com/boxee/topics/commercial_skipping_edl_support
|
146
153
|
investigate xbmc dvd edl how do you do that?
|
147
|
-
maybe use smplayer full-screened, to avoid?
|
148
154
|
investigate WMC "call out to mplayer EDL" or the like...
|
149
155
|
for mplayer realtime it needs to start early, but end on time
|
150
156
|
mplayer instructions are obscured
|
@@ -164,7 +170,8 @@
|
|
164
170
|
investigate dvdrsbvdl (windows media center edl plugin)
|
165
171
|
|
166
172
|
== DVD+-DVD-realtime backlog (totally unordered, some very low prio, basically all never do) ==
|
167
|
-
@mplayer:
|
173
|
+
@mplayer: crash IQ nav, keys dont' work in windows, prolly dvdcss doesn't cache in windows, can't pass parameter in windows LOL
|
174
|
+
@mplayer: dvdnav:///e: should play the *menu* please? please? [???]
|
168
175
|
@mplayer: do I need -zoom ?
|
169
176
|
@smplayer: you don't capture stderr [?] ex -vf scale:1280.0
|
170
177
|
@mplayer: http://www.infognition.com/VideoEnhancer/ can I do that through any means LOL?
|
@@ -211,7 +218,7 @@
|
|
211
218
|
allow for AAF or OMF export, as well as EDL (?)
|
212
219
|
C specific portion [A,B] player
|
213
220
|
also edit the trailers et al [?] hmm...
|
214
|
-
@mplayer: double click default to full screen! :)
|
221
|
+
@mplayer: double click default to full screen! :) and enter default to dvdnav select!
|
215
222
|
add button "play from exactly here to here" in [mplayer uh guess?] :P
|
216
223
|
what does mplayer do with -ss big_number past the end of an end [monster's inc]?
|
217
224
|
fix ffmpeg's Application provided invalid, non monotonically increasing dts to muxer in stream 0: 5940 >= 5940
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.24.
|
1
|
+
0.24.1
|
data/bin/sensible-cinema
CHANGED
@@ -112,15 +112,17 @@ module SensibleSwing
|
|
112
112
|
"Sensible Cinema is distributed under the gplv3 (http://www.gnu.org/licenses/gpl.html).\nBY CLICKING \"accept\" YOU SIGNIFY THAT YOU HAVE READ, UNDERSTOOD AND AGREED TO ABIDE BY THE TERMS OF THIS AGREEMENT"
|
113
113
|
require_blocking_license_accept_dialog 'Sensible Cinema', 'is_it_legal_to_copy_dvds.txt file', File.expand_path(File.dirname(__FILE__) + "/../documentation/is_it_legal_to_copy_dvds.txt"),
|
114
114
|
'is_it_legal_to_copy_dvds.txt file', 'I acknowledge that I have read, understand, accept and agree to abide by the implications noted in the documentation/is_it_legal_to_copy_dvds.txt file'
|
115
|
-
|
115
|
+
LocalStorage['main_license_accepted'] = VERSION
|
116
116
|
end
|
117
117
|
|
118
|
-
|
118
|
+
LocalStorage = Storage.new("sensible_cinema_storage")
|
119
119
|
|
120
120
|
def setup_upconvert_buttons
|
121
|
+
|
121
122
|
|
122
123
|
@watch_file_upconvert = new_jbutton( "Watch a file upconverted (unedited)") do
|
123
124
|
# ?? drive, volume, dvd_id = choose_dvd_drive_or_file true
|
125
|
+
warn_if_no_upconvert_options_currently_selected
|
124
126
|
filename_mpg = new_existing_file_selector_and_select_file( "pick moviefile (like moviename.mpg)")
|
125
127
|
play_mplayer_edl [filename_mpg, nil]
|
126
128
|
end
|
@@ -131,6 +133,7 @@ module SensibleSwing
|
|
131
133
|
#run_smplayer_blocking "dvdnav:///#{drive}", "-nocache" # TODO dvdnav://1-60 is summarily ignored...sniff...
|
132
134
|
# LODO mplayer dvdnav:///e: seems really really hosed LOL, and also dvdnav input what the...
|
133
135
|
# plush crash smplayer "normal" selecting IQ Menu (ok snow white tho...odd...)
|
136
|
+
warn_if_no_upconvert_options_currently_selected
|
134
137
|
play_dvd_smplayer_unedited
|
135
138
|
end
|
136
139
|
|
@@ -138,8 +141,14 @@ module SensibleSwing
|
|
138
141
|
|
139
142
|
end
|
140
143
|
|
144
|
+
def warn_if_no_upconvert_options_currently_selected
|
145
|
+
if !LocalStorage[UpConvertEnglish]
|
146
|
+
show_blocking_message_dialog "Warning: upconvert options have not been set yet--please change upconvert options first, if desired."
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
141
150
|
def add_set_upconvert_options_button
|
142
|
-
@show_upconvert_options = new_jbutton( "Change upconvert options (started as #{
|
151
|
+
@show_upconvert_options = new_jbutton( "Change upconvert options (started as #{LocalStorage[UpConvertEnglish] || 'not set'})" ) do
|
143
152
|
setup_upconvert_options
|
144
153
|
end
|
145
154
|
|
@@ -152,42 +161,43 @@ module SensibleSwing
|
|
152
161
|
def setup_upconvert_options
|
153
162
|
none = new_jbutton("reset upconvert options to default (none)")
|
154
163
|
none.tool_tip = "Having no upconvert options is reasonably good, uses directx for scaling, nice for slow cpu's"
|
155
|
-
p 'upconvert options started as:',
|
164
|
+
p 'upconvert options started as:', LocalStorage[UpConvertKey]
|
156
165
|
none.on_clicked {
|
157
|
-
|
158
|
-
|
159
|
-
|
166
|
+
LocalStorage[UpConvertKey] = nil
|
167
|
+
LocalStorage[UpConvertKeyExtra] = nil
|
168
|
+
LocalStorage[UpConvertEnglish] = nil
|
160
169
|
}
|
161
170
|
medium_dvd = new_jbutton("set upconvert options to DVD-style input (high-quality input)") {
|
162
|
-
|
163
|
-
|
164
|
-
|
171
|
+
LocalStorage[UpConvertKey] = "hqdn3d=2:1.5:3,scale=SCREEN_X:-1:0:0:3"
|
172
|
+
LocalStorage[UpConvertKeyExtra] = "-sws 9 -ssf ls=75.0 -ssf cs=50.0"
|
173
|
+
LocalStorage[UpConvertEnglish] = "DVD/HQ"
|
165
174
|
display_current_upconvert_setting
|
166
175
|
}
|
167
176
|
high_compression = new_jbutton("set upconvert options for playing back highly compressed video") {
|
168
177
|
# -autoq 6 -vf pp [?]
|
169
|
-
|
170
|
-
|
171
|
-
|
178
|
+
LocalStorage[UpConvertEnglish] = "high compress"
|
179
|
+
LocalStorage[UpConvertKey] = "hqdn3d=7:7:5,pp=hb:y/vb:y,scale=SCREEN_X:-1:0:0:5"
|
180
|
+
LocalStorage[UpConvertKeyExtra] = "-sws 9 -ssf ls=75.0 -ssf cs=75.0"
|
172
181
|
display_current_upconvert_setting
|
173
182
|
}
|
174
183
|
new_jbutton("set upconvert options to aggressive DVD/HQ-style playback") {
|
175
|
-
|
176
|
-
|
177
|
-
|
184
|
+
LocalStorage[UpConvertKey] = "hqdn3d=7:7:5,scale=SCREEN_X:-1:0:0:10"
|
185
|
+
LocalStorage[UpConvertKeyExtra] = "-sws 9 -ssf ls=100.0 -ssf cs=75.0"
|
186
|
+
LocalStorage[UpConvertEnglish] = "Aggressive DVD/HQ"
|
178
187
|
display_current_upconvert_setting
|
179
188
|
}
|
180
189
|
display_current_upconvert_setting
|
181
190
|
end
|
182
191
|
|
183
192
|
def display_current_upconvert_setting
|
184
|
-
show_blocking_message_dialog "
|
193
|
+
show_blocking_message_dialog "Upconvert options are set to #{LocalStorage[UpConvertEnglish] || 'none'}"
|
185
194
|
end
|
186
195
|
|
187
196
|
def get_upconvert_vf_settings
|
188
|
-
template =
|
197
|
+
template = LocalStorage[UpConvertKey]
|
189
198
|
if template
|
190
|
-
|
199
|
+
# choose width of widest monitor (why would they display it on the other?)
|
200
|
+
x = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment.getScreenDevices.map{|gd| gd.display_mode.width}.max
|
191
201
|
outgoing = template.gsub('SCREEN_X', x.to_i.to_s) # has to be an integer...
|
192
202
|
outgoing
|
193
203
|
else
|
@@ -196,7 +206,7 @@ module SensibleSwing
|
|
196
206
|
end
|
197
207
|
|
198
208
|
def get_upconvert_secondary_settings
|
199
|
-
|
209
|
+
LocalStorage[UpConvertKeyExtra]
|
200
210
|
end
|
201
211
|
|
202
212
|
def setup_advanced_buttons
|
@@ -209,7 +219,7 @@ module SensibleSwing
|
|
209
219
|
create_brand_new_edl
|
210
220
|
end
|
211
221
|
|
212
|
-
@open_list = new_jbutton("Open/Edit a previously created EDL
|
222
|
+
@open_list = new_jbutton("Open/Edit a previously created EDL file", "If your DVD has a previously existing EDL for it, you can open it to edit it with this button.")
|
213
223
|
@open_list.on_clicked {
|
214
224
|
filename = new_existing_file_selector_and_select_file( "Pick any file to open in editor", EDL_DIR)
|
215
225
|
open_file_to_edit_it filename
|
@@ -253,13 +263,19 @@ module SensibleSwing
|
|
253
263
|
play_dvd_smplayer_unedited true
|
254
264
|
}
|
255
265
|
|
256
|
-
@display_unique = new_jbutton( "Display current DVD
|
266
|
+
@display_unique = new_jbutton( "Display information about current DVD (ID, etc.)" )
|
257
267
|
@display_unique.tool_tip = "This is useful to setup a DVD's 'unique ID' within an EDL for it. \nIf your EDL doesn't have a line like disk_unique_id => \"...\" then you will want to run this to be able to add that line in."
|
258
268
|
@display_unique.on_clicked {
|
259
269
|
drive, volume_name, dvd_id = choose_dvd_drive_or_file true
|
260
270
|
# display it, allow them to copy and paste it out
|
261
|
-
|
262
|
-
|
271
|
+
out = nil
|
272
|
+
t = Thread.new {out= `mplayer dvdnav:///#{drive} -identify -frames 0 2>&1| grep LENGTH`}
|
273
|
+
id_string = "\"disk_unique_id\" => \"#{dvd_id}\", # #{volume_name}"
|
274
|
+
show_copy_pastable_string "#{drive} #{volume_name} for your copying+pasting pleasure (highlight, then ctrl+c to copy)\n
|
275
|
+
This is USED eventually to identify a disk to match it to its EDL, later.", id_string
|
276
|
+
t.join
|
277
|
+
File.write EdlTempFile, id_string + "\n" + out
|
278
|
+
open_file_to_edit_it EdlTempFile
|
263
279
|
}
|
264
280
|
|
265
281
|
@convert_seconds_to_ts = new_jbutton( "Convert 3600 <-> 1:00:00 style timestamps" )
|
@@ -295,19 +311,20 @@ module SensibleSwing
|
|
295
311
|
show_copy_pastable_string("Sensible cinema usable value (29.97 fps) for #{thirty_fps} would be: ", human_twenty_nine_seven)
|
296
312
|
}
|
297
313
|
|
298
|
-
@parse_srt = new_jbutton("
|
314
|
+
@parse_srt = new_jbutton("Scan a subtitle file (.srt) to detect profanity times automatically" )
|
299
315
|
@parse_srt.tool_tip = <<-EOL
|
300
|
-
You can download a .srt file and
|
301
|
-
Basically download it from opensubtitles.org (possibly from other
|
316
|
+
You can download a .srt file and use it to automatically search for profanities.
|
317
|
+
Basically download it from opensubtitles.org (possibly from other sites, too),
|
302
318
|
(enter dvd name in the search box, click a result, click one from the list with an English flag, then click 'Download(zip)')
|
303
319
|
Once you download the zip, unzip it, and then compare the timestamps in it with those on the DVD (see the button "Watch DVD unedited (realtime mplayer)")
|
304
320
|
EOL
|
305
|
-
@parse_srt.on_clicked
|
321
|
+
@parse_srt.on_clicked do
|
306
322
|
filename = new_existing_file_selector_and_select_file("Pick srt file:")
|
307
|
-
parsed = SubtitleProfanityFinder.edl_output
|
323
|
+
parsed = SubtitleProfanityFinder.edl_output filename, {}, 0.35, 0.25 # PUT MOVIE SPECIFIC OFFSET TIMINGS HERE
|
308
324
|
File.write(EdlTempFile, "# add these into your mute section if they are offensive\n" + parsed)
|
325
|
+
open_file_to_edit_it filename
|
309
326
|
open_file_to_edit_it EdlTempFile
|
310
|
-
|
327
|
+
end
|
311
328
|
|
312
329
|
add_set_upconvert_options_button
|
313
330
|
|
@@ -351,17 +368,21 @@ module SensibleSwing
|
|
351
368
|
run_smplayer_blocking nice_file, "-edl \"#{EdlTempFile}\"", false
|
352
369
|
}
|
353
370
|
|
371
|
+
@reload = new_jbutton("reload bin/sensible-cinema code") do
|
372
|
+
load $0
|
373
|
+
end
|
374
|
+
|
354
375
|
end # advanced buttons
|
355
376
|
|
356
377
|
def setup_normal_buttons
|
357
378
|
|
358
|
-
@mplayer_edl = new_jbutton( "Watch DVD
|
379
|
+
@mplayer_edl = new_jbutton( "Watch DVD edited (realtime)")
|
359
380
|
@mplayer_edl.tool_tip = "This will watch your DVD in realtime from your computer while skipping/muting questionable scenes."
|
360
381
|
@mplayer_edl.on_clicked {
|
361
382
|
play_mplayer_edl
|
362
383
|
}
|
363
384
|
|
364
|
-
@create = new_jbutton( "Create edited copy
|
385
|
+
@create = new_jbutton( "Create edited copy of video on Your Hard Drive" )
|
365
386
|
@create.tool_tip = <<-EOL
|
366
387
|
This grabs from your DVD and creates a new file on your hard disk like dvd_name_edited.mpg for you to watch later.
|
367
388
|
The file you create will contain the whole movie edited.
|
@@ -371,17 +392,17 @@ module SensibleSwing
|
|
371
392
|
do_copy_dvd_to_hard_drive_via_file false
|
372
393
|
}
|
373
394
|
|
374
|
-
@
|
375
|
-
|
376
|
-
end
|
377
|
-
|
378
|
-
# @watch_created_file = new_jbutton( "Watch the edited file version of DVD", false).on_clicked {
|
379
|
-
# play_mplayer_edl # TODO
|
395
|
+
# @watch_created_file = new_jbutton( "Watch the edited version of DVD file", false).on_clicked {
|
396
|
+
# play_mplayer_edl # LODO
|
380
397
|
# }
|
381
398
|
|
382
|
-
@watch_file_edl = new_jbutton( "Watch
|
399
|
+
@watch_file_edl = new_jbutton( "Watch movie file edited (realtime)" ) do
|
383
400
|
choose_file_and_edl false
|
384
|
-
end
|
401
|
+
end
|
402
|
+
|
403
|
+
@open_help_file = new_jbutton("View Sensible Cinema Documentation") do
|
404
|
+
show_in_explorer __DIR__ + "/../documentation"
|
405
|
+
end
|
385
406
|
|
386
407
|
end
|
387
408
|
|
@@ -392,8 +413,14 @@ module SensibleSwing
|
|
392
413
|
if just_create_dot_edl_file_instead_of_play
|
393
414
|
descriptors = EdlParser.parse_file edl_filename
|
394
415
|
# LODO these timings...DRY up...plus is XBMC the same? what about on a slower computer?
|
395
|
-
|
396
|
-
|
416
|
+
# NB these are just for the SxS EDL!
|
417
|
+
|
418
|
+
#add_secs_end = 0
|
419
|
+
#add_secs_beginning = 0.5 # LODO are these accurate for file based, as well? slow cpu versus fast?
|
420
|
+
|
421
|
+
# TODO do I want these added at file create time, not use time!
|
422
|
+
edl_contents = MplayerEdl.convert_to_edl descriptors, add_secs_end = MplayerEndBuffer, MplayerBeginingBuffer, splits = []
|
423
|
+
output_file = filename_mpg.gsub(/\.[^\.]+$/, '') + '.edl' # sanitize...
|
397
424
|
File.write(output_file, edl_contents)
|
398
425
|
raise unless File.exist?(output_file)
|
399
426
|
show_blocking_message_dialog("created #{output_file}")
|
@@ -408,7 +435,7 @@ module SensibleSwing
|
|
408
435
|
|
409
436
|
def initialize
|
410
437
|
super "Sensible-Cinema #{VERSION} (GPL)"
|
411
|
-
if !(
|
438
|
+
if !(LocalStorage['main_license_accepted'] == VERSION)
|
412
439
|
force_accept_license_first
|
413
440
|
end
|
414
441
|
|
@@ -456,14 +483,14 @@ module SensibleSwing
|
|
456
483
|
@exit = new_jbutton("Exit", "Exits the application and kills any background processes that are running at all--don't exit unless you are done processing all the way!")
|
457
484
|
@exit.on_clicked {
|
458
485
|
Thread.new { self.close } # don't waste the time to close it :P
|
459
|
-
puts 'Thank you for using Sensible Cinema.
|
486
|
+
puts 'Thank you for using Sensible Cinema. Come again!'
|
460
487
|
java.lang.System.exit 0
|
461
488
|
}
|
462
489
|
|
463
490
|
increment_button_location
|
464
491
|
increment_button_location
|
465
492
|
|
466
|
-
setIconImage(ImageIcon.new(
|
493
|
+
setIconImage(ImageIcon.new(__DIR__ + "/../vendor/monkey.png").getImage())
|
467
494
|
check_for_various_dependencies
|
468
495
|
end
|
469
496
|
|
@@ -471,15 +498,20 @@ module SensibleSwing
|
|
471
498
|
extra_options += " -mouse-movements #{get_upconvert_secondary_settings} " # just in case smplayer also needs -mouse-movements... :)
|
472
499
|
if OS.mac? || force_use_mplayer
|
473
500
|
@_run_smplayer_instructions ||= show_mplayer_instructions
|
474
|
-
conf_file = File.expand_path
|
475
|
-
File.write conf_file, "MOUSE_BTN0_DBL vo_fullscreen\nKP_ENTER dvdnav select\n" # dvdnav doesn't work here...
|
501
|
+
conf_file = File.expand_path './mplayer_input_conf'
|
502
|
+
File.write conf_file, "MOUSE_BTN0_DBL vo_fullscreen\nMOUSE_BTN2 vo_fullscreen\nKP_ENTER dvdnav select\n" # dvdnav doesn't work here...
|
476
503
|
if OS.windows?
|
477
504
|
# direct3d for windows 7 old nvidia cards' sake [yipes]
|
478
|
-
|
479
|
-
|
505
|
+
extra_options += " -vo direct3d " # more mouse, less speed [?] less mouse ??
|
506
|
+
extra_options += " -slang en "
|
507
|
+
extra_options += " -font #{ENV['SystemRoot']}\\fonts\\ARIAL.TTF " # would need EXTRA ESCAPING FOR SMPLAYER USE
|
508
|
+
conf_file = conf_file[2..-1] # strip off drive letter, which it doesn't like no sir
|
480
509
|
end
|
481
|
-
c = "mplayer
|
510
|
+
c = "mplayer #{extra_options} #{"-vf " + get_upconvert_vf_settings if get_upconvert_vf_settings} -input conf=\"#{conf_file}\" -mouse-movements \"#{play_this}\" "
|
482
511
|
else
|
512
|
+
if OS.windows?
|
513
|
+
extra_options += " -vo direct3d " # more light nvidia...should be ok...
|
514
|
+
end
|
483
515
|
config_path = set_smplayer_opts extra_options
|
484
516
|
c = "smplayer_portable \"#{play_this}\" -config-path \"#{File.dirname config_path}\" -close-at-end "
|
485
517
|
end
|
@@ -520,10 +552,10 @@ module SensibleSwing
|
|
520
552
|
|
521
553
|
"volume_name" => "#{volume}",
|
522
554
|
"disk_unique_id" => "#{dvd_id}",
|
523
|
-
"dvd_title_track" => "1", #
|
555
|
+
"dvd_title_track" => "1", # the show info button will tell you title length (typically longest is main feature)
|
524
556
|
# "not edited out stuff" => "some violence",
|
525
557
|
# "closing thoughts" => "still...",
|
526
|
-
# "mplayer_dvd_splits" => ["59:59", "1:04:59"], # or [] if there are none. In mplayer, the DVD timestamp "resets" to zero for some reason, so you need to specify when if you want to use mplayer DVD realtime playback, or use mencoder -edl to split your file. See http://goo.gl/yMfqX
|
558
|
+
# "mplayer_dvd_splits" => ["59:59", "1:04:59"], # or [] if there are none. Additive currently. 12345.6 ok. In mplayer, the DVD timestamp "resets" to zero for some reason, so you need to specify when if you want to use mplayer DVD realtime playback, or use mencoder -edl to split your file. See http://goo.gl/yMfqX
|
527
559
|
EOL
|
528
560
|
# frame0 is the name of our window LOL tough to avoid that collision...hmm...
|
529
561
|
filename = EDL_DIR + "\\edls_being_edited\\" + english_name.gsub(' ', '_') + '.txt'
|
@@ -571,8 +603,10 @@ module SensibleSwing
|
|
571
603
|
Thread.new { system_original command }
|
572
604
|
end
|
573
605
|
|
574
|
-
|
575
|
-
|
606
|
+
if respond_to?(:system)
|
607
|
+
# make them choose which system call to use explicitly
|
608
|
+
undef system
|
609
|
+
end
|
576
610
|
|
577
611
|
def download full_url, to_here
|
578
612
|
require 'open-uri'
|
@@ -613,14 +647,14 @@ module SensibleSwing
|
|
613
647
|
EOL
|
614
648
|
end
|
615
649
|
|
650
|
+
MplayerBeginingBuffer = 1.0
|
651
|
+
MplayerEndBuffer = 0.0
|
652
|
+
|
616
653
|
def play_mplayer_edl file_with_edl_path = nil
|
617
|
-
add_secs_end = 0
|
618
|
-
add_secs_beginning = 0.5 # LODO are these accurate for file based, as well?
|
619
654
|
extra_mplayer_commands = []
|
620
655
|
if file_with_edl_path
|
621
656
|
drive_or_file, edl_path = file_with_edl_path
|
622
|
-
dvd_id = NonDvd # fake it out...
|
623
|
-
# descriptors = {} # allow unkon
|
657
|
+
dvd_id = NonDvd # fake it out...LODO
|
624
658
|
else
|
625
659
|
drive_or_file, dvd_volume_name, dvd_id, edl_path, descriptors = choose_dvd_or_file_and_edl_for_it
|
626
660
|
end
|
@@ -638,22 +672,32 @@ module SensibleSwing
|
|
638
672
|
descriptors = {}
|
639
673
|
end
|
640
674
|
if using_dvd
|
675
|
+
p descriptors
|
641
676
|
splits = descriptors['mplayer_dvd_splits']
|
642
|
-
splits
|
643
|
-
if splits == []
|
677
|
+
if splits == nil
|
644
678
|
show_blocking_message_dialog("warning: edit list does not contain mplayer replay information [mplayer_dvd_splits] so edits past a certain time period might not won't work ( http://goo.gl/yMfqX ).")
|
679
|
+
splits = []
|
645
680
|
end
|
646
681
|
splits.map!{|s| EdlParser.translate_string_to_seconds(s) }
|
647
682
|
else
|
648
683
|
splits = []
|
649
684
|
end
|
650
|
-
edl_contents =
|
685
|
+
edl_contents = nil
|
686
|
+
begin
|
687
|
+
edl_contents = MplayerEdl.convert_to_edl descriptors, add_secs_end = MplayerEndBuffer, MplayerBeginingBuffer, splits #, 600 TODOS # add a sec to mutes to accomodate for mplayer's oddness...
|
688
|
+
rescue SyntaxError => e # overlaps et al
|
689
|
+
show_blocking_message_dialog 'fail:' + e.to_s
|
690
|
+
raise e
|
691
|
+
end
|
651
692
|
File.write(EdlTempFile, edl_contents)
|
652
693
|
|
653
694
|
# -framedrop is for slow CPU's
|
654
695
|
# same with -autosync to try and help it stay in sync... -mc 0.03 is to A/V correct 1s audio per 2s video
|
655
696
|
# -hardframedrop might help but hurts just too much
|
656
|
-
extra_mplayer_commands << "-framedrop
|
697
|
+
extra_mplayer_commands << "-framedrop "
|
698
|
+
# ?? extra_mplayer_commands << " -mc 0.016 -autosync 15"
|
699
|
+
|
700
|
+
# prefer english, attempt to disable subtitles, set edl...
|
657
701
|
extra_mplayer_commands << "-alang en -nosub -noautosub -forcedsubsonly -sid 1000 -edl #{File.expand_path EdlTempFile}" # some maybe no longer necessary, but avoid subtitles by default...
|
658
702
|
|
659
703
|
# LODO -fullscreen ...
|
@@ -776,12 +820,21 @@ module SensibleSwing
|
|
776
820
|
show_blocking_message_dialog("It appears that you need to install a dependency: MPlayer for Windows (MPUI).\n
|
777
821
|
Click ok to be directed to its download website, where you can download and install it (recommend: MPUI Full-package), then restart sensible cinema.",
|
778
822
|
"Lacking dependency", JOptionPane::ERROR_MESSAGE)
|
779
|
-
|
823
|
+
open_url_to_view_it_non_blocking "http://code.google.com/p/mulder/downloads/detail?name=MPUI.2011-06-09.Full-Package.exe"
|
780
824
|
System.exit(1)
|
781
825
|
end
|
782
826
|
end
|
783
827
|
end
|
784
828
|
|
829
|
+
def open_url_to_view_it_non_blocking url
|
830
|
+
if OS.windows?
|
831
|
+
system_non_blocking(c = "start #{url.gsub('&', '^&')}") # LODO would launchy help/work here with the full url?
|
832
|
+
p c
|
833
|
+
else
|
834
|
+
system_non_blocking "#{OS.open_file_command} \"#{url}\"" # LODO test
|
835
|
+
end
|
836
|
+
end
|
837
|
+
|
785
838
|
def open_file_to_edit_it filename
|
786
839
|
if OS.windows?
|
787
840
|
system_non_blocking "notepad \"#{filename}\""
|
@@ -809,10 +862,10 @@ module SensibleSwing
|
|
809
862
|
end
|
810
863
|
end
|
811
864
|
|
812
|
-
EDL_DIR = File.expand_path(
|
865
|
+
EDL_DIR = File.expand_path(__DIR__ + "/../zamples/edit_decision_lists/dvds").to_filename
|
813
866
|
|
814
867
|
def repeat_last_copy_dvd_to_hard_drive
|
815
|
-
generate_and_run_bat_file *
|
868
|
+
generate_and_run_bat_file *LocalStorage['last_params']
|
816
869
|
end
|
817
870
|
|
818
871
|
def new_nonexisting_filechooser title = nil, default_dir = nil
|
@@ -858,11 +911,11 @@ module SensibleSwing
|
|
858
911
|
def new_existing_file_selector_and_select_file title, dir=nil
|
859
912
|
out = FileDialog.new(self, title, FileDialog::LOAD)
|
860
913
|
out.set_title title
|
861
|
-
dir ||=
|
914
|
+
dir ||= LocalStorage[caller.inspect]
|
862
915
|
out.set_directory dir.to_filename if dir
|
863
916
|
got = out.go
|
864
917
|
raise 'cancelled choosing existing file method' unless got # I think we always want to raise...
|
865
|
-
|
918
|
+
LocalStorage[caller.inspect] = File.dirname(got)
|
866
919
|
got
|
867
920
|
end
|
868
921
|
|
@@ -951,9 +1004,9 @@ module SensibleSwing
|
|
951
1004
|
Subsequent previews will be faster, though, as long as you use the same filename, as it won't have to re-set it up for processing.
|
952
1005
|
Also note that if you change your edit list, you'll need to close, and restart the video to be able to see it with your new settings.
|
953
1006
|
EOL
|
954
|
-
old_start =
|
955
|
-
start_time = get_user_input("At what point in the video would you like to start your preview? (like 01:00 for starting at 1 minute)",
|
956
|
-
default_end =
|
1007
|
+
old_start = LocalStorage['start_time']
|
1008
|
+
start_time = get_user_input("At what point in the video would you like to start your preview? (like 01:00 for starting at 1 minute)", LocalStorage['start_time'])
|
1009
|
+
default_end = LocalStorage['end_time']
|
957
1010
|
if start_time and start_time != old_start
|
958
1011
|
default_end = EdlParser.translate_string_to_seconds(start_time) + 10
|
959
1012
|
default_end = EdlParser.translate_time_to_human_readable(default_end)
|
@@ -963,8 +1016,8 @@ module SensibleSwing
|
|
963
1016
|
JOptionPane.showMessageDialog(nil, " Please choose start and end", "Failed", JOptionPane::ERROR_MESSAGE)
|
964
1017
|
return
|
965
1018
|
end
|
966
|
-
|
967
|
-
|
1019
|
+
LocalStorage['start_time'] = start_time
|
1020
|
+
LocalStorage['end_time'] = end_time
|
968
1021
|
end
|
969
1022
|
dvd_friendly_name = descriptors['name']
|
970
1023
|
raise 'no dvd name in EDL?' unless dvd_friendly_name
|
@@ -1009,7 +1062,7 @@ module SensibleSwing
|
|
1009
1062
|
end
|
1010
1063
|
|
1011
1064
|
def generate_and_run_bat_file save_to, edit_list_path, descriptors, file_from, dvd_title, start_time, end_time, dvd_title_track, run_mplayer, require_deletion_entry
|
1012
|
-
|
1065
|
+
LocalStorage['last_params'] = [save_to, edit_list_path, descriptors, file_from, dvd_title, start_time, end_time, dvd_title_track, run_mplayer, require_deletion_entry]
|
1013
1066
|
begin
|
1014
1067
|
commands = get_mencoder_commands descriptors, file_from, save_to, start_time, end_time, dvd_title_track, require_deletion_entry
|
1015
1068
|
rescue MencoderWrapper::TimingError => e
|
@@ -1,3 +1,10 @@
|
|
1
|
+
== 0.24.1 ==
|
2
|
+
|
3
|
+
A few more profanities/subtitle tweaks.
|
4
|
+
Now can optionally "adjust" the auto-generated mutes from subtitles based on time
|
5
|
+
differences from the file versus from the movie file itself.
|
6
|
+
Some minor upconverting tweaks
|
7
|
+
|
1
8
|
== 0.24.0 ==
|
2
9
|
|
3
10
|
Now comes with an upconverting software player to play back DVD's/files.
|
data/lib/edl_parser.rb
CHANGED
@@ -105,15 +105,17 @@ class EdlParser
|
|
105
105
|
# divides up mutes and blanks so that they don't overlap, preferring blanks over mutes
|
106
106
|
# returns it like [[start,end,type], [s,e,t]...] type like either :blank and :mute
|
107
107
|
# [[70.0, 73.0, :blank], [378.0, 379.1, :mute]]
|
108
|
-
def self.convert_incoming_to_split_sectors incoming,
|
108
|
+
def self.convert_incoming_to_split_sectors incoming, add_this_to_all_ends = 0, subtract_this_from_beginnings = 0, splits = []
|
109
|
+
raise if subtract_this_from_beginnings < 0
|
110
|
+
raise if add_this_to_all_ends < 0
|
109
111
|
if splits != []
|
110
112
|
# allow it to do all the double checks we later skip, just in case :)
|
111
113
|
self.convert_incoming_to_split_sectors incoming
|
112
114
|
end
|
113
115
|
mutes = incoming["mutes"] || {}
|
114
116
|
blanks = incoming["blank_outs"] || {}
|
115
|
-
mutes = mutes.map{|k, v| get_secs(k, v, -
|
116
|
-
blanks = blanks.map{|k, v| get_secs(k, v, -
|
117
|
+
mutes = mutes.map{|k, v| get_secs(k, v, -subtract_this_from_beginnings, add_this_to_all_ends, splits) + [:mute]}
|
118
|
+
blanks = blanks.map{|k, v| get_secs(k, v, -subtract_this_from_beginnings, add_this_to_all_ends, splits) + [:blank]}
|
117
119
|
combined = (mutes+blanks).sort
|
118
120
|
|
119
121
|
# detect overlap...
|
@@ -177,9 +179,9 @@ class EdlParser
|
|
177
179
|
out << "%02d" % minutes
|
178
180
|
seconds = seconds - minutes * 60
|
179
181
|
out << ":"
|
180
|
-
# avoid .0 at the end
|
182
|
+
# avoid an ugly .0 at the end
|
181
183
|
if seconds != seconds.to_i
|
182
|
-
out << "%04.
|
184
|
+
out << "%04.3f" % seconds
|
183
185
|
else
|
184
186
|
out << "%02d" % seconds
|
185
187
|
end
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# see subtitle_todo file
|
5
5
|
|
6
6
|
|
7
|
-
|
7
|
+
require_relative 'edl_parser'
|
8
8
|
|
9
9
|
|
10
10
|
module SubtitleProfanityFinder
|
@@ -14,11 +14,10 @@ module SubtitleProfanityFinder
|
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
-
def self.edl_output
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
def self.edl_output incoming_filename, extra_profanity_hash = {}, subtract_from_each_beginning_ts = 0, add_to_end_each_ts = 0
|
18
|
+
incoming = File.read(incoming_filename)
|
19
|
+
raise if subtract_from_each_beginning_ts < 0
|
20
|
+
raise if add_to_end_each_ts < 0
|
22
21
|
|
23
22
|
|
24
23
|
|
@@ -48,11 +47,12 @@ module SubtitleProfanityFinder
|
|
48
47
|
|
49
48
|
|
50
49
|
|
50
|
+
# TODO butt, nimrod, ... retard, dumb, jerk, bloody
|
51
51
|
|
52
52
|
|
53
53
|
profanities = {'hell' => ['he..', true],
|
54
54
|
'g' +
|
55
|
-
'o' + 100.chr => '
|
55
|
+
'o' + 100.chr => 'goodness', 'g' +
|
56
56
|
111.chr +
|
57
57
|
100.chr +
|
58
58
|
's' => 'deitys',
|
@@ -80,16 +80,11 @@ module SubtitleProfanityFinder
|
|
80
80
|
'jesus' => 'l...',
|
81
81
|
'chri' +
|
82
82
|
'st'=> ['chr...', true], # allow for christian[ity] [good idea or not?]
|
83
|
+
'sh' +
|
84
|
+
'i' + 't' => 'sh..',
|
83
85
|
'a realllly bad word' => ['test bad word', true]
|
84
86
|
}
|
85
|
-
|
86
|
-
incoming = File.read(args.shift)
|
87
|
-
|
88
|
-
while args.length > 0
|
89
|
-
prof = args.shift
|
90
|
-
sanitized = args.shift
|
91
|
-
profanities[prof] = sanitized
|
92
|
-
end
|
87
|
+
profanities.merge! extra_profanity_hash
|
93
88
|
|
94
89
|
all_profanity_combinations = []
|
95
90
|
|
@@ -158,7 +153,16 @@ module SubtitleProfanityFinder
|
|
158
153
|
timing_line = glop.split("\n").first.strip
|
159
154
|
timing_line =~ /((\d\d:\d\d:\d\d),(\d\d\d) --> (\d\d:\d\d:\d\d),(\d\d\d))/
|
160
155
|
# "00:03:00.0" , "00:04:00.0", "violence", "of some sort",
|
161
|
-
|
156
|
+
ts_begin = "#{$2}.#{$3}"
|
157
|
+
ts_begin = EdlParser.translate_string_to_seconds ts_begin
|
158
|
+
ts_begin -= subtract_from_each_beginning_ts
|
159
|
+
ts_begin = EdlParser.translate_time_to_human_readable ts_begin, true
|
160
|
+
ts_end = "#{$4}.#{$5}"
|
161
|
+
ts_end = EdlParser.translate_string_to_seconds ts_end
|
162
|
+
ts_end += add_to_end_each_ts
|
163
|
+
ts_end = EdlParser.translate_time_to_human_readable ts_end, true
|
164
|
+
output += %!"#{ts_begin}" , "#{ts_end}", "profanity", "#{sanitized.gsub(/[\[\]]/, '').strip}", "#{sanitized_glop.strip}",\n!
|
165
|
+
break
|
162
166
|
end
|
163
167
|
|
164
168
|
end
|
@@ -174,6 +178,6 @@ if $0 == __FILE__
|
|
174
178
|
p 'syntax: filename.srt [prof1 sanitized_equivalent1 prof2 sanitized_equivalent2 ...]'
|
175
179
|
exit
|
176
180
|
else
|
177
|
-
print SubtitleProfanityFinder.edl_output ARGV
|
181
|
+
print SubtitleProfanityFinder.edl_output ARGV.first
|
178
182
|
end
|
179
183
|
end
|
data/spec/notes
CHANGED
@@ -1,4 +1,23 @@
|
|
1
|
+
|
1
2
|
up next:
|
3
|
+
|
4
|
+
== real time subtitle ==
|
5
|
+
0.4 extra + 0.5 not nuf blacky, marked one
|
6
|
+
|
7
|
+
flight:
|
8
|
+
first: second 168.0 -> 00:02:48.03 sez: 00:02:47,668
|
9
|
+
last: first 5151.2 -> 1:25:51.2 sez: 01:25:50,859
|
10
|
+
|
11
|
+
sum additive needed:
|
12
|
+
beginning: add to the end 0.25s
|
13
|
+
end: add to the begining 0.35s
|
14
|
+
|
15
|
+
== upconverting to the huge monitor==
|
16
|
+
with the black laptop:
|
17
|
+
"normal" dvdnav seemed to work all right, slightly jerky at times.
|
18
|
+
I think that upconverting to the little monitor used more cpu.
|
19
|
+
Anything to the big screen maxed out the cpu.
|
20
|
+
I "think" it looked better upconverted than not, big screen too, though both really pretty good. Except the computer not LOL.
|
2
21
|
|
3
22
|
== ts vs. mkv transcoding ==
|
4
23
|
mencoder fails c. mkv, succeeds c. ts (editing seems to succeed overall [?])
|
@@ -24,11 +24,11 @@ describe SubtitleProfanityFinder do
|
|
24
24
|
|
25
25
|
describe "should parse out various profanities" do
|
26
26
|
|
27
|
-
output = SubtitleProfanityFinder.edl_output
|
28
|
-
|
29
|
-
describe "
|
27
|
+
output = SubtitleProfanityFinder.edl_output 'dragon.srt'
|
28
|
+
|
29
|
+
describe "he.." do
|
30
30
|
it "should include the bad line with timestamp" do
|
31
|
-
output.should match(/
|
31
|
+
output.should match(/0:00:54.929.*"he\.\."/)
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should include the description in its output" do
|
@@ -42,12 +42,12 @@ describe SubtitleProfanityFinder do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
it "should parse out deity singular and at very end" do
|
45
|
-
output = SubtitleProfanityFinder.edl_output
|
46
|
-
output.should include("fortress is our [
|
45
|
+
output = SubtitleProfanityFinder.edl_output 'deity_end.srt'
|
46
|
+
output.should include("fortress is our [goodness]")
|
47
47
|
end
|
48
48
|
|
49
49
|
it "should parse out <i> et al " do
|
50
|
-
output = SubtitleProfanityFinder.edl_output
|
50
|
+
output = SubtitleProfanityFinder.edl_output 'deity_end.srt'
|
51
51
|
output.should_not include(" i ")
|
52
52
|
output.should_not include("<i")
|
53
53
|
output.should_not include("huntingand")
|
@@ -58,16 +58,16 @@ describe SubtitleProfanityFinder do
|
|
58
58
|
|
59
59
|
describe 'full word only profanities' do
|
60
60
|
|
61
|
-
output2 = SubtitleProfanityFinder.edl_output
|
61
|
+
output2 = SubtitleProfanityFinder.edl_output 'arse.srt'
|
62
62
|
it 'should not parse it if it\'s in other words' do
|
63
63
|
output2.should_not include "a..ume"
|
64
64
|
output2.should_not include "he..o" # todo: positive ex: ... :P
|
65
65
|
end
|
66
66
|
|
67
67
|
it 'should parse them at EOL' do
|
68
|
-
output2.should include '
|
69
|
-
output2.should include "
|
70
|
-
output2.should include '
|
68
|
+
output2.should include '0:00:55.069' # EOL
|
69
|
+
output2.should include "0:00:55.071" # full line...
|
70
|
+
output2.should include '0:00:55.066' # BOL
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'should replace l for i' do
|
@@ -86,16 +86,22 @@ describe SubtitleProfanityFinder do
|
|
86
86
|
|
87
87
|
end
|
88
88
|
|
89
|
+
it 'should add to begin, end' do
|
90
|
+
out = SubtitleProfanityFinder.edl_output 'dragon.srt', {'word' => 'word'}, 1, 1.5
|
91
|
+
out.should include "45.460"
|
92
|
+
out.should include "51.589"
|
93
|
+
end
|
94
|
+
|
89
95
|
describe "it should take optional user params" do
|
90
|
-
output = SubtitleProfanityFinder.edl_output
|
96
|
+
output = SubtitleProfanityFinder.edl_output 'dragon.srt', {'word' => 'word'}
|
91
97
|
|
92
98
|
it "should parse out the word word" do
|
93
|
-
output.should match(/
|
99
|
+
output.should match(/0:00:50.089.*"word"/)
|
94
100
|
end
|
95
101
|
|
96
102
|
it "should parse out and replace with euphemism" do
|
97
|
-
output = SubtitleProfanityFinder.edl_output
|
98
|
-
output.should match(/
|
103
|
+
output = SubtitleProfanityFinder.edl_output 'dragon.srt', {'word' => 'w...'}
|
104
|
+
output.should match(/0:00:50.089.*In a \[w\.\.\.\]/)
|
99
105
|
end
|
100
106
|
|
101
107
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
@"RUN SENSIBLE CINEMA CLICK HERE.bat" --upconvert-mode
|
data/todo.subtitle
CHANGED
data/todo.upconvert
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
# comments can go after a # on any line, for example this one.
|
2
|
+
"name" => "Airplane Edited",
|
3
|
+
|
4
|
+
"mutes" => [
|
5
|
+
# an example line, uncomment the leading "#" to make it active
|
6
|
+
# "0:00:01.0", "0:00:02.0", "profanity", "da..",
|
7
|
+
],
|
8
|
+
|
9
|
+
"blank_outs" => [
|
10
|
+
# an example line, uncomment the leading "#" to make it active
|
11
|
+
# "00:03:00.0" , "00:04:00.0", "violence", "of some sort",
|
12
|
+
],
|
13
|
+
|
14
|
+
"volume_name" => "050207_1132",
|
15
|
+
"disk_unique_id" => "95c96e17|f2c4159e",
|
16
|
+
"dvd_title_track" => "1", # the show info button will tell you title length (typically longest is main feature)
|
17
|
+
"not edited out stuff" => "some kissing on the beach, some kissing at the end",
|
18
|
+
# "closing thoughts" => "still...",
|
19
|
+
# "mplayer_dvd_splits" => ["59:59", "1:04:59"], # or [] if there are none. Additive currently. 12345.6 ok. In mplayer, the DVD timestamp "resets" to zero for some reason, so you need to specify when if you want to use mplayer DVD realtime playback, or use mencoder -edl to split your file. See http://goo.gl/yMfqX
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# comments can go after a # on any line, for example this one.
|
2
|
+
"name" => "Flight of the Navigator",
|
3
|
+
|
4
|
+
"mutes" => [
|
5
|
+
|
6
|
+
"0:15:39.006" , "0:15:42.484", "profanity", "goodness", "Oh my [goodness]",
|
7
|
+
"0:15:44.720" , "0:15:47.697", "profanity", "goodness", "Oh Thank [goodness]",
|
8
|
+
"0:25:30.097" , "0:25:35.827", "profanity", "l...", "[l...] He's transmitting in alpha waves with complex frequency patterns in them",
|
9
|
+
"0:25:47.399" , "0:25:51.968", "profanity", "he..", "How the [he..] is he doing that I have no idea",
|
10
|
+
"0:33:31.453" , "0:33:33.395", "profanity", "sh..", "Don't take any [sh..] David",
|
11
|
+
"0:35:44.461" , "0:35:49.274", "profanity", "goodness", "Oh my [goodness] This kid's head is full",
|
12
|
+
"0:37:9.672" , "0:37:13.191", "profanity", "goodness", "My [goodness] These are uncharted systems",
|
13
|
+
"0:47:30.501" , "0:47:32.978", "profanity", "goodness", "Oh my [goodness]",
|
14
|
+
"0:48:23.095" , "0:48:26.948", "profanity", "goodness", "All right Get the [goodness][da..] door open Now",
|
15
|
+
"0:48:57.171" , "0:49:1.566", "profanity", "sh..", "Holy [sh..] it's an alien No you idiot It's the kid",
|
16
|
+
"0:54:10.442" , "0:54:14.344", "profanity", "da..", "[da..] How did that kid get outside",
|
17
|
+
"0:56:55.107" , "0:56:58.251", "profanity", "goodness", "My [goodness] it changed shape",
|
18
|
+
"1:03:53.359" , "1:03:57.921", "profanity", "goodness", "I swear to [goodness] if I was flying this thing we'd be home by now",
|
19
|
+
"1:06:52.705" , "1:06:56.099", "profanity", "goodness", "Inside a spaceship Oh my [goodness]",
|
20
|
+
"1:07:5.718" , "1:07:10.447", "profanity", "ba.....", "Faraday that [ba.....] That ba He's gonna wish he never met us",
|
21
|
+
"1:18:8.005" , "1:18:10.190", "profanity", "da..", "[da..]",
|
22
|
+
],
|
23
|
+
|
24
|
+
"blank_outs" => [
|
25
|
+
# an example line, uncomment the leading "#" to make it active
|
26
|
+
# "00:03:00.0" , "00:04:00.0", "violence", "of some sort",
|
27
|
+
],
|
28
|
+
|
29
|
+
"volume_name" => "FLIGHT_OF_THE_NAVIGATOR",
|
30
|
+
"disk_unique_id" => "464df6bb|75753761",
|
31
|
+
"dvd_title_track" => "1",
|
32
|
+
# "not edited out stuff" => "some violence",
|
33
|
+
# "closing thoughts" => "still...",
|
34
|
+
"mplayer_dvd_splits" => [],
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# 3648747 comments can go after a # on any line, for example this one.
|
2
|
+
"name" => "HitchHiker's guide to the galaxy",
|
3
|
+
|
4
|
+
"mutes" => [
|
5
|
+
|
6
|
+
"00:08:54.816" , "00:08:59.185", "profanity", "...", "All these people are idiots [...]",
|
7
|
+
"00:09:55.811" , "00:10:00.705", "profanity", "...", "[...] you're serious Um I can't go to Madagascar", # failed default blacky 0.5s
|
8
|
+
"00:12:43.912" , "00:12:45.880", "profanity", "he..", "What the [he..] are those things",
|
9
|
+
"00:16:00.108" , "00:16:03.271", "profanity", "...", "of philosophical blockbusters Where [...] Went Wrong",
|
10
|
+
"00:16:03.378" , "00:16:05.869", "profanity", "...", "Some More of [...]'s Greatest Mistakes",
|
11
|
+
"00:16:05.947" , "00:16:08.279", "profanity", "...", "and Who Is This [...] Person Anyway",
|
12
|
+
"00:17:11.746" , "00:17:16.308", "profanity", "...", "Oh [...] my home My home was demolished",
|
13
|
+
"00:31:59.133" , "00:32:01.158", "profanity", "he..", "What the [he..] are you doing here",
|
14
|
+
"00:46:11.084" , "00:46:14.349", "profanity", "...", "Many races believed it was created by some sort of [...]", # hmm...
|
15
|
+
"00:52:50.198" , "00:52:54.464", "profanity", "he..", "Where the [he..] is Ford",
|
16
|
+
"00:53:35.510" , "00:53:38.274", "profanity", "he..", "What the [he..] have you been doing",
|
17
|
+
|
18
|
+
"01:04:09.076" , "01:04:12.705", "profanity", "he..", "Ow What the [he..] is that",
|
19
|
+
"01:36:19.675" , "01:36:25.006", "profanity", "...", "For [...]'s sake stop Cease fire", # modified...
|
20
|
+
|
21
|
+
],
|
22
|
+
|
23
|
+
"blank_outs" => [
|
24
|
+
"00:21:02.5" , "00:21:08.5", "violence", "smashing crab",
|
25
|
+
],
|
26
|
+
|
27
|
+
"volume_name" => "HGG0NND1",
|
28
|
+
"disk_unique_id" => "311b9d17|aef5cad0",
|
29
|
+
"dvd_title_track" => "12", # 6520.833
|
30
|
+
# "not edited out stuff" => "some violence",
|
31
|
+
# "closing thoughts" => "still...",
|
32
|
+
"mplayer_dvd_splits" => ["3152.6", "4192.0"],
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# comments can go after a # on any line, for example this one.
|
2
|
+
"name" => "snow white and the seven dwarfs",
|
3
|
+
|
4
|
+
"mutes" => [
|
5
|
+
# an example line, uncomment the leading "#" to make it active
|
6
|
+
# "0:00:01.0", "0:00:02.0", "profanity", "da..",
|
7
|
+
],
|
8
|
+
|
9
|
+
"blank_outs" => [
|
10
|
+
# an example line, uncomment the leading "#" to make it active
|
11
|
+
# "00:03:00.0" , "00:04:00.0", "violence", "of some sort",
|
12
|
+
],
|
13
|
+
|
14
|
+
"volume_name" => "Snow_White",
|
15
|
+
"disk_unique_id" => "4a3cd891|ab315d08",
|
16
|
+
"dvd_title_track" => "1",# "not edited out stuff" => "some violence",
|
17
|
+
# "closing thoughts" => "still...",
|
18
|
+
# "mplayer_dvd_splits" => ["59:59", "1:04:59"], # it does have some...
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: sensible-cinema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.24.
|
5
|
+
version: 0.24.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Roger Pack
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-07-
|
13
|
+
date: 2011-07-12 00:00:00 -06:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -296,6 +296,7 @@ files:
|
|
296
296
|
- template_bats/RUN SENSIBLE CINEMA CLICK HERE.bat
|
297
297
|
- template_bats/_DO_NOT_RUN_IT_FROM_HERE_DOWNLOAD_THE_RELEASE_ZIP_FROM_SOURCEFORGE_INSTEAD
|
298
298
|
- template_bats/advanced--create or edit sensible cinema edit list files.bat
|
299
|
+
- template_bats/run-upconverting-video-player.bat
|
299
300
|
- todo.build_library.txt
|
300
301
|
- todo.inventionzy.txt
|
301
302
|
- todo.open_edl_list_org.txt
|
@@ -322,8 +323,11 @@ files:
|
|
322
323
|
- zamples/edit_decision_lists/dvds/bob the builder pets in a pickle.txt
|
323
324
|
- zamples/edit_decision_lists/dvds/bobs_big_plan.txt
|
324
325
|
- zamples/edit_decision_lists/dvds/cool runnings.txt
|
326
|
+
- zamples/edit_decision_lists/dvds/edls_being_edited/airplane_edited.txt
|
325
327
|
- zamples/edit_decision_lists/dvds/edls_being_edited/bambi.txt
|
326
328
|
- zamples/edit_decision_lists/dvds/edls_being_edited/edl_for_unit_tests.txt
|
329
|
+
- zamples/edit_decision_lists/dvds/edls_being_edited/flight_of_the_navigator.txt
|
330
|
+
- zamples/edit_decision_lists/dvds/edls_being_edited/hitchhiker's_guide_to_the_galaxy.txt
|
327
331
|
- zamples/edit_decision_lists/dvds/edls_being_edited/iq.txt
|
328
332
|
- zamples/edit_decision_lists/dvds/edls_being_edited/other_side_of_heaven.txt
|
329
333
|
- zamples/edit_decision_lists/dvds/edls_being_edited/snow_white_and_the_7_dwarfs_1937.txt
|
@@ -337,6 +341,7 @@ files:
|
|
337
341
|
- zamples/edit_decision_lists/dvds/narnia_voyage_of_the_dawn_treader.txt
|
338
342
|
- zamples/edit_decision_lists/dvds/pack_wedding_2007-03-03.txt
|
339
343
|
- zamples/edit_decision_lists/dvds/sintel_open_source_blender.txt
|
344
|
+
- zamples/edit_decision_lists/dvds/snow_white_and_the_seven_dwarfs.txt
|
340
345
|
- zamples/edit_decision_lists/dvds/tron_legacy.txt
|
341
346
|
- zamples/edit_decision_lists/dvds/turn_around_alma_younger.txt
|
342
347
|
- zamples/edit_decision_lists/netflix_instant/greatest_story_ever_told_netflix.txt
|