#!/usr/bin/perl -w

=pod

=head1 NAME

tv_cat - Concatenate XMLTV listings files.

=head1 SYNOPSIS

tv_cat [--help] [--utf8] [--output FILE] [FILE...]

=head1 DESCRIPTION

Read one or more XMLTV files and write a file to standard output whose
programmes are the concatenation of the programmes in the input files,
and whose channels are the union of the channels in the input files.

B<--output FILE> write to FILE rather than standard output

The treatment of programmes and channels is slightly different because
for programmes, the ordering is important (typically programmes are
processed or displayed in the same order as they appear in the input)
whereas channels are just a set indexed by channel id.  There is a
warning if channel details clash for the same id.

One more wrinkle is the credits (source, generator and so on), they
are taken from one of the files and then thereE<39>s a warning if the
other files differ.  If two input files have different character
encodings, then it is not meaningful to combine their data (without
recoding or other processing) and tv_cat die with an error message.

But if you do want to combine multiple input files with different
character encodings then you can use the --utf8 command-line parameter
which will create a combined output file in UTF-8 format. (Note: it is
not safe to combine mixed encodings to anything other than UTF-8 so no
other output encoding is provided for.) (Note 2: any input file which
does not have an encoding specified in the xml tag is not only naughty
but is assumed to already be UTF-8, which may not be true!)

This tool is rather useless, but it makes a good testbed for the XMLTV
module.

=head1 SEE ALSO

L<xmltv(5)>.

=head1 AUTHOR

Ed Avis, ed@membled.com

=cut

use strict;
use XMLTV;
use XMLTV::Version "$XMLTV::VERSION";
use Getopt::Long;

# Use Log::TraceMessages if installed.
BEGIN {
    eval { require Log::TraceMessages };
    if ($@) {
	*t = sub {};
	*d = sub { '' };
    }
    else {
	*t = \&Log::TraceMessages::t;
	*d = \&Log::TraceMessages::d;
	Log::TraceMessages::check_argv();
    }
}

use XMLTV::Usage <<END
$0: concatenate listings, merging channels, (optional: utf-8 output file)
usage: $0 [--help] [--utf8] [--output FILE] [FILE...]
END
;

my ($opt_help, $opt_output, $opt_utf8);
GetOptions('help' => \$opt_help, 'output=s' => \$opt_output, 'utf8' => \$opt_utf8) or usage(0);
usage(1) if $opt_help;
@ARGV = ('-') if not @ARGV;

my %w_args = ();
if (defined $opt_output) {
    my $fh = new IO::File ">$opt_output";
    die "cannot write to $opt_output\n" if not $fh;
    %w_args = (OUTPUT => $fh);
}

if (defined $opt_utf8) {
    $w_args{'UTF8'} = 1;
}

XMLTV::catfiles(\%w_args, @ARGV);
