Various changes/updates
authorAlan J. Pippin <alan@pippins.net>
Fri, 18 Nov 2011 03:01:35 +0000 (20:01 -0700)
committerAlan J. Pippin <ajp@pippins.net>
Fri, 18 Nov 2011 03:01:35 +0000 (20:01 -0700)
Added newly created mkv video creation scripts

16 files changed:
create_merge_videos [deleted file]
dump_raw_video_files_from_camera [deleted file]
em [deleted file]
fix_video_names [deleted file]
homevideo_random.pl [new file with mode: 0755]
make_home_videos.cmd
make_home_videos.cmd.nocapture [new file with mode: 0755]
make_home_videos.cmd.noreboot
make_home_videos.pl
make_mkv [new file with mode: 0755]
merge_videos_by_day [new file with mode: 0755]
mts2mpg [new file with mode: 0755]
organize_videos [new file with mode: 0755]
setprompt.pl [deleted file]
tsMuxeR [new file with mode: 0755]
tsMuxerGUI [new file with mode: 0755]

diff --git a/create_merge_videos b/create_merge_videos
deleted file mode 100644 (file)
index aaa1c9a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-make_home_video.pl -m -d <path to video dir>
diff --git a/dump_raw_video_files_from_camera b/dump_raw_video_files_from_camera
deleted file mode 100755 (executable)
index d540dd7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/usr/bin/dvgrab --autosplit --timestamp --format dv2  --opendml --size 22000 home_video_
diff --git a/em b/em
deleted file mode 100755 (executable)
index 90b80f1..0000000
--- a/em
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-/usr/bin/emacs -fn 8x13 $* &
-
diff --git a/fix_video_names b/fix_video_names
deleted file mode 100644 (file)
index 266f312..0000000
+++ /dev/null
@@ -1 +0,0 @@
-rn 's/\.00\.avi/-00_xvid2500\.avi/' *
diff --git a/homevideo_random.pl b/homevideo_random.pl
new file mode 100755 (executable)
index 0000000..4e5a81a
--- /dev/null
@@ -0,0 +1,16 @@
+#!/usr/bin/perl
+
+use List::Util 'shuffle';
+
+my $dir = "/naspool/videos/HomeVideos";
+my $plsfile = "$dir/Random.pls";
+my $avifiles = "????/????-??-??.avi";
+
+chdir $dir || die "Couldn't change directory!\n";
+system "rm -f $plsfile";
+@files = `ls -1 $avifiles`;
+@shuffled = shuffle(@files);
+open (FILE, ">$plsfile") || die "Couldn't open $plsfile!\n";
+print FILE @shuffled;
+close (FILE);
+
index ce6b266429dfefdfb9aade8b36a492f6821bd314..4c19b7e874930ad4561ae964228f84d35bfe0d34 100755 (executable)
@@ -8,8 +8,8 @@
 # USAGE:   make_home_videos.cmd <tapename>
 # EXAMPLE: make_home_videos.cmd Dec06-Apr07
 
-SERVER="/mnt/server/videos/HomeVideos"
-MAKE_VIDEOS="/mnt/server/videos/bin/make_home_videos.pl"
+SERVER="/naspool/videos/HomeVideos"
+MAKE_VIDEOS="/naspool/videos/bin/make_home_videos.pl"
 
 $MAKE_VIDEOS -e -c -m -p -a -n $*
 
@@ -68,5 +68,6 @@ popd > /dev/null
 echo "-> Rebooting the system in 10 seconds... Press CTRL-C to abort..."
 sleep 10
 echo "-> Rebooting now..."
+# chmod u+s /sbin/reboot if you can't run the below command without being root
 /sbin/reboot
 
diff --git a/make_home_videos.cmd.nocapture b/make_home_videos.cmd.nocapture
new file mode 100755 (executable)
index 0000000..2895f42
--- /dev/null
@@ -0,0 +1,67 @@
+#!/bin/bash
+# DESCRIPTION:
+# Wrapper script around make_home_videos.pl script that
+# facilitates copying over the daily_clips to another
+# linux server location, properly merging the clips
+# created with the existing clips and playlists on
+# the remote server.
+# USAGE:   make_home_videos.cmd <tapename>
+# EXAMPLE: make_home_videos.cmd Dec06-Apr07
+
+SERVER="/naspool/videos/HomeVideos"
+MAKE_VIDEOS="/naspool/videos/bin/make_home_videos.pl"
+
+$MAKE_VIDEOS -e -m -p -a -n $*
+
+# Copy the daily clips over to the main file server
+pushd "$*/daily_clips" > /dev/null
+lastyear=""
+for i in `/bin/ls -1 *.avi`;
+do 
+  filename=`echo "$i" | sed 's/.avi//g'`
+  year=`echo "$filename" | awk --field-separator - '{print $1}'`
+  month=`echo "$filename" | awk --field-separator - '{print $2}'`
+  day=`echo "$filename" | awk --field-separator - '{print $3}'`
+
+  # set lastyear if we haven't done so yet
+  if [[ -z "$lastyear" ]]; 
+  then
+    lastyear="$year"
+  fi
+
+  # if we have changed year directories, remake the playlists for lastyear
+  if [[ "$year" != "$lastyear" ]]; 
+  then
+    pushd "$SERVER/$lastyear" > /dev/null
+    $MAKE_VIDEOS -p -d .
+    popd > /dev/null
+  fi
+
+  # make the destination directory if it is missing
+  if [[ ! -d "$SERVER/$year" ]]; 
+  then 
+    mkdir "$SERVER/$year"
+  fi
+
+  # don't overwrite existing filenames
+  basefilename="$filename"
+  num=0
+  while [[ -f "$SERVER/$year/$filename.avi" ]];
+  do 
+    ((num++))
+    filename="$basefilename.$num"
+  done
+
+  echo "Copying $i to $SERVER/$year/$filename.avi"
+  cp "$i" "$SERVER/$year/$filename.avi"
+  
+  lastyear=$year
+done
+
+# remake the playlists for year
+pushd "$SERVER/$year" > /dev/null
+$MAKE_VIDEOS -p -d .
+popd > /dev/null
+
+popd > /dev/null
+
index a34a1a5b28c6e4094c263a192ff51a00890eaf86..49666522b3b7fd49d2e7fd546eae59bf9214ec77 100755 (executable)
@@ -8,8 +8,8 @@
 # USAGE:   make_home_videos.cmd <tapename>
 # EXAMPLE: make_home_videos.cmd Dec06-Apr07
 
-SERVER="/mnt/server/videos/HomeVideos"
-MAKE_VIDEOS="/mnt/server/videos/bin/make_home_videos.pl"
+SERVER="/naspool/videos/HomeVideos"
+MAKE_VIDEOS="/naspool/videos/bin/make_home_videos.pl"
 
 $MAKE_VIDEOS -e -c -m -p -a -n $*
 
index 33c0c0df51eba9813a8bc9d590ed33a7bd570de8..69631756b5219137b1f669f9036f5f6c748cad6f 100755 (executable)
@@ -6,6 +6,7 @@
 # 2) mencoder  : http://www.mplayerhq.hu/homepage/design7/dload.html
 # 3) transcode : vi sources.list; deb ftp://ftp.nerim.net/debian-marillat sarge main
 #                apt-get install transcode
+# 4) avimerge  : apt-get install transcode-utils
 
 use Getopt::Std;
 
@@ -21,7 +22,7 @@ $encoded_dir = "xvid_clips";
 $merge_dir = "daily_clips";
 $default_tape_name = "home_video";
 $playlist_extension = "pls";
-$dvgrab = "/usr/local/bin/dvgrab";
+$dvgrab = "/usr/bin/dvgrab";
 $mencoder = "/usr/bin/mencoder";
 $mplayer = "/usr/bin/mplayer";
 $avimerge = "/usr/bin/avimerge";
@@ -34,8 +35,10 @@ $max_dv_clip_size_in_mb = "1023"; #I had to keep it at this size to avoid errors
 #$max_dv_clip_size_in_mb = "22000"; #avisplit still doesn't seem to do things right for large clips
 # max_tape_grab_time=7200 Allows Max time of 2 hours to allow a tape to be dumped (good for 90 min tape)
 # max_tape_grab_time=5400 Allows Max time of 1.5 hours to allow a tape to be dumped (good for 60 min tape)
-$max_tape_grab_time = 5400;
-$dvgrab_options = "--autosplit --timestamp --format dv2 --opendml --buffers 2048 --rewind";
+$max_tape_grab_time = 7200;
+#$dvgrab_options = "--autosplit --timestamp --format dv2 --opendml --buffers 2048 --rewind";
+#$dvgrab_options = "-autosplit -timestamp -format dv2 -opendml -buffers 2048 -rewind";
+$dvgrab_options = "-autosplit -timestamp -format dv2 -opendml -rewind";
 $encode_options_pass1 = "-mc 0 -oac mp3lame -lameopts cbr:cbr=128 -ffourcc XVID -fps 29.97 -ovc lavc ";
 $encode_options_pass1.= "-lavcopts vcodec=mpeg4:vhq:vbitrate=$bitrate:keyint=15:vpass=1 -vf pp=ci";
 $encode_options_pass2 = "-mc 0 -oac mp3lame -lameopts cbr:cbr=128 -ffourcc XVID -fps 29.97 -ovc lavc ";
diff --git a/make_mkv b/make_mkv
new file mode 100755 (executable)
index 0000000..ea3b50c
--- /dev/null
+++ b/make_mkv
@@ -0,0 +1,130 @@
+#!/usr/bin/perl
+# Author: Alan J. Pippin
+# Description: Take a list of video files and create a single mkv video file from them
+
+# Pre-requisites:
+# mkvtoolnix - http://www.bunkus.org/videotools/mkvtoolnix/
+# ffmpeg
+
+###########################
+# Includes
+use File::Copy;
+use File::Basename;
+use Getopt::Std;
+use File::stat;
+use DateTime;
+use DateTime::Duration;
+use DateTime::Format::Duration;
+
+###########################
+# Configuration parameters
+my $mkvmerge=`which mkvmerge`; chomp($mkvmerge);
+my $ffmpeg=`which ffmpeg`; chomp($ffmpeg);
+my $tmpfile = `tempfile`; chomp($tmpfile);
+my $chapter_file = $tmpfile;
+my $input_file_options = "-S";
+my $output_file_options = "--chapters $chapter_file";
+
+###########################
+# Options
+getopts("st:o:i:h");
+
+if(! -x $mkvmerge) { die "-E- Unable to find required program: mkvmerge\n"; }
+if(! -x $ffmpeg) { die "-E- Unable to find required program: ffmpeg\n"; }
+if(! defined $opt_t) { &usage(); die "-E- Missing required title: -t <title>\n"; }
+if(! defined $opt_o) { &usage(); die "-E- Missing required argument output video names: -o <output.mkv>\n"; }
+if(! defined $opt_i) { &usage(); die "-E- Missing required argument input video names: -i <input,input,...>\n"; }
+
+sub usage {
+    print "usage: $0 -t <title> -o <output.mkv> -i <input,input,...>\n";
+    print "  -t <title>            Sets the general title for the output video file\n";
+    print "  -o <output.mkv>       Sets the name of the output mkv file\n";
+    print "  -i <input,input,...>  Sets the name of the input files to make into an mkv file\n";
+    print "  -s                    Simulate mode. Don't actually make the video, but tell us what you will do\n";
+    print "\n";
+    return 1;
+}
+
+###########################
+# Helper Subroutines
+sub epoch_to_date {
+    my ($epoch) = @_;
+    my $mtime = DateTime->from_epoch(epoch => $epoch);
+    return sprintf("%4d",$mtime->year)."-".sprintf("%02d",$mtime->month)."-".sprintf("%02d",$mtime->day)." ".$mtime->hms;
+}
+
+###########################
+# MAIN
+
+# Turn the list of input videos into a hash with a value equal to the modification time in epoch seconds
+my %videos;
+foreach $video (split(/,/, $opt_i)) {
+    if(! -r "$video") { die "-E- Unable to read input video file: $video\n"; }
+    my $mtime_epoch = stat("$video")->mtime;
+    my $mdate = epoch_to_date($mtime_epoch);
+    $videos{$video} = $mtime_epoch;
+}
+
+# Create the chapters file for the mkv file.
+# Make each video file it's own chapter in the MKV file.
+# Name the chapter with the date and time the video clip was taken (modified date).
+print "-> Creating $opt_o with title '$opt_t' from the following video files in last modified date order:\n";
+open(CHAPTERS,">$chapter_file") || die "-E- Unable to create chapter file: $chapter_file\n";
+my $chapter_num = 0;
+my $prev_hour = 0;
+my $prev_min  = 0;
+my $prev_sec  = 0;
+my $new_duration = DateTime::Duration->new(years => 1900, hours => $prev_hour, minutes => $prev_min, seconds => $prev_sec);
+my $duration_format = DateTime::Format::Duration->new(pattern => '%H:%M:%S.%3N', normalize => 1);
+foreach my $video (sort{$videos{$a} <=> $videos{$b}} keys %videos) {
+    $chapter_num++;
+    my $hour = 0;
+    my $min  = 5;
+    my $sec  = 0;
+    my $mtime_epoch = stat("$video")->mtime;
+    my $mdate = epoch_to_date($mtime_epoch);
+    my $duration = `$ffmpeg -i "$video" 2>&1 | grep Duration`;
+    if($duration =~ /Duration: (\d+):(\d+):(\d+)\.(\d+)/) {
+       $hour = $1;
+       $min = $2;
+       $sec = "$3.$4";
+    }
+    my $start_time = $duration_format->format_duration($new_duration);
+    print "$mdate $hour:$min:$sec  -> $video \n";
+    print CHAPTERS "CHAPTER".sprintf("%02d",$chapter_num)."=".$start_time."\n";
+    print CHAPTERS "CHAPTER".sprintf("%02d",$chapter_num)."NAME=".$mdate."\n";
+    my $dt = DateTime::Duration->new(years => 1900, hours => $hour, minutes => $min, seconds => $sec);
+    my $prev_dt = DateTime::Duration->new(years => 1900, hours => $prev_hour, minutes => $prev_min, seconds => $prev_sec);
+    $new_duration = $dt + $prev_dt;
+    $prev_hour = $hour; $prev_min = $min; $prev_sec = $sec;
+}
+close(CHAPTERS);
+print "\n-> Creating the following chapter file for this video:\n";
+$chapter_file_contents = `cat $chapter_file`;
+print "$chapter_file_contents\n";
+
+# Create the mkv video
+print "-> Creating the MKV video file '$opt_o'\n";
+
+my $cmd = "$mkvmerge --title \"$opt_t\" $output_file_options -o \"$opt_o\"";
+my $video_count = 0;
+foreach my $video (sort{$videos{$a} <=> $videos{$b}} keys %videos) {
+    if($video_count == 0) {
+       $cmd .= " $input_file_options \"$video\"";
+    } else {
+       $cmd .= " $input_file_options + \"$video\"";
+    }
+    $video_count++;
+}
+print "$cmd\n";
+if(! defined $opt_s) { 
+    my $errno = system("$cmd");
+    if($errno > 0) { $errno = $errno - 255; }
+    if($errno > 1) { die "-E- mkvmerge encountered some errors with exit code $errno\n"; }
+}
+
+# Remove the temporary file
+if(-e "$tmpfile") { unlink "$tmpfile"; }
+
+###########################
+
diff --git a/merge_videos_by_day b/merge_videos_by_day
new file mode 100755 (executable)
index 0000000..dec78b2
--- /dev/null
@@ -0,0 +1,163 @@
+#!/usr/bin/perl
+
+use File::Copy;
+use File::Basename;
+use Getopt::Std;
+use File::stat;
+use Time::localtime;
+
+# Command line options
+getopts("h:tvs:");
+
+sub usage {
+    print "usage: $0 [-t] -s <srcpath>\n";
+    print "   -s <srcpath>          specify the path to search for videos to merge under\n";
+    print "   -h <compute host>     specify the remote compute host to submit the mkvmerge job to\n";
+    print "   -v                    verbose mode; print extra information about what is being found/merged\n";
+    print "   -t                    test mode; print what will happen, but don't do anything\n";
+    return 1;
+}
+if(defined $opt_h) { usage(); exit 1; }
+
+# Configuration parameters
+my $compute_host = "pippin.pippins.net";
+my $srcpathname = $opt_s;
+my $minage = "+10"; # Files must be older than X minutes to move
+my $owner = "ajp"; # The owner of the files after they are moved
+my $group = "pip"; # The group of the files after they are moved
+my $mode = "664"; # The mode to set on each file after they are moved
+my $make_mkv = "/naspool/videos/bin/make_mkv"; chomp($make_mkv);
+my $find_cmd = "find \"$srcpathname/\" -cmin $minage -iregex \".*\.mov\" -o -iregex \".*\.3gp\" -o -iregex \".*\.mp4\" -o -iregex \".*\.mts\"";
+
+# Sanity check
+if(! -x $make_mkv) { die "-E- Unable to find required script: make_mkv\n"; }
+if(! -d $srcpathname) { &usage; print "-E- Can't find srcpath: $srcpathname\n"; exit 1; }
+if(defined $opt_h) { $compute_host = $opt_h; }
+
+my %monthname2month = (
+                      "Jan" => "01",
+                      "Feb" => "02",
+                      "Mar" => "03",
+                      "Apr" => "04",
+                      "May" => "05",
+                      "Jun" => "06",
+                      "Jul" => "07",
+                      "Aug" => "08",
+                      "Sep" => "09",
+                      "Oct" => "10",
+                      "Nov" => "11",
+                      "Dec" => "12"
+                      );
+
+my %month2monthname = (
+                      "01" => "Jan",
+                      "02" => "Feb",
+                      "03" => "Mar",
+                      "04" => "Apr",
+                      "05" => "May",
+                      "06" => "Jun",
+                      "07" => "Jul",
+                      "08" => "Aug",
+                      "09" => "Sep",
+                      "10" => "Oct",
+                      "11" => "Nov",
+                      "12" => "Dec"
+                      );
+
+# Change directories to the srcpath to search for videos to merge
+print "-> Finding all videos under '$srcpathname' to merge by day\n";
+my %videos;
+chdir "$srcpathname";
+print "$find_cmd\n" if($opt_v);
+foreach $file (sort `$find_cmd`) {
+
+    chomp($file);
+    $srcdir = dirname($file);
+    $file = basename($file);
+    $srcfile = $file;
+    $ext = "mkv";
+    
+    print "Found movie: srcdir: $srcdir srcfile: $srcfile ext: $ext\n" if($opt_v);
+
+    # Throw out files not in the current srcpath
+    if((! -f "$srcfile") && (! -f "$srcdir/$srcfile")) { next; }
+            
+    # Make a note of the month, year, and day this video was taken (from the modification time of the file)
+    $date_taken = ctime(stat("$srcdir/$srcfile")->mtime);
+
+    # Get the date taken from the filename
+    if($srcfile =~ /^(\d+)-(\d+)-(\d+)/) {
+       $year = $1;
+       $month = $2;
+       $day = sprintf("%02d",$3);
+       $monthnum = $month;
+       $monthname = lc($month2monthname{$month});
+    }
+    # Get the date taken from the modification time
+    elsif($date_taken =~ /\S+\s+(\S+)\s+(\d+)\s+\S+\s+(\d+)/) {
+       $year = $3;
+       $month = $1;
+       $day = sprintf("%02d",$2);
+       $monthnum = $monthname2month{$month};
+       $monthname = lc($month2monthname{$month});
+    } else {
+       print "-E- Unable to parse year and month from this file: $srcdir/$srcfile\n";
+       next;
+    }
+
+    # We are ready to pick a destination folder to put the merged video in
+    $dstdir = $srcdir;
+    $dstfile = $dstdir . "/" . $year . "-" . $monthnum . "-" . $day;
+
+    # Check for duplicate filenames at the destination
+    $newfile = $dstfile . "." . "000";
+    if(-e "$newfile.$ext") {
+       foreach $i ('001' .. '999') {
+           $newfile = $dstfile . "." . $i;
+           if(! -e "$newfile.$ext") { last; }
+       }
+       $dstfile = $newfile;
+    }
+    $dstfile = "$newfile.$ext";
+
+    print "   merging \"$srcdir/$srcfile\" into \"$dstfile\"\n";
+    push(@{$videos{"$dstfile"}}, "\"$srcdir/$srcfile\"");
+}
+
+foreach $video (sort keys %videos) {
+
+    my $videos = join(',', @{$videos{$video}});
+
+    # Only merge the videos if there is more than 1
+    my $num_videos = $#{$videos{$video}} + 1;
+    if($num_videos <= 1) { next; }
+    
+    if($video =~ /(\d+)-(\d+)-(\d+)/) {
+       $year = $1;
+       $month = $2;
+       $day = sprintf("%02d",$3);
+    }
+    
+    my $pwd = `pwd`; chomp($pwd);
+    my $cmd = "ssh $compute_host 'cd \"$pwd\"; $make_mkv -t \"HomeVideos: $year-$month-$day\" -o \"$video\" -i $videos'\n"; 
+    if(defined $opt_t) {
+       print "\n-> Creating \"$video\"\n";
+       print "$cmd\n";
+       foreach $video (@{$videos{$video}}) {
+           print("rm -f $video\n");
+       }
+    } else {
+       # Create the merged video
+       my $errno = system("$cmd");
+       if($errno > 0) { $errno = $errno - 255; }
+       if($errno) { die "-E- make_mkv encountered some errors with exit code $errno\n"; }
+       # Fix the permissions
+       system("chown $owner \"$video\"");
+       system("chgrp $group \"$video\"");
+       system("chmod $mode \"$video\"");
+       # Remove the individual video files
+       foreach $video (@{$videos{$video}}) {
+           system("rm -f $video");
+       }
+    }
+}
diff --git a/mts2mpg b/mts2mpg
new file mode 100755 (executable)
index 0000000..e3e4962
--- /dev/null
+++ b/mts2mpg
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+# transcode_mts-mpg.pl
+use File::Basename;
+@files = glob "*.MTS";
+
+foreach(@files)
+{
+  print "-> Encoding $_.MTS to $_.mpg\n";
+
+  # Find out if content is interlaced or not
+  $deint_option = "-deinterlace";
+  $interlaced = system('ffmpeg -i "$_.MTS" 2>&1 | grep -q "frame rate differs"');
+  if($interlaced != 0) { 
+    print "   Detected interlaced video content\n";
+  } else { 
+    print "   Detected progressive video content\n";
+    $deint_option = "";
+  }
+
+  # 2 pass encode the video to DVD compatible mpg
+  `ffmpeg -i $_ $deint_option -target ntsc-dvd -pass 1 $_.mpg`;
+  `rm $_.mpg`;
+  `ffmpeg -i $_ $deint_option -target ntsc-dvd -pass 2 $_.mpg`;
+
+}
diff --git a/organize_videos b/organize_videos
new file mode 100755 (executable)
index 0000000..c606da3
--- /dev/null
@@ -0,0 +1,188 @@
+#!/usr/bin/perl
+
+use File::Copy;
+use File::Basename;
+use Getopt::Std;
+use File::stat;
+use Time::localtime;
+
+# Configuration parameters
+my $srcpathname = "/naspool/pictures/New Photos"; # Path to look for photos to move from
+my $dstpathname = "/naspool/videos/HomeVideos"; # Path to move the photos to
+my $merge_videos_by_day = "/naspool/videos/bin/merge_videos_by_day";
+my $minage = "+10"; # Files must be older than X minutes to move
+my $owner = "ajp"; # The owner of the files after they are moved
+my $group = "pip"; # The group of the files after they are moved
+my $mode = "664"; # The mode to set on each file after they are moved
+my $find_cmd = "find \"$srcpathname/\" -cmin $minage -a \\( -iregex \".*\.mov\" -o -iregex \".*\.3gp\" -o -iregex \".*\.mp4\" -o -iregex \".*\.mts\" -o -iregex \".*\.mkv\" \\)";
+
+# Sanity check
+if(! -d $srcpathname) { print "-E- Can't find srcpath: $srcpathname\n"; exit 1; }
+if(! -d $dstpathname) { print "-E- Can't find dstpath: $dstpathname\n"; exit 1; }
+if(! -x $merge_videos_by_day) { print "-E- Can't find required script: $merge_videos_by_day\n"; exit 1; }
+
+my %monthname2month = (
+                      "Jan" => "01",
+                      "Feb" => "02",
+                      "Mar" => "03",
+                      "Apr" => "04",
+                      "May" => "05",
+                      "Jun" => "06",
+                      "Jul" => "07",
+                      "Aug" => "08",
+                      "Sep" => "09",
+                      "Oct" => "10",
+                      "Nov" => "11",
+                      "Dec" => "12"
+                      );
+
+my %month2monthname = (
+                      "01" => "Jan",
+                      "02" => "Feb",
+                      "03" => "Mar",
+                      "04" => "Apr",
+                      "05" => "May",
+                      "06" => "Jun",
+                      "07" => "Jul",
+                      "08" => "Aug",
+                      "09" => "Sep",
+                      "10" => "Oct",
+                      "11" => "Nov",
+                      "12" => "Dec"
+                      );
+
+getopts("htv");
+
+sub usage {
+    print "usage: $0 [-v] [-t]\n";
+    print "   -v = verbose; print file being moved (to)\n";
+    print "   -t = test; print what will happen, but don't do anything\n";
+    return 1;
+}
+
+sub is_folder_empty {
+    my $dirname = shift;
+    opendir(my $dh, $dirname) or die "Not a directory";
+    return scalar(grep { $_ ne "." && $_ ne ".." } readdir($dh)) == 0;
+}
+
+if(defined $opt_h) { usage(); exit 1; }
+
+# Only proceed if there are video files to organize
+$video_files_found=`$find_cmd`;
+if(!$video_files_found) { exit 0; }
+
+# Only one instance of this script running at a time
+use File::Pid;
+my $pidfile = File::Pid->new({file => "/tmp/organize_videos.pid"});
+exit if $pidfile->running();
+$pidfile->write();
+
+# Print the date
+system("date");
+
+# Merge videos prior to copying them over to the destination path
+my $errno = 0;
+if(defined $opt_t) { 
+    $errno=system("$merge_videos_by_day -s \"$srcpathname\" -t");
+} else {
+    $errno=system("$merge_videos_by_day -s \"$srcpathname\"");
+}
+if($errno > 0) { $errno = $errno - 255; }
+if($errno) { die "-E- $merge_videos_by_day encountered some errors with exit code $errno\n"; }
+
+# Copy the videos over to the destination path
+chdir "$srcpathname";
+print "$find_cmd\n" if($opt_v);
+foreach $file (`$find_cmd`) {
+
+    chomp($file);
+    $srcdir = dirname($file);
+    $file = basename($file);
+    $srcfile = $file;
+    $ext = $file; $ext =~ s/.*\.(\S+)$/$1/; $ext = lc($ext);
+    
+    print "Found movie: srcdir: $srcdir srcfile: $srcfile ext: $ext\n" if($opt_v);
+
+    # Throw out files not in the current srcpath
+    if((! -f "$srcfile") && (! -f "$srcdir/$srcfile")) { next; }
+    
+    # Change all spaces to underscores in the filename
+    #$srcfile =~ s/ /_/g;
+        
+    # Make a note of the month, year, and day this video was taken (from the modification time of the file)
+    $date_taken = ctime(stat("$srcdir/$srcfile")->mtime);
+
+    # Get the date taken from the filename
+    if($srcfile =~ /^(\d+)-(\d+)-(\d+)/) {
+       $year = $1;
+       $month = $2;
+       $day = sprintf("%02d",$3);
+       $monthnum = $month;
+       $monthname = lc($month2monthname{$month});
+    }
+    # Get the date taken from the modification time
+    elsif($date_taken =~ /\S+\s+(\S+)\s+(\d+)\s+\S+\s+(\d+)/) {
+       $year = $3;
+       $month = $1;
+       $day = sprintf("%02d",$2);
+       $monthnum = $monthname2month{$month};
+       $monthname = lc($month2monthname{$month});
+    } else {
+       print "-E- Unable to parse year and month from this file: $srcdir/$srcfile\n";
+       next;
+    }
+
+    # We are ready to pick a destination folder to put the picture in
+    $dstdir = $dstpathname . "/" . $year;
+    $dstfile = $dstdir . "/" . $year . "-" . $monthnum . "-" . $day;
+
+    # Check for duplicate filenames at the destination
+    $newfile = $dstfile . "." . "000";
+    if(-e "$newfile.$ext") {
+       foreach $i ('001' .. '999') {
+           $newfile = $dstfile . "." . $i;
+           if(! -e "$newfile.$ext") { last; }
+       }
+       $dstfile = $newfile;
+    }
+    $dstfile = "$newfile.$ext";
+
+    if(defined $opt_t) {
+       print "-> Moving \"$srcdir/$srcfile\" to \"$dstfile\"\n";
+    } else {
+       # Make sure the destination directories exist
+       $errno=system("mkdir -p \"$dstdir\"");
+       if($errno) { print "-E- Error creating dstdir: $dstdir\n"; next; }
+       # Perform the move operation from $srcdir/$srcfile -> $dstfile
+       if($opt_v) { print "-> Moving \"$srcdir/$srcfile\" to \"$dstfile\"\n"; }
+       # Make sure the dstfile doesn't exist, if it does, don't do the move
+       if(! -f "$dstfile") {
+           $errno=system("mv \"$srcdir/$srcfile\" \"$dstfile\" 2>/dev/null");
+           if($errno) { print "-E- Error moving srcfile to dstfile: $srcdir/$srcfile -> $dstfile\n"; next; }
+       } else {
+           if($opt_v) { print "-> Skipping \"$srcdir/$srcfile\". Destfile \"$dstfile\" already exists.\n"; }
+       }
+       # Fix the permissions
+       system("chown $owner \"$dstfile\"");
+       system("chgrp $group \"$dstfile\"");
+       system("chmod $mode \"$dstfile\"");
+    }
+
+    # Check to see if there is an empty sub directory to remove
+    if(($srcdir ne $srcpathname) && ($srcpathname ne ".")) { 
+      if(is_folder_empty($srcdir)) { 
+         print "-> Subdir detected for videos ($srcdir != $srcpathname)\n" if($opt_v);
+         if(! defined $opt_t) { 
+             $tmpdir=`tempfile`;
+             system("rm $tmpdir");
+             system("mv \"$srcdir\" $tmpdir > /dev/null 2>/dev/null");
+             print "-> Moved empty subdir $srcdir to $tmpdir\n" if($opt_v);
+         }
+      }
+    }
+}
+
+$pidfile->remove();
+
+print "\n\n";
diff --git a/setprompt.pl b/setprompt.pl
deleted file mode 100755 (executable)
index c1c4280..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/perl
-
-$host = `hostname`; chomp($host);
-%hostaliases = (
-               "hpesajp" => "hp",
-               "pippin" => "pippin",
-               );
-$pwd = $ENV{PWD};
-
-@aliases = (
-           "/tmp_mnt/auto=>",
-           "$ENV{HOME}=>~",
-           "/net/=>",
-           "/home/=>/~",
-           );
-
-$host = $hostaliases{$host} if defined $hostaliases{$host};
-foreach $alias (@aliases) {
-    @alias = split(/=>/, $alias);
-    if ( $alias[0] ne "" ) {
-        $pwd =~ s/$alias[0]/$alias[1]/;
-    }
-}
-if ($pwd =~ /^(~)?(.+)(\/.*?\/.*?\/.*)/) {
-    @prec = split(/\//, $2);
-    $pwd = "$1($#prec)$3" if $#prec;
-}
-
-while ($pwd =~ /[\/]+([^\/]{13,})/) {
-    $segment = $oldseg = $1;
-    $segment =~ s/^(.{4}).*?(.{5})$/$1\.\.\.$2/;
-    $pwd =~ s/$oldseg/$segment/;
-}
-$whoami = `whoami`;
-chomp( $whoami );
-if ( $whoami eq "root" ) {
-    $user = "\\[\e[41m\\]ROOT\\[\e[49m\\]:";
-} elsif( $whoami ne "ajp" ) {
-    $user = "\\[\e[41m\\]$whoami\\[\e[49m\\]@";
-}
-
-#Colors
-if ( $ENV{COLOR_PROMPT} ne "no" )
-{
-  $host = "\\[\e[32m\\]$host\\[\e[39m\\]" if $host;
-  $pwd  = "\\[\e[36m\\]$pwd\\[\e[39m\\]";
-}
-
-print "$user$host:$pwd> ";
-
diff --git a/tsMuxeR b/tsMuxeR
new file mode 100755 (executable)
index 0000000..82aa2b1
Binary files /dev/null and b/tsMuxeR differ
diff --git a/tsMuxerGUI b/tsMuxerGUI
new file mode 100755 (executable)
index 0000000..d2bbc24
Binary files /dev/null and b/tsMuxerGUI differ