#!/usr/bin/perl -w # ipodexport.pl v2.0 # By Justin Hornsby 22 October 2006 # # A MythTV user job script for exporting MythTV recordings to Ipod & other xvid/aac formats # # Usage info will be output if the script is run with no arguments (or insufficient arguments) # # Contains elements of mythtv.pl by Nigel Pearson # Initial idea from nuvexport # # requirements: ffmpeg with aac & xvid support enabled, PERL and the DBI & DBD::mysql modules # # NOTE: May not work with SVN trunk storage groups # # PERL MODULES WE WILL BE USING use DBI; use DBD::mysql # MythTV Database details - edit these to suit $host = '127.0.0.1'; $database = 'mythconverg'; $user = 'mythtv'; $pass = $user; $hostname = 'mythback'; # Location of the recordings $dir = '/video/videorec/'; # Where the recordings are $exportdir = '/home/mythtv/'; $bitrate = '96'; $aspect = '4:3'; $size = '320x240'; $prefix = '/usr/bin'; $db = undef; $connect = undef; $debug = 0; ###################################### # # # SUBROUTINES ARE HERE # # # ###################################### # Try to find the database # sub findDatabase() { my $found = 0; my @mysql = ('/usr/local/share/mythtv/mysql.txt', '/usr/share/mythtv/mysql.txt', '/etc/mythtv/mysql.txt', '/usr/local/etc/mythtv/mysql.txt', "$ENV{HOME}/.mythtv/mysql.txt", 'mysql.txt' ); foreach my $file (@mysql) { next unless (-e $file); $found = 1; open(CONF, $file) or die "Unable to open $file: $!\n\n"; while (my $line = ) { # Cleanup next if ($line =~ /^\s*#/); $line =~ s/^str //; chomp($line); # Split off the var=val pairs my ($var, $val) = split(/\=/, $line, 2); next unless ($var && $var =~ /\w/); if ($var eq 'DBHostName') { $host = $val; } elsif ($var eq 'DBUserName') { $user = $val; } elsif ($var eq 'DBName') { $database = $val; } elsif ($var eq 'DBPassword') { $pass = $val; } } close CONF; } if ( ! $found ) { die "Unable to locate mysql.txt: $!\n\n" } } # DB connect subroutine # ======================= # openDatabase() - Connect or die # sub openDatabase() { $db = DBI->connect("dbi:mysql:database=$database" . ":host=$host", $user, $pass) or die "Cannot connect to database: $!\n\n"; return $db; } ################################## # # # Main code starts here !! # # # ################################## # # # FIND THE DATABASE SETTINGS $usage = "\nHow to use dvbradioexport.pl \n\nipodexport.pl exportdir=/foo/bar starttime=%STARTTIME% chanid=%CHANID bitrate=x size=320x240 aspect=4:3 debug\n" ."\n%CHANID% = channel ID associated with the recording to export\n" ."%STARTTIME% = recording start time in either 'yyyy-mm-dd hh:mm:ss' or 'yyyymmddhhmmss' format\n" ."exportdir = dir to export completed MP3 files to (note the user the script runs as must have write permission on that dir\n" ."size = frame size of output file. 320x240 is the default value \n" ."aspect = aspect ratio of output file. Valid values are 4:3 (default) and 16:9 \n" ."bitrate = audio bitrate in output file in kbps. Default value is 96 \n" ."debug = enable debugging information - outputs which commands would be run etc\n"; findDatabase(); # get this script's ARGS # $num = $#ARGV + 1; # if user hasn't passed enough arguments, die and print the usage info if ($num le "2") { die "$usage"; } # # Get all the arguments # foreach (@ARGV){ if ($_ =~ m/debug/) { $debug = 1; } elsif ($_ =~ m/size/) { $size = (split(/\=/,$_))[1]; } elsif ($_ =~ m/aspect/) { $aspect = (split(/\=/,$_))[1]; } elsif ($_ =~ m/bitrate/) { $bitrate = (split(/\=/,$_))[1]; } elsif ($_ =~ m/starttime/) { $starttime = (split(/\=/,$_))[1]; } elsif ($_ =~ m/chanid/) { $chanid = (split(/\=/,$_))[1]; } elsif ($_ =~ m/exportdir/) { $exportdir = (split(/\=/,$_))[1]; } } # # connect to database # $connect = openDatabase(); # PREPARE THE QUERY $query = "SELECT title, subtitle FROM recorded WHERE chanid=$chanid AND starttime='$starttime'"; $query_handle = $connect->prepare($query); # EXECUTE THE QUERY $query_handle->execute() || die "Cannot connect to database \n"; # BIND TABLE COLUMNS TO VARIABLES $query_handle->bind_columns(undef, \$title, \$subtitle); # LOOP THROUGH RESULTS $query_handle->fetch(); # FIND WHERE THE RECORDINGS LIVE $query = "SELECT data FROM settings WHERE value='RecordFilePrefix' AND hostname='$hostname'"; $query_handle = $connect->prepare($query); $query_handle->execute() || die "Unable to query settings table"; my ($dir) = $query_handle->fetchrow_array; # FIND OUT THE CHANNEL NAME $query = "SELECT name FROM channel WHERE chanid=$chanid"; $query_handle = $connect->prepare($query); $query_handle->execute() || die "Unable to query settings table"; my ($channame) = $query_handle->fetchrow_array; # replace whitespace in channame with dashes $channame =~ s/\s+/-/g; # replace whitespace in title with underscores $title =~ s/\W+/_/g; # replace whitespace in subtitle with underscores $subtitle =~ s/\W+/_/g; # # Remove non alphanumeric chars from $starttime & $endtime # $newstarttime = $starttime; $newstarttime =~ s/[|^\W|\s|-|]//g; $year = substr($newstarttime, 0, 4); $filename = $dir."/".$chanid."_".$newstarttime.".mpg"; $newfilename = $exportdir."/".$channame."_".$title."_".$subtitle."_".$newstarttime.".mp4"; if ($debug) { print "\n\n Source filename:$filename \nDestination filename:$newfilename\n \n"; } # # Now run ffmpeg to get ipod compatible video with a simple ffmpeg line $command = $prefix."/nice -n19 ffmpeg -i $filename -vcodec xvid -b 300 -qmin 3 -qmax 5 -bufsize 4096 -g 300 -acodec aac -ab $bitrate -s $size -aspect $aspect '$newfilename' 2>&1"; if ($debug) { print "\n\nUSING $command \n\n"; } if (!$debug) { system "$command"; }