Ipod export

From MythTV Official Wiki
Revision as of 16:59, 3 February 2008 by Swedish cook (talk | contribs) (Added note for conversion of DVB recordings using ProjectX then ffmpeg)

Jump to: navigation, search

iPod export script

Here is a script to export recordings in a format compatible with a video iPod. It can be used on the command line or as a user job script.

Command line usage

If using on the command line, the usage information is as follows:

ipodexport.pl exportdir=/foo/bar starttime=%STARTTIME% chanid=%CHANID% bitrate=x size=320x240 aspect=4:3 debug

..where

%CHANID% = channel ID associated with the recording to export

%STARTTIME% = recording start time in either 'yyyy-mm-dd hh:mm:ss' or 'yyyymmddhhmmss' format

exportdir = dir to export completed MP4 files to (note the user the script runs as must have write permission on that dir

size = frame size of output file. 320x240 is the default value

aspect = aspect ratio of output file. Valid values are 4:3 (default) and 16:9

bitrate = audio bitrate in output file in kbps. Default value is 96

debug = enable debugging information - outputs which commands would be run etc

Use as a User Job

Enter mythtv-setup and select the 'general' menu option. Keep hitting 'next' until the 'Job Queue (Job Commands)' screen appears.

Add a brief description of the script in the 'description' field then enter the path to the script (including any options) to the 'command' field.

In this case, put 'export recordings to iPod' in the description field and

ipodexport.pl exportdir=/foo/bar starttime=%STARTTIME% chanid=%CHANID% bitrate=128 size=320x240 aspect=4:3
in the 'command' field. You may want to change some of the parameters to suit your own needs.

Click all the way to 'finish' and if user jobs are permitted to run, the script will now be available to use.

The Code

#!/usr/bin/perl -w
# ipodexport.pl v1.0
# By Justin Hornsby 27 July 2007
# 
# 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
#                Also requires MythTV perl bindings
# 
#
# PERL MODULES WE WILL BE USING
use DBI;
use DBD::mysql;
use MythTV;

# Set default values
my $exportdir = '/home/mythtv/';
my $bitrate = '96';
my $aspect = '4:3';
my $size = '320x240';

$connect = undef;
$debug = 0;

##################################
#                                #
#    Main code starts here !!    #
#                                #
##################################

$usage = "\nHow to use dvbradioexport.pl : \n"
        ."ipodexport.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 MP4 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"
        ."\nExample: ipodexport.pl exportdir=/home/juski starttime=20060803205900 chanid=1006 size=320x340 aspect=16:9 bitrate=192 debug \n";

# 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];
    }
}

#
#
my $myth = new MythTV();
# connect to database
$connect = $myth->{'dbh'};

# 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();

my $schemaVer = $myth->backend_setting('DBSchemaVer');
# Storage Groups were added in DBSchemaVer 1171
# FIND WHERE THE RECORDINGS LIVE
my $dir = 'UNKNOWN';
if ($schemaVer < 1171)
{
    if ($debug) {
        print ("Using compatibility mode\n");
    }
    $dir = $myth->backend_setting('RecordFilePrefix');
}
else
{
    if ($debug) {
        print ("Going into new mode\n");
    }
    my $storagegroup = new MythTV::StorageGroup();
    $dir = $storagegroup->FindRecordingDir($basename);
}

# 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 non-word characters in title with underscores
$title =~ s/\W+/_/g;
# replace non-word characters in subtitle with underscores
$subtitle =~ s/\W+/_/g;

#
# Remove non alphanumeric chars from $starttime & $endtime
#
 
$newstarttime = $starttime;
$newstarttime =~ s/[|^\W|\s|-|]//g;
$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 = "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";
}

Note On Conversion Of DVB Recording

Living in the UK, recording from DVB-T (digital tv as its commonly known here) I found the above ffmpeg command would not work, I had to demux the video into audio and video portions before ffmpeg would process it, I've used a java utility ProjectX, here is an except from the script I've used to convert to an ipod compatible file :

java -Djava.awt.headless=true -jar $MYDIR/ProjectX/ProjectX.jar -demux $FILENAME -out /data/tmp/$BASENAME
ffmpeg -vcodec xvid -b 768 -qmax 5 -bufsize 4096 -g 300 -acodec aac -ab 160 -i /data/tmp/$BASENAME/$M2VNAME -i /data/tmp/$BASENAME/$MP2NAME -s 320x180 /data/tmp/$BASENAME/$MP4NAME

--Swedish cook 16:59, 3 February 2008 (UTC)