sensible-cinema 0.25.4 → 0.26.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.25.4
1
+ 0.26.0
data/bin/sensible-cinema CHANGED
@@ -79,7 +79,7 @@ else
79
79
  end
80
80
 
81
81
  import 'javax.swing.ImageIcon'
82
- require_relative 'sensible-cinema-dependencies'
82
+ require_relative '../lib/sensible-cinema-dependencies'
83
83
 
84
84
  module SensibleSwing
85
85
  VERSION = File.read(File.dirname(__FILE__) + "/../VERSION").strip
@@ -329,7 +329,7 @@ module SensibleSwing
329
329
  out = "Upconvert options currently #{ settings ? "are set to #{settings} style" : "are NOT SET"}"
330
330
  if settings
331
331
  multiple = LocalStorage[ScreenMultipleFactor]
332
- out += " (screen multiplier #{multiple} = #{(multiple * get_current_max_width_resolution).to_i}px)."
332
+ out += " (screen multiplier #{get_current_max_width_resolution}*#{multiple} = #{(multiple * get_current_max_width_resolution).to_i}px)."
333
333
  end
334
334
  out
335
335
  end
@@ -621,11 +621,8 @@ module SensibleSwing
621
621
  if just_create_dot_edl_file_instead_of_play
622
622
  descriptors = EdlParser.parse_file edl_filename
623
623
  # LODO these timings...DRY up...plus is XBMC the same? what about on a slower computer?
624
- # NB these are just for the SxS EDL!
624
+ # NB these are just for the Side by side EDL's!
625
625
 
626
- #add_secs_end = 0
627
- #add_secs_beginning = 0.5 # LODO are these accurate for file based, as well? slow cpu versus fast?
628
-
629
626
  edl_contents = MplayerEdl.convert_to_edl descriptors, add_secs_end = MplayerEndBuffer, MplayerBeginingBuffer, splits = []
630
627
  output_file = filename_mpg.gsub(/\.[^\.]+$/, '') + '.edl' # sanitize...
631
628
  File.write(output_file, edl_contents)
@@ -85,20 +85,12 @@ def go_sc(args)
85
85
  auto_found = AutoWindowFinder.search_for_single_url_match
86
86
  if auto_found
87
87
  p 'auto-discovered open window for player x EDL, using it ' + auto_found
88
- settings = EdlParser.parse_file auto_found
89
- if settings["from_url"]
90
- require 'tempfile'
91
- to = Tempfile.new 'abc'
92
- require_relative 'sensible-cinema-dependencies'
93
- SensibleSwing::MainWindow.download(settings["from_url"], to.path)
94
- edit_decision_list = to.path
95
- else
96
- edit_decision_list = auto_found
97
- end
88
+ edit_decision_list = auto_found
98
89
  else
99
90
  puts 'Select Edit Decision List to use'
100
91
  edit_decision_list = FileChooser.choose_file(" SELECT EDIT DECISION LIST", __DIR__ + "/../zamples/edit_decision_lists")
101
92
  end
93
+ settings = EdlParser.parse_file auto_found
102
94
 
103
95
  if !edit_decision_list
104
96
  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"
@@ -1,4 +1,34 @@
1
- == 025.5==
1
+ == 0.26.0 ==
2
+
3
+ It can now parse out (screen scraping), at runtime, EDL information from a user editable online 3rd party wiki
4
+ (imdb parent guide), including property timestamp conversions and making it easy to read, etc., and doing all the various
5
+ sections to an appropriate category.
6
+ So it binds the DVD's unique ID with its imdb database.
7
+
8
+ Note that Sensible Cinema can convert timestamps back and forth, using the command line,
9
+ to convert its own EDL's into a format that is copy and pastable into a wiki page on IMDB. (30 to 29.97 fps)
10
+
11
+ Note also that it could just as easily parse from a wiki, parse out timestamps, including +- descriptions,
12
+ and save that away to be distributable by the program at compile time, as well.
13
+
14
+ Note also that it is basically almost a "universal" player at this point, because it has been made to work
15
+ with demos of already several various online/local program playing video players.
16
+ Including software blu-ray players etc.
17
+
18
+ Note that it already demo'ed being able to have "user customizable" volume level for muted sections
19
+ (i.e. not mute it all the way, if desired)
20
+
21
+ Note also that it can be used by hooking to a projector or from computer -> tv so we have this unofficially
22
+ in the living room or across several devices or the like.
23
+
24
+ Note that the various video screenshots recorded imply that one would be able to
25
+ readily stream sensible cinema via screenshot capture to any device ready to receive it.
26
+ See also coupling it with [1] and [2].
27
+
28
+ [1] https://github.com/rdp/virtual-audio-capture-grabber-device
29
+ [2] https://github.com/rdp/screen-capture-recorder-program
30
+
31
+ == 0.25.5==
2
32
 
3
33
  Cleaned up upconverting options to hopefully cause less confusion. Until somebody complains otherwise.
4
34
 
@@ -1,12 +1,20 @@
1
1
  module ConvertThirtyFps
2
+
2
3
  def self.from_thirty seconds_float
3
- twentyNinePointNineSeven = 30000/1001.0
4
+ twentyNinePointNineSeven = 30000/1001.0 # 29.97
4
5
  seconds_float * 30/twentyNinePointNineSeven
5
6
  end
7
+
8
+ def self.from_twenty_nine_nine_seven seconds_float
9
+ twentyNinePointNineSeven = 30000/1001.0
10
+ seconds_float * twentyNinePointNineSeven/30
11
+ end
12
+
6
13
  end
7
14
 
8
15
  if $0 == __FILE__
9
- p 'syntax: second to convert from 30 to 29.97'
16
+ p 'syntax: second to convert '
10
17
  seconds = eval(ARGV[0] || "1000").to_f
11
- p 'converted value is', ConvertThirtyFps.from_thirty(seconds) # should get bigger...
18
+ p 'converted value from 30 to 29.97 is', ConvertThirtyFps.from_thirty(seconds) # should be bigger...
19
+ p 'converted value from 29.97 to 30 is', ConvertThirtyFps.from_twenty_nine_nine_seven(seconds)
12
20
  end
data/lib/edl_parser.rb CHANGED
@@ -25,17 +25,75 @@ class EdlParser
25
25
  end
26
26
 
27
27
  # returns {"mutes" => [["00:00", "00:00", string1, string2, ...], ...], "blank_outs" -> [...], "url" => ...}
28
- def self.parse_file filename
28
+ def self.parse_file filename, expand = true
29
29
  output = parse_string File.read(filename), filename, []
30
30
  if relative = output["take_from_relative_file"]
31
31
  new_filename = File.dirname(filename) + '/' + relative
32
32
  new_input = parse_file new_filename
33
33
  output.merge! new_input
34
34
  end
35
+ require_relative 'sensible-cinema-dependencies'
36
+
37
+ if expand
38
+
39
+ if output["from_url"] # replacement
40
+ downloaded = SensibleSwing::MainWindow.download_to_string(output["from_url"])
41
+ output = parse_string downloaded # full replacement
42
+ end
43
+
44
+ if imdb_id = output["imdb_id"]
45
+ require_relative 'convert_thirty_fps'
46
+ url = "http://www.imdb.com/title/#{imdb_id}/parentalguide"
47
+ all = SensibleSwing::MainWindow.download_to_string(url)
48
+
49
+ header, violence_word, violence_section, profanity_word, profanity_section, alcohol_word, alcohol_section, frightening_word, frightening_section =
50
+ sections = all.split(/<span>(Violence|Profanity|Alcohol|Frightening)/)
51
+ header = sections.shift
52
+ all ={}
53
+ while(!sections.empty?) # my klugey to_hash method
54
+ word_type = sections.shift
55
+ settings = sections.shift
56
+ assert word_type.in? ['Violence', 'Profanity', 'Alcohol', 'Frightening']
57
+ all[word_type] = settings
58
+ end
59
+ # blank_outs or mutes for each...
60
+ # TODO make -> optional
61
+ split_into_timestamps = /([\d:]+(?:\.\d+|))\W*-&gt;\W*([\d:]+(?:\.\d+|))([^\d\n]+)/
62
+ for type, settings in all
63
+ settings.scan(split_into_timestamps) do |begin_ts, end_ts, description|
64
+ puts "parsing from wiki imdb entry violence: #{begin_ts} #{end_ts} #{description} #{type}"
65
+ start_seconds = translate_string_to_seconds begin_ts
66
+ end_seconds = translate_string_to_seconds end_ts
67
+ # convert from 30 to 29.97 fps ... we presume ...
68
+ start_seconds = ConvertThirtyFps.from_twenty_nine_nine_seven start_seconds
69
+ start_seconds = ("%.02f" % start_seconds).to_f # round
70
+ start_seconds = translate_time_to_human_readable start_seconds, true
71
+ end_seconds = ConvertThirtyFps.from_twenty_nine_nine_seven end_seconds
72
+ end_seconds = ("%.02f" % end_seconds).to_f # round
73
+ end_seconds = translate_time_to_human_readable end_seconds, true
74
+ p end_seconds
75
+ if type == 'Profanity'
76
+ output['mutes'] << [start_seconds, end_seconds]
77
+ else
78
+ output['blank_outs'] << [start_seconds, end_seconds]
79
+ end
80
+ end
81
+ end
82
+
83
+ end
84
+ end
85
+
35
86
  output
36
87
  end
37
88
 
38
89
  private
90
+
91
+ def self.download full_url, to_here
92
+ require 'open-uri'
93
+ writeOut = open(to_here, "wb")
94
+ writeOut.write(open(full_url).read)
95
+ writeOut.close
96
+ end
39
97
 
40
98
  # better eye-ball these before letting people run them, eh? TODO
41
99
  # but I couldn't think of any other way to parse the files tho
@@ -132,6 +190,7 @@ class EdlParser
132
190
 
133
191
  public
134
192
 
193
+ # called later, from external
135
194
  # divides up mutes and blanks so that they don't overlap, preferring blanks over mutes
136
195
  # returns it like [[start,end,type], [s,e,t]...] type like either :blank and :mute
137
196
  # [[70.0, 73.0, :blank], [378.0, 379.1, :mute]]
@@ -172,6 +231,7 @@ class EdlParser
172
231
  combined.compact
173
232
  end
174
233
 
234
+ # its reverse: translate_time_to_human_readable
175
235
  def self.translate_string_to_seconds s
176
236
  # might actually already be a float, or int, depending on the yaml
177
237
  # int for 8 => 9 and also for 1:09 => 1:10
@@ -196,6 +256,7 @@ class EdlParser
196
256
  total
197
257
  end
198
258
 
259
+ # its reverse: translate_string_to_seconds
199
260
  def self.translate_time_to_human_readable seconds, force_hour_stamp = false
200
261
  # 3600 => "1:00:00"
201
262
  out = ''
@@ -1,5 +1,7 @@
1
1
  require 'java'
2
2
 
3
+ require 'sane'
4
+
3
5
  module SensibleSwing
4
6
 
5
7
  class MainWindow < javax.swing.JFrame
@@ -11,5 +13,15 @@ module SensibleSwing
11
13
  writeOut.write(open(full_url).read)
12
14
  writeOut.close
13
15
  end
16
+
17
+ def self.download_to_string full_url
18
+ require 'tempfile'
19
+ to = Tempfile.new 'abc'
20
+ download(full_url, to.path)
21
+ out = File.binread(to.path)
22
+ to.delete
23
+ out
24
+ end
25
+
14
26
  end
15
27
  end
@@ -185,14 +185,16 @@ describe EdlParser do
185
185
  english(3660 + 0.1).should == "1:01:00.100"
186
186
  end
187
187
 
188
- it "should auto-select a EDL if it matches a DVD's title" do
188
+ it "should auto-select a (nested) EDL if it matches a DVD's id" do
189
+ FileUtils.mkdir_p 'files/edls/a/b/c'
190
+ File.write('files/edls/a/b/c/yo.txt', %!"disk_unique_id" => "deadbeef|8b27d001"!)
189
191
  EdlParser.single_edit_list_matches_dvd("deadbeef|8b27d001").should_not be nil
190
192
  end
191
193
 
192
194
  it "should not auto-select if you pass it nil" do
195
+ File.write('files/edls/yo', %!"disk_unique_id" => "deadbeef|8b27d001"!)
193
196
  EdlParser.single_edit_list_matches_dvd(nil).should be nil
194
197
  end
195
-
196
198
 
197
199
  EdlParser::EDL_DIR.gsub!(/^.*$/, 'files/edls')
198
200
 
@@ -228,6 +230,18 @@ describe EdlParser do
228
230
  FileUtils.rm_rf 'files/edls/a.txt'
229
231
  FileUtils.rm_rf 'files/edls/b.txt'
230
232
  end
231
- end
233
+ end
234
+
235
+ before do
236
+ FileUtils.mkdir_p 'files/edls'
237
+ end
238
+ after do
239
+ FileUtils.rm_rf 'files/edls'
240
+ end
241
+
242
+ it "should download from imdb if specified and merge" do
243
+ File.binwrite('files/edls/a.txt', %!"imdb_id" => "tt1727587"!)
244
+ EdlParser.parse_file('files/edls/a.txt').should == {"blank_outs" => [["0:00:56", "0:00:57"], ["0:01:05", "0:01:14.500"]], "mutes" => [], "imdb_id" => "tt1727587"}
245
+ end
232
246
 
233
247
  end
data/todo.inventionzy.txt CHANGED
@@ -1,34 +1,39 @@
1
1
  === patentzy yes actually do vaguely ordered ===
2
- blu-ray OCR
3
- more blu-ray stuff: can ID them, can playback (through...mkv? VLC? powerdvd OCr/scripted?)
4
- some blu-ray player descriptor somehow
5
- can move the mouse 10 pixels down at the beginning, in order to...put it in the right place.
6
-
7
- EDL can say "this exact text was at this exact time" to allow for matching with other videos of same content that may have slightly different timestamps/speeds/start time etc.
8
- allow for extra start time offset for videos, if netflix instant has any
9
- can "suck in" a large list of EDL's from imdb at build time, and/or from a wiki (github wiki in this case), and a "resync" button?
10
- can handle multiple dvdid's et al (same EDL) (mostly do already though)
11
- can overlay over online films too
12
- it can pull in a DVD based just on the dvd-id "query id, not local? go get it from online"
2
+ blu-ray OCR
3
+ more blu-ray stuff: can ID them, can playback (through...mkv? VLC? powerdvd OCr/scripted?)
4
+ some blu-ray player descriptor somehow
5
+ accomodate splits vs. blanks and work
6
+
7
+ post a demo of it playing back blu-ray edited local computer, +- projector, +- playon (?)
8
+ could add dragging since we already control the mouse up and down, and movements etc., for example to skip forward etc.
9
+ a little robot demo thingy that can "click" your remote (or hardware) to fast forward through certain scenes, et al
10
+ EDL can say "this exact text was at this exact time" to allow for matching with other videos of same content that may have slightly different timestamps/speeds/start time etc.
11
+ with several, or start one, end one, etc.
12
+ allow for extra start time offset for videos, if netflix instant has any
13
+ a way to integrate with cable TV, ex: "this show we know started at 1:01, and its offsets should be this after that point"
14
+ a video of "recording to broadcast it" (or save it one by one)
15
+ can "suck in" a large list of EDL's from imdb at build time,
16
+ and/or a "resync" button, to re-download just the list of updated EDL's/IMDB wiki settings [?]
17
+ can handle multiple dvdid's et al (same EDL) (mostly done already)
18
+ it can pull in a DVD based just on the dvd-id "query id, not local? go get it from online to see if the list has been updated since"
13
19
  control VLC RC to overlay a logo dynamically
14
20
  can control volume *and* play other audio
21
+ can permanently black out certain coords to keep things prettier...et al
22
+ remove black when they really move the mouse?
15
23
  can add to to supplement EDL + EDL timestamps
16
- can pick specific profanities to avoid
24
+ can pick specific profanities to avoid (I think I demo'ed this already actually)
17
25
  it can scan "playing" instant streaming titles, and/or OCR or take the audio and look for words, to check for profanity.
18
- it can examine "output volume level" to auto-detects violence.
26
+ it can examine "output volume level" to auto-detect violence scenes.
19
27
  similarly for "questionable" content
20
- manual select which to include into an EDL
21
- use multiple filters/complex mapping graphs to overlay just the correct frameage: http://ffmpeg.org/libavfilter.html
22
- user preference "how many down clicks on volume for profanity"?
28
+ it can detect from subtitles (and/or OCR, same thing), questionable content, or violence, based on words used
29
+ use multiple filters/complex mapping graphs to overlay just the exactly correct overlay: http://ffmpeg.org/libavfilter.html
30
+ user preference "how many down clicks on volume for profanity" (already possible)
23
31
  make it so it can suck in from "another wiki" the DL's, at package time, somehow (just one)
24
32
  or even just suck in any web file, for starters
25
33
  space -> advance from pause until next edit item?
26
34
  amazon player descriptor, just in case ;P
27
35
  can jerk mouse only every so often (cheap would be to just arbitrarily have it from x to y, demo that)
28
- can scan several player descriptors to "pick the right one" (kind of already showed this one)
29
- edited streamer screencast demo (the rumor guy demo, like zediva)
30
- incorporate the EDL translator from the BYU-I fella
31
- post a demo of it playing back blu-ray edited local computer, +- projector, +- playon (?)
36
+ can scan several player descriptors to "pick the right one" (kind of already showed/did this one)
32
37
  post some playon.tv demo screencast...this should prove all shouldn't it [?]
33
38
  can "control mouse" to drag it to change location (ex: "move down 10 pixels at beginning of movie" LOL)
34
39
  beep at them/warn when not tracking [?]
@@ -40,17 +45,17 @@
40
45
  don't mute, just almost mute LOL or almost mute and static-ify
41
46
  or combine the two
42
47
  can suck it in "in realtime" from online, and parse it +- from a user editable wiki
43
- a UI to select categories, works
44
- edited blu ray movie playback screencast, as that's apparently not in the patent...
48
+ a UI to select categories, save as preference, apply it each time at DVD selection time
45
49
  don't use timecodes, use "% of the movie" and "total length" perhaps?
46
- look at their patents for other ideas? [+- nissim patents?]
47
- just pause it, tell them how far to fast forward at that point :P [somewhat already done]
50
+ look at patents for other ideas? [+- nissim patents?]
51
+ just pause it, tell them how far to fast forward at that point :P [somewhat already done/showed actually, thanks to mplayer]
48
52
 
49
- have the user forced to tell me what each digit is, themselves :P
53
+ have the user forced to tell me what each digit is, themselves, at runtime, for OCR :P
50
54
  the online edl stuff itself (its todo list)
51
55
  javascript API
52
- phase 2: I can accomodate for pauses, too.
53
- phase 3: I can re-train based on events of stoppage
56
+ phase 1: done
57
+ phase 2: I can accomodate for pausing, too.
58
+ phase 3: I can re-train based on events of stoppage (buffering et al)
54
59
  phase 4: I can constantly poll and react appropriately to current timestamp
55
60
  post video demo of it streaming to a console device
56
61
  maybe could just "play from x to y" [no exclude info?] instead of "here are the bad parts"
@@ -58,3 +63,4 @@
58
63
  stage two: chrome plugin for the same, auto-detect, auto-user, auto-download, auto-watch edited :)
59
64
  can insert deleted scenes et al [even external scenes :P] (already showed it somewhat)
60
65
  many others were already completed and done from this list and removed
66
+ there are some more ideas in the TODO file itself, and/or on the blog sites where I have posted other ideas too
data/todo.upconvert CHANGED
@@ -31,6 +31,9 @@ do I need double tapping? http://archive2.avsforum.com/avs-vb/showthread.php?s=&
31
31
 
32
32
  == never ==
33
33
 
34
+ test out xvda too...Radeon 4000 for example :P
35
+ I guess ffmpeg already supports it...
36
+
34
37
  add another sharpen filter?
35
38
 
36
39
  create a VLC version?
@@ -0,0 +1,91 @@
1
+ <head>
2
+
3
+ <script src="http://code.jquery.com/jquery-1.4.2.min.js" type="text/javascript"></script>
4
+
5
+ <script type="text/javascript">
6
+
7
+ var _gaq = _gaq || [];
8
+ _gaq.push(['_setAccount', 'UA-4531218-5']);
9
+ _gaq.push(['_trackPageview']);
10
+
11
+ (function() {
12
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
13
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
14
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
15
+ })();
16
+
17
+ </script>
18
+
19
+ </head>
20
+
21
+ <body>
22
+ <html>
23
+ <div style="float:right; margin-right: 50px; margin-left: 20px;">
24
+ <img src="source/vendor/profs.png" width=150 />
25
+
26
+ <h1>Sensible Cinema</h1></div>
27
+ <pre>
28
+ Welcome to the (work in progress) home page of Sensible Cinema, the free video scene skipper/muter.
29
+ Sensible Cinema allows you watch edited movies by applying edit lists (EDL's)
30
+ (i.e. "mute out" or "cut out" questionable scenes) to DVD's or movie files.
31
+
32
+ A description and history/background of sensible-cinema can be found <a href="https://github.com/rdp/sensible-cinema/blob/master/README">here</a>.
33
+ Don't forget to come back to this page to download it, though (from the "Download" section).
34
+
35
+ <h2 style="margin: 0px;">Download</h2>
36
+ To download, please check the checkbox if you agree to the terms of the
37
+ license agreement (<a href="http://www.gnu.org/licenses/gpl.html">gplv3</a>) and wish to download and use sensible cinema.
38
+
39
+ <input type="checkbox" class="trigger" onClick="$('#comments').toggle(); $('#comments2').toggle();"/> I have read and agree to the license terms and conditions.
40
+
41
+ <div id="comments" style="display:none; border-style:dotted; border-width:1px; border-color: #aaaaaa; padding: 5px;">
42
+ Please download the latest version of sensible cinema from <a href="https://sourceforge.net/projects/sensible-cinema/files/">sourceforge</a>.
43
+ </div>
44
+ After download, unzip it. For windows users, that's like:
45
+ Reveal the file in explorer -> right click on the file -> Extract all -> Extract.
46
+ Now open the newly created sensible-cinema-x.x.x folder, and run the file "run sensible cinema.bat"
47
+ You will be initially prompted to accept the license agreement(s) and also install a few
48
+ (non included, separate ownership/distribution) dependencies.
49
+ Now insert a DVD you own, and restart sensible cinema to see available options.
50
+ Note that you want to download from sourceforge not from github.com (github is just the raw source).
51
+ There is more usage documentation within the "sensible-cinema/documentation" folder.
52
+
53
+ <h3>Mac user prerequisites</h3>Mac users will need to install some programs first.
54
+
55
+ If you plan on watching any movies in "realtime" then you'll need to download <a href="http://mplayerx.org/#Download">mplayerx</a>.
56
+
57
+ If you plan on doing any auto-video editing/saving then you'll need to install <a href="http://www.macports.org/">macports</a>.
58
+ Install macports, then afterward open the "terminal" Application and execute the following command:
59
+ $ sudo port install mencoder ffmpeg gocr
60
+ After this finishes (it will take awhile) you'll be ready to run Sensible Cinema.
61
+ Note that by installing these, you're accepting their respective licenses/distributions.
62
+
63
+ <h3>Upconverting/upscaling DVD/video player</h3>Sensible Cinema comes with its own upscaling/upconverting software DVD/movie file player. See it and the various other things that sensible cinema does <a href="..">here</a>.
64
+
65
+ <h3>Available edited movie lists</h3>You can see the (small) current list of DVD edit lists (EDL's) thus far available <a href="https://github.com/rdp/sensible-cinema/tree/master/zamples/edit_decision_lists/dvds">here</a> (all of them created previously by volunteers like you).
66
+ If yours is already there, then you might be good to go. Just use it.
67
+
68
+ If yours isn't there, then we'd ask you to help us by creating and submitting your own EDL (delete/cut list) for your DVD that doesn't have one yet,
69
+ see the <a href="https://github.com/rdp/sensible-cinema/blob/master/documentation">how to create</a> file for instructions on creating a new delete list. <!-- this is actually a short line -->
70
+ Then run the file "advanced-edit or create sensible cinema delete list files.bat" to create and edit your new delete list. Sensible Cinema has a few things to help you there.
71
+ Don't forget to upload your new file back to us when you're done, so others can benefit from your work (see "contact", below).
72
+
73
+ That link is the full list--your help is wanted/needed to help it grow!
74
+
75
+ <h2 style="margin: 0px;">Other Resources/Contact/Support</h2>
76
+ Let me know via the <a href="http://groups.google.com/group/sensible-cinema?pli=1">google group</a> or email rogerdpack@gmail.com if you have feedback or have any other ideas/suggestions.
77
+ <h3>Source code</h3>Source code is all available <a href="http://github.com/rdp/sensible-cinema">here</a>. Notes for potential source code developers are <a href="https://github.com/rdp/sensible-cinema/blob/master/developer_how_to_contribute_to_the_project.txt">here</a>.
78
+ For (techy or non-techy) contributions, see the contact info in the README file, or write to the google group, above.
79
+
80
+ You can see the <a href="source/change_log_with_feature_list.txt">change log with feature list</a>.
81
+
82
+ You can get a list of DVD ISO's (creative commons licensed) <a href="releases/dvd_isos">here</a>, if you want to try them out for experimenting/development/research etc.
83
+
84
+ Please click the license agreement checkbox at the top to see a list of some old releases (newer ones are found on sourceforge exclusively, old ones here).
85
+ <div id="comments2" style="display:none;">You can find an old list of older releases, as well as the MS based C <a href="releases/c_player">DVD player</a> listed <a href="releases">in the archives</a>.
86
+
87
+ </div>
88
+ </pre>
89
+ </html>
90
+ </body>
91
+