Dvbradioexport.pl

From MythTV Official Wiki
Jump to: navigation, search

Important.png Note: The correct title of this article is dvbradioexport.pl. It appears incorrectly here due to technical restrictions.


Author Justin Hornsby
Description none
Supports


DVB Radio export script

Here is a script to export DVB radio recordings to MP3 format. 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:

dvbradioexport.pl exportdir=/foo/bar starttime=%STARTTIME% chanid=%CHANID% maxbitrate=x 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 MP3 files to (note the user the script runs as must have write permission on that dir)

maxbitrate = maximum bitrate for the export to use. If more than the original file's bitrate, the original bitrate will be used

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 DVB Radio' in the description field and

dvbradioexport.pl exportdir=/foo/bar starttime=%STARTTIME% chanid=%CHANID% maxbitrate=x
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.


Script.png dvbradioexport.pl

#!/usr/bin/perl -w
# dvbradioexport.pl v2.0
# By Justin Hornsby 22 October 2006
# 
# Storage Group Support by Stuart Auchterlonie  28 April 2007
#
# A MythTV user job script for exporting DVB radio recordings to MP3 format
#
# 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: id3tag, ffmpeg with mp3 exporting enabled, PERL and the DBI & DBD::mysql modules
#               MythTV perl bindings.
#

# PERL MODULES WE WILL BE USING
use DBI;
use DBD::mysql;
use MythTV;

my $exportdir = '/home/mythtv/';
my $maxbitrate = '256';
my $bitrate = '192';

$connect = undef;
$debug = 0;

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

$usage = "\nHow to use dvbradioexport.pl \n\ndvbradioexport.pl exportdir=/foo/bar starttime=%STARTTIME% 
chanid=%CHANID% maxbitrate=x 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"
        ."maxbitrate = maximum bitrate for the export to use.  If more than the original file's bitrate, the original 
bitrate will be used \n"
        ."debug = enable debugging information - outputs which commands would be run etc\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/maxbitrate/) {
        $maxbitrate = (split(/\=/,$_))[1];
    }
    elsif ($_ =~ m/starttime/) {
        $starttime = (split(/\=/,$_))[1];
    }
    elsif ($_ =~ m/chanid/) {
        $chanid = (split(/\=/,$_))[1];
    }
    elsif ($_ =~ m/exportdir/) {
        $exportdir = (split(/\=/,$_))[1];
    }
}

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

# PREPARE THE QUERY
$query = "SELECT title, subtitle, basename FROM recorded WHERE chanid=$chanid AND starttime='$starttime'";
$query_handle = $connect->prepare($query);
$query_handle->execute() || die "Cannot connect to database \n";

# BIND TABLE COLUMNS TO VARIABLES
$query_handle->bind_columns(undef, \$title, \$subtitle, \$basename);

# 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 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."/".$basename;

$newfilename = $exportdir."/".$channame."_".$title."_".$subtitle."_".$newstarttime.".mp3";

if ($debug)
{
    print "\n\n Source filename:$filename \nDestination filename:$newfilename\n \n";
}
#
# Now run ffmpeg to find out what bitrate the stream is
#

$origbitrate = -1;

$output = `ffmpeg -i $filename 2>&1`;

$output =~s/^.*?Audio.*?, (\d*) kb\/s.*$/$1/s;

print $output . "\n";

if ($output =~ /^\d+$/) {
    $origbitrate = $output;
}

#
# If maximum bitrate is less than the source bitrate, allow the max bitrate to remain
#

$bitrate = $maxbitrate;

if (($origbitrate != -1) && ($maxbitrate > $origbitrate)) {
    print "maxbitrate is greater than original.  Using source bitrate to save space\n";
    $bitrate = $origbitrate;
}

$bitrate .= "K";

#
# Now run ffmpeg to get mp3 out of the dvb radio recording
#

$command = "nice -n19 ffmpeg -i $filename -ab $bitrate -ac 2 -acodec mp3 -f mp3 '$newfilename' 2>&1";

if ($debug) {
    print "\n\nUSING $command \n\n";
}

system "$command";

# Now tag the finished MP3 file

$command = "id3tag --song='$title' --album='$subtitle' --artist='$channame' --comment='Transcoded by MythTV' --year=$year '$newfilename'";

if ($debug) {
    print "\n\nUsing $command \n\n";
}
system "$command";