sensible-cinema 0.12.0 → 0.13.0
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/TODO +2 -5
- data/VERSION +1 -1
- data/bin/AboutDialog.class +0 -0
- data/bin/AboutDialog.java +38 -0
- data/bin/ComboBoxes$1.class +0 -0
- data/bin/ComboBoxes$2.class +0 -0
- data/bin/ComboBoxes.class +0 -0
- data/bin/ComboBoxes.java +67 -0
- data/bin/sensible-cinema +138 -85
- data/bin/sensible-cinema-cli +107 -0
- data/bin/sensible-cinema-hit-reload-twice-then-save-copy-of-for-death +105 -0
- data/bin/swing_helpers.rb +48 -0
- data/lib/vlc_programmer.rb +10 -6
- data/spec/vlc_programmer.spec.rb +5 -1
- data/zamples/scene_lists/dvds/all_dogs_go_to_heaven_dvd.yml +1 -1
- data/zamples/scene_lists/dvds/bobs_big_plan.yml +9 -0
- data/zamples/scene_lists/dvds/cars_disney.yml +1 -1
- metadata +23 -4
data/TODO
CHANGED
@@ -23,12 +23,9 @@
|
|
23
23
|
|
24
24
|
== random 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). ==
|
25
25
|
|
26
|
-
some real GUI...then I can have an 'edit preferences' button et al.
|
27
|
-
|
28
26
|
"sav-ize"
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
GUI to make that actually feasible
|
28
|
+
|
32
29
|
"ripperzy-ize"
|
33
30
|
can rip from DVD and then edit that
|
34
31
|
mplayer?
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.13.0
|
Binary file
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import java.awt.BorderLayout;
|
2
|
+
import java.awt.Dimension;
|
3
|
+
import java.awt.Point;
|
4
|
+
import java.awt.event.ActionEvent;
|
5
|
+
import java.awt.event.ActionListener;
|
6
|
+
import javax.swing.JButton;
|
7
|
+
import javax.swing.JDialog;
|
8
|
+
import javax.swing.JFrame;
|
9
|
+
import javax.swing.JLabel;
|
10
|
+
import javax.swing.JPanel;
|
11
|
+
public class AboutDialog extends JDialog implements ActionListener {
|
12
|
+
public AboutDialog(JFrame parent, String title, String message) {
|
13
|
+
super(parent, title, true);
|
14
|
+
if (parent != null) {
|
15
|
+
Dimension parentSize = parent.getSize();
|
16
|
+
Point p = parent.getLocation();
|
17
|
+
setLocation(p.x + parentSize.width / 4, p.y + parentSize.height / 4);
|
18
|
+
}
|
19
|
+
JPanel messagePane = new JPanel();
|
20
|
+
messagePane.add(new JLabel(message));
|
21
|
+
getContentPane().add(messagePane);
|
22
|
+
JPanel buttonPane = new JPanel();
|
23
|
+
JButton button = new JButton("OK");
|
24
|
+
buttonPane.add(button);
|
25
|
+
button.addActionListener(this);
|
26
|
+
getContentPane().add(buttonPane, BorderLayout.SOUTH);
|
27
|
+
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
|
28
|
+
pack();
|
29
|
+
setVisible(true);
|
30
|
+
}
|
31
|
+
public void actionPerformed(ActionEvent e) {
|
32
|
+
setVisible(false);
|
33
|
+
dispose();
|
34
|
+
}
|
35
|
+
public static void main(String[] a) {
|
36
|
+
AboutDialog dlg = new AboutDialog(new JFrame(), "title", "message");
|
37
|
+
}
|
38
|
+
}
|
Binary file
|
Binary file
|
Binary file
|
data/bin/ComboBoxes.java
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
|
2
|
+
// : c14:ComboBoxes.java
|
3
|
+
// Using drop-down lists.
|
4
|
+
// <applet code=ComboBoxes width=200 height=125></applet>
|
5
|
+
// From 'Thinking in Java, 3rd ed.' (c) Bruce Eckel 2002
|
6
|
+
// www.BruceEckel.com. See copyright notice in CopyRight.txt.
|
7
|
+
|
8
|
+
import java.awt.Container;
|
9
|
+
import java.awt.FlowLayout;
|
10
|
+
import java.awt.event.ActionEvent;
|
11
|
+
import java.awt.event.ActionListener;
|
12
|
+
|
13
|
+
import javax.swing.JApplet;
|
14
|
+
import javax.swing.JButton;
|
15
|
+
import javax.swing.JComboBox;
|
16
|
+
import javax.swing.JFrame;
|
17
|
+
import javax.swing.JTextField;
|
18
|
+
|
19
|
+
public class ComboBoxes extends JApplet {
|
20
|
+
private String[] description = { "Ebullient", "Obtuse", "Recalcitrant",
|
21
|
+
"Brilliant", "Somnescent", "Timorous", "Florid", "Putrescent" };
|
22
|
+
|
23
|
+
private JTextField t = new JTextField(15);
|
24
|
+
|
25
|
+
private JComboBox c = new JComboBox();
|
26
|
+
|
27
|
+
private JButton b = new JButton("Add items");
|
28
|
+
|
29
|
+
private int count = 0;
|
30
|
+
|
31
|
+
public void init() {
|
32
|
+
for (int i = 0; i < 4; i++)
|
33
|
+
c.addItem(description[count++]);
|
34
|
+
t.setEditable(false);
|
35
|
+
b.addActionListener(new ActionListener() {
|
36
|
+
public void actionPerformed(ActionEvent e) {
|
37
|
+
if (count < description.length)
|
38
|
+
c.addItem(description[count++]);
|
39
|
+
}
|
40
|
+
});
|
41
|
+
c.addActionListener(new ActionListener() {
|
42
|
+
public void actionPerformed(ActionEvent e) {
|
43
|
+
t.setText("index: " + c.getSelectedIndex() + " "
|
44
|
+
+ ((JComboBox) e.getSource()).getSelectedItem());
|
45
|
+
}
|
46
|
+
});
|
47
|
+
Container cp = getContentPane();
|
48
|
+
cp.setLayout(new FlowLayout());
|
49
|
+
cp.add(t);
|
50
|
+
cp.add(c);
|
51
|
+
cp.add(b);
|
52
|
+
}
|
53
|
+
|
54
|
+
public static void main(String[] args) {
|
55
|
+
run(new ComboBoxes(), 200, 125);
|
56
|
+
}
|
57
|
+
|
58
|
+
public static void run(JApplet applet, int width, int height) {
|
59
|
+
JFrame frame = new JFrame();
|
60
|
+
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
61
|
+
frame.getContentPane().add(applet);
|
62
|
+
frame.setSize(width, height);
|
63
|
+
applet.init();
|
64
|
+
applet.start();
|
65
|
+
frame.setVisible(true);
|
66
|
+
}
|
67
|
+
} ///:~
|
data/bin/sensible-cinema
CHANGED
@@ -1,99 +1,152 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
|
-
|
3
2
|
puts 'Welcome to Sensible Cinema...'
|
3
|
+
|
4
4
|
require 'rubygems'
|
5
5
|
require 'sane'
|
6
|
+
require File.dirname(__FILE__) + '/swing_helpers'
|
7
|
+
load File.dirname(__FILE__) + '/sensible-cinema-cli'
|
8
|
+
require 'tmpdir'
|
9
|
+
require 'ruby-wmi'
|
6
10
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
11
|
+
module SensibleSwing
|
12
|
+
class MainWindow < JFrame
|
13
|
+
def initialize
|
14
|
+
super "Sensible-Cinema"
|
15
|
+
setDefaultCloseOperation JFrame::EXIT_ON_CLOSE
|
16
|
+
panel = JPanel.new
|
17
|
+
panel.set_layout nil
|
18
|
+
setSize 350,400
|
19
|
+
add panel # why can't I just slap these down?
|
20
|
+
|
21
|
+
jlabel = JLabel.new 'Welcome to Sensible Cinema'
|
22
|
+
happy = Font.new("Tahoma", Font::PLAIN, 11)
|
23
|
+
jlabel.setFont(happy)
|
24
|
+
jlabel.set_bounds(44,44,136,14)
|
25
|
+
panel.add jlabel
|
26
|
+
b = JButton.new( "Play Hulu, Youtube, or a DVD" ).on_clicked {
|
27
|
+
self.close
|
28
|
+
go_sc
|
29
|
+
}
|
30
|
+
b.set_bounds(44,120,200,23)
|
31
|
+
panel.add b
|
28
32
|
|
29
|
-
|
30
|
-
|
31
|
-
|
33
|
+
c=JButton.new( "Copy edited DVD to Hard Drive" )
|
34
|
+
c.on_clicked {
|
35
|
+
drive = choose_dvd_drive
|
36
|
+
fc = JFileChooser.new
|
37
|
+
fc.setFileSelectionMode(nil)
|
38
|
+
fc.set_dialog_title "Please pick a DVD descriptor file"
|
39
|
+
fc.set_current_directory(JFile.new( __dir__ + "/../zamples/scene_lists/dvds"))
|
40
|
+
descriptor_path = fc.go
|
41
|
+
descriptors = YAML.load_file descriptor_path
|
42
|
+
|
43
|
+
fc = JFileChooser.new
|
44
|
+
# LODO allow for spaces in save to file
|
45
|
+
fc.set_dialog_title "Pick a location to save it to (like 'my_dvd')"
|
46
|
+
save_to_file_name = ((descriptors["title"] || "my dvd") + ' edited').gsub(' ', '_').gsub( /\W/, '') # no punctuation for now...
|
47
|
+
fc.setSelectedFile(JFile.new(get_drive_with_most_space + save_to_file_name))
|
48
|
+
save_to = fc.go
|
49
|
+
# TODO don't pop up those annoying windows
|
50
|
+
dvd_title_track = descriptors["dvd_title_track"]
|
51
|
+
bat_file = VLCProgrammer.convert_to_full_xspf(descriptors, save_to, drive)
|
52
|
+
temp_dir = Dir.tmpdir
|
53
|
+
temp_file = temp_dir + '/' + 'convert_it.bat'
|
54
|
+
File.write(temp_file, bat_file)
|
55
|
+
p 'running', temp_file
|
56
|
+
# TODO change title to "running" or something, while it runs...
|
57
|
+
if !ARGV.find{|a| a == '--test'} && system(temp_file)
|
58
|
+
JOptionPane.showMessageDialog(nil, " Done--you may now watch file #{save_to}.ps in VLC player", "Done!", JOptionPane::ERROR_MESSAGE)
|
59
|
+
command = "explorer /e,/select,\"#{File.expand_path(save_to).gsub('/', '\\')}.ps\""
|
60
|
+
system command
|
61
|
+
File.delete temp_file
|
62
|
+
self.close
|
63
|
+
else
|
64
|
+
JOptionPane.showMessageDialog(nil, " Failed--please examine #{temp_file} and screen output and report back!", "Failed", JOptionPane::ERROR_MESSAGE)
|
65
|
+
end
|
66
|
+
# TODO warn if they don't have VLC installed...
|
67
|
+
# LODO warn if they will overwrite a file
|
68
|
+
}
|
69
|
+
|
70
|
+
c.set_bounds(44,180,200,23)
|
71
|
+
panel.add c
|
72
|
+
|
73
|
+
exit = JButton.new("Exit").on_clicked {
|
74
|
+
self.close
|
75
|
+
}
|
76
|
+
exit.set_bounds(44,320,200,23)
|
77
|
+
panel.add exit
|
78
|
+
|
79
|
+
reload = JButton.new( "reload code" ).on_clicked {
|
80
|
+
eval File.read(__FILE__), nil, __FILE__
|
81
|
+
p 're-evaled it'
|
82
|
+
}
|
83
|
+
reload.set_bounds(44,280,200,23)
|
84
|
+
panel.add reload if ARGV.find{|a| a == '--test'}
|
85
|
+
|
86
|
+
end
|
32
87
|
|
33
|
-
|
88
|
+
def exit_and_close
|
89
|
+
JOptionPane.showMessageDialog(nil, "exiting", "exiting", JOptionPane::ERROR_MESSAGE)
|
90
|
+
close
|
91
|
+
exit
|
92
|
+
end
|
34
93
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
player_description = ARGV.shift.to_s
|
40
|
-
if !File.exist?(player_description)
|
41
|
-
puts 'Please Select Computer Player'
|
42
|
-
player_description = FileChooser.choose_file(" SELECT COMPUTER PLAYER", __dir__ + "/../zamples/players")
|
43
|
-
end
|
44
|
-
|
45
|
-
scene_list = ARGV.shift.to_s
|
46
|
-
|
47
|
-
if scene_list == 'test'
|
48
|
-
overlay = nil
|
49
|
-
p 'got test...just doing screen dump'
|
50
|
-
$VERBOSE=true # adds some extra output
|
51
|
-
else
|
52
|
-
if !File.exist? scene_list
|
53
|
-
puts 'Select Scene Descriptions file'
|
54
|
-
scene_list = FileChooser.choose_file(" SELECT SCENE DESCRIPTIONS FILE", __dir__ + "/../zamples/scene_lists")
|
55
|
-
end
|
94
|
+
|
95
|
+
def choose_dvd_drive
|
96
|
+
opticals = get_dvd_drives
|
97
|
+
opticals.map!{|d| d.Name + "\\" + " (" + d.VolumeName + ")"}
|
56
98
|
|
57
|
-
if
|
58
|
-
|
59
|
-
|
99
|
+
if opticals.length != 1
|
100
|
+
dialog = GetDisk.new(self, opticals)
|
101
|
+
dialog.show
|
102
|
+
selected = dialog.selected
|
103
|
+
else
|
104
|
+
selected = opticals[0]
|
60
105
|
end
|
61
|
-
|
62
|
-
|
63
|
-
Blanker.startup
|
64
|
-
# todo start it late as it has an annoying startup blip
|
65
|
-
overlay = OverLayer.new(scene_list)
|
66
|
-
end
|
106
|
+
return selected[0..2]
|
107
|
+
end
|
67
108
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
109
|
+
def get_drive_with_most_space
|
110
|
+
disks = WMI::Win32_LogicalDisk.find(:all)
|
111
|
+
out = disks.sort_by{|d| d.FreeSpace}[-1].Name + "\\"
|
112
|
+
out
|
113
|
+
end
|
73
114
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
screen_tracker.dump_bmp
|
80
|
-
exit 1
|
81
|
-
end
|
82
|
-
screen_tracker.process_forever_in_thread
|
83
|
-
else
|
84
|
-
puts 'warning--not using any screen tracking...'
|
115
|
+
|
116
|
+
private
|
117
|
+
def get_dvd_drives
|
118
|
+
disks = WMI::Win32_LogicalDisk.find(:all)
|
119
|
+
disks.select{|d| d.Description =~ /CD-ROM/} # hope this works...
|
85
120
|
end
|
86
|
-
|
87
|
-
OCR.unserialize_cache_from_disk # do this every time so we don't delete it if they don't have one...
|
88
121
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
122
|
+
end
|
123
|
+
|
124
|
+
class GetDisk < JDialog
|
125
|
+
attr_reader :selected
|
126
|
+
def initialize parent, options_array
|
127
|
+
super parent, true
|
128
|
+
|
129
|
+
box = JComboBox.new
|
130
|
+
box.add_action_listener do |e|
|
131
|
+
idx = box.get_selected_index
|
132
|
+
if idx != 0
|
133
|
+
@selected = box.get_selected_item
|
134
|
+
dispose
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
box.add_item "Select DVD drive" # put something in index 0
|
139
|
+
options_array.each{|drive|
|
140
|
+
box.add_item drive
|
141
|
+
}
|
142
|
+
add box
|
143
|
+
pack
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
SensibleSwing::MainWindow.new.set_visible true
|
151
|
+
|
152
|
+
puts 'Please use the Sensible Cinema GUI window'
|
@@ -0,0 +1,107 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'sane'
|
5
|
+
|
6
|
+
Thread.abort_on_exception=true #gah
|
7
|
+
|
8
|
+
for file in ['overlayer', 'keyboard_input', 'screen_tracker', 'mouse', 'file_chooser', 'ocr', 'vlc_programmer']
|
9
|
+
require_relative '../lib/' + file
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def go_sc(args=ARGV)
|
14
|
+
|
15
|
+
$VERBOSE = 1 if args.delete('-v')
|
16
|
+
$TEST = 1 if args.delete('-t')
|
17
|
+
if args.delete('--clear-cache')
|
18
|
+
OCR.clear_cache!
|
19
|
+
puts 'cleared cache'
|
20
|
+
end
|
21
|
+
|
22
|
+
$stderr.puts 'warning: currently windows only for certain parts currently' unless ENV['OS'] == 'Windows_NT'
|
23
|
+
|
24
|
+
if args.detect{|arg| arg == '-h' || arg == '--help'}
|
25
|
+
|
26
|
+
puts <<-END
|
27
|
+
|
28
|
+
syntax: player_description.yml|test scene_descriptions_list.yml [-t -v --clear-cache] (or nothing to prompt for files)
|
29
|
+
END
|
30
|
+
|
31
|
+
for file in Dir[__dir__ + '../zamples/mute*/*']
|
32
|
+
puts "\n", "Example file:", file + "\n\n", File.read(file)
|
33
|
+
end
|
34
|
+
|
35
|
+
exit 1
|
36
|
+
|
37
|
+
else
|
38
|
+
|
39
|
+
# allow for command line filenames
|
40
|
+
|
41
|
+
player_description = args.shift.to_s
|
42
|
+
if !File.exist?(player_description)
|
43
|
+
puts 'Please Select Computer Player'
|
44
|
+
player_description = FileChooser.choose_file(" SELECT COMPUTER PLAYER", __dir__ + "/../zamples/players")
|
45
|
+
end
|
46
|
+
|
47
|
+
scene_list = args.shift.to_s
|
48
|
+
|
49
|
+
if scene_list == 'test'
|
50
|
+
overlay = nil
|
51
|
+
p 'got test...just doing screen dump'
|
52
|
+
$VERBOSE=true # adds some extra output
|
53
|
+
else
|
54
|
+
if !File.exist? scene_list
|
55
|
+
puts 'Select Scene Descriptions file'
|
56
|
+
scene_list = FileChooser.choose_file(" SELECT SCENE DESCRIPTIONS FILE", __dir__ + "/../zamples/scene_lists")
|
57
|
+
end
|
58
|
+
|
59
|
+
if !scene_list
|
60
|
+
puts "error: have to specify a scene descriptions file\n or specify \"test\" on the command line if you just want to snapshot your player"
|
61
|
+
exit 1
|
62
|
+
end
|
63
|
+
|
64
|
+
puts 'Selected scene descriptions file ' + File.basename(scene_list) + "\n\t(full path: #{scene_list})"
|
65
|
+
Blanker.startup
|
66
|
+
# todo start it late as it has an annoying startup blip
|
67
|
+
overlay = OverLayer.new(scene_list)
|
68
|
+
end
|
69
|
+
|
70
|
+
if File.exist? player_description.to_s
|
71
|
+
puts 'Selected player ' + File.basename(player_description) + "\n\t(full path: #{player_description})"
|
72
|
+
# this one doesn't use any updates, so just pass in file contents, not filename
|
73
|
+
screen_tracker = ScreenTracker.new_from_yaml File.binread(player_description), overlay
|
74
|
+
Mouse.jitter_forever_in_own_thread # when this ends you know a snapshot was taken...
|
75
|
+
|
76
|
+
# exit early if we just wanted a screen dump...a little kludgey...
|
77
|
+
unless overlay
|
78
|
+
puts 'warning--only doing screen dump in t-minus 4s...'
|
79
|
+
sleep 4
|
80
|
+
puts 'snap!'
|
81
|
+
screen_tracker.dump_bmp
|
82
|
+
exit 1
|
83
|
+
end
|
84
|
+
screen_tracker.process_forever_in_thread
|
85
|
+
else
|
86
|
+
puts 'warning--not using any screen tracking...'
|
87
|
+
end
|
88
|
+
|
89
|
+
OCR.unserialize_cache_from_disk # do this every time so we don't delete it if they don't have one...
|
90
|
+
|
91
|
+
puts "Opening the curtains... (please play in player now)"
|
92
|
+
overlay.start_thread true
|
93
|
+
key_input = KeyboardInput.new overlay
|
94
|
+
key_input.start_thread # status thread
|
95
|
+
at_exit {
|
96
|
+
Blanker.shutdown # lodo move this and the 'q' key to within overlayer
|
97
|
+
OCR.serialize_cache_to_disk
|
98
|
+
}
|
99
|
+
key_input.handle_keystrokes_forever # when this method exits, we want to exit fully...
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
if __FILE__ == $0
|
105
|
+
puts 'Welcome to Sensible Cinema...'
|
106
|
+
go_sc
|
107
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
puts 'Welcome to Sensible Cinema...'
|
3
|
+
require 'rubygems'
|
4
|
+
require 'ruby-wmi'
|
5
|
+
require 'swing_helpers'
|
6
|
+
|
7
|
+
module SensibleSwing
|
8
|
+
class MainWindow < JFrame
|
9
|
+
def initialize
|
10
|
+
super "Sensible-Cinema"
|
11
|
+
setDefaultCloseOperation JFrame::EXIT_ON_CLOSE
|
12
|
+
panel = JPanel.new
|
13
|
+
panel.set_layout nil
|
14
|
+
setSize 350,400
|
15
|
+
add panel # why can't I just slap these down?
|
16
|
+
|
17
|
+
jlabel = JLabel.new 'Welcome to Sensible Cinema'
|
18
|
+
happy = Font.new("Tahoma", Font::PLAIN, 11)
|
19
|
+
jlabel.setFont(happy)
|
20
|
+
jlabel.set_bounds(44,44,136,14)
|
21
|
+
panel.add jlabel
|
22
|
+
|
23
|
+
c=JButton.new( "Save local copy of an edited DVD" )
|
24
|
+
c.on_clicked {
|
25
|
+
drive = get_disk_name
|
26
|
+
=begin
|
27
|
+
fc = JFileChooser.new
|
28
|
+
fc.setFileSelectionMode(nil)
|
29
|
+
fc.set_dialog_title "Please pick a DVD descriptor file"
|
30
|
+
fc.set_current_directory(JFile.new( __dir__ + "/../zamples/scene_lists/dvds"))
|
31
|
+
descriptor = fc.execute
|
32
|
+
fc = JFileChooser.new
|
33
|
+
# TODO allow for spaces in save to file
|
34
|
+
fc.set_dialog_title "Pick a location to save it to (like 'my_dvd')"
|
35
|
+
fc.setCurrentDirectory(JFile.new("c:\\"))
|
36
|
+
save_to = fc.execute
|
37
|
+
p [drive, descriptor, save_to]
|
38
|
+
descriptors = YAML.load_file descriptor
|
39
|
+
bat_file = VLCProgrammer.convert_to_full_xspf(descriptors, save_to, drive)
|
40
|
+
temp_dir = Dir.tmpdir
|
41
|
+
temp_file = temp_dir + '/' + 'convert_it.bat'
|
42
|
+
File.write(temp_file, bat_file)
|
43
|
+
p 'running', temp_file
|
44
|
+
p 'got', system(temp_file)
|
45
|
+
JOptionPane.showMessageDialog(nil, " Done--you may now watch file #{save_to}.ps in VLC player", "Done!", JOptionPane::ERROR_MESSAGE)
|
46
|
+
self.close
|
47
|
+
=end
|
48
|
+
}
|
49
|
+
c.set_bounds(44,180,200,23)
|
50
|
+
panel.add c
|
51
|
+
|
52
|
+
reload = JButton.new( "reload code" ).on_clicked {
|
53
|
+
eval File.read(__FILE__), nil, __FILE__
|
54
|
+
p 're-evaled it'
|
55
|
+
}
|
56
|
+
reload.set_bounds(44,280,200,23)
|
57
|
+
panel.add reload # if ARGV.find{|a| a == '--test'}
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
def exit_and_close
|
62
|
+
JOptionPane.showMessageDialog(nil, "exiting", "exiting", JOptionPane::ERROR_MESSAGE)
|
63
|
+
close
|
64
|
+
exit
|
65
|
+
end
|
66
|
+
|
67
|
+
def get_disk_name
|
68
|
+
disks = WMI::Win32_LogicalDisk.find(:all)
|
69
|
+
|
70
|
+
opticals = disks.select{|d| d.Description =~ /CD-ROM/}
|
71
|
+
|
72
|
+
opticals.map!{|d| [d.Name + "\\", d.VolumeName]}
|
73
|
+
p opticals
|
74
|
+
p 'showing dialog'
|
75
|
+
dialog = GetDisk.new(self, opticals)
|
76
|
+
p 'done showing dialog'
|
77
|
+
|
78
|
+
return opticals[0][0]
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
class GetDisk < JDialog
|
85
|
+
def initialize parent, options_array
|
86
|
+
super parent, true
|
87
|
+
|
88
|
+
box = JComboBox.new
|
89
|
+
box.add_action_listener do |e|
|
90
|
+
p 'chosen perhaps?', e, box.get_selected_index, e.get_source, get_selected_item
|
91
|
+
#dispose if
|
92
|
+
end
|
93
|
+
box.add_item "Select DVD drive"
|
94
|
+
box.add_item "halloo"
|
95
|
+
|
96
|
+
add box
|
97
|
+
pack
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
SensibleSwing::MainWindow.new.set_visible true
|
104
|
+
|
105
|
+
puts 'Please see the Sensible Cinema window'
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'java'
|
2
|
+
module SensibleSwing
|
3
|
+
include_package 'javax.swing'
|
4
|
+
[JButton, JFrame, JLabel, JPanel, JOptionPane,
|
5
|
+
JFileChooser, JComboBox, JDialog] # grab these constants (http://jira.codehaus.org/browse/JRUBY-5107)
|
6
|
+
include_package 'java.awt'
|
7
|
+
[FlowLayout, Font]
|
8
|
+
include_class 'java.awt.event.ActionListener'
|
9
|
+
JFile = java.io.File
|
10
|
+
|
11
|
+
class JButton
|
12
|
+
def initialize *args
|
13
|
+
super *args
|
14
|
+
set_font Font.new("Tahoma", Font::PLAIN, 11)
|
15
|
+
end
|
16
|
+
|
17
|
+
def on_clicked &block
|
18
|
+
raise unless block
|
19
|
+
add_action_listener do |e|
|
20
|
+
block.call
|
21
|
+
end
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
class JFrame
|
28
|
+
def close
|
29
|
+
dispose # sigh
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class JFileChooser
|
34
|
+
# returns nil on failure...
|
35
|
+
def go
|
36
|
+
success = show_open_dialog nil
|
37
|
+
unless success == Java::javax::swing::JFileChooser::APPROVE_OPTION
|
38
|
+
puts "did not choose one"
|
39
|
+
java.lang.System.exit 1
|
40
|
+
end
|
41
|
+
get_selected_file.get_absolute_path
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
# code examples
|
48
|
+
# JOptionPane.showInputDialog(nil, "not implemented yet", "not implemented yet", JOptionPane::ERROR_MESSAGE)
|
data/lib/vlc_programmer.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
require_relative 'overlayer'
|
2
2
|
|
3
|
+
# add some common locations for vlc.exe to the path...
|
4
|
+
ENV['PATH'] = ENV['PATH'] + ";C:\\Program Files\\VideoLAN\\VLC"+ ";D:\\Program Files\\VideoLAN\\VLC" + ";E:\\Program Files\\VideoLAN\\VLC"
|
5
|
+
|
3
6
|
class VLCProgrammer
|
4
7
|
|
5
8
|
def self.to_english s
|
@@ -7,8 +10,10 @@ class VLCProgrammer
|
|
7
10
|
@overlayer.translate_time_to_human_readable s
|
8
11
|
end
|
9
12
|
|
10
|
-
def self.convert_to_full_xspf incoming, filename = nil
|
13
|
+
def self.convert_to_full_xspf incoming, filename = nil, drive_with_slash = nil, dvd_title_track = nil
|
14
|
+
@drive = drive_with_slash || "e:\\"
|
11
15
|
@filename = filename
|
16
|
+
@dvd_title_track = dvd_title_track || "1"
|
12
17
|
mutes = incoming["mutes"] || {}
|
13
18
|
blanks = incoming["blank_outs"] || {}
|
14
19
|
mutes = mutes.map{|k, v| [OverLayer.translate_string_to_seconds(k), OverLayer.translate_string_to_seconds(v), :mute]}
|
@@ -93,7 +98,7 @@ class VLCProgrammer
|
|
93
98
|
end
|
94
99
|
|
95
100
|
def self.get_section title, start, stop, idx, no_audio = false
|
96
|
-
loc = "dvd
|
101
|
+
loc = "dvd://#{@drive}@#{@dvd_title_track}"
|
97
102
|
if !@filename
|
98
103
|
"<track>
|
99
104
|
<title>#{title}</title>
|
@@ -106,7 +111,7 @@ class VLCProgrammer
|
|
106
111
|
<location>#{loc}</location>
|
107
112
|
</track>"
|
108
113
|
else
|
109
|
-
"call vlc -I dummy #{loc} --start-time=#{start} --stop-time=#{stop} --sout
|
114
|
+
"call vlc -I dummy #{loc} --start-time=#{start} --stop-time=#{stop} --sout=\"file/ps:#{@filename}.ps.#{idx}\" #{"--no-sout-audio" if no_audio} vlc://quit\n" # +
|
110
115
|
#"call vlc #{@filename}.ps.#{idx}.tmp --sout=file/ps:go.ps
|
111
116
|
end
|
112
117
|
end
|
@@ -118,14 +123,13 @@ class VLCProgrammer
|
|
118
123
|
files = (1..idx).map{|n| "#{@filename}.ps.#{n}"}
|
119
124
|
# concat
|
120
125
|
line = 'type ' + files.join(' ')
|
121
|
-
line += " > #{@filename}.
|
126
|
+
line += " > #{@filename}.ps\n"
|
122
127
|
|
123
128
|
line += "rm " + files.join(' ') + "\n"
|
124
|
-
line += "echo Done--you may now watch file #{@filename}.
|
129
|
+
line += "echo Done--you may now watch file #{@filename}.ps in VLC player"
|
125
130
|
end
|
126
131
|
|
127
132
|
end
|
128
|
-
|
129
133
|
|
130
134
|
end
|
131
135
|
|
data/spec/vlc_programmer.spec.rb
CHANGED
@@ -95,7 +95,11 @@ describe 'VLC Programmer' do
|
|
95
95
|
File.write('mute5-10.bat', bat_file)
|
96
96
|
puts 'run it like $ mute5-10.bat'
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
|
+
it "should modify path to have VLC available" do
|
100
|
+
ENV['PATH'].should include("VideoLAN")
|
101
|
+
end
|
102
|
+
|
99
103
|
it "should produce a workable non VLC playable file"
|
100
104
|
|
101
105
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 13
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.13.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Roger Pack
|
@@ -14,8 +14,8 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-11-
|
18
|
-
default_executable:
|
17
|
+
date: 2010-11-19 00:00:00 -07:00
|
18
|
+
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: sane
|
@@ -116,7 +116,16 @@ dependencies:
|
|
116
116
|
description:
|
117
117
|
email: rogerdpack@gmail.com
|
118
118
|
executables:
|
119
|
+
- AboutDialog.class
|
120
|
+
- AboutDialog.java
|
121
|
+
- ComboBoxes$1.class
|
122
|
+
- ComboBoxes$2.class
|
123
|
+
- ComboBoxes.class
|
124
|
+
- ComboBoxes.java
|
119
125
|
- sensible-cinema
|
126
|
+
- sensible-cinema-cli
|
127
|
+
- sensible-cinema-hit-reload-twice-then-save-copy-of-for-death
|
128
|
+
- swing_helpers.rb
|
120
129
|
extensions:
|
121
130
|
- ext/mkrf_conf.rb
|
122
131
|
extra_rdoc_files:
|
@@ -130,6 +139,8 @@ files:
|
|
130
139
|
- TODO
|
131
140
|
- VERSION
|
132
141
|
- bin/sensible-cinema
|
142
|
+
- bin/sensible-cinema-cli
|
143
|
+
- bin/swing_helpers.rb
|
133
144
|
- ext/mkrf_conf.rb
|
134
145
|
- gplv3.txt
|
135
146
|
- lib/blanker.rb
|
@@ -238,6 +249,7 @@ files:
|
|
238
249
|
- zamples/scene_lists/category descriptions.yml
|
239
250
|
- zamples/scene_lists/dvds/White Christmas.yml
|
240
251
|
- zamples/scene_lists/dvds/all_dogs_go_to_heaven_dvd.yml
|
252
|
+
- zamples/scene_lists/dvds/bobs_big_plan.yml
|
241
253
|
- zamples/scene_lists/dvds/cars_disney.yml
|
242
254
|
- zamples/scene_lists/dvds/happy_feet_dvd.yml
|
243
255
|
- zamples/scene_lists/dvds/labyrinth.yml
|
@@ -246,6 +258,13 @@ files:
|
|
246
258
|
- zamples/scene_lists/star_trek_generations_hulu.yml
|
247
259
|
- zamples/scene_lists/youtube/gummy_bear_song_youtube.yml
|
248
260
|
- zamples/scene_lists/youtube/nuki_song_youtube.yml
|
261
|
+
- bin/AboutDialog.class
|
262
|
+
- bin/AboutDialog.java
|
263
|
+
- bin/ComboBoxes$1.class
|
264
|
+
- bin/ComboBoxes$2.class
|
265
|
+
- bin/ComboBoxes.class
|
266
|
+
- bin/ComboBoxes.java
|
267
|
+
- bin/sensible-cinema-hit-reload-twice-then-save-copy-of-for-death
|
249
268
|
has_rdoc: true
|
250
269
|
homepage: http://github.com/rdp
|
251
270
|
licenses: []
|