sensible-cinema 0.16.5 → 0.16.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|