NAME

Net::MythTV::Fuse::Recordings - Manage list of MythTV recordings for MythTV Fuse filesystem

SYNOPSIS

$recordings = Net::MythTV::Fuse::Recordings->new({backend   => 'mythbackend.domain.org',
                                                  pattern   => '%C/%T/%S',
                                                  cachetime => 120,
                                                  maxgets   => 6,
                                                  threaded  => 1,
                                                  debug     => 1}
                                                );
$recordings->start_update_thread();
@paths = $recordings->entries('.');
$recordings->valid_path('Firefly/Serenity.mpg') or die;
$recordings->is_dir('Firefly')                  or die;
($status,$content) = $recordings->download_recorded_file('Firefly/Serenity.mpg',1024,0);

DESCRIPTION

This is a utility class used by Net::MythTV::Fuse which handles all interaction with the backend. Using the MythTV 0.25 API, the module maintains a cache of current recordings, translates them into a series of virtual directory listings according to a template, and can download segments of individual recordings from a local or remote backend.

METHODS

$r = Net::MythTV::Fuse::Recordings->new(\%options)

Create a new Recordings object. Options are passed as a hashref and may contain any of the following keys:

backend       IP address of the backend (localhost)
port          Control port for the backend (6544)
pattern       Template for transforming recordings into paths (%T/%S)
delimiter     Trim this string from the pathname if it is dangling or occurs multiple times (none)
cachetime     Maximum time to cache recorded list before refreshing from backend (300 sec)
maxgets       Maximum number of simultaneous file fetches to perform on backend (8)
threaded      Run the cache fill process as an ithread (true)
debug         Turn on debugging messages (false)
dummy_data_path  For debugging, pass path to backend recording XML listing

See the help text for mythfs.pl for more information on these arguments.

Accessors

These methods get or set the correspondingly-named values:

debug()
backend()
port()
maxgets()
threaded()
pattern()
delimiter()
mtime()
localmount()

These methods are used internally:

dummy_data()
cache()
cachetime()
semaphore()

$r->start_update_thread

Start the thread that periodically fetches and caches the recording data from the server. Will run as a detached thread until the process terminates.

$recordings = $r->get_recorded

Return a data structure corresponding to the current recording list. The data structure is a hashref with two top-level keys: "directories", which list directory names and their contents, and "paths" which give size and other attributes for each directory, subdirectory and file. Here is an example:

{
 'directories' => {
      '.' => {
              '007 Licence To Kill.mpg' => 1,
              'A Funny Thing Happened on the Way to the Forum.mpg' => 1,
              'Alfred Hitchcock Presents' => 5,
              'American Dad' => 9,
               ...
              },
      'Alfred Hitchcock Presents' => {
              'Back for Christmas.mpg' => 1,
              'Dead Weight.mpg' => 1,
              'Rose Garden.mpg' => 1,
             },
      'American Dad' => {
              'Dr. Klaustus.mpg' => 1,
              'Flirting With Disaster.mpg' => 1,
              'Gorillas in the Mist.mpg' => 1,
             },
        ...
    },
 'paths' => {
      '.' => {
              'ctime' => 1368074100,
              'length' => 240,
              'mtime' => 1368076875,
              'type' => 'directory'
             },
      '007 Licence To Kill.mpg' => {
              'basename' => '1111_20121126200000.mpg',
              'ctime' => 1353978000,
              'host' => 'myth',
              'length' => '21262807708',
              'mtime' => 1357927839,
              'storage' => 'Default',
              'type' => 'file'
             },
      'A Funny Thing Happened on the Way to the Forum.mpg' => {
              'basename' => '1191_20121230000000.mpg',
              'ctime' => 1356843600,
              'host' => 'myth',
              'length' => '12298756208',
              'mtime' => 1357927839,
              'storage' => 'Default',
              'type' => 'file'
             },
        'Alfred Hitchcock Presents' => {
              'ctime' => 1362985200,
              'length' => 5,
              'mtime' => 1362987680,
              'type' => 'directory'
             },
         'Alfred Hitchcock Presents/Back for Christmas.mpg' => {
              'basename' => '1022_20121225153000.mpg',
              'ctime' => 1356467400,
              'host' => 'myth',
              'length' => '647625408',
              'mtime' => 1357927839,
              'storage' => 'Default',
              'type' => 'file'
             },
         'Alfred Hitchcock Presents/Dead Weight.mpg' => {
                'basename' => '1022_20121207000000.mpg',
                'ctime' => 1354856400,
                'host' => 'myth',
                'length' => '647090360',
                'mtime' => 1357927839,
                'storage' => 'Default',
                'type' => 'file'
              },
            ...
    }

$path = $r->recording_to_path($metadata)

Given the metadata returned from the backend for a single recording, transform this into a pathname using the provided template.

$message = $r->status

Returns the last status message.

$time = $r->mtime

Return the time that the status was last updated.

@entries = $r->entries($path)

Given a path to a directory in the virtual filesystem, return all subentries within that directory. Use '.' to indicate the top level directory.

$name = $r->basename($path)

Given a path to a file in the virtual filesystem, returns the basename of the physical file on the backend's storage disk.

$entry = $r->entry($path)

Given a path to a file on the virtual filesystem, returns a hashref that provides length, modification time and basename information about the recording. This is simply the value of the {path}{$path} key in the data structure described for get_recorded():

{'Alfred Hitchcock Presents/Back for Christmas.mpg' => {
       'basename' => '1022_20121225153000.mpg',
       'ctime' => 1356467400,
       'host' => 'myth',
       'length' => '647625408',
       'mtime' => 1357927839,
       'storage' => 'Default',
       'type' => 'file'
      }
}

$boolean = $r->valid_path($path)

Returns true if the provided path is valid.

$boolean = $r->is_dir($path)

Returns true if the provided path is a directory in the virtual filesystem.

($status,$content) = $r->download_recorded_file($path,$size,$offset)

Attempts to download the recording corresponding to the indicated path. $size and $offset allow you to fetch the indicated portion of the recording.

A two-element list is returned. The first element is a status message, one of "ok", "not found", "invalid offset", or "connection failed". If successful, the second element will be the requested content, otherwise undef.

$status = $r->delete_recording($path)

Call on a path to delete the indicated recording. Returns "ok" if successful. Otherwise may return "not found" for an invalid path, or "delete failed: " plus some explanatory text describing an error on the backend.

$status = $r->delete_directory($path)

Call on a path to delete the indicated directory. The directory must be empty. The returned status string will be "ok", or one of "not found", "not a directory" or "directory not empty".

$path = $r->apply_pattern($entry)

$upcoming = $r->get_upcoming_list

Get a list of upcoming recordings. This is an array reference of hashes parsed from the XML shown at http://www.mythtv.org/wiki/DVR_Service#GetUpcomingList.

AUTHOR

Copyright 2013, Lincoln D. Stein <lincoln.stein@gmail.com>

LICENSE

This package is distributed under the terms of the Perl Artistic License 2.0. See http://www.perlfoundation.org/artistic_license_2_0.