sensible-cinema 0.15.0 → 0.16.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. data/ChangeLog +15 -1
  2. data/LICENSE +46 -35
  3. data/Rakefile +7 -10
  4. data/TODO +61 -67
  5. data/VERSION +1 -1
  6. data/bin/sensible-cinema +195 -113
  7. data/lib/edl_parser.rb +54 -0
  8. data/lib/mencoder_wrapper.rb +8 -9
  9. data/lib/storage.rb +82 -0
  10. data/lib/swing_helpers.rb +19 -1
  11. data/run_sensible_cinema_in_create_mode.bat +5 -0
  12. data/sensible-cinema.gemspec +141 -136
  13. data/spec/edl_parser.spec.rb +76 -0
  14. data/spec/mencoder_wrapper.spec.rb +10 -12
  15. data/spec/sensible_cinema_gui.spec.rb +12 -10
  16. data/vendor/unzip.exe +0 -0
  17. data/zamples/edit_decision_lists/category descriptions.txt +1 -0
  18. data/zamples/edit_decision_lists/dvds/bobs_big_plan.txt +9 -12
  19. data/zamples/edit_decision_lists/dvds/happiest baby on the block.txt +8 -11
  20. data/zamples/edit_decision_lists/dvds/White Christmas.txt b/data/zamples/edit_decision_lists/dvds/old_and_inaccurate/White → Christmas.txt +0 -0
  21. data/zamples/edit_decision_lists/dvds/{all_dogs_go_to_heaven.txt → old_and_inaccurate/all_dogs_go_to_heaven.txt} +0 -0
  22. data/zamples/edit_decision_lists/dvds/{cars_disney.txt → old_and_inaccurate/cars_disney.txt} +0 -0
  23. data/zamples/edit_decision_lists/dvds/{happy_feet.txt → old_and_inaccurate/happy_feet.txt} +0 -0
  24. data/zamples/edit_decision_lists/dvds/{labyrinth.txt → old_and_inaccurate/labyrinth.txt} +0 -0
  25. data/zamples/edit_decision_lists/dvds/making marriage work.txt b/data/zamples/edit_decision_lists/dvds/old_and_inaccurate/making marriage → work.txt +0 -0
  26. data/zamples/edit_decision_lists/{star_trek_generations_hulu.txt → dvds/old_and_inaccurate/star_trek_generations_hulu.txt} +0 -0
  27. data/zamples/edit_decision_lists/example_edit_decision_list.txt +36 -20
  28. data/zamples/edit_decision_lists/{youtube → old_not_yet_update/youtube}/gummy_bear_song_youtube.txt +0 -0
  29. data/zamples/edit_decision_lists/{youtube → old_not_yet_update/youtube}/nuki_song_youtube.txt +0 -0
  30. metadata +291 -285
data/ChangeLog CHANGED
@@ -1,7 +1,21 @@
1
+ == 0.16.0 ==
2
+
3
+ Change the YAML style so that it can have filterable categories (disabled for now, but there are unit tests
4
+ that show the use of such as a form of "combining user preferences" with the EDL to produce a
5
+ new customized one.
6
+
7
+ Allow for quite more easily user creation/editing of EDL's by allowing users to access just specific "scenes" of the video edited.
8
+
9
+ Disable title auto selection use, now use md5sum of the DVD's IFO files for auto-selection of EDL.
10
+
1
11
  == 0.15.0 ==
2
12
 
3
13
  Use all i-frames for more accurate precision in cutting segments.
4
14
  Also use ffmpeg and mencoder for the same (no more VLC for encoding). Phew.
15
+ Note that by at least this version, auto DVD title selection as a parameter has been built in (see git log).
16
+ Note that by at least this version, it could compute an md5sum of a DVD's IFO files to compute
17
+ a unique ID for that disk.
18
+ Note that before this, I was using the volume name to generate filenames.
5
19
 
6
20
  == 0.14.8 ==
7
21
 
@@ -13,7 +27,7 @@ Auto-select EDL depending on which disk they have.
13
27
 
14
28
  == 0.14.5 ==
15
29
 
16
- Make it distributable more easily.
30
+ Made it distributable more easily.
17
31
 
18
32
  == 0.14.4 ==
19
33
 
data/LICENSE CHANGED
@@ -1,42 +1,53 @@
1
- All files released under the GPLv3 license [1] unless otherwise specified. Ping me if you want this changed.
2
-
3
- May contain some 3rd party libraries under their own (separate, open source) licenses.
4
-
5
- Note that this software should be legal in the EU,
6
- as it is only software and therefore theoretically not subject to patents (see "What about patent licenses?" in [2]).
7
- It's basically for use in the EU.
1
+ All files released under the GPLv3 license [1] unless otherwise specified. Ping me if you want/need this changed.
2
+
3
+ May contain some 3rd party libraries/executables under their own (separate, open source) licenses.
4
+
5
+ Is this legal?
6
+
7
+ Unclear. In general ripping personal DVD's is fine.
8
+ It is controversial to use open source software to play/rip DVD's.
9
+ There are a few conflicting views.
10
+ Sensible-cinema doesn't actually do any decryption or decoding, nor has any knowledge of it,
11
+ but calls out to another separate program to rip. It doesn't even have knowledge
12
+ as to whether it is ripping something encrypted or not. We don't distribute sensible-cinema with
13
+ that program, either.
14
+ You can ask the authors of that program if it is legal. Apparently
15
+ libdvdcss that it uses has never been challenged in court, and uses a slightly different algorithm
16
+ than those that have.
17
+ Note also that fair use does allow one to "record" things (especially things that they own)
18
+ for personal use/backup.
19
+ Using sensible-cinema is probably not any more unethical than ripping your DVD collection to your hard
20
+ drive so you can keep your DVD's all in one place.
21
+ Also note that if you watch an edited DVD, your are using a DVD player that conforms
22
+ with DMCA specifications, so that might have some influence.
23
+
24
+ In general, you are responsible for your actions and use of this program.
25
+ It is possible that the authors of sensible-cinema are not cupable of anything
26
+ regarding its use themselves, since they re-distribute no edited media,
27
+ nor distribute cracking codes. In general, check your country's rules first.
28
+
29
+ In terms of copyright, it could indeed be legal, at least in the United States, when viewed
30
+ using the "playlist" option (v 0.10'ish).
31
+ In general, if I have the original DVD sitting next to my TV, I don't feel bad about watching
32
+ its edited copy at the same time, but please consult a laywer first if you have any concerns.
33
+
34
+ Do not redistribute copied commercial DVD's. We have learned from clean flicks that
35
+ redistributing edited commercial DVD's is illegal in the US. We hope that sensible-cinema
36
+ is more legal, since you can get the DVD's from wherever you want, and it doesn't change their
37
+ structure at all. Please don't redistribute.
38
+
39
+ DO NOT MAKE ILLEGAL COPIES.
40
+
41
+ Note that this software might well be legal in the EU,
42
+ as it is only software and therefore thus possibly not subject to patents (see "What about patent licenses?" in [2]).
8
43
  If it's not legal in your country, don't use it!
9
44
 
10
- The http://en.wikipedia.org/wiki/Family_Entertainment_and_Copyright_Act describes a recent
11
- US law that appears related (and is in its favor).
12
-
13
- A history of various related thoughts was described here:
45
+ A more ancient history of various related thoughts was described here:
14
46
  http://betterlogic.com/roger/?p=2618
15
47
 
16
- Enjoy!
48
+ Also note that several ideas have been released in the code that are disabled in the final release. Please see the blog
49
+ for release notes http://betterlogic.com/roger, as well as http://ruby-forum.com (ruby talk ML there), and rubygems.org
50
+ which lists the various releases, and github.com/rdp/sensible-cinema which lists commits and changes and releases.
17
51
 
18
52
  [1] http://www.gnu.org/licenses/gpl.html, also gplv3 file.
19
53
  [2] http://www.videolan.org/support/faq.html
20
-
21
- add note "we don't distribute anything that breaks encryption keys" like http://k9copy.sourceforge.net/
22
-
23
- honest about DMCA (we don't distribute the cracker, we don't redistribute, don't perform any acts, etc.)
24
- if you burn you'll eventually be using a DMCA compatible player :P
25
- long list of players...we're not alone :)
26
- the authors of the program might not be liable for damages. We don't feel dishonest about it, as long as
27
- we own the DVD and have it with us when we watch the edited version.
28
-
29
- not more unethical than ripping your DVD collection to hard drive so you can keep your DVD's all in one
30
- place and don't have to worry about losing them. Then you edit them manually to remove cruft, and watch them
31
- from there.
32
-
33
- for me, the images and audio are unencrypted, so storing/saving those away might well be fair use, but check your countries rules first
34
- (similar to how recording using a VCR might well not be illegal under fair use). But don't take my word for it.
35
-
36
- note that you are watching it using only bits and pieces of the original, similar to said bill. And the
37
- authors of the program might not be cupable of copyright infringement themselves, since they distribute no infringed materials.
38
-
39
- Not responsible for your actions. Don't redistribute. "You run the risk on your own"
40
- "should the courts someday rule..." If DVD next to me...
41
-
42
- fair use may apply
data/Rakefile CHANGED
@@ -69,19 +69,11 @@ task 'bundle_dependencies' => 'gemspec' do
69
69
  dependencies.each{|d|
70
70
  system("#{Gem.ruby} -S gem unpack #{d.name}")
71
71
  }
72
- # add imagemagick
73
- puts 'copying in imagemagick'
74
- Dir.mkdir 'imagemagick'
75
- im_identify_command = RubyWhich.new.which('identify').select{|dir| dir =~ /ImageMagick/}[0]
76
- # "d:\\installs\\ImageMagick-6.6.2-Q16\\identify.EXE",
77
- Dir["#{File.dirname im_identify_command}/*"].each{|file|
78
- FileUtils.cp_r(file, 'imagemagick') rescue nil # some fail for some odd reason
79
- }
80
72
  puts 'downloading in jruby-complete.jar file'
81
73
  # jruby complete .jar file
82
74
  Net::HTTP.start("jruby.org.s3.amazonaws.com") { |http|
83
75
  resp = http.get("/downloads/1.5.5/jruby-complete-1.5.5.jar")
84
- puts 'copying... '
76
+ puts 'copying it... '
85
77
  open("jruby-complete-1.5.5.jar", "wb") { |file|
86
78
  file.write(resp.body)
87
79
  }
@@ -107,6 +99,11 @@ task 'create_distro_dir' do
107
99
  FileUtils.mkdir_p dir_out
108
100
  FileUtils.cp_r(existing, dir_out)
109
101
  # this one belongs in the trunk
110
- FileUtils.cp("#{dir_out}/run_sensible_cinema.bat", "#{dir_out}/..")
102
+ FileUtils.cp(Dir["#{dir_out}/*.bat"], "#{dir_out}/..")
111
103
  p 'created (still need to zip it) ' + dir_out
112
104
  end
105
+
106
+ desc 'j -S rake bundle_dependencies create_distro_dir ...'
107
+ task 'full_release' => [:bundle_dependencies, :create_distro_dir, :build] do # :release
108
+ system("#{Gem.ruby} -S gem push pkg/*.gem")
109
+ end
data/TODO CHANGED
@@ -1,107 +1,104 @@
1
1
  == medium ==
2
-
3
2
 
4
3
  == probably next up+low prio ==
5
4
 
6
- use mencoder from the gui
7
- use mencoder + ffmpeg
8
- re-do various EDL's I have :P
9
- split the two projects somehow (project + distribution)
10
- two releases: experimental, normal (no imagemagick)
11
- preferences merger...hmm...;
12
5
  compare computer DVD playback with physical player...
6
+ release .zip
13
7
 
14
8
  == slightly lower than that ==
15
9
 
10
+ make sure no subtitles on national treasure...
11
+ partner for filters (Jon, Karlie if interested...give beta)
12
+ lotsa filters somehow
13
+ beta release/rinse and repeat with various ppl (once it's releasable...)
14
+ can generate mplayer EDL's and play them...hmm...smplayer them?
15
+ update license too...
16
+ a real'ish website
17
+ "run create mode" button (?)
18
+ license the first time they run it (gplv3)
19
+ bring that window to the top! (before done dialog...)
20
+
21
+ == DVD backlog (unordered, some very low prio) ==
22
+
23
+ DRY up dependency installation code
24
+ install them to cache2 or something...so I can cleanup..
25
+ using+burning screencast
26
+ editing screencast
27
+ instructions on how to do their own (private) EDL or do one and submit it (public), or email their friends :P
28
+ note how to get the title number
29
+ add a way to get the label rather easily...
30
+ add an option "just save full disk (unedited) to hard drive..."
31
+ note to people: can edit those to your liking
32
+
33
+
34
+ advertise urug, ruby flow :)
35
+ "Re-run most recent" disabled when there isn't one [?]
36
+ unit test the GUI
37
+ re-do DVD EDL's that need it :P
38
+ all dogs go to heaven...finish EDL
39
+ warn when labels exist and don't match...
40
+ kill old mencoder instances more often...
41
+ auto-download imagemagick, too
42
+ check all the various options to see if there's a "cross platform way to split files accurately" besides my hacky kludge.
43
+ popup "you may now watch": bring it to the front...
44
+ can rip from a DVD-like folder (?)
16
45
  ripping "redoes" a large last section, for combining. Can I avoid this?
17
46
  plus I do some copy, some ac3?
18
- easy installer for x,y,z
19
- unit test the GUI
20
- no subtitles on national treasure...
21
-
22
- ask if there's a "cross platform way to split files accurately" besides my hacky kludge.
23
-
24
- popup "you may now watch": bring it to the front...
25
-
26
- easy editor for this style of edit
27
- partner (Jon, Karlie if interested...give beta)
28
- create lotsa filters
29
- beta release
30
- some better ripper...
31
- maybe vlc is bound by the same constrains mplayer is?
32
- maybe rip it to a more precise encoding, then edit it?
33
-
34
- == DVD monetary backlog (unordered) ==
35
-
36
- @mencoder.exe distributor: OCI plz? puh-lease?
37
- @dvd flick do you need that frequent i-frames?
47
+ @dvd flick do you need that frequent of i-frames?
38
48
  rename bat as template.bat
39
49
  can parse IMDB (require they put in the URL by hand fer now)
40
50
  add stuffs to imdb hmmm
41
51
  IMDB easy mapping
42
- all dogs go to heaven...
43
52
  can blank out the video, with audio continuing through...
44
- add an option "just save full disk (unedited) to hard drive..."
45
53
  add an option "just save full disk (edited) to hard drive...well compressed"
46
- or do we want to do that by default anyway? (does it help burning? it helps with file size...hmm...)
54
+ or do we want to do that by default anyway? (does it help burning? file size...hmm...)
47
55
  @VLC: hard crash when ripping that one DVD...long one, about the constitution...
48
- auto-zip it with my rake task :)
49
- check DVD patent expiration date
50
- better burning screencast
56
+ in general, fine tune burning with various things...
51
57
 
52
58
  make sure can work with very large DVD's...
53
59
  can use a fast temp drive, save through to other :P
54
60
  only prompt if have two...
55
- pass a better title through when ripping so it doesn't just say dvd://1 always
56
61
  can have collaborators re-selling EDL's
57
62
  good license for their stuff like "public domain" or what not :P Can't be a hypocrite now, can I?
58
- 80/20
59
- .ts doesn't seem too awesome....
60
-
63
+ a real website
61
64
  k9 might preserve/shrink well...hmm...auto calculation may be possible...hmm...
62
- better icon...
65
+ better .exe icon...
63
66
  ensure file exists after we created it...and has a reasonable size, before declaring success
64
67
  148 cars_widescreen_2006_edited.ps
68
+ blu-ray support somehow (real-time? rip?)
65
69
  use DVD navigator ?
66
70
  http://msdn.microsoft.com/en-us/library/dd388584(v=VS.85).aspx
67
71
  with an avi file sink?
68
- authorize.net instead of paypal?
69
- blu-ray support somehow (real-time? rip?)
70
- legal shtuff (LICENSE)
71
- some type of installer that can setup the registry...
72
- auto-assignment of EDL's to media:
73
- DVD's (right click on DVD player, rip with SC?)
74
- a real website
75
- instructions on how to do their own (private) EDL or do one and submit it (public), or email their friends :P
76
72
  double buffering hard drive/incoming copying from DVD might speed things, if your HD is fast.
77
- personalized copier might be faster than the "type" command.
78
- merge with preferences
79
- For the monetized version: nothing but cut and paste, no merging et al
80
- mplayer EDL's
81
- add option to "just rip a DVD of your own straight full thing"
82
- avisynth?
83
73
  make the progress bar map "better" to the size of the various sections...
84
- detect occurrence of these type errors: dvdnav warning: cannot get next block (Error reading from DVD.) somehow (file size...)
85
- per movie, various EDL's, one includes profanity, one just violence, one paranoid, etc.
74
+ detect occurrence of these type errors (DVD read failure): dvdnav warning: cannot get next block (Error reading from DVD.) somehow (file size...)
75
+ per movie, several EDL's, one includes profanity, one just violence, one paranoid, etc.
86
76
  when there are several, it lets you just choose between the ones that are valid (?)
87
77
 
88
- ask VLC is "adding 0.23 expected?" "do you have the same constraints as mplayer?"
89
- ask VLC "fuzzy menus on the happiest baby dvd expected?"
90
- slightly faster copying possible (664 versus 887 seconds to combine them all together.)
91
- @mplayer "when it says nearest keyframe, that could be in the future?"
92
- @mplayer "when I say play for 3.2, and the keyframe is 0.5 before, does it end up playing for 3.2 or 3.7?"
93
78
  burnable to DVD/CD/multi DVD automagically... (auto-burn insert your new disk!)
94
79
  can *re-use* original navigation stuffs, less the profanity (is that possible? VobBlanker help, perhaps?)
95
80
  can lop off sections to save space (?)
96
81
  can burn extras from the DVD, too?
97
82
  optionally ?
98
- transcode to condense...
83
+ transcode to condense..?
99
84
  split to allow?
100
- @smplayer: playing DVD's doesn't work currently
101
85
  try to compile transcode in cygwin (yipes)
102
- the ac3 thing
86
+ legal shtuff (LICENSE)
103
87
 
104
- == 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). ==
88
+ == random non-DVD backlog ... note: just plow forward, to "grab" available ideas...except that for now, just what *I* plan on needing for myself (filters for what I need/want). ==
89
+
90
+ the ac3 thing
91
+ ask VLC "fuzzy menus on the happiest baby dvd expected?"
92
+ right click on DVD player, rip edited with SC?
93
+ auto-zip it with my rake task :)
94
+ split the two projects somehow (project + distribution)
95
+ two releases: experimental, developer/experimental
96
+ bring back the old :)
97
+ button for "suck in EDL's"
98
+ split out the EDL's to a separate project (?)
99
+ make the other stuff work again, since I no longer use YAML...
100
+ advertise my "splitting joining" google doc page. also test the various options there for accurateness :)
101
+ also note that mencoder doesn't do splitting very well, for some reason.
105
102
 
106
103
  pass unit tests again jruby
107
104
 
@@ -137,9 +134,6 @@ a descriptor for some closed source app player...
137
134
 
138
135
  can "overlay-audio/video"
139
136
 
140
- GUI:
141
- preferences for levels, etc.
142
-
143
137
  blanker: allow for one side of the screen or another...
144
138
 
145
139
  PISH
@@ -280,6 +274,6 @@ create a "book edit list" (word x is at position y...)
280
274
  are your highest settings optimal?
281
275
  accept subtitled video...
282
276
 
283
- @smplayer: your CD config is awful.
277
+ @smplayer: your CD config is awful.
284
278
  @mencoder: can't split
285
279
  something like you watch it *with* you friends and can all chat together...hmm...
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.15.0
1
+ 0.16.1
data/bin/sensible-cinema CHANGED
@@ -5,21 +5,20 @@ puts 'Loading Sensible Cinema...'
5
5
  require File.dirname(__FILE__) + "/../lib/add_any_bundled_gems_to_load_path.rb"
6
6
  require 'sane'
7
7
 
8
- for file in ['vlc_programmer']
9
- require_relative '../lib/' + file
10
- end
8
+ require_relative '../lib/mencoder_wrapper'
9
+ require_relative '../lib/storage'
10
+ require_relative '../lib/edl_parser'
11
11
 
12
- require 'ruby-wmi'
13
12
  require 'tmpdir'
14
13
  require_relative '../lib/swing_helpers'
15
14
  require_relative '../lib/drive_info'
15
+ require 'whichr'
16
16
 
17
- # add some common locations for vlc.exe to the path...
18
- # lodo use the registry to pull out the 'right' path...
19
- ENV['PATH'] = ENV['PATH'] + ";C:\\Program Files\\VideoLAN\\VLC"+ ";D:\\Program Files\\VideoLAN\\VLC" + ";E:\\Program Files\\VideoLAN\\VLC"
17
+ ENV['PATH'] = ENV['PATH'] + ';' + File.expand_path(File.dirname(__FILE__)) + '/../vendor/cache/mencoder'.to_filename
20
18
 
21
19
  module SensibleSwing
22
20
  class MainWindow < JFrame
21
+ Storage = Storage.new("sc")
23
22
  def initialize
24
23
  super "Sensible-Cinema"
25
24
  setDefaultCloseOperation JFrame::EXIT_ON_CLOSE
@@ -28,136 +27,214 @@ module SensibleSwing
28
27
  setSize 350,400
29
28
  add panel # why can't I just slap these down?
30
29
 
31
- jlabel = JLabel.new 'Welcome to Sensible Cinema'
30
+ jlabel = JLabel.new 'Welcome to Sensible Cinema!'
32
31
  happy = Font.new("Tahoma", Font::PLAIN, 11)
33
32
  jlabel.setFont(happy)
34
33
  jlabel.set_bounds(44,44,136,14)
35
34
  panel.add jlabel
36
- b = JButton.new( "Play Hulu, Youtube, or a DVD (Tracking)" ).on_clicked {
37
- load File.dirname(__FILE__) + '/sensible-cinema-cli'
38
- Thread.new { go_sc([]) } # needs to be in its own thread becuase it blocks,
39
- # so "this thread" is the uni-swing thread, gets blocked, and the overlayer can't repaint
40
- self.close
41
- }
42
- button_width = 230
43
- b.set_bounds(44,120,button_width,23)
44
- panel.add b
45
35
 
46
- c=JButton.new( "Copy edited copy of DVD to Hard Drive" )
36
+ button_width = 270
37
+
38
+ c = JButton.new( "Create edited copy of DVD on Your Hard Drive" )
47
39
  c.on_clicked {
48
- do_copy_dvd_to_hard_drive true
40
+ do_copy_dvd_to_hard_drive false
49
41
  }
50
- c.set_bounds(44,220,button_width,23)
51
- panel.add c
42
+ c.set_bounds(44,120,button_width,23)
43
+ panel.add c
52
44
 
53
- d=JButton.new( "Play edited DVD with VLC" )
45
+ b = JButton.new("Watch current DVD unedited")
46
+ b.on_clicked {
47
+ ENV['PATH'] = ENV['PATH'] + ";d:\\Program Files\\SMPlayer;c:\\Program Files\\SMPlayer"
48
+ path = RubyWhich.new.which('smplayer')
49
+ if(path.length == 0)
50
+ JOptionPane.showMessageDialog(self, "It appears that you need to install a dependency: SMPlayer.\n
51
+ Click ok to be directed to its download website.
52
+ Also note that if it ever hangs, kill the process, and then use VLC instead
53
+ (though VLC only has approximate timings).", "Lacking dependency", JOptionPane::ERROR_MESSAGE)
54
+ system("start http://smplayer.sourceforge.net/downloads.php")
55
+ else
56
+ drive, volume, md5 = choose_dvd_drive
57
+ system("smplayer dvd:// -dvd-device #{drive}")
58
+ end
59
+ }
60
+ b.set_bounds(44,150,button_width,23)
61
+ panel.add b
62
+
63
+ d = JButton.new( "Preview edited section of current DVD" )
54
64
  d.on_clicked {
55
- do_copy_dvd_to_hard_drive false
65
+ do_copy_dvd_to_hard_drive true
56
66
  }
57
67
 
58
68
  d.set_bounds(44,180,button_width,23)
59
- panel.add d
69
+ panel.add d if ARGV.index("--create-mode")
70
+
71
+ f = JButton.new("Open/Edit an Edit Decision List")
72
+ f.on_clicked {
73
+ dialog = FileDialog.new(self, "Pick file to edit")
74
+ dialog.set_directory EDL_DIR
75
+ filename = dialog.go
76
+ system("notepad \"#{filename}\"") if filename
77
+ }
78
+ f.set_bounds(44,260,button_width,23)
79
+ panel.add f if ARGV.index("--create-mode")
80
+
81
+ e = JButton.new( "Re-run most recent preview segment" )
82
+ e.on_clicked {
83
+ repeat_last_copy_dvd_to_hard_drive
84
+ }
85
+
86
+ e.set_bounds(44,220,button_width,23)
87
+ panel.add e if ARGV.index("--create-mode")
88
+
89
+ reload = JButton.new( "Get a disk's unique ID" ).on_clicked {
90
+ drive, volume, md5 = choose_dvd_drive
91
+ # display it, allow them to copy and paste it out
92
+ JOptionPane.showInputDialog("#{drive} #{volume} for your copying+pasting pleasure (highlight, then ctrl+c to copy) \n
93
+ This is used to identify a disk to match it to its EDL, later.", "\"disk_unique_id\" => \"#{md5}\",")
94
+ }
60
95
 
96
+ reload.set_bounds(44,290,button_width,20)
97
+ panel.add reload if ARGV.index("--create-mode")
98
+
61
99
  @exit = JButton.new("Exit").on_clicked {
62
100
  self.close
63
101
  }
64
102
  @exit.set_bounds(44,320,button_width,23)
65
- panel.add @exit
66
-
67
- if ARGV.find{|a| a == '--test'}
68
- reload = JButton.new( "reload code" ).on_clicked {
69
- eval File.read(__FILE__), nil, __FILE__
70
- p 're-evaled the code ...'
71
- }
72
- reload.set_bounds(20,300,20,20)
73
- panel.add reload
74
- end
103
+ panel.add @exit
75
104
 
76
105
  @progress_bar = JProgressBar.new(0, 100)
77
106
  @progress_bar.set_bounds(44,280,button_width,23)
78
- @progress_bar.visible=false
107
+ @progress_bar.visible = false
79
108
  panel.add @progress_bar
80
- @buttons = [b,c,d,@exit]
109
+ @buttons = [b,c,d,e,reload,@exit]
110
+ check_for_dependencies
81
111
  end
82
112
 
83
- def vlc_currently_installed?
84
- if !system("vlc --qt-start-minimized vlc://quit 2>NUL")
85
- JOptionPane.showMessageDialog(nil, "Appears you do not yet have VLC Media Player installed. Click ok to download it.", "VLC Player not found", JOptionPane::ERROR_MESSAGE)
86
- system("start http://www.videolan.org/")
87
- false
88
- else
89
- true
90
- end
91
- end
113
+ def download full_url, to_here
114
+ require 'open-uri'
115
+ writeOut = open(to_here, "wb")
116
+ writeOut.write(open(full_url).read)
117
+ writeOut.close
118
+ end
92
119
 
93
- def single_edit_list_matches_dvd volume_name
120
+ def check_for_dependencies
121
+ ffmpeg = RubyWhich.new.which('ffmpeg')
122
+ if ffmpeg.length == 0
123
+ JOptionPane.showMessageDialog(self, "It appears that you need to install a dependency: imagemagick.\n
124
+ Click ok to be directed to its download website.\nYou'll probably want to download and install the \"windows-dll.exe\" package.\n
125
+ Then restart Sensible-Cinema.", "Lacking dependency", JOptionPane::ERROR_MESSAGE)
126
+ system("start http://www.imagemagick.org/script/binary-releases.php#windows")
127
+ java.lang.System.exit(1)
128
+ end
129
+ mencoder = RubyWhich.new.which('mencoder')
130
+ if mencoder.length == 0
131
+ answer = JOptionPane.showConfirmDialog(nil, "Appears that you need to install a dependency: mencoder.
132
+ Its license is at: http://www.gnu.org/licenses/gpl-2.0.html.
133
+ Also this will download 7z locally (license: http://www.7-zip.org/license.txt).
134
+ Click yes if you accept the terms of the several license agreements. They will then be installed automatically.
135
+ Or click no to cancel.", "Lacking dependency", JOptionPane::YES_NO_OPTION)
136
+ if answer == 1
137
+ p 'exiting, no mencoder...'
138
+ sleep 10
139
+ java.lang.System.exit(1)
140
+ end
141
+ vendor_cache = File.expand_path(File.dirname(__FILE__)) + "/../vendor/cache/"
142
+ ENV['PATH'] = ENV['PATH'] + ';' + vendor_cache + '\\..;' + vendor_cache
143
+ Dir.chdir(vendor_cache) do
144
+ Kernel.print 'downloading unzip utility...'
145
+ download("http://downloads.sourceforge.net/project/sevenzip/7-Zip/9.20/7za920.zip", "7za920.zip")
146
+ system("unzip -o 7za920.zip") # -o means "overwrite" without prompting
147
+ # now we have 7za.exe
148
+ Kernel.print 'downloading mencoder'
149
+ download("http://downloads.sourceforge.net/project/mplayer-win32/MPlayer%20and%20MEncoder/revision%2032492/MPlayer-rtm-svn-32492.7z", "mencoder.7z")
150
+ system("7za e mencoder.7z -y -omencoder")
151
+ Kernel.puts 'done'
152
+ end
153
+ end
154
+ end
155
+
156
+ def single_edit_list_matches_dvd md5
157
+ return unless md5 # ignore nil searches, where it wasn't set in the .txt file
94
158
  matching = Dir[EDL_DIR + '/*.txt'].select{|file|
95
- YAML.load_file(file)["dvd_drive_label"] == volume_name
159
+ EdlParser.parse_file(file)["disk_unique_id"] == md5
96
160
  }
97
161
  if matching.length == 1
98
162
  file = matching[0]
99
- p "selecting only matching file #{file}"
100
- return file
101
- end
102
- nil
163
+ p "selecting the one matching file #{file}"
164
+ file
165
+ else
166
+ nil
167
+ end
103
168
  end
104
169
 
105
- EDL_DIR = __dir__ + "/../zamples/edit_decision_lists/dvds"
170
+ EDL_DIR = File.expand_path(__dir__ + "/../zamples/edit_decision_lists/dvds").to_filename
171
+
172
+ def repeat_last_copy_dvd_to_hard_drive
173
+ generate_and_run_bat_file *Storage['last_params']
174
+ end
106
175
 
107
- def do_copy_dvd_to_hard_drive should_save_file
108
- return unless vlc_currently_installed?
109
- drive, volume_name = choose_dvd_drive
110
- if !(edit_list_path = single_edit_list_matches_dvd(volume_name))
111
- fc = JFileChooser.new
112
- fc.setFileSelectionMode(nil)
113
- fc.set_dialog_title "Please pick a DVD Edit List File"
114
- fc.set_current_directory(JFile.new EDL_DIR)
176
+ def do_copy_dvd_to_hard_drive should_prompt_for_start_and_end_times
177
+ drive, dvd_volume_name, md5sum = choose_dvd_drive
178
+ edit_list_path = single_edit_list_matches_dvd(md5sum)
179
+ if !edit_list_path
180
+ fc = FileDialog.new(self)
181
+ fc.set_title "Please pick a DVD Edit List File"
182
+ fc.set_directory EDL_DIR
115
183
  edit_list_path = fc.go
116
184
  end
117
- descriptors = YAML.load_file edit_list_path
118
- dvd_title = descriptors['title']
119
- if should_save_file
120
- fc = JFileChooser.new
121
- # LODO allow for spaces in the save to file
122
- fc.set_dialog_title "Pick where to save #{dvd_title || "the file"} edited to"
123
- save_to_file_name = ((dvd_title || "my dvd") + ' edited copy').gsub(' ', '_').gsub( /\W/, '') # no punctuation for now...
124
- fc.setSelectedFile(JFile.new(DriveInfo.get_drive_with_most_space_with_slash + save_to_file_name))
125
- save_to = fc.go
126
- else
127
- save_to = nil
185
+ descriptors = EdlParser.parse_file edit_list_path
186
+
187
+ dvd_title = descriptors['title'] || dvd_volume_name
188
+
189
+ fc = JFileChooser.new
190
+ # LODO allow for spaces in the save to filename
191
+
192
+ if should_prompt_for_start_and_end_times
193
+ JOptionPane.showMessageDialog(nil, "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!", JOptionPane::INFORMATION_MESSAGE)
194
+ start_time = JOptionPane.showInputDialog("At what point in the video would you like to start your preview? (like 01:00 for starting at 1 minute)", Storage['start_time'])
195
+ Storage['start_time'] = start_time
196
+ end_time = JOptionPane.showInputDialog("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'])
197
+ Storage['end_time'] = end_time
198
+ unless start_time and end_time
199
+ JOptionPane.showMessageDialog(nil, " Please choose start and end", "Failed", JOptionPane::ERROR_MESSAGE)
200
+ return
201
+ end
128
202
  end
203
+
204
+ fc.set_title "Pick where to save #{dvd_title} edited to"
205
+
206
+ save_to_file_name = dvd_title + ' edited copy'
207
+ save_to_file_name += ' single segment' if should_prompt_for_start_and_end_times
208
+ save_to_file_name=save_to_file_name.gsub(' ', '_').gsub( /\W/, '') # no punctuation for now...
209
+ fc.setFile(DriveInfo.get_drive_with_most_space_with_slash + save_to_file_name)
210
+ save_to = fc.go
129
211
  dvd_title_track = descriptors["dvd_title_track"]
130
- bat_file_or_xspf = VLCProgrammer.convert_to_full_xspf(descriptors, save_to, drive, dvd_title_track, dvd_title)
131
-
132
- temp_dir = Dir.tmpdir
133
- temp_file = temp_dir + '/' + 'vlc.temp.xspf'
134
- File.write(temp_file, bat_file_or_xspf)
135
- puts bat_file_or_xspf
136
- if should_save_file
137
- popup = ModeLessDialog.new( "Copying to #{save_to}.\n" +
138
- "Running edit list #{File.basename edit_list_path} against \n" +
139
- " #{drive} (#{dvd_title})...\n" +
140
- "This could take quite awhile, and will prompt you when it is done.\n" +
141
- "It may also cause small popup ballon dialogs to appear.\n" +
142
- "You can close this window and continue working while it runs.",
143
- "OK")
144
-
145
- # this allows our popups to still be serviced while it is running
146
- Thread.new {
147
- run_copy_commands bat_file_or_xspf, save_to
148
- popup.dispose
149
- }
150
- else
151
- command = "vlc \"#{temp_file.to_filename}\" vlc://quit"
152
- puts 'running playlist for DVD: ', command
153
- system(command) # blocks the current window while running...
154
- p 'done playing DVD'
155
- end
156
- # LODO warn if they will overwrite a file in the end
212
+ generate_and_run_bat_file save_to, edit_list_path, descriptors, drive, dvd_title, start_time, end_time, dvd_title_track
157
213
  end
158
214
 
159
- def run_copy_commands batch_commands, save_to
160
- p 'saving to ' + save_to + '.ps' # lodo cleanup the .ps here...
215
+ def generate_and_run_bat_file save_to, edit_list_path, descriptors, drive, dvd_title, start_time, end_time, dvd_title_track
216
+ Storage['last_params'] = [save_to, edit_list_path, descriptors, drive, dvd_title, start_time, end_time, dvd_title_track]
217
+ bat_file = MencoderWrapper.get_bat_commands descriptors, drive, save_to, start_time, end_time, dvd_title_track
218
+ temp_dir = Dir.tmpdir
219
+ temp_file = temp_dir + '/vlc.temp.bat'
220
+ File.write(temp_file, bat_file)
221
+ puts 'commands located for debugging purposes at: ' + bat_file
222
+ popup = ModeLessDialog.new( "Copying to #{save_to}.\n" +
223
+ "Running #{File.basename edit_list_path} against #{drive} (#{dvd_title}).\n" +
224
+ "This could take quite awhile, and will prompt you when it is done.\n" +
225
+ "You can close this window and continue working while it runs.\n" +
226
+ "NB that the created file will be playable with SMplayer or VLC player.",
227
+ "OK")
228
+
229
+ # allow our popups to still be serviced while it is running
230
+ Thread.new {
231
+ run_create_commands bat_file, save_to
232
+ popup.dispose
233
+ }
234
+ # LODO warn if they will overwrite a file in the end...
235
+ end
236
+
237
+ def run_create_commands batch_commands, save_to
161
238
  @buttons.each{|b| b.set_enabled false}
162
239
  success = true
163
240
  lines = batch_commands.lines.to_a
@@ -166,26 +243,32 @@ module SensibleSwing
166
243
  @progress_bar.set_value(10) # start at 10% always, so they can see something.
167
244
  lines.each_with_index{|l, idx|
168
245
  if success
169
- success = system(l) unless ARGV.find{|a| a == '--test'} # this doesn't seem to cancel out early for some reason..
170
- @progress_bar.set_value(10 + idx/total_size*90)
246
+ success = system(l) unless ARGV.find{|a| a == '--test'} # this might not actually cancel out early for some reason...
247
+ if l =~ /@rem /
248
+ success = true # these fail fof some reason?
249
+ else
250
+ p 'line failed ' + l unless success
251
+ end
171
252
  end
253
+ @progress_bar.set_value(10 + idx/total_size*90)
172
254
  }
173
255
  @progress_bar.visible=false
174
256
  @buttons.each{|b| b.set_enabled true}
175
257
  if success
176
- JOptionPane.showMessageDialog(nil, " Done--you may now watch file #{save_to}.ps in VLC player", "Done!", JOptionPane::INFORMATION_MESSAGE)
177
- show_file = "explorer /e,/select,\"#{File.expand_path(save_to).to_filename}.ps\""
258
+ saved_to = save_to + '.avi' # LODO pass this out?
259
+ JOptionPane.showMessageDialog(nil, " Done--you may now watch file #{saved_to} in SMPlayer or VLC player", "Done!", JOptionPane::INFORMATION_MESSAGE)
260
+ show_file = "explorer /e,/select,\"#{File.expand_path(saved_to).to_filename}\""
178
261
  system show_file
179
- self.close
262
+ #self.close # ?
180
263
  else
181
264
  JOptionPane.showMessageDialog(nil, " Failed--please examine screen output and report back!", "Failed", JOptionPane::ERROR_MESSAGE)
182
265
  end
183
266
  end
184
267
 
185
- # returns e:\, win32ole instance
268
+ # returns e:\, volume, md5sum
186
269
  def choose_dvd_drive
187
270
  opticals = DriveInfo.get_dvd_drives_as_win32ole
188
- names = opticals.map{|d| d.Name + "\\" + " (" + (d.VolumeName || 'empty') + ")"}
271
+ names = opticals.map{|d| d.Name + "\\" + " (" + (d.VolumeName || 'please insert DVD before proceeding if you want to use this drive') + ")"}
189
272
 
190
273
  if opticals.length != 1
191
274
  dialog = GetDisk.new(self, names)
@@ -194,13 +277,14 @@ module SensibleSwing
194
277
  selected_idx = dialog.selected_idx
195
278
  else
196
279
  selected_idx = 0
197
- p 'selecting only disk drive ' + names[0]
198
- end
280
+ p 'selecting user\'s only disk drive ' + names[0]
281
+ end
282
+
199
283
  if selected_idx
200
284
  disk = opticals[selected_idx]
201
- return names[selected_idx][0..2], opticals[selected_idx].VolumeName
285
+ return names[selected_idx][0..2], opticals[selected_idx].VolumeName, DriveInfo.md5sum_disk(opticals[selected_idx].Name)
202
286
  else
203
- puts 'did not select a drive'
287
+ puts 'did not select a drive...exiting'
204
288
  java.lang.System.exit 1
205
289
  end
206
290
  end
@@ -229,9 +313,7 @@ module SensibleSwing
229
313
  add box
230
314
  pack
231
315
  end
232
-
233
316
  end
234
-
235
317
  end
236
318
 
237
319
  if $0 == __FILE__