[mythtv-users] Need help with custom mythtranscode User Job

Chris Pinkham cpinkham at bc2va.org
Mon Nov 14 23:25:45 EST 2005


> So, any suggestions on how to proceed?  I suppose I could patch 
> mythtranscode to take an output parameter...

Replying again because I forgot to attach the script. :(

-- 
Chris

-------------- next part --------------
#!/usr/bin/perl
##
## Written by Chris Pinkham (cpinkham at bc2va.org)
##
## Here's the description email I wrote when I originally posted
## this script in reply to a question on the #mythtv-users mailing list.
##
#########################################################################
## > Is there some way I can tell the backend to transcode (but keep the
## > original), and "decide" which version to send when a program is
## > selected on the frontend?
## 
## This has been brought up before and currently Myth isn't designed to
## support anything like this since the database can only handle one
## file (and associated filename, seektable, etc.) per recording.
## 
## I put together a quick script which might give you what you're
## looking for though.
## 
## Attached is a script called myth_make_transcoded_copy.pl.  This script
## will transcode a recording then take the new .tmp file created by
## mythtranscode and rename it and create a new entry in the recording
## table with a starttime of 1 minute after the original recording and
## a subtitle with " (TRANSCODED)" appended to the original subtitle.  The
## AutoExpire field is turned ON for the transcoded copy.  All other fields
## remain the same.  The new recording is treated as a separate recording,
## there is no link to the original recording, so you have to delete
## both of them independently.  I turned AutoExpire ON by default on
## the transcoded copy to try to insure the hard drive doesn't fill up
## with the transcoded copies.
## 
## You would run this script as a User Job from the JobQueue like this (all
## on one line):
## 
## myth_make_transcoded_copy.pl -c %CHANID% -s %STARTTIME% --dir %DIR% 
##     --file %FILE% 
##     
## A couple optional args are things like: 
## 
##     --recgroup 'Transcoded'    (create the new recording in a
##                                 recording group called "Transcoded"
##                                 otherwise leave it in the same group)
##     --noautoexpire             (turn OFF autoexpire on the new
##                                 copy of the recording since it defaults
##                                 to ON).
##     --beforeorig               (set starttime of new recording to 1
##                                 minute BEFORE the original, in case
##                                 you have autoexpire turned on on both
##                                 the original and copy, the copy will
##                                 then expire first since will be older)
##     --rebuild                  (build the seektable in the database
##                                 for the new recording.  This shouldn't
##                                 be necessary for MPEG4 recordings since
##                                 they have a seektable in the file)
## 
## Additional help is available by typing "myth_make_transcoded_copy.pl -h".
## 
## This has only been tested with MPEG2 -> MPEG4 transcodings.  I think
## you'll need the --rebuild option with MPEG2 -> MPEG2 transcodings.
## 
## > I know I'm asking for a lot here, but I'm guessing someone else must
## > have this issue.
## 
## Let me know if this works for you, it's something others would probably
## be interested in as well.
## 
## --
## Chris Pinkham
## 
#########################################################################

require "ctime.pl";
require "timelocal.pl";

use DBI;
use Getopt::Long;

my $chanid = "";
my $orig_startts = "";
my $dir = "";
my $file = "";
my $help = 0;
my $rebuild = 0;
my $database = "mythconverg";
my $dbhost = "localhost";
my $dbuser = "mythtv";
my $dbpass = "mythtv";
my $autoexpire = 1;
my $recgroup = "";
my $beforeorig = 0;

GetOptions(
    'database=s' => \$database,
    'dbhost=s' => \$dbhost,
    'dbuser=s' => \$dbuser,
    'dbpass=s' => \$dbpass,
    'chanid=s' => \$chanid,
    'starttime=s' => \$orig_startts,
    'dir=s' => \$dir,
    'file=s' => \$file,
    'rebuild' => \$rebuild,
    'autoexpire!' => \$autoexpire,
    'beforeorig' => \$beforeorig,
    'recgroup=s' => \$recgroup,
    'help' => \$help
    );

if (( $chanid eq "" ) ||
    ( $orig_startts eq "" ) ||
    ( $dir eq "" ) ||
    ( $file eq "" ) ||
    ( $help != 0 )) {
	print( "Usage: myth_make_transcoded_copy.pl --chanid <CHANID> --startime <STARTTIME> --dir <DIR> --file <FILE> <OPTIONS>\n" );
	print( "\n" );
	print( "WHERE: CHANID    = chanid of program to copy\n" );
	print( "       STARTTIME = starttime in YYYYMMDDHHMMSS format\n" );
    print( "       DIR       = recording directory\n" );
    print( "       FILE      = recording base filename\n" );
    print( "\n" );
    print( "Optional Args:\n" );
    print( "  --rebuild        = build seektable in database for new recording\n" );
    print( "  --noautoexpire   = do not set new recording to autoexpire\n" );
    print( "  --recgroup GROUP = set recording group to GROUP for new recording\n" );
    print( "  --beforeorig     = set time of new recording before original\n" );
	exit(-1);
}

my $sql, $sth;
my $dbh = DBI->connect("dbi:mysql:database=$database:host=$dbhost",
    "$dbuser","$dbpass") or die "Cannot connect to database ($!)\n";

my $s_sec  = substr( $orig_startts, 12, 2);
my $s_min  = substr( $orig_startts, 10, 2);
my $s_hour = substr( $orig_startts, 8, 2);
my $s_mday = substr( $orig_startts, 6, 2);
my $s_mon  = substr( $orig_startts, 4, 2) - 1;
my $s_year = substr( $orig_startts, 0, 4) - 1900;
my $iso_startts = sprintf( "%04d-%02d-%02dT%02d:%02d:%02d",
    $s_year + 1900, $s_mon + 1, $s_mday, $s_hour, $s_min, $s_sec );
my $orig_starttime =
    timelocal( $s_sec, $s_min, $s_hour, $s_mday, $s_mon, $s_year );
my $diff = $beforeorig ? -60 : 60;
my $new_starttime = $orig_starttime + $diff;
my ( $sec,  $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
	localtime($new_starttime);
my $new_startts = sprintf( "%04d%02d%02d%02d%02d%02d",
    $year + 1900, $mon + 1, $mday, $hour, $min, $sec );
my $new_file = $file;
$new_file =~ s/$orig_startts/$new_startts/;

printf( "Transcoding program recorded on chanid %s @ %s\n",
	$chanid, $orig_startts );
printf( "New Recording will be chanid %s @ %s\n",
    $chanid, $new_startts );

if ( -r "$dir/$new_file" ) {
    print( "ERROR: $dir/$new_file already exists, cannot proceed\n" );
    exit(-1);
}

my $cmd = sprintf(
    "mythtranscode --chanid %s --starttime %s -p autodetect",
    $chanid, $iso_startts );

# for testing
#$cmd = sprintf( "ln -s %s/%s %s/%s.tmp", $dir, $file, $dir, $file );

printf( "Running transcode command: '%s'\n", $cmd );

system( $cmd );

if ( ! -r "$dir/$file.tmp" ) {
    print( "ERROR: $dir/$file.tmp does not exist, transcode failed.\n" );
    exit( -1 );
}

print( "Renaming $dir/$file.tmp -> $dir/$new_file\n" );
rename( "$dir/$file.tmp", "$dir/$new_file" );

$sql = sprintf(
    "CREATE TEMPORARY TABLE temp_recorded AS " .
    "SELECT * FROM recorded WHERE chanid = %s AND starttime = %s;",
    $chanid, $orig_startts );
$sth = $dbh->prepare($sql);
$sth->execute() || die "Can't create temporary table temp_recorded!";

$sql = sprintf(
    "UPDATE temp_recorded SET starttime = %s, " .
        "subtitle = CONCAT( subtitle, ' (TRANSCODED)'), " .
        "autoexpire = %d, " .
        "basename = '%s' " .
    "WHERE chanid = %s AND starttime = %s;",
    $new_startts, $autoexpire, $new_file, $chanid, $orig_startts );
$sth = $dbh->prepare($sql);
$sth->execute() || die "Can't modify recording in temp_recorded!";

if ( $recgroup ne "" ) {
    $sql = sprintf(
        "UPDATE temp_recorded SET recgroup = '%s' " .
        "WHERE chanid = %s AND starttime = %s;",
        $recgroup, $chanid, $new_startts );
    $sth = $dbh->prepare($sql);
    $sth->execute() || die "Can't modify recording group in temp_recorded!";
}

$sql = sprintf(
    "INSERT recorded " .
    "SELECT * FROM temp_recorded WHERE chanid = %s AND starttime = %s;",
    $chanid, $new_startts );
$sth = $dbh->prepare($sql);
$sth->execute() || die "Can't insert new recording into recorded table!";

$sql = "DROP TABLE temp_recorded;";
$sth = $dbh->prepare($sql);
$sth->execute();

if ($rebuild) {
    $cmd = sprintf(
        "mythcommflag --chanid %s --starttime %s --rebuild",
        $chanid, $new_startts );
    printf( "Creating seektable in database for new recording\n" );
    printf( "Using '%s'\n", $cmd );
    system( $cmd );
}

# vim: set expandtab tabstop=4 shiftwidth=4:


More information about the mythtv-users mailing list