sensible-cinema 0.19.1 → 0.19.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +4 -0
- data/LICENSE.TXT +7 -6
- data/README +7 -5
- data/RUN SENSIBLE CINEMA CLICK HERE.bat +2 -1
- data/TODO +24 -16
- data/VERSION +1 -1
- data/bin/sensible-cinema +28 -18
- data/create or edit sensible cinema decision list files.bat +2 -1
- data/lib/edl_parser.rb +11 -0
- data/lib/mencoder_wrapper.rb +8 -6
- data/lib/mplayer_edl.rb +1 -1
- data/lib/swing_helpers.rb +3 -3
- data/lib/vlc_programmer.rb +0 -8
- data/sensible-cinema.gemspec +1 -1
- data/spec/edl_parser.spec.rb +4 -0
- data/spec/mencoder_wrapper.spec.rb +13 -6
- data/spec/mplayer_edl.spec.rb +0 -1
- data/spec/sensible_cinema_gui.spec.rb +37 -10
- metadata +2 -2
data/ChangeLog
CHANGED
data/LICENSE.TXT
CHANGED
@@ -23,6 +23,7 @@ It's about the same as using VLC media player to watch a DVD, which also uses li
|
|
23
23
|
Also note that if you watch an edited DVD in a commercial DVD player, your are using a DVD player that conforms
|
24
24
|
with encryption specifications, so that might have some sway.
|
25
25
|
Note also that fair use at times does allow one to "record" things for personal use/backup (for example off the TV).
|
26
|
+
Note that sensible cinema does require the original DVD to be present when using it, also.
|
26
27
|
|
27
28
|
If general, if it's not legal in your country, then don't use it!
|
28
29
|
You are responsible for your actions and use of this program.
|
@@ -31,16 +32,16 @@ regarding its use themselves, since they re-distribute no edited media,
|
|
31
32
|
nor distribute cracking codes. Check your country's rules first.
|
32
33
|
If it's illegal, don't use it!
|
33
34
|
|
34
|
-
Note: do not redistribute/re-sell edited
|
35
|
-
redistributing edited commercial DVD's is
|
36
|
-
is more legal, since you can get the DVD's from wherever you want, and
|
37
|
-
|
35
|
+
Note: do not redistribute/re-sell edited DVD's. We have learned the hard way from clean flicks that
|
36
|
+
redistributing edited commercial DVD's is against copyright in the US. We hope that sensible-cinema
|
37
|
+
is more legal, since you can get the DVD's from wherever you want, and keep the original.
|
38
|
+
Please don't redistribute. If creating copies of commercial DVD's is illegal
|
38
39
|
in your country, then don't do it! Use the "watch in realtime" option.
|
39
40
|
|
40
41
|
DO NOT MAKE ILLEGAL COPIES.
|
41
42
|
|
42
|
-
In terms of copyright, it could be legal under the The Family Home Movie Act of 2005,
|
43
|
-
at least in the United States, when viewed using the "playlist" option (v 0.10'ish, then later removed).
|
43
|
+
In terms of copyright, it could be legal under the The Family Home Movie Act of 2005,
|
44
|
+
at least in the United States, when viewed using the "playlist" option (v 0.10'ish, then later removed), or the "realtime" option (0.18.0'ish +).
|
44
45
|
In general, if I have the original DVD sitting next to my TV, I don't feel bad about watching
|
45
46
|
its edited copy, but please consult a laywer first if you have any concerns.
|
46
47
|
|
data/README
CHANGED
@@ -166,20 +166,22 @@ If it says "audio problem try pcm" then you can add
|
|
166
166
|
"audio_codec" => "lavc"
|
167
167
|
to your EDL and try again.
|
168
168
|
|
169
|
-
Also if your DVD playback has no audio, try the "lavc" setting, above. And report it (see feedback).
|
170
|
-
|
171
169
|
It can fail also because a deletion is past end of DVD, or
|
172
170
|
Also note that if your DVD has scratches that cause it to skip, the time signatures will be off after that point,
|
173
171
|
so clean your discs and try again!
|
174
172
|
|
175
173
|
Also you could try a different computer (desktop computers' DVD drives seem to work better at times than laptops')
|
176
174
|
|
175
|
+
Too slow? One big speedup would be getting a faster hard drive (like an SSD). A second might be to get a faster DVD drive.
|
176
|
+
I'm not certain but I don't believe that a faster cpu (or even dual core, etc.), will currently help much,
|
177
|
+
though it might like 3% or something.
|
177
178
|
|
178
179
|
== Feedback ==
|
179
180
|
|
180
181
|
Feedback, including feature requests, comments, etc. welcome.
|
181
182
|
|
182
|
-
http://
|
183
|
-
|
183
|
+
Mailing List: http://groups.google.com/group/sensible-cinema
|
184
|
+
|
184
185
|
If you're a developer and want to help out with programmming it, please do!
|
185
|
-
|
186
|
+
Source code: http://github.com/rdp/sensible-cinema (create an issue for any feature requests/bugs)
|
187
|
+
or e-mail rogerdpack@gmail.com
|
@@ -2,5 +2,6 @@
|
|
2
2
|
@rem disable any local rubyopt settings...
|
3
3
|
@set RUBYOPT=
|
4
4
|
@echo This window will display lots of debug message output!
|
5
|
-
@
|
5
|
+
@java -version || echo need to install java first && pause
|
6
|
+
@cd sensible-cinema && java -cp "./vendor/cache/jruby-complete-1.5.5.jar" org.jruby.Main bin\sensible-cinema || echo ERROR. Please look for error message, above, and report back the error you see, or fix it && pause
|
6
7
|
@rem taskkill /f /im mencoder.exe
|
data/TODO
CHANGED
@@ -2,25 +2,21 @@
|
|
2
2
|
|
3
3
|
== up next release ==
|
4
4
|
|
5
|
-
edit lists
|
6
|
-
cool runnings
|
7
|
-
|
8
|
-
|
5
|
+
edit lists actually *work*:
|
6
|
+
cool runnings
|
7
|
+
temple
|
8
|
+
cars
|
9
|
+
HP
|
9
10
|
|
10
11
|
== slightly lower than that, somewhat ordered ==
|
11
12
|
|
12
|
-
@license: requires legal DVD's to be present
|
13
|
-
can you forceidx on the original copy and have mplayer replay EDL in realtime accurately or not?
|
14
13
|
linearize edl's
|
15
14
|
don't use them linear, just linearize
|
16
15
|
not this release
|
17
|
-
|
18
|
-
edit lists:
|
19
|
-
temple
|
20
|
-
cars
|
21
16
|
compare computer DVD timings with physical player's timings...
|
22
17
|
if same, add imdb todo's up here
|
23
|
-
mpeg is lossy (at least my current one pass conversion is)
|
18
|
+
mpeg is lossy (at least my current one pass conversion still is...)
|
19
|
+
frame accurate splitter
|
24
20
|
check the DVD burning experience too...
|
25
21
|
could check if DVD Flick handles *oversize* files well, for information sake
|
26
22
|
partner for filters (Jon, Karlie if interested...give beta)
|
@@ -30,18 +26,29 @@
|
|
30
26
|
only after linearize
|
31
27
|
beta release/rinse and repeat with various ppl (once it's releasable...)
|
32
28
|
a real'ish-er website
|
33
|
-
|
34
|
-
button
|
29
|
+
link to ML
|
30
|
+
add button "upload/mail/submit" to ML [?]
|
35
31
|
play a bigger noise when totally done...(dvd flick'ish...)
|
36
32
|
propaganda-ize
|
37
33
|
advertise in christian places
|
38
34
|
blogs that have ever mentioned clearplay :P
|
39
35
|
free google adwords (?)
|
40
36
|
advertise urug, ruby flow :)
|
41
|
-
add they 'play from unedited till it hits the first bad spot, if
|
37
|
+
add they 'play from unedited from grab till it hits the first bad spot', if useful [?]
|
38
|
+
fix edl_parser spec
|
42
39
|
|
43
40
|
== DVD backlog (unordered, some very low prio, basically never do) ==
|
44
41
|
|
42
|
+
can you forceidx on the original copy and have mplayer replay EDL in realtime accurately or not, with audio?
|
43
|
+
if not somehow, wait till video falls through, then see if I can...do something here with audio...yipers..
|
44
|
+
sound accurate?
|
45
|
+
back to audio copy? huh?
|
46
|
+
calculating disk's unique id... -> gui somewhere
|
47
|
+
@dvd flick: auto-detect the aspect ratio, if possible (?)
|
48
|
+
detect disks have changed, re-query.
|
49
|
+
ffmpeg handle 3F2R audio [sigh] [cars, should work with temple at lavc, too, bob dvd's are dual, I think...hmm...]
|
50
|
+
"preview edited in a wholly blank section that includes an audio section should fail"
|
51
|
+
an 'always skip mutes' option for paranoia.
|
45
52
|
dvdnav versus dvd for mplayer edl?
|
46
53
|
disallow choosing empty drive? fail more gracefully? (issue 11)
|
47
54
|
some status bar that shows which DVD is in currently, how many match it, et al (pre button)
|
@@ -70,7 +77,7 @@
|
|
70
77
|
several "play now" options...without a navigator of course :)
|
71
78
|
visualbasic-like playlist
|
72
79
|
one line at a time :P
|
73
|
-
provide link for cheap DVD decoder if
|
80
|
+
provide link for cheap DVD decoder if they lack one :)
|
74
81
|
"round conservatively, write no file" playback
|
75
82
|
mplayer batch (playlist?)
|
76
83
|
"round conservatively, yes write file"
|
@@ -164,10 +171,11 @@ report to jruby "when one thread dies, the GUI becomes unresponsive" (and others
|
|
164
171
|
a "certified clean" list
|
165
172
|
advertise my "splitting joining" google doc page. also test the various options there for accurateness :)
|
166
173
|
check for "newer version available" or not...
|
167
|
-
buy blu-ray decrypter, try it out.
|
174
|
+
buy blu-ray decrypter, and drive, try it out.
|
168
175
|
|
169
176
|
== random non-DVD 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). ==
|
170
177
|
|
178
|
+
copy to one drive, write to another, for speedup
|
171
179
|
fade in/fade out volume, video
|
172
180
|
make the other stuff work again, since I no longer use YAML...
|
173
181
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.19.
|
1
|
+
0.19.2
|
data/bin/sensible-cinema
CHANGED
@@ -81,7 +81,7 @@ module SensibleSwing
|
|
81
81
|
super "Sensible-Cinema"
|
82
82
|
if !(Storage['main_license_accepted'] == VERSION)
|
83
83
|
show_blocking_license_accept_dialog 'Sensible Cinema', 'gplv3', 'http://www.gnu.org/licenses/gpl.html'
|
84
|
-
show_blocking_license_accept_dialog 'Sensible Cinema', 'LICENSE file', File.expand_path(File.dirname(__FILE__) + "/../LICENSE.TXT"), 'LICENSE file', 'I acknowledge that I have read the LICENSE file.'
|
84
|
+
show_blocking_license_accept_dialog 'Sensible Cinema', 'LICENSE.TXT file', File.expand_path(File.dirname(__FILE__) + "/../LICENSE.TXT"), 'LICENSE.TXT file', 'I acknowledge that I have read the LICENSE.TXT file.'
|
85
85
|
Storage['main_license_accepted'] = VERSION
|
86
86
|
end
|
87
87
|
|
@@ -147,7 +147,7 @@ module SensibleSwing
|
|
147
147
|
repeat_last_copy_dvd_to_hard_drive
|
148
148
|
}
|
149
149
|
|
150
|
-
@open_list = new_jbutton("Open a Delete List", true)
|
150
|
+
@open_list = new_jbutton("Open/Edit a Delete List", true)
|
151
151
|
@open_list.on_clicked {
|
152
152
|
dialog = FileDialog.new(self, "Pick file to edit")
|
153
153
|
dialog.set_directory EDL_DIR
|
@@ -221,7 +221,7 @@ EOL
|
|
221
221
|
end
|
222
222
|
|
223
223
|
def show_blocking_license_accept_dialog program, license_name, license_url_should_also_be_embedded_by_you_in_message, title = 'Confirm Acceptance of License Agreement', message = nil
|
224
|
-
puts 'Please confirm license agreement in
|
224
|
+
puts 'Please confirm license agreement in open window'
|
225
225
|
old = ['no', 'yes', 'ok'].map{|name| 'OptionPane.' + name + 'ButtonText'}.map{|name| [name, UIManager.get(name)]}
|
226
226
|
UIManager.put("OptionPane.yesButtonText", 'Accept')
|
227
227
|
UIManager.put("OptionPane.noButtonText", 'View License')
|
@@ -248,7 +248,7 @@ EOL
|
|
248
248
|
System.exit 1
|
249
249
|
end
|
250
250
|
throw unless returned == 0
|
251
|
-
old.each{|name, old_setting| UIManager.put(name, old_setting)}
|
251
|
+
old.each{|name, old_setting| UIManager.put(name, old_setting)}
|
252
252
|
end
|
253
253
|
|
254
254
|
def check_for_dependencies
|
@@ -301,7 +301,7 @@ EOL
|
|
301
301
|
begin
|
302
302
|
parse_edl(file)["disk_unique_id"] == md5
|
303
303
|
rescue SyntaxError
|
304
|
-
# ignore
|
304
|
+
# ignore poorly formed delete lists for auto choose
|
305
305
|
end
|
306
306
|
}
|
307
307
|
if matching.length == 1
|
@@ -325,6 +325,7 @@ EOL
|
|
325
325
|
|
326
326
|
def show_blocking_message_dialog(message, title = message.split("\n")[0], style= JOptionPane::INFORMATION_MESSAGE)
|
327
327
|
JOptionPane.showMessageDialog(nil, message, title, style)
|
328
|
+
true
|
328
329
|
end
|
329
330
|
|
330
331
|
include_class javax.swing.UIManager
|
@@ -349,19 +350,21 @@ EOL
|
|
349
350
|
edit_list_path = fc.go
|
350
351
|
end
|
351
352
|
raise 'cancelled' unless edit_list_path
|
352
|
-
|
353
|
-
|
353
|
+
[drive, dvd_volume_name, md5sum, edit_list_path, nil]
|
354
|
+
end
|
355
|
+
|
356
|
+
# reload it just in case it has changed on disk
|
357
|
+
edit_list_path = @_choose_dvd_and_edl_for_it[3]
|
358
|
+
descriptors = nil
|
359
|
+
while(!descriptors)
|
354
360
|
begin
|
355
361
|
descriptors = parse_edl edit_list_path
|
356
362
|
rescue SyntaxError => e
|
357
363
|
puts e
|
358
|
-
show_blocking_message_dialog("
|
364
|
+
show_blocking_message_dialog("your file has an error: \n" + edit_list_path + "\n " + e)
|
359
365
|
end
|
360
|
-
end
|
361
|
-
[drive, dvd_volume_name, md5sum, edit_list_path, descriptors]
|
362
366
|
end
|
363
|
-
|
364
|
-
@_choose_dvd_and_edl_for_it[4] = parse_edl(@_choose_dvd_and_edl_for_it[3])
|
367
|
+
@_choose_dvd_and_edl_for_it[-1] = descriptors
|
365
368
|
@_choose_dvd_and_edl_for_it
|
366
369
|
end
|
367
370
|
|
@@ -392,8 +395,9 @@ EOL
|
|
392
395
|
|
393
396
|
# LODO allow for spaces in the save_to filename
|
394
397
|
if should_prompt_for_start_and_end_times
|
395
|
-
# only show
|
396
|
-
@show_block ||= show_blocking_message_dialog("Ok, let's preview just a portion of it. \nNote that you'll want to preview a section that wholly includes a
|
398
|
+
# only show this message once :)
|
399
|
+
@show_block ||= show_blocking_message_dialog("Ok, let's preview just a portion of it. \nNote that you'll want to preview a section that wholly includes a deleted section in it\n For example, if it mutes from second 1 to second 10, you'll want to play from 00:00 to 00:12 or what not.\nAlso note that the first time you preview a section of a video, it will take a long time as it sets up the video for previewing.\nSubsequent previews will be faster, though, as long as you use the same filename.\n
|
400
|
+
Also note that if you change your delete list, you'll need to close, and regenerate the video to see it with your new settings.", "Preview")
|
397
401
|
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)", Storage['start_time'])
|
398
402
|
end_time = get_user_input("At what point in the video would you like to finish your preview? (like 02:00 for ending at the 2 minute mark)", Storage['end_time'])
|
399
403
|
unless start_time and end_time
|
@@ -416,8 +420,8 @@ EOL
|
|
416
420
|
end
|
417
421
|
|
418
422
|
dvd_title_track = get_title_track(descriptors)
|
419
|
-
|
420
|
-
generate_and_run_bat_file save_to, edit_list_path, descriptors, drive, dvd_title, start_time, end_time, dvd_title_track,
|
423
|
+
should_run_mplayer = should_prompt_for_start_and_end_times || exit_early_if_fulli_exists
|
424
|
+
generate_and_run_bat_file save_to, edit_list_path, descriptors, drive, dvd_title, start_time, end_time, dvd_title_track, should_run_mplayer, !ignore_settings
|
421
425
|
[false, fulli] # false means it's running in a background thread :P
|
422
426
|
end
|
423
427
|
|
@@ -425,13 +429,19 @@ EOL
|
|
425
429
|
DriveInfo.get_drive_with_most_space_with_slash
|
426
430
|
end
|
427
431
|
|
432
|
+
# stubbable :)
|
428
433
|
def get_mencoder_commands descriptors, drive, save_to, start_time, end_time, dvd_title_track, require_deletion_entry
|
429
434
|
MencoderWrapper.get_bat_commands descriptors, drive, save_to, start_time, end_time, dvd_title_track, true, require_deletion_entry # delete partials...
|
430
435
|
end
|
431
436
|
|
432
437
|
def generate_and_run_bat_file save_to, edit_list_path, descriptors, drive, dvd_title, start_time, end_time, dvd_title_track, run_mplayer, require_deletion_entry
|
433
438
|
Storage['last_params'] = [save_to, edit_list_path, descriptors, drive, dvd_title, start_time, end_time, dvd_title_track, run_mplayer, require_deletion_entry]
|
434
|
-
|
439
|
+
begin
|
440
|
+
commands = get_mencoder_commands descriptors, drive, save_to, start_time, end_time, dvd_title_track, require_deletion_entry
|
441
|
+
rescue MencoderWrapper::TimingError => e
|
442
|
+
show_blocking_message_dialog("Appears you chose a time frame with no deletion segment in it--please try again:" + e)
|
443
|
+
return
|
444
|
+
end
|
435
445
|
temp_dir = Dir.tmpdir
|
436
446
|
temp_file = temp_dir + '/vlc.temp.bat'
|
437
447
|
File.write(temp_file, commands)
|
@@ -492,7 +502,7 @@ EOL
|
|
492
502
|
def choose_dvd_drive
|
493
503
|
opticals = DriveInfo.get_dvd_drives_as_win32ole
|
494
504
|
show_blocking_message_dialog 'insert dvd first' unless opticals.find{|d| d.VolumeName }
|
495
|
-
names = opticals.map{|d| d.Name + "\\" + " (" + (d.VolumeName || 'Insert DVD and re-
|
505
|
+
names = opticals.map{|d| d.Name + "\\" + " (" + (d.VolumeName || 'Insert DVD and re-start') + ")"}
|
496
506
|
|
497
507
|
if opticals.length != 1
|
498
508
|
dialog = GetDisk.new(self, names)
|
@@ -2,5 +2,6 @@
|
|
2
2
|
@rem disable any local rubyopt settings...
|
3
3
|
@set RUBYOPT=
|
4
4
|
@echo This window will display lots of debug message output!
|
5
|
-
@
|
5
|
+
@java -version || echo need to install java first && pause
|
6
|
+
@cd sensible-cinema && java -cp "./vendor/cache/jruby-complete-1.5.5.jar" org.jruby.Main bin\sensible-cinema --create-mode || echo ERROR. Please look for error message, above, and report back the error you see, or fix it && pause
|
6
7
|
@taskkill /f /im mencoder.exe
|
data/lib/edl_parser.rb
CHANGED
@@ -84,6 +84,7 @@ class EdlParser
|
|
84
84
|
mutes = mutes.map{|k, v| [OverLayer.translate_string_to_seconds(k), OverLayer.translate_string_to_seconds(v) + add_this_to_mutes, :mute]}
|
85
85
|
blanks = blanks.map{|k, v| [OverLayer.translate_string_to_seconds(k), OverLayer.translate_string_to_seconds(v), :blank]}
|
86
86
|
|
87
|
+
combined = (mutes+blanks).sort_by{|entry| entry[0,1]}
|
87
88
|
combined = (mutes+blanks).sort
|
88
89
|
|
89
90
|
combined.each{|s, e, t|
|
@@ -129,4 +130,14 @@ class EdlParser
|
|
129
130
|
}
|
130
131
|
end
|
131
132
|
|
133
|
+
end
|
134
|
+
|
135
|
+
# <= 1.8.7 Symbol compat
|
136
|
+
|
137
|
+
class Symbol
|
138
|
+
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Symbol.html]
|
139
|
+
def <=>(with)
|
140
|
+
return nil unless with.is_a? Symbol
|
141
|
+
to_s <=> with.to_s
|
142
|
+
end unless method_defined? :"<=>"
|
132
143
|
end
|
data/lib/mencoder_wrapper.rb
CHANGED
@@ -19,7 +19,8 @@ This file is part of Sensible Cinema.
|
|
19
19
|
require_relative 'edl_parser'
|
20
20
|
|
21
21
|
class MencoderWrapper
|
22
|
-
|
22
|
+
class TimingError < StandardError
|
23
|
+
end
|
23
24
|
class << self
|
24
25
|
|
25
26
|
def get_header this_drive, these_settings
|
@@ -29,9 +30,9 @@ class MencoderWrapper
|
|
29
30
|
end
|
30
31
|
# video_opts = "-ovc lavc -lavcopts keyint=1" # seems reasonable quality somehow...
|
31
32
|
# equivalent of ffmpeg's -target ntsc-dvd...I think...except that aspect thing terrifies me...
|
32
|
-
audio_codec = these_settings['audio_codec'] || 'copy
|
33
|
+
audio_codec = these_settings['audio_codec'] || 'lavc' # not copy...sniff...
|
33
34
|
video_opts = "-ovc lavc -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=1:vstrict=0:acodec=ac3:abitrate=192:autoaspect -ofps 30000/1001"
|
34
|
-
out + "call mencoder dvdnav://#{@dvd_title_track} -of mpeg -mpegopts format=dvd:tsaf -alang en -nocache -sid 1000 -oac #{audio_codec} #{video_opts} -
|
35
|
+
out + "call mencoder dvdnav://#{@dvd_title_track} -of mpeg -mpegopts format=dvd:tsaf -alang en -nocache -sid 1000 -oac #{audio_codec} #{video_opts} -o #{@big_temp} -dvd-device #{this_drive} && echo got_file > #{@big_temp}.done\n"
|
35
36
|
end
|
36
37
|
|
37
38
|
def calculate_final_filename to_here_final_file
|
@@ -48,7 +49,7 @@ class MencoderWrapper
|
|
48
49
|
start_here = OverLayer.translate_string_to_seconds(start_here)
|
49
50
|
end_here = OverLayer.translate_string_to_seconds(end_here)
|
50
51
|
combined.select!{|start, endy, type| start > start_here && endy < end_here }
|
51
|
-
raise "unable to find deletion entry between #{start_here} and #{end_here}" if require_deletion_entry && combined.length == 0
|
52
|
+
raise TimingError.new("unable to find deletion entry between #{start_here} and #{end_here}") if require_deletion_entry && combined.length == 0
|
52
53
|
# it's relative now, since we rip from not the beginning
|
53
54
|
previous_end = start_here
|
54
55
|
else
|
@@ -73,10 +74,11 @@ class MencoderWrapper
|
|
73
74
|
partials = (1..@idx).map{|n| "#{to_here_final_file}.#{n}.avi"}
|
74
75
|
to_here_final_file = to_here_final_file + ".avi"
|
75
76
|
if File.exist? to_here_final_file
|
76
|
-
FileUtils.rm to_here_final_file # raises on failure...which is what we want I think
|
77
|
+
FileUtils.rm to_here_final_file # raises on deletion failure...which is what we want I think...hopefully.
|
77
78
|
end
|
78
79
|
out += "call mencoder #{partials.join(' ')} -o #{to_here_final_file} -ovc copy -oac copy\n"
|
79
|
-
# LODO only do this if they want to watch it on their computer, with something other than smplayer, or want to make it smaller, as it takes *forever* longer
|
80
|
+
# LODO only do this if they want to watch it on their computer, with something other than smplayer, or want to make it smaller, as it takes *forever* longer to run...
|
81
|
+
# or is ffdshow enough without this?
|
80
82
|
out += "@rem call mencoder -oac lavc -ovc lavc -of mpeg -mpegopts format=dvd:tsaf -vf scale=720:480,harddup -srate 48000 -af lavcresample=48000 -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=18:vstrict=0:acodec=ac3:abitrate=192:aspect=16/9 -ofps 30000/1001 #{partials.join(' ')} -o #{to_here_final_file}\n"
|
81
83
|
|
82
84
|
delete_prefix = delete_partials ? "" : "@rem "
|
data/lib/mplayer_edl.rb
CHANGED
data/lib/swing_helpers.rb
CHANGED
@@ -40,9 +40,9 @@ module SensibleSwing
|
|
40
40
|
begin
|
41
41
|
block.call
|
42
42
|
rescue Exception => e
|
43
|
-
puts 'got fatal exception', e
|
44
|
-
puts e.backtrace.join("\n")
|
45
|
-
System.exit(1) # LODO no exit
|
43
|
+
puts 'got fatal exception in button', e, e.class
|
44
|
+
puts e.backtrace.join("\n"), e
|
45
|
+
System.exit(1) # LODO no exit [?]
|
46
46
|
end
|
47
47
|
end
|
48
48
|
self
|
data/lib/vlc_programmer.rb
CHANGED
@@ -111,11 +111,3 @@ class VLCProgrammer
|
|
111
111
|
|
112
112
|
end
|
113
113
|
|
114
|
-
# <= 1.8.7 compat...
|
115
|
-
class Symbol
|
116
|
-
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Symbol.html]
|
117
|
-
def <=>(with)
|
118
|
-
return nil unless with.is_a? Symbol
|
119
|
-
to_s <=> with.to_s
|
120
|
-
end unless method_defined? :"<=>"
|
121
|
-
end
|
data/sensible-cinema.gemspec
CHANGED
data/spec/edl_parser.spec.rb
CHANGED
@@ -100,4 +100,8 @@ describe EdlParser do
|
|
100
100
|
E.parse_string('"mutes"=>["0:33", "0:34"]', 'filename', [], true)['mutes'].should == []
|
101
101
|
end
|
102
102
|
|
103
|
+
it "should sort exactly overlapping segments" do
|
104
|
+
EdlParser.convert_incoming_to_split_sectors({"mutes"=>{105=>145}, "blank_outs"=>{105=>145}}).should == [[105.0, 145.0, :blank]]
|
105
|
+
end
|
106
|
+
|
103
107
|
end
|
@@ -45,7 +45,16 @@ describe MencoderWrapper do
|
|
45
45
|
if use_mpg2_fulli_unedited
|
46
46
|
@out.should match(/dvdnav.*lavcopt.*mpeg2video/)
|
47
47
|
@out.should match(/autoaspect/) # try to preserve aspect
|
48
|
+
else
|
49
|
+
@out.should match(/dvdnav.*-ovc copy/)
|
48
50
|
end
|
51
|
+
# "poor" audio for certain DVD's <sigh>
|
52
|
+
@out.should match(/dvdnav.*-oac lavc/)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should not double setting params" do
|
56
|
+
@out.should_not =~ /-ovc.*-ovc/
|
57
|
+
@out.should_not =~ /-oac.*-oac/
|
49
58
|
end
|
50
59
|
|
51
60
|
it "should avoid subtitles" do
|
@@ -117,12 +126,9 @@ describe MencoderWrapper do
|
|
117
126
|
@out.should_not include(".avi.1 ")
|
118
127
|
end
|
119
128
|
|
120
|
-
it "should concatenate (merge) them all together" do
|
129
|
+
it "should concatenate (merge) them all together into one large conglom file" do
|
121
130
|
@out.should match(/mencoder.* -ovc copy -oac copy/)
|
122
131
|
@out.should match(/mencoder to_here.1.avi/)
|
123
|
-
end
|
124
|
-
|
125
|
-
it "should create a large conglom file" do
|
126
132
|
@out.should match(/mencoder.*-o to_here.avi -ovc copy -oac copy/)
|
127
133
|
end
|
128
134
|
|
@@ -152,9 +158,10 @@ describe MencoderWrapper do
|
|
152
158
|
end
|
153
159
|
|
154
160
|
it "should accept audio_code" do
|
155
|
-
|
161
|
+
# for the audio philes, I guess..
|
162
|
+
settings = {"audio_codec"=>"copy2"}
|
156
163
|
out = MencoderWrapper.get_bat_commands settings, "e:\\", 'to_here.avi'
|
157
|
-
out.should include("-oac
|
164
|
+
out.should include("-oac copy2")
|
158
165
|
end
|
159
166
|
|
160
167
|
def setup
|
data/spec/mplayer_edl.spec.rb
CHANGED
@@ -15,6 +15,8 @@ This file is part of Sensible Cinema.
|
|
15
15
|
You should have received a copy of the GNU General Public License
|
16
16
|
along with Sensible Cinema. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
=end
|
18
|
+
|
19
|
+
require 'ostruct'
|
18
20
|
require File.expand_path(File.dirname(__FILE__) + '/common')
|
19
21
|
load '../bin/sensible-cinema'
|
20
22
|
|
@@ -189,7 +191,7 @@ module SensibleSwing
|
|
189
191
|
temp_dir = Dir.tmpdir
|
190
192
|
|
191
193
|
def join_background_thread
|
192
|
-
@subject.background_thread.join
|
194
|
+
@subject.background_thread.join # must be running...
|
193
195
|
end
|
194
196
|
|
195
197
|
it "should be able to preview unedited" do
|
@@ -211,12 +213,13 @@ module SensibleSwing
|
|
211
213
|
@command.should match(/smplayer/)
|
212
214
|
end
|
213
215
|
|
214
|
-
it "should
|
216
|
+
it "should warn if you watch an edited time frame with no edits in it" do
|
215
217
|
@subject.unstub!(:get_mencoder_commands)
|
216
|
-
|
218
|
+
click_button(:@preview_section)
|
219
|
+
@show_blocking_message_dialog_last_args[0].should =~ /unable to/
|
217
220
|
@subject.stub!(:get_user_input).and_return('06:00', '07:00')
|
218
|
-
# rspec bug: wrong backtrace: proc { prompt_for_start_and_end_times #}.should_not raise_error LODO
|
219
|
-
click_button(:@preview_section)
|
221
|
+
# rspec bug: wrong'ish backtrace: proc { prompt_for_start_and_end_times #}.should_not raise_error LODO
|
222
|
+
click_button(:@preview_section)
|
220
223
|
join_background_thread
|
221
224
|
@system_blocking_command.should == "echo wrote (probably successfully) to abc.avi"
|
222
225
|
end
|
@@ -281,18 +284,34 @@ module SensibleSwing
|
|
281
284
|
count.should == 1
|
282
285
|
end
|
283
286
|
|
284
|
-
|
285
|
-
|
287
|
+
def should_allow_for_changing_file corrupt_file = false
|
288
|
+
with_clean_edl_dir_as 'temp' do
|
286
289
|
File.binwrite('temp/a.txt', "\"disk_unique_id\" => \"abcdef1234\"")
|
287
290
|
@subject.stub!(:choose_dvd_drive) {
|
288
291
|
["mock_dvd_drive", "Volume", "abcdef1234"]
|
289
292
|
}
|
290
293
|
@subject.choose_dvd_and_edl_for_it[4]['mutes'].should == []
|
291
|
-
|
294
|
+
new_file_contents = '"disk_unique_id" => "abcdef1234","mutes"=>["0:33", "0:34"]'
|
295
|
+
new_file_contents = '"a syntax error' if corrupt_file
|
296
|
+
File.binwrite('temp/a.txt', new_file_contents)
|
297
|
+
# it changed!
|
292
298
|
@subject.choose_dvd_and_edl_for_it[4]['mutes'].should_not == []
|
293
299
|
end
|
294
300
|
end
|
295
301
|
|
302
|
+
it "should allow for file to change contents while editing it" do
|
303
|
+
should_allow_for_changing_file
|
304
|
+
end
|
305
|
+
|
306
|
+
it "should prompt you if you re-choose, and your file now has a failure in it" do
|
307
|
+
@subject.stub(:show_blocking_message_dialog) {
|
308
|
+
@got_here = true
|
309
|
+
@subject.stub(:parse_edl) { 'pass the second time through' }
|
310
|
+
}
|
311
|
+
should_allow_for_changing_file true
|
312
|
+
@got_here.should == true
|
313
|
+
end
|
314
|
+
|
296
315
|
it "should only prompt for save to filename once" do
|
297
316
|
count = 0
|
298
317
|
@subject.stub!(:new_filechooser) {
|
@@ -305,14 +324,22 @@ module SensibleSwing
|
|
305
324
|
end
|
306
325
|
|
307
326
|
it "should prompt you if you need to insert a dvd" do
|
308
|
-
|
327
|
+
DriveInfo.stub(:get_dvd_drives_as_win32ole) {
|
328
|
+
a = OpenStruct.new
|
329
|
+
a.Name = 'a name'
|
330
|
+
# no VolumeName though
|
331
|
+
[a]
|
332
|
+
}
|
333
|
+
@subject.unstub!(:choose_dvd_drive)
|
334
|
+
proc {@subject.choose_dvd_drive }.should raise_error(/might not yet have.*in it/)
|
335
|
+
@show_blocking_message_dialog_last_args.should_not be nil
|
309
336
|
end
|
310
337
|
|
311
338
|
it "should not show the normal buttons in create mode" do
|
312
339
|
MainWindow.new.buttons.length.should == 3 # exit button, two normal buttons
|
313
340
|
ARGV << "--create-mode"
|
314
341
|
MainWindow.new.buttons.length.should == 8
|
315
|
-
ARGV.pop # cleanup--why not :)
|
342
|
+
ARGV.pop # test cleanup--why not :)
|
316
343
|
end
|
317
344
|
|
318
345
|
end
|