Myth upcoming recordings.pl

From MythTV Official Wiki
Jump to: navigation, search

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


Author Michael T. Dean
Description Outputs information about upcoming recordings in either plain-text or Miscellaneous Status Information format (for embedding in the backend status page). Allows specifying time range or count and showing only episodes matching specific status (such as showing only Conflicts).
Supports Version21.png  Version22.png  Version23.png  Version24.png  Version26.png 


myth_upcoming_recordings.pl outputs information about the upcoming recordings.

Examples

Command-line Usage

To get detailed help:

myth_upcoming_recordings.pl --help

To show a plain-text list of conflicts or "No conflicts." in the event there are no conflicts:

myth_upcoming_recordings.pl --plain_text --recordings -1 --no_show_scheduled --heading 'Recording Conflicts\n\n' --no_conflicts_message 'No Conflicts'

To show a list of deactivated recordings (Inactive schedule, Never Record, Earlier or Later Showing, Too Many Recordings, Not Enough Disk Space, Not Listed):

myth_upcoming_recordings.pl --plain_text --recordings -1 --no_show_scheduled --no_show_duplicates --show_deactivated --no_show_conflicts --heading "Upcoming Deactivated Recordings" 


Important.png Note: This output could be e-mailed with a script called from a cron job that uses mailx/sendmail/... to send the e-mail.

Miscellaneous Status Information Script Usage

When used as a Miscellaneous Status Information script, recording information will be shown in the "Miscellaneous" section of the backend status page (available through MythWeb's Backend Status page or http://[hostname]:6544/ ).

To show a list of conflicts:

myth_upcoming_recordings.pl --recordings -1 --no_show_scheduled --heading '<h3>Recording Conflicts</h3>' --no_conflicts_message '<h3>No Conflicts</h3>'


The Script

Script.png myth_upcoming_recordings.pl

#!/usr/bin/perl -w
#
# Provides notification of upcoming recordings.
#
# Automatically detects database settings.
#

# Includes
    use DBI;
    use Getopt::Long;
    use MythTV;

# Some variables we'll use here
    our ($num_recordings, $heading, $plain_text, $text_format, $usage);
    our ($hours, $minutes, $seconds, $no_conflicts_message);
    our ($scheduled, $duplicates, $deactivated, $conflicts);
    our ($dnum_recordings, $dheading, $dtext_format);
    our ($dhours, $dminutes, $dseconds, $dno_conflicts_message);
    our ($dscheduled, $dduplicates, $ddeactivated, $dconflicts);
    our ($status_text_format, $status_value_format);
    our ($dstatus_text_format, $dstatus_value_format);

# Default number of upcoming recordings to show
    $dnum_recordings = 5;
# Default period in which to show recordings
    $dhours          = -1;
    $dminutes        = -1;
    $dseconds        = -1;
# Default recording status types to show
    $dscheduled      = 1;
    $dduplicates     = 0;
    $ddeactivated    = 0;
    $dconflicts      = 1;
# Default status output heading
    $dheading='Upcoming Recordings:\n';
# Default format of plain-text output
    $dtext_format='%rs\n%n/%j, %g:%i %A - %cc\n%T - %S\n%R\n\n';
# Default "no conflicts" message
    $dno_conflicts_message='No conflicts.\n';
# Default format of status output display text
    $dstatus_text_format= '<a href="#">%rs - %n/%j, %g:%i %A -  %cc - '.
                          '%T - %S<br />'.
                          '<span><strong>%T</strong> %n/%j, %g:%i %A<br />'.
                          '<em>%S</em><br /><br />%R<br /></span></a><hr />';
# Default format of status output value
    $dstatus_value_format = '%n/%j, %g:%i %A - %T - %S';

# Provide default values for GetOptions
    $num_recordings       = $dnum_recordings;
    $hours                = $dhours;
    $minutes              = $dminutes;
    $seconds              = $dseconds;
    $scheduled            = $dscheduled;
    $duplicates           = $dduplicates;
    $deactivated          = $ddeactivated;
    $conflicts            = $dconflicts;
    $heading              = $dheading;
    $text_format          = $dtext_format;
    $no_conflicts_message = $dno_conflicts_message;
    $status_text_format   = $dstatus_text_format;
    $status_value_format  = $dstatus_value_format;

# Load the cli options
    GetOptions('num_recordings|recordings=s'         => \$num_recordings,
               'hours|o=i'                           => \$hours,
               'minutes=i'                           => \$minutes,
               'seconds|s=i'                         => \$seconds,
               'show_scheduled|_show_scheduled|scheduled|_scheduled|e!'
                                                     => \$scheduled,
               'show_duplicates|_show_duplicates|duplicates|_duplicates|p!'
                                                     => \$duplicates,
               'show_deactivated|_show_deactivated|deactivated|_deactivated|v!'
                                                     => \$deactivated,
               'show_conflicts|_show_conflicts|conflicts|_conflicts!'
                                                     => \$conflicts,
               'heading=s'                           => \$heading,
               'plain_text'                          => \$plain_text,
               'text_format=s'                       => \$text_format,
               'no_conflicts_message=s'              => \$no_conflicts_message,
               'status_text_format=s'                => \$status_text_format,
               'status_value_format=s'               => \$status_value_format,
               'usage|help'                          => \$usage
              );

# Print usage
    if ($usage) {
    # Make default "--show_*" options readable
        $dscheduled   = ($dscheduled   ? '--show_scheduled' :
                                         '--no_show_scheduled');
        $dduplicates  = ($dduplicates  ? '--show_duplicates' :
                                         '--no_show_duplicates');
        $ddeactivated = ($ddeactivated ? '--show_deactivated' :
                                         '--no_show_deactivated');
        $dconflicts   = ($dconflicts   ? '--show_conflicts' :
                                         '--no_show_conflicts');
        print <<EOF;
$0 usage:

options:

--recordings [number of recordings]

    Outputs information on the next [number of recordings] shows to be recorded
    by MythTV and that match the criteria specified for --scheduled,
    --duplicates, --deactivated, and --conflicts.  To output information on all
    matching recordings, specify -1.

    default:  $dnum_recordings

--hours [number of hours]

    Outputs information on recordings starting in the next [number of hours]
    and that match the criteria specified for --scheduled, --duplicates,
    --deactivated, and --conflicts.  This option may be specified in
    conjunction with --minutes and --seconds.  To output information on all
    matching recordings regardless of start time, specify -1 for --hours,
    --minutes, and --seconds.

    default:  $dhours

--minutes [number of minutes]

    Outputs information on recordings starting in the next [number of minutes]
    and that match the criteria specified for --scheduled, --duplicates,
    --deactivated, and --conflicts.  This option may be specified in
    conjunction with --hours and --seconds.  To output information on all
    matching recordings regardless of start time, specify -1 for --hours,
    --minutes, and --seconds.

    default:  $dminutes

--seconds [number of seconds]

    Outputs information on recordings starting in the next [number of seconds]
    and that match the criteria specified for --scheduled, --duplicates,
    --deactivated, and --conflicts.  This option may be specified in
    conjunction with --hours and --minutes.  To output information on all
    matching recordings regardless of start time, specify -1 for --hours,
    --minutes, and --seconds.

    default:  $dseconds

--show_scheduled|--no_show_scheduled

    Outputs information about scheduled recordings.  Scheduled recordings are
    those that MythTV plans to actually record.

    default:  $dscheduled

--show_duplicates|--no_show_duplicates

    Outputs information about duplicate recordings.  Duplicate recordings are
    those that will not be recorded because of the specified duplicate matching
    policy for the rule.

    default:  $dduplicates

--show_deactivated|--no_show_deactivated

    Outputs information about deactivated recordings.  Deactivated recordings
    are those that MythTV will not record because the schedule is inactive,
    because the showing was set to never record, because the show is being
    recorded in an earlier or later showing, because there are too many
    recordings or not enough disk space to allow the recording, or because
    the show you\'ve specified for recording is not listed in the timeslot
    specified.

    default:  $ddeactivated

--show_conflicts|--no_show_conflicts

    Outputs information about conflicts (those shows that MythTV cannot record
    because of other higher-priority scheduled recordings).

    default:  $dconflicts

--heading [heading]
    Output the [heading] before printing information about recordings.

    default:  \'$dheading\'

--plain_text
    Output information in plain text format (i.e. for inclusion in an e-mail
    notification).

--text_format [format]
    Use the provided [format] to display information on the recordings.  The
    format should use the same format specifiers used by mythlink.pl, but
    may also use \\r and/or \\n for line breaks and %rs for recording status.
    This option is ignored if --plain_text is not used.

    default:  \'$dtext_format\'

--no_conflicts_message [message]
    Use the provided [message] to specify there are no conflicts.  This option
    is used when only information about conflicts is requested and there are
    no conflicts.  I.e. it is only used with the combination of show_*
    options --show_conflicts, --no_show_scheduled, --no_show_deactivated,
    and --no_show_duplicates .

    default:  \'$dno_conflicts_message\'

--help

    Show this help text.

EOF
        exit;
    }

# Determine the period of interest
    my $now = time();
    my $start_before = $now;
    $start_before = $start_before + ($hours * 3600) if ($hours > 0);
    $start_before = $start_before + ($minutes * 60) if ($minutes > 0);
    $start_before = $start_before + $seconds if ($seconds > 0);
    $start_before = 0 if (!($start_before > $now));

# Fix the heading.
    if (defined($plain_text)) {
        $heading =~ s/\\r/\r/g;
        $heading =~ s/\\n/\n/g;
    }
    else {
    # Remove line break format specifiers from heading for status output
        $heading =~ s/(\\r|\\n)//g;
    }

# Connect to mythbackend
    my $Myth = new MythTV();

# Get the list of recordings
    my $count = 0;
    my %rows = $Myth->backend_rows('QUERY_GETALLPENDING', 2);
    my $has_conflicts = $rows{'offset'}[0];
    if ((!$has_conflicts) &&
        (($conflicts) &&
         (!(($scheduled) || ($duplicates) || ($deactivated))))) {
        $no_conflicts_message =~ s/\\r/\r/g;
        $no_conflicts_message =~ s/\\n/\n/g;
        print "$no_conflicts_message";
        exit 0;
    }
    my $num_scheduled = $rows{'offset'}[1];
    our $show;
    foreach my $row (@{$rows{'rows'}}) {
        last unless (($count < $num_recordings) || ($num_recordings < 0));
        $show = new MythTV::Program(@$row);
        last if (($start_before) && ($show->{'recstartts'} > $start_before));
        next if ((!$scheduled) && (is_scheduled($show->{'recstatus'})));
        next if ((!$duplicates) && (is_duplicate($show->{'recstatus'})));
        next if ((!$deactivated) && (is_deactivated($show->{'recstatus'})));
        next if ((!$conflicts) && (is_conflict($show->{'recstatus'})));

    # Print the recording information in the desired format
        if (defined($plain_text)) {
            text_print($count);
        }
        else {
            status_print($count);
        }
        $count++;
    }

# Returns true if the show is scheduled to record
    sub is_scheduled {
        my $recstatus = (shift() or 0);
        return (($MythTV::recstatus_willrecord == $recstatus) ||
                ($MythTV::recstatus_recorded == $recstatus) ||
                ($MythTV::recstatus_recording == $recstatus));
    }

# Returns true if the show is a duplicate
    sub is_duplicate {
        my $recstatus = (shift() or 0);
        return (($MythTV::recstatus_repeat == $recstatus) ||
                ($MythTV::recstatus_previousrecording == $recstatus) ||
                ($MythTV::recstatus_currentrecording == $recstatus));
    }

# Returns true if the recording is deactivated
    sub is_deactivated {
        my $recstatus = (shift() or 0);
        return (($MythTV::recstatus_inactive == $recstatus) ||
                ($MythTV::recstatus_toomanyrecordings == $recstatus) ||
                ($MythTV::recstatus_cancelled == $recstatus) ||
                ($MythTV::recstatus_deleted == $recstatus) ||
                ($MythTV::recstatus_aborted == $recstatus) ||
                ($MythTV::recstatus_notlisted == $recstatus) ||
                ($MythTV::recstatus_dontrecord == $recstatus) ||
                ($MythTV::recstatus_lowdiskspace == $recstatus) ||
                ($MythTV::recstatus_tunerbusy == $recstatus) ||
                ($MythTV::recstatus_neverrecord == $recstatus) ||
                ($MythTV::recstatus_earliershowing == $recstatus) ||
                ($MythTV::recstatus_latershowing == $recstatus));
    }

# Returns true if the show cannot be recorded due to a conflict
    sub is_conflict {
        my $recstatus = (shift() or 0);
        return ($MythTV::recstatus_conflict == $recstatus);
    }

# Print the output for use in the backend status page.
    sub status_print {
        my $count = shift;
        my $text = $show->format_name($status_text_format, ' ', ' ', 1, 0 ,1);
        $text =~ s/%rs/$MythTV::RecStatus_Types{$show->{'recstatus'}}/g;
        my $value = $show->format_name($status_value_format, ' ', ' ',
                                       1, 0 ,1);
        $value =~ s/%rs/$MythTV::RecStatus_Types{$show->{'recstatus'}}/g;
        print("$heading<div class=\"schedule\">") if ($count == 0);
        print("$text");
        print("</div>") if ($count == ($num_recordings - 1));
        print("[]:[]recording$count");
        print("[]:[]$value\n");
    }

# Print the output in plain text format
    sub text_print {
        my $count = shift;
        my $text = $show->format_name($text_format, ' ', ' ', 1, 0 ,1);
        $text =~ s/%rs/$MythTV::RecStatus_Types{$show->{'recstatus'}}/g;
        $text =~ s/\\r/\r/g;
        $text =~ s/\\n/\n/g;
        print("$heading") if ($count == 0);
        print("$text");
    }