sensible-cinema 0.16.5 → 0.16.7
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +11 -0
- data/README +2 -1
- data/run_sensible_cinema.bat b/data/RUN SENSIBLE CINEMA CLICK → HERE.bat +0 -0
- data/Rakefile +2 -2
- data/TODO +63 -22
- data/VERSION +1 -1
- data/bin/sensible-cinema +303 -266
- data/run_sensible_cinema_in_create_mode.bat b/data/edit sensible cinema decision list → files.bat +0 -0
- data/lib/mencoder_wrapper.rb +1 -1
- data/lib/swing_helpers.rb +11 -6
- data/sensible-cinema.gemspec +5 -4
- data/spec/sensible_cinema_gui.spec.rb +128 -7
- data/zamples/edit_decision_lists/dvds/COOL_RUNNINGS.txt +11 -0
- metadata +6 -5
data/ChangeLog
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
== 0.16.7 ==
|
2
|
+
|
3
|
+
Accomodate for disks that have scratches in them better.
|
4
|
+
|
5
|
+
== 0.16.5 ==
|
6
|
+
|
7
|
+
Enable "preferences merging" of user preferences with an edit decision list to come up with a new edit decision list for them.
|
8
|
+
The prototypes are there, though it's not enabled.
|
9
|
+
|
1
10
|
== 0.16.0 ==
|
2
11
|
|
3
12
|
Change the YAML style so that it can have filterable categories (disabled for now, but there are unit tests
|
@@ -16,6 +25,8 @@ Note that by at least this version, auto DVD title selection as a parameter has
|
|
16
25
|
Note that by at least this version, it could compute an md5sum of a DVD's IFO files to compute
|
17
26
|
a unique ID for that disk.
|
18
27
|
Note that before this, I was using the volume name to generate filenames.
|
28
|
+
Note that several (even more) revisions ago, I used on screen timestamp OCR and thus tracking to be able to
|
29
|
+
control output of hulu, youtube, etc. (online displayable programs).
|
19
30
|
|
20
31
|
== 0.14.8 ==
|
21
32
|
|
data/README
CHANGED
@@ -32,7 +32,8 @@ Q. How do I watch these on my TV?
|
|
32
32
|
A. You can burn a DVD with it. First create it on your hard drive. Then use
|
33
33
|
Dvd Flick ()a good one for windows) (here's a screencast of using it within http://rogerdpack.t28.net/sensible-cinema)
|
34
34
|
For OS X : iDVD might work well.
|
35
|
-
You
|
35
|
+
You could also drag your laptop over to your TV and hook it in that way.
|
36
|
+
If you're interested in being able to "beam" it from your computer to your game console (ex: PS3) ping me--I might have something in mind.
|
36
37
|
|
37
38
|
== Caveats ==
|
38
39
|
|
File without changes
|
data/Rakefile
CHANGED
@@ -61,7 +61,7 @@ task 'bundle_dependencies' => 'gemspec' do
|
|
61
61
|
|
62
62
|
spec = eval File.read('sensible-cinema.gemspec')
|
63
63
|
dependencies = spec.runtime_dependencies
|
64
|
-
dependencies = dependencies + get_transitive_dependencies(dependencies)
|
64
|
+
dependencies = (dependencies + get_transitive_dependencies(dependencies)).uniq
|
65
65
|
Gem.loaded_specs.select{|name, spec| name == 'os'}
|
66
66
|
FileUtils.rm_rf 'vendor/cache'
|
67
67
|
Dir.mkdir 'vendor/cache'
|
@@ -72,7 +72,7 @@ task 'bundle_dependencies' => 'gemspec' do
|
|
72
72
|
puts 'downloading in jruby-complete.jar file'
|
73
73
|
# jruby complete .jar file
|
74
74
|
Net::HTTP.start("jruby.org.s3.amazonaws.com") { |http|
|
75
|
-
resp = http.get("/downloads/1.5.
|
75
|
+
resp = http.get("/downloads/1.5.6/jruby-complete-1.5.6.jar")
|
76
76
|
puts 'copying it... '
|
77
77
|
open("jruby-complete-1.5.5.jar", "wb") { |file|
|
78
78
|
file.write(resp.body)
|
data/TODO
CHANGED
@@ -1,32 +1,72 @@
|
|
1
1
|
== medium ==
|
2
2
|
|
3
3
|
== probably next up+low prio ==
|
4
|
-
|
4
|
+
|
5
|
+
"non realtime, non edity good" release (family only)
|
6
|
+
add some "||'s" to bat files...
|
7
|
+
popup "you may now watch": bring it to the front...
|
8
|
+
|
5
9
|
== slightly lower than that ==
|
6
10
|
|
11
|
+
note "I first use this to edit my temple movie"
|
12
|
+
move the progressbar to the bottom :)
|
13
|
+
license the first time they run it (gplv3)
|
14
|
+
only pick that filename once per session...
|
15
|
+
note "just a linear editor"
|
16
|
+
note "just a wrapper"
|
7
17
|
partner for filters (Jon, Karlie if interested...give beta)
|
8
18
|
lotsa filters somehow
|
9
19
|
my dvd's
|
20
|
+
friend's dvd's
|
21
|
+
partners'...
|
10
22
|
beta release/rinse and repeat with various ppl (once it's releasable...)
|
11
|
-
can generate mplayer EDL's and play them...hmm...smplayer them?
|
12
|
-
update license too...
|
13
23
|
a real'ish website
|
14
|
-
license the first time they run it (gplv3)
|
15
24
|
checkbox for other license or something?
|
16
|
-
bring that window to the top! (before done dialog...)
|
17
|
-
assert that at least one drive has a DVD in it...
|
18
25
|
compare computer DVD playback with physical player...
|
19
|
-
|
20
|
-
ffmpeg easier
|
26
|
+
overlay audio
|
21
27
|
|
22
28
|
== DVD backlog (unordered, some very low prio) ==
|
23
29
|
|
30
|
+
assert that at least one drive has a DVD in it...maybe loop refuse with message until this?
|
31
|
+
cool runnings:
|
32
|
+
make a copy me--do they now match?
|
33
|
+
get a working copy--do they match?
|
34
|
+
md5sum the full rip files...appears necessary...
|
35
|
+
is it necessary?
|
36
|
+
add button for md5sum
|
37
|
+
propaganda-ize
|
38
|
+
alternative.to
|
39
|
+
blogs that have ever mentioned clearplay
|
40
|
+
play a bigger noise when totally done...(dvd flick has one...)
|
41
|
+
vnc has a good looking license :)
|
42
|
+
unzip instructions?
|
43
|
+
prompt for name, auto populate with volume name
|
44
|
+
LLC before ever pay anyone
|
45
|
+
redo the edit buttons into an ordering of sorts...
|
46
|
+
note that this can corrupt your soul!
|
47
|
+
plus figure out if mplayer is a fast forward feature...
|
48
|
+
several "play now" options...without a navigator of course :)
|
49
|
+
one for watch unedited "as grabbing" (create mode)
|
50
|
+
visualbasic
|
51
|
+
"round conservatively, write no file" way
|
52
|
+
mplayer batch (playlist?)
|
53
|
+
"round conservatively, yes write file" (+1 you track it)
|
54
|
+
can generate mplayer EDL's and play them...hmm...smplayer them?
|
55
|
+
update license too...
|
56
|
+
get half-way through, start playing back as writing edited full copy
|
57
|
+
maybe not all of these tho...
|
58
|
+
non parallelize
|
59
|
+
can have different volume settings
|
60
|
+
can insert other titles mid-stream [?]
|
61
|
+
these last two have gotta be lower prio than the rest...
|
62
|
+
whichr: return nil
|
63
|
+
install smplayer before mencoder [?]
|
24
64
|
smaller .zip
|
25
65
|
bundle 7z [?]
|
26
66
|
remove note about it
|
27
67
|
using, burning, creating "howto's"
|
28
68
|
better
|
29
|
-
usability test?
|
69
|
+
usability test them?
|
30
70
|
|
31
71
|
using+burning screencast
|
32
72
|
editing screencast
|
@@ -36,18 +76,17 @@
|
|
36
76
|
add an option "just save full disk (unedited) to hard drive..."
|
37
77
|
note to people: can edit those to your liking
|
38
78
|
|
79
|
+
imagemagick (ffmpeg) easier install...
|
39
80
|
DRY up dependency installation code
|
40
81
|
install them to cache2 or something...so I can cleanup the deploy code...
|
41
82
|
advertise urug, ruby flow :)
|
42
83
|
"Re-run most recent" disabled when there isn't one [?]
|
43
|
-
unit test the GUI
|
44
84
|
re-do DVD EDL's that need it :P
|
45
85
|
all dogs go to heaven...finish EDL
|
46
86
|
warn when labels exist and don't match...
|
47
87
|
kill old mencoder instances more often...
|
48
88
|
auto-download imagemagick, too
|
49
|
-
check all the
|
50
|
-
popup "you may now watch": bring it to the front...
|
89
|
+
check all the many options to see if there's a "cross platform way to split files accurately" besides my hacky kludge.
|
51
90
|
can rip from a DVD-like folder (?)
|
52
91
|
ripping "redoes" a large last section, for combining. Can I avoid this?
|
53
92
|
plus I do some copy, some ac3?
|
@@ -63,24 +102,24 @@
|
|
63
102
|
in general, fine tune burning with various things...
|
64
103
|
|
65
104
|
make sure can work with very large DVD's...
|
66
|
-
can use a fast temp drive, save through to
|
67
|
-
|
105
|
+
can use a fast temp drive, save through it to another :P
|
106
|
+
(when they have two...)
|
68
107
|
can have collaborators re-selling EDL's
|
69
108
|
good license for their stuff like "public domain" or what not :P Can't be a hypocrite now, can I?
|
70
|
-
a real website
|
109
|
+
a real website that looks good
|
71
110
|
k9 might preserve/shrink well...hmm...auto calculation may be possible...hmm...
|
72
111
|
better .exe icon...
|
73
|
-
ensure file exists after we created it...and has a reasonable size, before declaring success
|
74
|
-
148 cars_widescreen_2006_edited.ps
|
75
112
|
blu-ray support somehow (real-time? rip?)
|
76
113
|
use DVD navigator ?
|
77
114
|
http://msdn.microsoft.com/en-us/library/dd388584(v=VS.85).aspx
|
78
115
|
with an avi file sink?
|
79
116
|
double buffering hard drive/incoming copying from DVD might speed things, if your HD is fast.
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
117
|
+
might not work for all modes tho...
|
118
|
+
make the progress bar map "better" to the actual time that each section should take...
|
119
|
+
|
120
|
+
"show" what drive they have in there--like an auto-detect, and if it has EDL's available for it or not.
|
121
|
+
Note to people: make several EDL's per movie.
|
122
|
+
Note to people: clean your disks!
|
84
123
|
|
85
124
|
burnable to DVD/CD/multi DVD automagically... (auto-burn insert your new disk!)
|
86
125
|
can *re-use* original navigation stuffs, less the profanity (is that possible? VobBlanker help, perhaps?)
|
@@ -92,7 +131,9 @@ burnable to DVD/CD/multi DVD automagically... (auto-burn insert your new disk!)
|
|
92
131
|
try to compile transcode in cygwin (yipes)
|
93
132
|
legal shtuff (LICENSE)
|
94
133
|
|
95
|
-
|
134
|
+
@smplayer: right click on DVD...
|
135
|
+
|
136
|
+
== random non-DVD (or don't care when) 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). ==
|
96
137
|
|
97
138
|
the ac3 thing
|
98
139
|
ask VLC "fuzzy menus on the happiest baby dvd expected?"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.16.
|
1
|
+
0.16.7
|
data/bin/sensible-cinema
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
puts 'Loading Sensible Cinema...'
|
4
4
|
|
5
5
|
require File.dirname(__FILE__) + "/../lib/add_any_bundled_gems_to_load_path.rb"
|
6
|
-
require 'sane'
|
6
|
+
require 'sane' # failure here means you haven't bundled your dependencies...[rake task]
|
7
7
|
|
8
8
|
require_relative '../lib/mencoder_wrapper'
|
9
9
|
require_relative '../lib/storage'
|
@@ -15,237 +15,266 @@ require_relative '../lib/drive_info'
|
|
15
15
|
require 'whichr'
|
16
16
|
|
17
17
|
ENV['PATH'] = ENV['PATH'] + ';' + File.expand_path(File.dirname(__FILE__)) + '/../vendor/cache/mencoder'.to_filename
|
18
|
+
ENV['PATH'] = ENV['PATH'] + ";d:\\Program Files\\SMPlayer;c:\\Program Files\\SMPlayer"
|
18
19
|
|
19
20
|
module SensibleSwing
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
21
|
+
class MainWindow < JFrame
|
22
|
+
|
23
|
+
def new_jbutton title, only_on_create_mode
|
24
|
+
button = JButton.new title
|
25
|
+
button.set_bounds(44, @starting_button_y, @button_width, 23)
|
26
|
+
@starting_button_y += 30
|
27
|
+
if only_on_create_mode
|
28
|
+
if ARGV.index("--create-mode")
|
29
|
+
@panel.add button
|
30
|
+
@buttons << button
|
31
|
+
end
|
32
|
+
else
|
33
|
+
@panel.add button
|
34
|
+
@buttons << button
|
35
|
+
end
|
36
|
+
button
|
37
|
+
end
|
38
|
+
|
39
|
+
Storage = Storage.new("sc")
|
34
40
|
|
35
|
-
|
41
|
+
alias system_blocking system
|
36
42
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
}
|
41
|
-
c.set_bounds(44,120,button_width,23)
|
42
|
-
panel.add c
|
43
|
+
def system_non_blocking command
|
44
|
+
Thread.new { system_blocking command }
|
45
|
+
end
|
43
46
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
47
|
+
# make them choose which one to use
|
48
|
+
undef system
|
49
|
+
|
50
|
+
def initialize
|
51
|
+
super "Sensible-Cinema"
|
52
|
+
setDefaultCloseOperation JFrame::EXIT_ON_CLOSE
|
53
|
+
panel = JPanel.new
|
54
|
+
@panel = panel
|
55
|
+
@buttons = []
|
56
|
+
panel.set_layout nil
|
57
|
+
add panel # why can't I just slap these down?
|
58
|
+
|
59
|
+
jlabel = JLabel.new 'Welcome to Sensible Cinema!'
|
60
|
+
happy = Font.new("Tahoma", Font::PLAIN, 11)
|
61
|
+
jlabel.setFont(happy)
|
62
|
+
jlabel.set_bounds(44,44,160,14)
|
63
|
+
panel.add jlabel
|
64
|
+
@starting_button_y = 120
|
65
|
+
@button_width = 270
|
66
|
+
|
67
|
+
@progress_bar = JProgressBar.new(0, 100)
|
68
|
+
@progress_bar.set_bounds(44,80,@button_width,23)
|
69
|
+
@progress_bar.visible = false
|
70
|
+
panel.add @progress_bar
|
71
|
+
|
72
|
+
@create = new_jbutton( "Create edited copy of DVD on Your Hard Drive", false )
|
73
|
+
@create.on_clicked {
|
74
|
+
do_copy_dvd_to_hard_drive false
|
75
|
+
}
|
76
|
+
|
77
|
+
@watch_unedited = new_jbutton("Watch DVD from hard drive unedited", true) # LODO watch in realtime option--then rippers and watchers can combine
|
78
|
+
@watch_unedited.on_clicked {
|
79
|
+
path = RubyWhich.new.which('smplayer')
|
80
|
+
if(path.length == 0)
|
81
|
+
show_blocking_message_dialog("It appears that you need to install a dependency: SMPlayer.\n
|
82
|
+
Click ok to be directed to its download website, where you can download and install it.", "Lacking dependency", JOptionPane::ERROR_MESSAGE)
|
83
|
+
system_non_blocking("start http://smplayer.sourceforge.net/downloads.php")
|
84
|
+
System.exit(1)
|
85
|
+
else
|
86
|
+
success_no_run, wrote_to_here_fulli = do_copy_dvd_to_hard_drive false, true # LODO pass in a block (currently @after_success_once is run from the other thread--even have a race condition in there!)
|
87
|
+
on_success = proc {
|
88
|
+
command = "smplayer #{wrote_to_here_fulli}"
|
89
|
+
system_non_blocking command
|
90
|
+
}
|
91
|
+
if success_no_run
|
92
|
+
on_success.call
|
93
|
+
else
|
94
|
+
@after_success_once = on_success # shenanigans to be able to let that thread run...
|
95
|
+
end
|
96
|
+
end
|
97
|
+
}
|
98
|
+
|
99
|
+
@open_list = new_jbutton("Open/Edit a pre-existing Edit Decision List", false)
|
100
|
+
@open_list.on_clicked {
|
101
|
+
dialog = FileDialog.new(self, "Pick file to edit")
|
102
|
+
dialog.set_directory EDL_DIR
|
103
|
+
filename = dialog.go
|
104
|
+
open_file_to_edit_it filename if filename
|
105
|
+
}
|
106
|
+
|
107
|
+
@preview_section = new_jbutton( "Preview a certain time frame (edited)", true )
|
108
|
+
@preview_section.on_clicked {
|
109
|
+
success_no_run, wrote_to_here_fulli = do_copy_dvd_to_hard_drive true
|
110
|
+
on_success = proc { |file|
|
111
|
+
system_non_blocking("smplayer #{file}")
|
112
|
+
}
|
61
113
|
if success_no_run
|
62
114
|
on_success.call
|
63
115
|
else
|
64
|
-
@after_success_once = on_success # shenanigans to be able to let
|
116
|
+
@after_success_once = on_success # shenanigans to be able to let that thread run...
|
65
117
|
end
|
66
|
-
|
67
|
-
}
|
68
|
-
b.set_bounds(44,150,button_width,23)
|
69
|
-
panel.add b if ARGV.index("--create-mode") # LODO allow end users to play it from here?
|
70
|
-
|
71
|
-
d = JButton.new( "Preview edited section of current DVD" )
|
72
|
-
d.on_clicked {
|
73
|
-
do_copy_dvd_to_hard_drive true
|
74
|
-
}
|
75
|
-
|
76
|
-
d.set_bounds(44,180,button_width,23)
|
77
|
-
panel.add d if ARGV.index("--create-mode")
|
78
|
-
|
79
|
-
f = JButton.new("Open/Edit an Edit Decision List")
|
80
|
-
f.on_clicked {
|
81
|
-
dialog = FileDialog.new(self, "Pick file to edit")
|
82
|
-
dialog.set_directory EDL_DIR
|
83
|
-
filename = dialog.go
|
84
|
-
open_file_to_edit_it filename if filename
|
85
|
-
}
|
86
|
-
f.set_bounds(44,260,button_width,23)
|
87
|
-
panel.add f if ARGV.index("--create-mode")
|
88
|
-
|
89
|
-
e = JButton.new( "Re-run most recent preview segment" )
|
90
|
-
e.on_clicked {
|
91
|
-
repeat_last_copy_dvd_to_hard_drive
|
92
|
-
}
|
93
|
-
|
94
|
-
e.set_bounds(44,220,button_width,23)
|
95
|
-
panel.add e if ARGV.index("--create-mode")
|
96
|
-
|
97
|
-
reload = JButton.new( "Get a disk's unique ID" ).on_clicked {
|
98
|
-
drive, volume, md5 = choose_dvd_drive
|
99
|
-
# display it, allow them to copy and paste it out
|
100
|
-
JOptionPane.showInputDialog("#{drive} #{volume} for your copying+pasting pleasure (highlight, then ctrl+c to copy) \n
|
101
|
-
This is used to identify a disk to match it to its EDL, later.", "\"disk_unique_id\" => \"#{md5}\",")
|
102
|
-
}
|
103
|
-
|
104
|
-
reload.set_bounds(44,290,button_width,20)
|
105
|
-
panel.add reload if ARGV.index("--create-mode")
|
118
|
+
}
|
106
119
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
120
|
+
@rerun_preview = new_jbutton( "Re-run most recently performed preview", true )
|
121
|
+
@rerun_preview.on_clicked {
|
122
|
+
repeat_last_copy_dvd_to_hard_drive
|
123
|
+
}
|
124
|
+
|
125
|
+
@create_new_edl_for_current_dvd = new_jbutton("Create new Edit Decision List for current DVD", true)
|
126
|
+
@create_new_edl_for_current_dvd.on_clicked do
|
127
|
+
drive, volume, md5 = choose_dvd_drive
|
115
128
|
input = <<-EOL
|
116
|
-
# comments can go after a # on any line.
|
129
|
+
# comments can go after a # on any line, for example this one.
|
117
130
|
"mutes" => [
|
118
|
-
|
131
|
+
"0:00:01.0", "0:00:02.0", "da..",
|
119
132
|
],
|
120
133
|
|
121
134
|
"blank_outs" => [
|
122
|
-
|
135
|
+
"1:01:00.0" , "1:02:00.0", "violent scene of some sort"
|
123
136
|
],
|
124
137
|
"disk_unique_id" => "#{md5}",
|
125
138
|
"title" => "#{volume}",
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
def download full_url, to_here
|
149
|
-
require 'open-uri'
|
150
|
-
writeOut = open(to_here, "wb")
|
151
|
-
writeOut.write(open(full_url).read)
|
152
|
-
writeOut.close
|
153
|
-
end
|
154
|
-
|
155
|
-
def check_for_dependencies
|
156
|
-
ffmpeg = RubyWhich.new.which('ffmpeg')
|
157
|
-
if ffmpeg.length == 0
|
158
|
-
JOptionPane.showMessageDialog(self, "It appears that you need to install a dependency: imagemagick.\n
|
159
|
-
Click ok to be directed to its download website.\nYou'll probably want to download and install the \"windows-dll.exe\" package.\n
|
160
|
-
Then restart Sensible-Cinema.", "Lacking dependency", JOptionPane::ERROR_MESSAGE)
|
161
|
-
system("start http://www.imagemagick.org/script/binary-releases.php#windows")
|
162
|
-
java.lang.System.exit(1)
|
139
|
+
"dvd_title_track" => "1" # most DVD's use title 1 for the main film. Some don't though. The correct number is discoverable by opening the film in VLC and choosing "playback -> title" while watching the main feature. If its not 1, then change this here. And delete this overly verbose comment either way :)
|
140
|
+
EOL
|
141
|
+
filename = EDL_DIR + "\\" + volume.gsub(' ', '_') + '.txt'
|
142
|
+
File.write(filename, input) unless File.exist?(filename) # lodo let them choose name (?)
|
143
|
+
open_file_to_edit_it filename
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
@display_unique = new_jbutton( "Calculate DVD's unique ID", true ).on_clicked {
|
148
|
+
drive, volume, md5 = choose_dvd_drive
|
149
|
+
# display it, allow them to copy and paste it out
|
150
|
+
get_user_input("#{drive} #{volume} for your copying+pasting pleasure (highlight, then ctrl+c to copy) \n
|
151
|
+
This is used to identify a disk to match it to its EDL, later.", "\"disk_unique_id\" => \"#{md5}\",")
|
152
|
+
}
|
153
|
+
|
154
|
+
@exit = new_jbutton("Exit", false).on_clicked {
|
155
|
+
self.close
|
156
|
+
}
|
157
|
+
|
158
|
+
setSize 350,430
|
159
|
+
|
160
|
+
check_for_dependencies
|
163
161
|
end
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
162
|
+
|
163
|
+
def download full_url, to_here
|
164
|
+
require 'open-uri'
|
165
|
+
writeOut = open(to_here, "wb")
|
166
|
+
writeOut.write(open(full_url).read)
|
167
|
+
writeOut.close
|
168
|
+
end
|
169
|
+
|
170
|
+
def check_for_dependencies
|
171
|
+
ffmpeg = RubyWhich.new.which('ffmpeg')
|
172
|
+
if ffmpeg.length == 0
|
173
|
+
show_blocking_message_dialog(self, "It appears that you need to install a dependency: imagemagick.\n
|
174
|
+
Click ok to be directed to its download website.\nYou'll probably want to download and install the \"windows-dll.exe\" package.\n
|
175
|
+
Then restart Sensible-Cinema.", "Lacking dependency", JOptionPane::ERROR_MESSAGE)
|
176
|
+
system_non_blocking("start http://www.imagemagick.org/script/binary-releases.php#windows")
|
173
177
|
java.lang.System.exit(1)
|
174
178
|
end
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
download(
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
179
|
+
mencoder = RubyWhich.new.which('mencoder')
|
180
|
+
if mencoder.length == 0
|
181
|
+
answer = JOptionPane.showConfirmDialog(nil, "Appears that you need to install a dependency: mencoder.
|
182
|
+
Its license is at: http://www.gnu.org/licenses/gpl-2.0.html.
|
183
|
+
Also this will download 7z locally (license: http://www.7-zip.org/license.txt).
|
184
|
+
Click yes if you accept the terms of the several license agreements mentioned. The programs will then be downloaded.
|
185
|
+
Or click no to cancel and exit.", "Lacking dependency", JOptionPane::YES_NO_OPTION)
|
186
|
+
if answer == 1
|
187
|
+
p 'exiting, no mencoder...'
|
188
|
+
java.lang.System.exit(1)
|
189
|
+
end
|
190
|
+
vendor_cache = File.expand_path(File.dirname(__FILE__)) + "/../vendor/cache/"
|
191
|
+
ENV['PATH'] = ENV['PATH'] + ';' + vendor_cache + '\\..;' + vendor_cache
|
192
|
+
Dir.chdir(vendor_cache) do
|
193
|
+
Kernel.print 'downloading unzip utility...'
|
194
|
+
download("http://downloads.sourceforge.net/project/sevenzip/7-Zip/9.20/7za920.zip", "7za920.zip")
|
195
|
+
system_blocking("unzip -o 7za920.zip") # -o means "overwrite" without prompting
|
196
|
+
# now we have 7za.exe
|
197
|
+
Kernel.print 'downloading mencoder'
|
198
|
+
download("http://downloads.sourceforge.net/project/mplayer-win32/MPlayer%20and%20MEncoder/revision%2032492/MPlayer-rtm-svn-32492.7z", "mencoder.7z")
|
199
|
+
system_blocking("7za e mencoder.7z -y -omencoder")
|
200
|
+
Kernel.puts 'done'
|
201
|
+
end
|
186
202
|
end
|
187
203
|
end
|
188
|
-
end
|
189
204
|
|
190
|
-
|
191
|
-
|
192
|
-
|
205
|
+
def open_file_to_edit_it filename
|
206
|
+
system_non_blocking "notepad \"#{filename}\""
|
207
|
+
end
|
208
|
+
|
209
|
+
def single_edit_list_matches_dvd md5
|
210
|
+
return unless md5 # ignore nil searches, where it wasn't set in the .txt file
|
211
|
+
matching = Dir[EDL_DIR + '/*.txt'].select{|file|
|
212
|
+
EdlParser.parse_file(file)["disk_unique_id"] == md5
|
213
|
+
}
|
214
|
+
if matching.length == 1
|
215
|
+
file = matching[0]
|
216
|
+
p "selecting the one matching file #{file} #{md5}"
|
217
|
+
file
|
218
|
+
else
|
219
|
+
nil
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
EDL_DIR = File.expand_path(__dir__ + "/../zamples/edit_decision_lists/dvds").to_filename
|
193
224
|
|
194
|
-
|
195
|
-
|
196
|
-
matching = Dir[EDL_DIR + '/*.txt'].select{|file|
|
197
|
-
EdlParser.parse_file(file)["disk_unique_id"] == md5
|
198
|
-
}
|
199
|
-
if matching.length == 1
|
200
|
-
file = matching[0]
|
201
|
-
p "selecting the one matching file #{file} #{md5}"
|
202
|
-
file
|
203
|
-
else
|
204
|
-
nil
|
225
|
+
def repeat_last_copy_dvd_to_hard_drive
|
226
|
+
generate_and_run_bat_file *Storage['last_params']
|
205
227
|
end
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
228
|
+
|
229
|
+
def new_filechooser
|
230
|
+
JFileChooser.new
|
231
|
+
end
|
232
|
+
|
233
|
+
def show_blocking_message_dialog(message, title = message.split("\n")[0], style= JOptionPane::INFORMATION_MESSAGE)
|
234
|
+
JOptionPane.showMessageDialog(nil, message, title, style)
|
235
|
+
end
|
236
|
+
|
237
|
+
def get_user_input(message, default)
|
238
|
+
start_time = JOptionPane.showInputDialog(message, default)
|
239
|
+
end
|
240
|
+
|
241
|
+
def do_copy_dvd_to_hard_drive should_prompt_for_start_and_end_times, want_full_list = false
|
215
242
|
drive, dvd_volume_name, md5sum = choose_dvd_drive
|
216
|
-
|
243
|
+
puts "#{drive}, #{dvd_volume_name}, #{md5sum}"
|
217
244
|
edit_list_path = single_edit_list_matches_dvd(md5sum)
|
218
245
|
if !edit_list_path
|
219
246
|
fc = FileDialog.new(self)
|
220
|
-
fc.set_title "Please pick a DVD Edit List File"
|
247
|
+
fc.set_title "Please pick a DVD Edit Decision List File"
|
221
248
|
fc.set_directory EDL_DIR
|
222
249
|
edit_list_path = fc.go
|
223
250
|
end
|
251
|
+
return unless edit_list_path
|
224
252
|
descriptors = EdlParser.parse_file edit_list_path
|
225
|
-
|
253
|
+
|
226
254
|
dvd_title = descriptors['title'] || dvd_volume_name
|
227
|
-
|
228
|
-
fc =
|
229
|
-
|
230
|
-
|
255
|
+
|
256
|
+
fc = new_filechooser
|
257
|
+
|
258
|
+
# LODO allow for spaces in the save_to filename
|
259
|
+
|
231
260
|
if should_prompt_for_start_and_end_times
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
261
|
+
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 an edit decision 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 like 20 minutes as it sets up the video for previewing.\nSubsequent previews will be faster, though, as long as you use the same filename.", "Preview")
|
262
|
+
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'])
|
263
|
+
Storage['start_time'] = start_time
|
264
|
+
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'])
|
265
|
+
Storage['end_time'] = end_time
|
266
|
+
unless start_time and end_time
|
267
|
+
JOptionPane.showMessageDialog(nil, " Please choose start and end", "Failed", JOptionPane::ERROR_MESSAGE)
|
268
|
+
return
|
269
|
+
end
|
241
270
|
end
|
242
|
-
|
271
|
+
|
243
272
|
fc.set_title "Pick where to save #{dvd_title} edited to"
|
244
|
-
|
273
|
+
|
245
274
|
save_to_file_name = dvd_title + ' edited copy'
|
246
275
|
save_to_file_name += ' single segment' if should_prompt_for_start_and_end_times || want_full_list
|
247
|
-
save_to_file_name=save_to_file_name.gsub(' ', '_').gsub( /\W/, '') # no punctuation for now...
|
248
|
-
fc.
|
276
|
+
save_to_file_name = save_to_file_name.gsub(' ', '_').gsub( /\W/, '') # no punctuation for now...
|
277
|
+
fc.set_file(get_drive_with_most_space_with_slash + save_to_file_name)
|
249
278
|
save_to = fc.go
|
250
279
|
dvd_title_track = descriptors["dvd_title_track"]
|
251
280
|
# how does save_to map to fulli?
|
@@ -260,32 +289,41 @@ EOL
|
|
260
289
|
end
|
261
290
|
end
|
262
291
|
generate_and_run_bat_file save_to, edit_list_path, descriptors, drive, dvd_title, start_time, end_time, dvd_title_track
|
263
|
-
[false, fulli]
|
292
|
+
[false, fulli] # false means it's running in a background thread :P
|
293
|
+
end
|
294
|
+
|
295
|
+
def get_drive_with_most_space_with_slash
|
296
|
+
DriveInfo.get_drive_with_most_space_with_slash
|
264
297
|
end
|
265
|
-
|
266
|
-
|
298
|
+
|
299
|
+
def get_mencoder_commands descriptors, drive, save_to, start_time, end_time, dvd_title_track
|
300
|
+
MencoderWrapper.get_bat_commands descriptors, drive, save_to, start_time, end_time, dvd_title_track
|
301
|
+
end
|
302
|
+
|
303
|
+
def generate_and_run_bat_file save_to, edit_list_path, descriptors, drive, dvd_title, start_time, end_time, dvd_title_track
|
267
304
|
Storage['last_params'] = [save_to, edit_list_path, descriptors, drive, dvd_title, start_time, end_time, dvd_title_track]
|
268
|
-
|
305
|
+
commands = get_mencoder_commands descriptors, drive, save_to, start_time, end_time, dvd_title_track
|
269
306
|
temp_dir = Dir.tmpdir
|
270
307
|
temp_file = temp_dir + '/vlc.temp.bat'
|
271
|
-
File.write(temp_file,
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
308
|
+
File.write(temp_file, commands)
|
309
|
+
popup = ModeLessDialog.new( "Copying to #{save_to}.\n" +
|
310
|
+
"Running #{File.basename edit_list_path} against #{drive} (#{dvd_title}).\n" +
|
311
|
+
"This could take quite awhile, and will prompt you when it is done.\n" +
|
312
|
+
"You can close this window and continue working while it runs.\n" +
|
313
|
+
"NB that the created file will be playable only with smplayer or VLC player.",
|
314
|
+
"OK")
|
315
|
+
|
280
316
|
# allow our popups to still be serviced while it is running
|
281
|
-
Thread.new {
|
282
|
-
run_create_commands
|
317
|
+
@background_thread = Thread.new {
|
318
|
+
run_create_commands commands, save_to
|
283
319
|
popup.dispose
|
284
320
|
}
|
285
321
|
# LODO warn if they will overwrite a file in the end...
|
286
322
|
end
|
287
|
-
|
288
|
-
|
323
|
+
|
324
|
+
attr_accessor :background_thread, :after_success_once
|
325
|
+
|
326
|
+
def run_create_commands batch_commands, save_to
|
289
327
|
@buttons.each{|b| b.set_enabled false}
|
290
328
|
success = true
|
291
329
|
lines = batch_commands.lines.to_a
|
@@ -294,7 +332,7 @@ EOL
|
|
294
332
|
@progress_bar.set_value(10) # start at 10% always, so they can see something.
|
295
333
|
lines.each_with_index{|l, idx|
|
296
334
|
if success
|
297
|
-
success =
|
335
|
+
success = system_blocking(l) unless ARGV.find{|a| a == '--test'} # this might not actually cancel out early for some reason...
|
298
336
|
if l =~ /@rem /
|
299
337
|
success = true # these fail fof some reason?
|
300
338
|
else
|
@@ -305,76 +343,75 @@ EOL
|
|
305
343
|
}
|
306
344
|
@progress_bar.visible=false
|
307
345
|
@buttons.each{|b| b.set_enabled true}
|
308
|
-
if
|
346
|
+
if success
|
347
|
+
saved_to = save_to + '.avi' # LODO pass this out?
|
309
348
|
if @after_success_once
|
310
|
-
|
311
|
-
@after_success_once = nil
|
312
|
-
procy.call
|
349
|
+
@after_success_once.call saved_to
|
313
350
|
else
|
314
|
-
|
315
|
-
JOptionPane.showMessageDialog(nil, " Done--you may now watch file #{saved_to} in SMPlayer or VLC player", "Done!", JOptionPane::INFORMATION_MESSAGE)
|
351
|
+
show_blocking_message_dialog(" Done--you may now watch file #{saved_to} in SMPlayer or VLC player")
|
316
352
|
show_file = "explorer /e,/select,\"#{File.expand_path(saved_to).to_filename}\""
|
317
|
-
|
353
|
+
system_non_blocking show_file
|
318
354
|
#self.close # ?
|
319
355
|
end
|
320
356
|
else
|
321
|
-
|
357
|
+
show_blocking_message_dialog("Failed--please examine screen output and report back!", "Failed", JOptionPane::ERROR_MESSAGE)
|
322
358
|
end
|
323
|
-
|
324
|
-
|
325
|
-
# returns e:\, volume, md5sum
|
326
|
-
def choose_dvd_drive
|
327
|
-
opticals = DriveInfo.get_dvd_drives_as_win32ole
|
328
|
-
names = opticals.map{|d| d.Name + "\\" + " (" + (d.VolumeName || 'please insert DVD before proceeding if you want to use this drive') + ")"}
|
329
|
-
|
330
|
-
if opticals.length != 1
|
331
|
-
dialog = GetDisk.new(self, names)
|
332
|
-
dialog.setSize 200,125
|
333
|
-
dialog.show
|
334
|
-
selected_idx = dialog.selected_idx
|
335
|
-
else
|
336
|
-
selected_idx = 0
|
337
|
-
p 'selecting user\'s only disk drive ' + names[0]
|
359
|
+
@after_success_once = nil
|
338
360
|
end
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
361
|
+
|
362
|
+
# returns e:\, volume, md5sum
|
363
|
+
def choose_dvd_drive
|
364
|
+
opticals = DriveInfo.get_dvd_drives_as_win32ole
|
365
|
+
names = opticals.map{|d| d.Name + "\\" + " (" + (d.VolumeName || 'Insert DVD to use') + ")"}
|
366
|
+
|
367
|
+
if opticals.length != 1
|
368
|
+
dialog = GetDisk.new(self, names)
|
369
|
+
dialog.setSize 200,125
|
370
|
+
dialog.show
|
371
|
+
selected_idx = dialog.selected_idx
|
372
|
+
else
|
373
|
+
selected_idx = 0
|
374
|
+
p 'selecting user\'s only disk drive ' + names[0]
|
375
|
+
end
|
376
|
+
|
377
|
+
if selected_idx
|
378
|
+
disk = opticals[selected_idx]
|
379
|
+
prefix = names[selected_idx][0..2]
|
380
|
+
return prefix, opticals[selected_idx].VolumeName, DriveInfo.md5sum_disk(prefix)
|
381
|
+
else
|
382
|
+
puts 'did not select a drive...exiting'
|
383
|
+
java.lang.System.exit 1
|
384
|
+
end
|
347
385
|
end
|
386
|
+
|
348
387
|
end
|
349
388
|
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
add box
|
372
|
-
pack
|
389
|
+
class GetDisk < JDialog
|
390
|
+
attr_reader :selected_idx
|
391
|
+
def initialize parent, options_array
|
392
|
+
super parent, true
|
393
|
+
|
394
|
+
box = JComboBox.new
|
395
|
+
box.add_action_listener do |e|
|
396
|
+
idx = box.get_selected_index
|
397
|
+
if idx != 0
|
398
|
+
# don't count choosing the first as a real entry
|
399
|
+
@selected_idx = box.get_selected_index - 1
|
400
|
+
dispose
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
box.add_item "Click to select DVD drive" # put something in index 0
|
405
|
+
options_array.each{|drive|
|
406
|
+
box.add_item drive
|
407
|
+
}
|
408
|
+
add box
|
409
|
+
pack
|
373
410
|
end
|
374
|
-
|
411
|
+
end
|
375
412
|
end
|
376
413
|
|
377
414
|
if $0 == __FILE__
|
378
415
|
SensibleSwing::MainWindow.new.set_visible true
|
379
416
|
puts 'Please use the Sensible Cinema GUI window popup...'
|
380
|
-
end
|
417
|
+
end
|
data/run_sensible_cinema_in_create_mode.bat b/data/edit sensible cinema decision list → files.bat
RENAMED
File without changes
|
data/lib/mencoder_wrapper.rb
CHANGED
@@ -53,7 +53,7 @@ class MencoderWrapper
|
|
53
53
|
out += "call mencoder #{partials.join(' ')} -o #{to_here_final_file}.avi -ovc copy -oac copy\n"
|
54
54
|
# 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
|
55
55
|
# LODO the "insta play" mode, or the "faster rip" mode (related...)
|
56
|
-
|
56
|
+
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"
|
57
57
|
|
58
58
|
out += "@rem del #{@big_temp}\n" # LODO
|
59
59
|
out += "del " + partials.join(' ') + "\n"# LODO
|
data/lib/swing_helpers.rb
CHANGED
@@ -18,18 +18,23 @@ module SensibleSwing
|
|
18
18
|
|
19
19
|
def on_clicked &block
|
20
20
|
raise unless block
|
21
|
+
@block = block
|
21
22
|
add_action_listener do |e|
|
22
23
|
begin
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
block.call
|
25
|
+
rescue Exception => e
|
26
|
+
puts 'got fatal exception', e
|
27
|
+
puts e.backtrace.join("\n")
|
28
|
+
System.exit(1) # LODO no exit
|
29
|
+
end
|
29
30
|
end
|
30
31
|
self
|
31
32
|
end
|
32
33
|
|
34
|
+
def simulate_click
|
35
|
+
@block.call
|
36
|
+
end
|
37
|
+
|
33
38
|
end
|
34
39
|
|
35
40
|
class JFrame
|
data/sensible-cinema.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{sensible-cinema}
|
8
|
-
s.version = "0.16.
|
8
|
+
s.version = "0.16.7"
|
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"]
|
12
|
-
s.date = %q{2010-12-
|
12
|
+
s.date = %q{2010-12-06}
|
13
13
|
s.email = %q{rogerdpack@gmail.com}
|
14
14
|
s.executables = ["sensible-cinema", "sensible-cinema-cli"]
|
15
15
|
s.extensions = ["ext/mkrf_conf.rb"]
|
@@ -23,11 +23,13 @@ Gem::Specification.new do |s|
|
|
23
23
|
"ChangeLog",
|
24
24
|
"LICENSE",
|
25
25
|
"README",
|
26
|
+
"RUN SENSIBLE CINEMA CLICK HERE.bat",
|
26
27
|
"Rakefile",
|
27
28
|
"TODO",
|
28
29
|
"VERSION",
|
29
30
|
"bin/sensible-cinema",
|
30
31
|
"bin/sensible-cinema-cli",
|
32
|
+
"edit sensible cinema decision list files.bat",
|
31
33
|
"experimental_readme.txt",
|
32
34
|
"ext/mkrf_conf.rb",
|
33
35
|
"gplv3.txt",
|
@@ -50,8 +52,6 @@ Gem::Specification.new do |s|
|
|
50
52
|
"lib/swing_helpers.rb",
|
51
53
|
"lib/vlc_programmer.rb",
|
52
54
|
"never_do",
|
53
|
-
"run_sensible_cinema.bat",
|
54
|
-
"run_sensible_cinema_in_create_mode.bat",
|
55
55
|
"sensible-cinema.gemspec",
|
56
56
|
"spec/blanker.spec.rb",
|
57
57
|
"spec/common.rb",
|
@@ -121,6 +121,7 @@ Gem::Specification.new do |s|
|
|
121
121
|
"vendor/gocr049.exe",
|
122
122
|
"vendor/unzip.exe",
|
123
123
|
"zamples/edit_decision_lists/category descriptions.txt",
|
124
|
+
"zamples/edit_decision_lists/dvds/COOL_RUNNINGS.txt",
|
124
125
|
"zamples/edit_decision_lists/dvds/bob the builder pets in a pickle.txt",
|
125
126
|
"zamples/edit_decision_lists/dvds/bobs_big_plan.txt",
|
126
127
|
"zamples/edit_decision_lists/dvds/happiest baby on the block.txt",
|
@@ -3,16 +3,21 @@ load '../bin/sensible-cinema'
|
|
3
3
|
|
4
4
|
module SensibleSwing
|
5
5
|
describe MainWindow do
|
6
|
-
|
6
|
+
|
7
|
+
it "should be able to start up" do
|
8
|
+
MainWindow.new.dispose# shouldn't crash :)
|
9
|
+
end
|
10
|
+
|
7
11
|
it "should auto-select a EDL if it matches a DVD's title" do
|
8
|
-
MainWindow.new.single_edit_list_matches_dvd("
|
12
|
+
MainWindow.new.single_edit_list_matches_dvd("19d121ae8dc40cdd70b57ab7e8c74f76").should_not be nil
|
9
13
|
end
|
10
|
-
|
14
|
+
|
11
15
|
it "should not auto-select if you pass it nil" do
|
12
16
|
MainWindow.new.single_edit_list_matches_dvd(nil).should be nil
|
13
17
|
end
|
14
|
-
|
18
|
+
|
15
19
|
it "should prompt if two EDL's match a DVD title" do
|
20
|
+
old_edl = MainWindow::EDL_DIR
|
16
21
|
MainWindow.const_set(:EDL_DIR, 'temp')
|
17
22
|
FileUtils.rm_rf 'temp'
|
18
23
|
Dir.mkdir 'temp'
|
@@ -22,11 +27,127 @@ module SensibleSwing
|
|
22
27
|
File.binwrite('b.txt', "\"disk_unique_id\" => \"abcdef1234\"")
|
23
28
|
end
|
24
29
|
MainWindow.new.single_edit_list_matches_dvd("abcdef1234").should be nil
|
30
|
+
MainWindow.const_set(:EDL_DIR, old_edl)
|
25
31
|
end
|
26
|
-
|
32
|
+
|
27
33
|
it "should modify path to have mencder available, and ffmpeg, and download them on the fly" do
|
28
34
|
ENV['PATH'].should include("mencoder")
|
29
35
|
end
|
30
|
-
|
36
|
+
|
37
|
+
before do
|
38
|
+
@subject = MainWindow.new
|
39
|
+
@subject.stub!(:choose_dvd_drive) {
|
40
|
+
["drive", "volume", "19d121ae8dc40cdd70b57ab7e8c74f76"] # happiest baby on the block
|
41
|
+
}
|
42
|
+
@subject.stub!(:get_mencoder_commands) { |*args|
|
43
|
+
args[-4].should match(/abc/)
|
44
|
+
@args = args
|
45
|
+
'sleep 0.1'
|
46
|
+
}
|
47
|
+
@subject.stub!(:new_filechooser) {
|
48
|
+
FakeFileChooser.new
|
49
|
+
}
|
50
|
+
@subject.stub!(:get_drive_with_most_space_with_slash) {
|
51
|
+
"e:\\"
|
52
|
+
}
|
53
|
+
@subject.stub!(:show_blocking_message_dialog) {}
|
54
|
+
@subject.stub!(:get_user_input) {'01:00'}
|
55
|
+
@subject.stub!(:system_non_blocking) { |command|
|
56
|
+
@command = command
|
57
|
+
Thread.new {} # fake out the return...
|
58
|
+
}
|
59
|
+
@subject.stub!(:open_file_to_edit_it) {}
|
60
|
+
end
|
61
|
+
|
62
|
+
class FakeFileChooser
|
63
|
+
def set_title x
|
64
|
+
end
|
65
|
+
def set_file y
|
66
|
+
end
|
67
|
+
def go
|
68
|
+
'abc'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should be able to do a normal copy to hard drive, edited" do
|
73
|
+
@subject.do_copy_dvd_to_hard_drive(false).should == [false, "abc.fulli.tmp.avi"]
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should call through to explorer for the full thing" do
|
77
|
+
@subject.do_copy_dvd_to_hard_drive(false)
|
78
|
+
@subject.background_thread.join
|
79
|
+
@args[-2].should == nil
|
80
|
+
@command.should match /explorer/
|
81
|
+
@command.should_not match /fulli/
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should be able to return the full list if it already exists" do
|
85
|
+
FileUtils.touch "abc.fulli.tmp.avi.done"
|
86
|
+
@subject.do_copy_dvd_to_hard_drive(false,true).should == [true, "abc.fulli.tmp.avi"]
|
87
|
+
FileUtils.rm "abc.fulli.tmp.avi.done"
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should call explorer for the we can't reach this path of opening a partial without telling it what to do with it" do
|
91
|
+
@subject.do_copy_dvd_to_hard_drive(true).should == [false, "abc.fulli.tmp.avi"]
|
92
|
+
@subject.background_thread.join
|
93
|
+
@args[-1].should == 1
|
94
|
+
@args[-2].should == "01:00"
|
95
|
+
@command.should match /explorer/
|
96
|
+
@command.should_not match /fulli/
|
97
|
+
end
|
98
|
+
|
99
|
+
def prompt_for_start_and_end_times
|
100
|
+
@subject.instance_variable_get(:@preview_section).simulate_click
|
101
|
+
@args[-1].should == 1
|
102
|
+
@args[-2].should == "01:00"
|
103
|
+
@subject.background_thread.join
|
104
|
+
@command.should match /smplayer/
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should prompt for start and end times" do
|
108
|
+
prompt_for_start_and_end_times
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should be able to reprompt for start and end times automagically" do
|
112
|
+
prompt_for_start_and_end_times
|
113
|
+
old_args = @args
|
114
|
+
@args = nil
|
115
|
+
@subject.repeat_last_copy_dvd_to_hard_drive.join
|
116
|
+
@args.should == old_args
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
it "if the .done file exists, it should directly call smplayer" do
|
121
|
+
FileUtils.touch "abc.fulli.tmp.avi.done"
|
122
|
+
@subject.instance_variable_get(:@watch_unedited).simulate_click
|
123
|
+
@command.should == "smplayer abc.fulli.tmp.avi"
|
124
|
+
FileUtils.rm "abc.fulli.tmp.avi.done"
|
125
|
+
end
|
126
|
+
|
127
|
+
it "if the .done file does not exist, it should call mplayer later" do
|
128
|
+
@subject.instance_variable_get(:@watch_unedited).simulate_click
|
129
|
+
@subject.after_success_once.should_not == nil
|
130
|
+
@command.should == nil # scary timing spec
|
131
|
+
@subject.background_thread.join
|
132
|
+
# should have cleaned up...
|
133
|
+
@subject.after_success_once.should == nil
|
134
|
+
@command.should_not == nil
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should create a new file for ya" do
|
138
|
+
out = MainWindow::EDL_DIR + "/volume.txt"
|
139
|
+
File.exist?( out ).should be_false
|
140
|
+
@subject.instance_variable_get(:@create_new_edl_for_current_dvd).simulate_click
|
141
|
+
begin
|
142
|
+
File.exist?( out ).should be_true
|
143
|
+
ensure
|
144
|
+
FileUtils.rm_rf out
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should display unique" do
|
149
|
+
@subject.instance_variable_get(:@display_unique).simulate_click.should == "01:00"
|
150
|
+
end
|
151
|
+
|
31
152
|
end
|
32
|
-
end
|
153
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# comments can go after a # on any line.
|
2
|
+
"mutes" => [
|
3
|
+
"0:00:01.0", "00:00:02.0", "dang",
|
4
|
+
],
|
5
|
+
|
6
|
+
"blank_outs" => [
|
7
|
+
"1:16:50.0" , "1:17:00.0", "bad ..."
|
8
|
+
],
|
9
|
+
"disk_unique_id" => "5a0a43f52e5d5e705fdfaa831b38409b",
|
10
|
+
"title" => "COOL_RUNNINGS",
|
11
|
+
"dvd_title_track" => "1"
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 16
|
8
|
-
-
|
9
|
-
version: 0.16.
|
8
|
+
- 7
|
9
|
+
version: 0.16.7
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Roger Pack
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-06 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -161,11 +161,13 @@ files:
|
|
161
161
|
- ChangeLog
|
162
162
|
- LICENSE
|
163
163
|
- README
|
164
|
+
- RUN SENSIBLE CINEMA CLICK HERE.bat
|
164
165
|
- Rakefile
|
165
166
|
- TODO
|
166
167
|
- VERSION
|
167
168
|
- bin/sensible-cinema
|
168
169
|
- bin/sensible-cinema-cli
|
170
|
+
- edit sensible cinema decision list files.bat
|
169
171
|
- experimental_readme.txt
|
170
172
|
- ext/mkrf_conf.rb
|
171
173
|
- gplv3.txt
|
@@ -188,8 +190,6 @@ files:
|
|
188
190
|
- lib/swing_helpers.rb
|
189
191
|
- lib/vlc_programmer.rb
|
190
192
|
- never_do
|
191
|
-
- run_sensible_cinema.bat
|
192
|
-
- run_sensible_cinema_in_create_mode.bat
|
193
193
|
- sensible-cinema.gemspec
|
194
194
|
- spec/blanker.spec.rb
|
195
195
|
- spec/common.rb
|
@@ -259,6 +259,7 @@ files:
|
|
259
259
|
- vendor/gocr049.exe
|
260
260
|
- vendor/unzip.exe
|
261
261
|
- zamples/edit_decision_lists/category descriptions.txt
|
262
|
+
- zamples/edit_decision_lists/dvds/COOL_RUNNINGS.txt
|
262
263
|
- zamples/edit_decision_lists/dvds/bob the builder pets in a pickle.txt
|
263
264
|
- zamples/edit_decision_lists/dvds/bobs_big_plan.txt
|
264
265
|
- zamples/edit_decision_lists/dvds/happiest baby on the block.txt
|