sensible-cinema 0.23.0 → 0.23.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +24 -25
- data/Rakefile +5 -10
- data/TODO +32 -29
- data/VERSION +1 -1
- data/bin/sensible-cinema +216 -102
- data/change_log_with_feature_list.txt +5 -0
- data/go.sh +1 -1
- data/how_to_get_files_from_dvd.txt +24 -0
- data/is_it_legal_to_copy_dvds.txt +12 -12
- data/lib/drive_info.rb +11 -8
- data/lib/edl_parser.rb +9 -8
- data/lib/file_chooser.rb +1 -3
- data/lib/mencoder_wrapper.rb +6 -6
- data/lib/subtitle_profanity_finder.rb +0 -4
- data/lib/swing_helpers.rb +17 -6
- data/sensible-cinema.gemspec +8 -4
- data/spec/edl_parser.spec.rb +5 -6
- data/spec/mencoder_wrapper.spec.rb +6 -5
- data/spec/notes +7 -1
- data/spec/sensible_cinema_gui.spec.rb +62 -29
- data/todo.inventionzy.txt +1 -0
- data/todo.open_edl_list_org.txt +2 -0
- data/todo.propaganda +1 -0
- data/www/index.html +2 -1
- data/zamples/edit_decision_lists/dvds/COOL_RUNNINGS.txt b/data/zamples/edit_decision_lists/dvds/cool → runnings.txt +0 -0
- data/zamples/edit_decision_lists/dvds/edl_for_unit_tests.txt +19 -0
- data/zamples/edit_decision_lists/dvds/sintel_open_source_blender.txt +3 -3
- data/zamples/edit_decision_lists/{netflix → netflix_instant}/greatest_story_ever_told_netflix.txt +0 -0
- metadata +43 -31
- data/lib/edl_converter.rb +0 -34
data/go.sh
CHANGED
@@ -1 +1 @@
|
|
1
|
-
jruby bin/sensible-cinema $1 $2 $3 $4 $5 # --create-mode
|
1
|
+
jruby bin/sensible-cinema $1 $2 $3 $4 $5 # --create-mode just realize that most buttons in create mode probably don't work yet in os x
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Warning: before grabbing any video files from your DVD's,
|
2
|
+
please consult the is_it_legal_to_copy_dvds.txt file to
|
3
|
+
check for legal ramifications. Don't do anything illegal in
|
4
|
+
your country.
|
5
|
+
|
6
|
+
Basically, sensible cinema affords you 2 options.
|
7
|
+
|
8
|
+
Either stick the DVD in then click the "realtime play" button.
|
9
|
+
Or you can "grab" a video file off a DVD,
|
10
|
+
then Sensible Cinema will take it and slice and dice out the profanity et al,
|
11
|
+
creating for you an edited version of the video file (for an example,
|
12
|
+
you could download the Big Buck Bunny DVD ISO, and try
|
13
|
+
it out on that [1]).
|
14
|
+
|
15
|
+
Sensible Cinema only accepts raw "unencrypted" movie streams,
|
16
|
+
so you're going to have to get the movie file off the DVD somehow first.
|
17
|
+
There are a few options.
|
18
|
+
A couple of ways are to run something similar to that described here [2]
|
19
|
+
(mplayer, or makemkv + tsmuxer)
|
20
|
+
|
21
|
+
Good luck!
|
22
|
+
|
23
|
+
[1] http://www.archive.org/details/BigBuckBunny
|
24
|
+
[2] http://wiki.videolan.org/Rip_DVD#Related
|
@@ -15,33 +15,33 @@ and relies on you to use something else for that, on your own.
|
|
15
15
|
|
16
16
|
It is controversial to use open source software to play/rip commercial DVD's.
|
17
17
|
There are a few conflicting views.
|
18
|
-
Sensible-cinema doesn't actually do any decryption or decoding, nor has any knowledge of it
|
19
|
-
|
20
|
-
as to whether the DVD was originally encrypted or not, we
|
21
|
-
some other means" philosophy.
|
22
|
-
You can ask the authors of the ripping programs if
|
18
|
+
Sensible-cinema doesn't actually do any decryption or decoding, nor has any knowledge of how it occurred
|
19
|
+
originally.
|
20
|
+
It doesn't even have knowledge as to whether the DVD was originally encrypted or not, we choose a
|
21
|
+
"you have to do the ripping through some other means" philosophy, to avoid legal issues.
|
22
|
+
You can ask the authors of the ripping programs you use if their software is legal. Apparently
|
23
23
|
libdvdcss (which the other programs that it calls out to use) has never been legally challenged in court (or so they say),
|
24
24
|
and uses a slightly different algorithm than those that have, so the jury's still out. Possibly
|
25
|
-
it has been challenged in French courts and found legal so it might vary from country to country [4].
|
25
|
+
it has been challenged in French courts and found legal so it might vary from country to country, as well [4].
|
26
26
|
|
27
27
|
Using sensible-cinema also might not be more unethical than ripping your DVD collection to your hard
|
28
|
-
drive so you can "keep your DVD's all in one place" or what not (which might
|
28
|
+
drive so you can "keep your DVD's all in one place" or what not (which might perhaps be termed fair use), since it
|
29
29
|
basically only saves parts from the original concatenated. Only original content is saved. It just happens to be bits and
|
30
30
|
pieces that don't have the profanity.
|
31
31
|
Note also that fair use at times does allow one to "record" things for personal use/backup (for example off the TV).
|
32
|
-
Note that sensible cinema does require the original DVD to be present when using it,
|
33
|
-
at least for watching it/using from within sensible cinema. Certainly do not rip DVD's you don't own.
|
32
|
+
Note also that sensible cinema does require the original DVD to be present when using it, to help enforce legality,
|
33
|
+
at least for watching it/using from within sensible cinema. Certainly, do not rip DVD's you don't own.
|
34
34
|
|
35
35
|
If general, if it's not legal in your country, then don't use it!
|
36
36
|
You are responsible for your actions and use of the program.
|
37
37
|
It is possible that the authors of sensible-cinema are not cupable of anything
|
38
38
|
regarding its use themselves, since they re-distribute no edited media,
|
39
|
-
nor distribute cracking codes. Check your country's rules first.
|
39
|
+
nor distribute cracking codes. Check your country's rules first. You have been warned.
|
40
40
|
|
41
|
-
Note: do not redistribute or re-sell edited DVD's, certainly that is illegal.
|
41
|
+
Note: do not redistribute or re-sell edited DVD's, certainly that is illegal in the US.
|
42
42
|
We have learned from clean flicks that redistributing
|
43
43
|
(well at least renting/selling) edited commercial DVD's is illegal in the US.
|
44
|
-
Please don't redistribute. Consult your lawyer.
|
44
|
+
Please don't redistribute. Consult your lawyer if you have any questions/concerns.
|
45
45
|
DO NOT MAKE ILLEGAL COPIES.
|
46
46
|
USE AT YOUR OWN RISK.
|
47
47
|
|
data/lib/drive_info.rb
CHANGED
@@ -24,17 +24,18 @@ class DriveInfo
|
|
24
24
|
|
25
25
|
def self.md5sum_disk(dir)
|
26
26
|
if OS.mac?
|
27
|
-
|
27
|
+
command = "#{__DIR__}/../vendor/mac_dvdid/bin/dvdid #{dir}"
|
28
28
|
else
|
29
|
-
|
29
|
+
command = "#{__DIR__}/../vendor/dvdid.exe #{dir}"
|
30
30
|
end
|
31
|
-
|
31
|
+
output = `#{command}`
|
32
|
+
puts 'dvdid command failed?' + command unless $?.exitstatus == 0 # hope this accomodates for it barfing...
|
32
33
|
output.strip
|
33
34
|
end
|
34
35
|
|
35
36
|
def self.get_dvd_drives_as_openstruct
|
36
37
|
disks = get_all_drives_as_ostructs
|
37
|
-
disks.select{|d| d.Description =~ /CD-ROM/}
|
38
|
+
disks.select{|d| d.Description =~ /CD-ROM/ && File.exist?(d.Name + "/VIDEO_TS")}
|
38
39
|
end
|
39
40
|
|
40
41
|
def self.get_drive_with_most_space_with_slash
|
@@ -55,16 +56,19 @@ class DriveInfo
|
|
55
56
|
d2.Description = parsed['OpticalDeviceType']
|
56
57
|
d2.MountPoint = parsed['MountPoint']
|
57
58
|
if d2.MountPoint == '/'
|
58
|
-
d2.MountPoint = File.expand_path '~' # better ?
|
59
|
+
d2.MountPoint = File.expand_path '~' # better ? I guess?
|
59
60
|
end
|
60
61
|
d2
|
61
62
|
}
|
62
63
|
else
|
63
64
|
require 'ruby-wmi'
|
64
65
|
disks = WMI::Win32_LogicalDisk.find(:all)
|
65
|
-
disks.map{|d| d2 = OpenStruct.new
|
66
|
+
disks.map{|d| d2 = OpenStruct.new
|
67
|
+
d2.Description = d.Description
|
68
|
+
d2.VolumeName = d.VolumeName
|
69
|
+
d2.Name = d.Name
|
66
70
|
d2.FreeSpace = d.FreeSpace.to_i
|
67
|
-
d2.MountPoint = d.Name[0..2]
|
71
|
+
d2.MountPoint = d.Name[0..2] # needed...
|
68
72
|
d2
|
69
73
|
}
|
70
74
|
end
|
@@ -73,6 +77,5 @@ class DriveInfo
|
|
73
77
|
end
|
74
78
|
|
75
79
|
if $0 == __FILE__
|
76
|
-
require 'pp'
|
77
80
|
p DriveInfo.get_dvd_drives_as_openstruct
|
78
81
|
end
|
data/lib/edl_parser.rb
CHANGED
@@ -15,7 +15,6 @@ 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
18
|
class EdlParser
|
20
19
|
|
21
20
|
def self.parse_file filename, ignore_settings = false
|
@@ -59,9 +58,9 @@ class EdlParser
|
|
59
58
|
out
|
60
59
|
end
|
61
60
|
|
62
|
-
TimeStamp = /(^\d+:\d\d[\d:\.]*$|\d+)/
|
61
|
+
#TimeStamp = /(^\d+:\d\d[\d:\.]*$|\d+)/ # this one also allows for 4444 [?] and also weirdness like "don't kill the nice butterfly 2!" ...
|
62
|
+
TimeStamp = /^\d+:\d\d[\d:\.]*$/
|
63
63
|
# starts with a digit, has at least one colon followed by two digits,then some combo of digits and colons and periods...
|
64
|
-
# or just like 5057 s
|
65
64
|
|
66
65
|
def self.extract_entry! from_this
|
67
66
|
return nil if from_this.length == 0
|
@@ -112,7 +111,6 @@ class EdlParser
|
|
112
111
|
end
|
113
112
|
mutes = incoming["mutes"] || {}
|
114
113
|
blanks = incoming["blank_outs"] || {}
|
115
|
-
p 'incoming', incoming, splits
|
116
114
|
mutes = mutes.map{|k, v| get_secs(k, v, -add_this_to_mutes_beginning, add_this_to_mutes_end, splits) + [:mute]}
|
117
115
|
blanks = blanks.map{|k, v| get_secs(k, v, -add_this_to_mutes_beginning, add_this_to_mutes_end, splits) + [:blank]}
|
118
116
|
combined = (mutes+blanks).sort
|
@@ -189,7 +187,7 @@ class EdlParser
|
|
189
187
|
|
190
188
|
end
|
191
189
|
|
192
|
-
# == 1.8.7 Symbol compat
|
190
|
+
# == 1.8.7 1.9 Symbol compat
|
193
191
|
|
194
192
|
class Symbol
|
195
193
|
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Symbol.html]
|
@@ -199,6 +197,9 @@ class Symbol
|
|
199
197
|
end unless method_defined? :"<=>"
|
200
198
|
end
|
201
199
|
|
202
|
-
if
|
203
|
-
|
204
|
-
|
200
|
+
if $0 == __FILE__
|
201
|
+
p 'syntax: filename'
|
202
|
+
require 'rubygems'
|
203
|
+
require 'sane'
|
204
|
+
p EdlParser.parse_file *ARGV
|
205
|
+
end
|
data/lib/file_chooser.rb
CHANGED
@@ -17,10 +17,8 @@ This file is part of Sensible Cinema.
|
|
17
17
|
=end
|
18
18
|
require 'java'
|
19
19
|
|
20
|
-
module FileChooser
|
20
|
+
module FileChooser # used in the cli only...
|
21
21
|
|
22
|
-
# show a popup dialog prompting for them to select a file
|
23
|
-
# pretty ugly
|
24
22
|
def choose_file(title, use_this_dir = nil)
|
25
23
|
|
26
24
|
fc = java.awt.FileDialog.new(nil, title)
|
data/lib/mencoder_wrapper.rb
CHANGED
@@ -35,16 +35,16 @@ class MencoderWrapper
|
|
35
35
|
# "This will result in a slightly bigger file, but will not cause problems when demuxing or remuxing into other container formats." LODO no harddup ok ???
|
36
36
|
# lodo: can I use ffmpeg to unmux-ify/GOP'ify perhaps?
|
37
37
|
# LODO 24000/1001 ?
|
38
|
-
video_opts = "-vf scale=pullup,softskip,harddup -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"
|
39
|
-
out += "mencoder \"#{this_file.gsub('"', '\\"')}\" -of mpeg -mpegopts format=dvd:tsaf -alang en -nocache -sid 1000 -oac #{audio_codec} #{video_opts} -o #{@big_temp} -dvd-device #{
|
38
|
+
video_opts = "-vf scale=720:480,pullup,softskip,harddup -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"
|
39
|
+
out += "mencoder \"#{this_file.gsub('"', '\\"')}\" -of mpeg -mpegopts format=dvd:tsaf -alang en -nocache -sid 1000 -oac #{audio_codec} #{video_opts} -o #{@big_temp} -dvd-device #{this_file} && echo done_grabbing > #{@big_temp}.done\n"
|
40
40
|
end
|
41
41
|
|
42
|
-
def
|
42
|
+
def calculate_fulli_filename to_here_final_file
|
43
43
|
@big_temp = to_here_final_file + ".fulli_unedited.tmp.mpg"
|
44
44
|
end
|
45
45
|
|
46
46
|
# called from the UI...
|
47
|
-
def get_bat_commands these_settings,
|
47
|
+
def get_bat_commands these_settings, this_from_file, to_here_final_file, start_here = nil, end_here = nil, dvd_title_track = "1", delete_partials = false, require_deletion_entry = false
|
48
48
|
combined = EdlParser.convert_incoming_to_split_sectors these_settings
|
49
49
|
@dvd_title_track = dvd_title_track
|
50
50
|
assert dvd_title_track
|
@@ -59,8 +59,8 @@ class MencoderWrapper
|
|
59
59
|
else
|
60
60
|
previous_end = 0
|
61
61
|
end
|
62
|
-
|
63
|
-
out = get_header
|
62
|
+
calculate_fulli_filename to_here_final_file
|
63
|
+
out = get_header this_from_file, these_settings
|
64
64
|
@idx = 0
|
65
65
|
combined.each {|start, endy, type|
|
66
66
|
if start > previous_end
|
@@ -141,10 +141,6 @@ module SubtitleProfanityFinder
|
|
141
141
|
|
142
142
|
# sanitize
|
143
143
|
for (prof2, (sanitized2, whole_word2)) in all_profanity_combinations
|
144
|
-
if sanitized_glop =~ prof2
|
145
|
-
require 'ruby-debug'
|
146
|
-
#debugger
|
147
|
-
end
|
148
144
|
if sanitized_glop =~ prof2
|
149
145
|
sanitized_glop.gsub!(prof2, sanitized2)
|
150
146
|
end
|
data/lib/swing_helpers.rb
CHANGED
@@ -48,12 +48,22 @@ module SensibleSwing
|
|
48
48
|
self
|
49
49
|
end
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
def simulate_click
|
52
|
+
@block.call
|
53
|
+
end
|
54
|
+
|
55
|
+
def tool_tip= text
|
56
|
+
if text
|
57
|
+
text = "<html>" + text + "</html>"
|
58
|
+
text = text.gsub("\n", "<br/>")
|
59
|
+
end
|
60
|
+
self.set_tool_tip_text text
|
61
|
+
end
|
54
62
|
|
55
63
|
end
|
56
64
|
|
65
|
+
ToolTipManager.sharedInstance().setDismissDelay(java.lang.Integer::MAX_VALUE) # don't timeout tooltips...
|
66
|
+
|
57
67
|
class JFrame
|
58
68
|
def close
|
59
69
|
dispose # sigh
|
@@ -61,6 +71,8 @@ module SensibleSwing
|
|
61
71
|
end
|
62
72
|
|
63
73
|
class JFileChooser
|
74
|
+
# also set_current_directory et al...
|
75
|
+
|
64
76
|
# raises on failure...
|
65
77
|
def go
|
66
78
|
success = show_open_dialog nil
|
@@ -79,8 +91,10 @@ module SensibleSwing
|
|
79
91
|
set_selected_file JFile.new(f)
|
80
92
|
end
|
81
93
|
alias setFile set_file
|
94
|
+
|
82
95
|
end
|
83
96
|
|
97
|
+
# awt...
|
84
98
|
class FileDialog
|
85
99
|
def go
|
86
100
|
show
|
@@ -123,6 +137,3 @@ class String
|
|
123
137
|
end
|
124
138
|
end
|
125
139
|
end
|
126
|
-
|
127
|
-
# code examples
|
128
|
-
# JOptionPane.showInputDialog(nil, "not implemented yet", "not implemented yet", JOptionPane::ERROR_MESSAGE)
|
data/sensible-cinema.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{sensible-cinema}
|
8
|
-
s.version = "0.23.
|
8
|
+
s.version = "0.23.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Roger Pack"]
|
@@ -36,6 +36,7 @@ Gem::Specification.new do |s|
|
|
36
36
|
"goc.bat",
|
37
37
|
"gplv3.txt",
|
38
38
|
"how_to_create_your_own_delete_lists.txt",
|
39
|
+
"how_to_get_files_from_dvd.txt",
|
39
40
|
"is_it_legal_to_copy_dvds.txt",
|
40
41
|
"legal/md5s.txt",
|
41
42
|
"legal/transcript_mute_vlc.txt",
|
@@ -46,7 +47,6 @@ Gem::Specification.new do |s|
|
|
46
47
|
"lib/check_installed_mac.rb",
|
47
48
|
"lib/count_down_timer_jruby_swing.rb",
|
48
49
|
"lib/drive_info.rb",
|
49
|
-
"lib/edl_converter.rb",
|
50
50
|
"lib/edl_parser.rb",
|
51
51
|
"lib/fake_blanker.rb",
|
52
52
|
"lib/file_chooser.rb",
|
@@ -114,12 +114,13 @@ Gem::Specification.new do |s|
|
|
114
114
|
"vendor/readme.txt",
|
115
115
|
"www/index.html",
|
116
116
|
"zamples/edit_decision_lists/category descriptions.txt",
|
117
|
-
"zamples/edit_decision_lists/dvds/COOL_RUNNINGS.txt",
|
118
117
|
"zamples/edit_decision_lists/dvds/Harry Potter 2.txt",
|
119
118
|
"zamples/edit_decision_lists/dvds/bambi.txt",
|
120
119
|
"zamples/edit_decision_lists/dvds/big_buck_bunny_dvd.txt",
|
121
120
|
"zamples/edit_decision_lists/dvds/bob the builder pets in a pickle.txt",
|
122
121
|
"zamples/edit_decision_lists/dvds/bobs_big_plan.txt",
|
122
|
+
"zamples/edit_decision_lists/dvds/cool runnings.txt",
|
123
|
+
"zamples/edit_decision_lists/dvds/edl_for_unit_tests.txt",
|
123
124
|
"zamples/edit_decision_lists/dvds/example_delete_list.txt",
|
124
125
|
"zamples/edit_decision_lists/dvds/happiest baby on the block.txt",
|
125
126
|
"zamples/edit_decision_lists/dvds/how_to_train_your_dragon.txt",
|
@@ -139,7 +140,7 @@ Gem::Specification.new do |s|
|
|
139
140
|
"zamples/edit_decision_lists/dvds/tron_legacy.txt",
|
140
141
|
"zamples/edit_decision_lists/dvds/turn_around_alma_younger.txt",
|
141
142
|
"zamples/edit_decision_lists/dvds/zz_example_delete_list_that_has_no_cuts_in_it.txt",
|
142
|
-
"zamples/edit_decision_lists/
|
143
|
+
"zamples/edit_decision_lists/netflix_instant/greatest_story_ever_told_netflix.txt",
|
143
144
|
"zamples/edit_decision_lists/old_not_yet_updated/example_edit_decision_list.txt",
|
144
145
|
"zamples/edit_decision_lists/old_not_yet_updated/youtube/gummy_bear_song_youtube.txt",
|
145
146
|
"zamples/edit_decision_lists/youtube/demo_mutes.txt",
|
@@ -165,6 +166,7 @@ Gem::Specification.new do |s|
|
|
165
166
|
s.specification_version = 3
|
166
167
|
|
167
168
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
169
|
+
s.add_runtime_dependency(%q<os>, [">= 0.9.3"])
|
168
170
|
s.add_runtime_dependency(%q<sane>, [">= 0.22.0"])
|
169
171
|
s.add_runtime_dependency(%q<rdp-win32screenshot>, [">= 0.0.7.3"])
|
170
172
|
s.add_runtime_dependency(%q<mini_magick>, [">= 3.1"])
|
@@ -182,6 +184,7 @@ Gem::Specification.new do |s|
|
|
182
184
|
s.add_runtime_dependency(%q<jeweler>, [">= 0"])
|
183
185
|
s.add_runtime_dependency(%q<rake>, [">= 0"])
|
184
186
|
else
|
187
|
+
s.add_dependency(%q<os>, [">= 0.9.3"])
|
185
188
|
s.add_dependency(%q<sane>, [">= 0.22.0"])
|
186
189
|
s.add_dependency(%q<rdp-win32screenshot>, [">= 0.0.7.3"])
|
187
190
|
s.add_dependency(%q<mini_magick>, [">= 3.1"])
|
@@ -200,6 +203,7 @@ Gem::Specification.new do |s|
|
|
200
203
|
s.add_dependency(%q<rake>, [">= 0"])
|
201
204
|
end
|
202
205
|
else
|
206
|
+
s.add_dependency(%q<os>, [">= 0.9.3"])
|
203
207
|
s.add_dependency(%q<sane>, [">= 0.22.0"])
|
204
208
|
s.add_dependency(%q<rdp-win32screenshot>, [">= 0.0.7.3"])
|
205
209
|
s.add_dependency(%q<mini_magick>, [">= 3.1"])
|
data/spec/edl_parser.spec.rb
CHANGED
@@ -37,7 +37,7 @@ describe EdlParser do
|
|
37
37
|
"missing_content"=>"this doesn't list some mild name calling",
|
38
38
|
"title"=>"Forever Strong", "source"=>"Hulu", "url"=>"http://www.byutv.org/watch/1790-100",
|
39
39
|
"whatever_else_you_want"=>"this is the old version of the film",
|
40
|
-
"disk_unique_id"=>"
|
40
|
+
"disk_unique_id"=>"1234|4678"
|
41
41
|
}
|
42
42
|
E.parse_string(string, nil).should == expected
|
43
43
|
end
|
@@ -60,17 +60,16 @@ describe EdlParser do
|
|
60
60
|
|
61
61
|
it "should detect timestamps well" do
|
62
62
|
t = EdlParser::TimeStamp
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
"00:00:00".should match(t)
|
63
|
+
for ts in ["2:01", "1:01.5", "00:00:00.5","00:00:00", "1:23", "01:23"]
|
64
|
+
raise ts unless t =~ ts
|
65
|
+
end
|
67
66
|
"5".should_not match(t)
|
68
67
|
"category".should_not match(t)
|
69
68
|
end
|
70
69
|
|
71
70
|
it "should parse a real file" do
|
72
71
|
E.parse_file(File.expand_path(__dir__) + "/../zamples/edit_decision_lists/dvds/bobs_big_plan.txt").should ==
|
73
|
-
{"title"=>"Bob's Big Plan", "dvd_title_track"=>1, "other notes"=>"could use more nit-picking of the song, as some parts seem all right in the end", "
|
72
|
+
{"title"=>"Bob's Big Plan", "dvd_title_track"=>1, "other notes"=>"could use more nit-picking of the song, as some parts seem all right in the end", "mutes"=>[["00:03.8", "01:03", "theme song is a bit raucous at times"], ["28:13.5", "29:40", "theme song again"], ["48:46", "49:08", "theme song again"]], "blank_outs"=>[]}
|
74
73
|
end
|
75
74
|
|
76
75
|
it "should be able to use personal preferences to decide which edits to make" do
|
@@ -43,17 +43,18 @@ describe MencoderWrapper do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should have what looks like a working mencoder grab command" do
|
46
|
-
@out.
|
47
|
-
@out.
|
46
|
+
@out.should_not match(/dvd:\//)
|
47
|
+
@out.should_not match(/dvdnav:\//)
|
48
|
+
@out.should match(/mencoder.*lavcopt.*keyint=1/)
|
48
49
|
use_mpg2_fulli_unedited = true
|
49
50
|
if use_mpg2_fulli_unedited
|
50
|
-
@out.should match(/
|
51
|
+
@out.should match(/mencoder.*lavcopt.*mpeg2video/)
|
51
52
|
@out.should match(/autoaspect/) # try to preserve aspect
|
52
53
|
else
|
53
|
-
@out.should match(/
|
54
|
+
@out.should match(/mencoder.*-ovc copy/)
|
54
55
|
end
|
55
56
|
# "poor" audio for certain DVD's <sigh>
|
56
|
-
@out.should match(/
|
57
|
+
@out.should match(/mencoder.*-oac lavc/)
|
57
58
|
end
|
58
59
|
|
59
60
|
it "should not double setting params" do
|
data/spec/notes
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
up next:
|
2
2
|
lighning exact frame to compare the two fulli's...
|
3
3
|
|
4
|
+
== XBMC not need a plugin? ==
|
5
|
+
|
6
|
+
http://forum.xbmc.org/showthread.php?t=28795 XBMC doesn't support real-time DVD EDL playback at all <sniff>
|
7
|
+
ps3ms edl maybe though...
|
8
|
+
|
4
9
|
== subtitle accuracy ==
|
10
|
+
|
5
11
|
narnia dawn treader had 1 subtitle that was "hand crafted", had the wrong timestamps, but was more accurate.
|
6
12
|
The several others were accurate though.
|
7
13
|
|
8
|
-
==
|
14
|
+
== auto subtitle download for a DVD ==
|
9
15
|
|
10
16
|
opensubtitles' viewer gets "nothing" for subtitles of DVD's...smplayer requires you to manually search, too...
|
11
17
|
splayer doesn't seem to attempt auto-download either of subs for DVD's. Feels so nice tho :P
|
@@ -28,10 +28,10 @@ module SensibleSwing
|
|
28
28
|
MainWindow.new.dispose# doesn't crash :)
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
Test_DVD_ID = 'deadbeef|8b27d001'
|
32
32
|
|
33
33
|
it "should auto-select a EDL if it matches a DVD's title" do
|
34
|
-
MainWindow.new.single_edit_list_matches_dvd(
|
34
|
+
MainWindow.new.single_edit_list_matches_dvd(Test_DVD_ID).should_not be nil
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should not auto-select if you pass it nil" do
|
@@ -116,11 +116,11 @@ module SensibleSwing
|
|
116
116
|
before do
|
117
117
|
@subject = MainWindow.new
|
118
118
|
@subject.stub!(:choose_dvd_drive) {
|
119
|
-
["mock_dvd_drive", "Volume",
|
119
|
+
["mock_dvd_drive", "Volume", Test_DVD_ID] # happiest baby on the block
|
120
120
|
}
|
121
121
|
@subject.stub!(:get_mencoder_commands) { |*args|
|
122
122
|
args[-5].should match(/abc/)
|
123
|
-
@
|
123
|
+
@get_mencoder_commands_args = args
|
124
124
|
'fake get_mencoder_commands'
|
125
125
|
}
|
126
126
|
@subject.stub!(:new_filechooser) {
|
@@ -165,6 +165,8 @@ module SensibleSwing
|
|
165
165
|
class FakeFileChooser
|
166
166
|
def set_title x; end
|
167
167
|
def set_file y; end
|
168
|
+
def set_current_directory x; end
|
169
|
+
def get_current_directory ; 'a great dir!'; end
|
168
170
|
def go
|
169
171
|
'abc'
|
170
172
|
end
|
@@ -174,13 +176,26 @@ module SensibleSwing
|
|
174
176
|
def click_button(name)
|
175
177
|
@subject.instance_variable_get(name).simulate_click
|
176
178
|
end
|
179
|
+
|
180
|
+
it "should be able to run system" do
|
181
|
+
@subject.system_non_blocking "ls"
|
182
|
+
end
|
177
183
|
|
178
184
|
it "should be able to do a normal copy to hard drive, edited" do
|
179
|
-
@subject.system_non_blocking "ls"
|
180
185
|
@subject.do_copy_dvd_to_hard_drive(false).should == [false, "abc.fulli_unedited.tmp.mpg"]
|
181
186
|
File.exist?('test_file_to_see_if_we_have_permission_to_write_to_this_folder').should be false
|
182
187
|
end
|
183
188
|
|
189
|
+
it "should prompt twice for filenames--once for the 'to' filename, once for the 'from' filename" do
|
190
|
+
count = 0
|
191
|
+
@subject.stub!(:new_filechooser) {
|
192
|
+
count += 1
|
193
|
+
FakeFileChooser.new
|
194
|
+
}
|
195
|
+
@subject.do_copy_dvd_to_hard_drive(false).should == [false, "abc.fulli_unedited.tmp.mpg"]
|
196
|
+
count.should == 2
|
197
|
+
end
|
198
|
+
|
184
199
|
it "should have a good default title of 1" do
|
185
200
|
@subject.get_title_track({}).should == "1"
|
186
201
|
descriptors = {"dvd_title_track" => "3"}
|
@@ -193,7 +208,7 @@ module SensibleSwing
|
|
193
208
|
}
|
194
209
|
@subject.do_copy_dvd_to_hard_drive(false)
|
195
210
|
@subject.background_thread.join
|
196
|
-
@
|
211
|
+
@get_mencoder_commands_args[-4].should == nil
|
197
212
|
@system_blocking_command.should match /explorer/
|
198
213
|
@system_blocking_command.should_not match /fulli/
|
199
214
|
@played.should == true
|
@@ -208,22 +223,22 @@ module SensibleSwing
|
|
208
223
|
it "should call explorer eventually, if it has to create the fulli file" do
|
209
224
|
@subject.do_copy_dvd_to_hard_drive(true).should == [false, "abc.fulli_unedited.tmp.mpg"]
|
210
225
|
join_background_thread
|
211
|
-
@
|
212
|
-
@
|
226
|
+
@get_mencoder_commands_args[-2].should == "2"
|
227
|
+
@get_mencoder_commands_args[-3].should == "01:00"
|
213
228
|
@system_non_blocking_command.should match /smplayer/
|
214
229
|
@system_non_blocking_command.should_not match /fulli/
|
215
230
|
end
|
216
231
|
|
217
|
-
def
|
232
|
+
def run_preview_section_button_successfully
|
218
233
|
click_button(:@preview_section)
|
219
234
|
join_background_thread
|
220
|
-
@
|
221
|
-
@
|
235
|
+
@get_mencoder_commands_args[-2].should == "2"
|
236
|
+
@get_mencoder_commands_args[-3].should == "01:00"
|
222
237
|
@system_non_blocking_command.should match /smplayer/
|
223
238
|
end
|
224
239
|
|
225
240
|
it "should prompt for start and end times" do
|
226
|
-
|
241
|
+
run_preview_section_button_successfully
|
227
242
|
end
|
228
243
|
|
229
244
|
temp_dir = Dir.tmpdir
|
@@ -250,12 +265,12 @@ module SensibleSwing
|
|
250
265
|
end
|
251
266
|
|
252
267
|
it "should be able to rerun the latest start and end times with the rerun button" do
|
253
|
-
|
254
|
-
old_args = @
|
268
|
+
run_preview_section_button_successfully
|
269
|
+
old_args = @get_mencoder_commands_args
|
255
270
|
old_args.should_not == nil
|
256
|
-
@
|
271
|
+
@get_mencoder_commands_args = nil
|
257
272
|
click_button(:@rerun_preview).join
|
258
|
-
@
|
273
|
+
@get_mencoder_commands_args.should == old_args
|
259
274
|
@system_non_blocking_command.should match(/smplayer/)
|
260
275
|
end
|
261
276
|
|
@@ -276,11 +291,10 @@ module SensibleSwing
|
|
276
291
|
end
|
277
292
|
|
278
293
|
it "should warn if you watch an edited time frame with no edits in it" do
|
279
|
-
@subject.unstub!(:get_mencoder_commands)
|
294
|
+
@subject.unstub!(:get_mencoder_commands) # this time through, let it check for existence of edits...
|
280
295
|
click_button(:@preview_section)
|
281
296
|
@show_blocking_message_dialog_last_arg.should =~ /unable to/
|
282
297
|
@subject.stub!(:get_user_input).and_return('06:00', '07:00')
|
283
|
-
# rspec bug: wrong'ish backtrace: proc { prompt_for_start_and_end_times #}.should_not raise_error LODO
|
284
298
|
click_button(:@preview_section)
|
285
299
|
join_background_thread
|
286
300
|
@system_blocking_command.should == "echo wrote (probably successfully) to abc.avi"
|
@@ -289,7 +303,7 @@ module SensibleSwing
|
|
289
303
|
it "if the .done files exists, watch unedited should call smplayer ja" do
|
290
304
|
FileUtils.touch "abc.fulli_unedited.tmp.mpg.done"
|
291
305
|
@subject.instance_variable_get(:@watch_unedited).simulate_click
|
292
|
-
@system_non_blocking_command.should == "
|
306
|
+
@system_non_blocking_command.should == "smplayer_portable abc.fulli_unedited.tmp.mpg"
|
293
307
|
FileUtils.rm "abc.fulli_unedited.tmp.mpg.done"
|
294
308
|
end
|
295
309
|
|
@@ -332,7 +346,7 @@ module SensibleSwing
|
|
332
346
|
@system_blocking_command.should match(/-dvd-device /)
|
333
347
|
end
|
334
348
|
|
335
|
-
it "should play edl with
|
349
|
+
it "should play edl with extra time for the mutes because of the EDL aspect" do
|
336
350
|
click_button(:@mplayer_edl).join
|
337
351
|
wrote = File.read(MainWindow::EdlTempFile)
|
338
352
|
# normally "378.0 379.1 1"
|
@@ -374,17 +388,16 @@ module SensibleSwing
|
|
374
388
|
count += 1
|
375
389
|
FakeFileChooser.new
|
376
390
|
}
|
377
|
-
@subject.
|
378
|
-
|
379
|
-
count.should == 1
|
391
|
+
3.times { @subject.do_copy_dvd_to_hard_drive(false) }
|
392
|
+
count.should == 2 # else would have been 6...
|
380
393
|
end
|
381
394
|
|
382
395
|
describe 'with unstubbed choose_dvd_drive' do
|
383
396
|
before do
|
384
397
|
DriveInfo.stub!(:get_dvd_drives_as_openstruct) {
|
385
398
|
a = OpenStruct.new
|
386
|
-
|
387
|
-
a.Name = 'a
|
399
|
+
a.VolumeName = 'a dvd name'
|
400
|
+
a.Name = 'a path location'
|
388
401
|
[a]
|
389
402
|
}
|
390
403
|
@subject.unstub!(:choose_dvd_drive)
|
@@ -394,7 +407,7 @@ module SensibleSwing
|
|
394
407
|
count = 0
|
395
408
|
DriveInfo.stub!(:md5sum_disk) {
|
396
409
|
count += 1
|
397
|
-
|
410
|
+
Test_DVD_ID
|
398
411
|
}
|
399
412
|
@subject.choose_dvd_and_edl_for_it
|
400
413
|
@subject.choose_dvd_and_edl_for_it
|
@@ -402,15 +415,21 @@ module SensibleSwing
|
|
402
415
|
end
|
403
416
|
|
404
417
|
it "should prompt you if you need to insert a dvd" do
|
405
|
-
|
418
|
+
DriveInfo.stub!(:get_dvd_drives_as_openstruct) {
|
419
|
+
a = OpenStruct.new
|
420
|
+
#a.VolumeName = 'a dvd name' # we "don't have one" for this test...
|
421
|
+
a.Name = 'a path location'
|
422
|
+
[a]
|
423
|
+
}
|
424
|
+
proc {@subject.choose_dvd_drive}.should raise_error(SystemExit)
|
406
425
|
@show_blocking_message_dialog_last_arg.should_not be nil
|
407
426
|
end
|
408
427
|
end
|
409
428
|
|
410
429
|
it "should not show the normal buttons in create mode" do
|
411
|
-
MainWindow.new.buttons.length.should == 3 # exit button
|
430
|
+
MainWindow.new.buttons.length.should == 3 # exit button plus two normal buttons
|
412
431
|
ARGV << "--create-mode"
|
413
|
-
MainWindow.new.buttons.length.should ==
|
432
|
+
MainWindow.new.buttons.length.should == 15 # all of them :P
|
414
433
|
ARGV.pop # test cleanup--why not :)
|
415
434
|
end
|
416
435
|
|
@@ -434,6 +453,20 @@ module SensibleSwing
|
|
434
453
|
end
|
435
454
|
end
|
436
455
|
|
456
|
+
it "should be able to parse an srt for ya" do
|
457
|
+
@subject.stub!(:new_filechooser) {
|
458
|
+
fc = FakeFileChooser.new
|
459
|
+
fc.stub!(:go) {
|
460
|
+
'spec/dragon.srt'
|
461
|
+
}
|
462
|
+
fc
|
463
|
+
}
|
464
|
+
file = SensibleSwing::MainWindow::EdlTempFile
|
465
|
+
FileUtils.rm_rf file
|
466
|
+
click_button(:@parse_srt)
|
467
|
+
assert File.read(file).contain? "deitys"
|
468
|
+
end
|
469
|
+
|
437
470
|
end # describe MainWindow
|
438
471
|
|
439
472
|
end
|