App-MP4Meta
view release on metacpan or search on metacpan
lib/App/MP4Meta/TV.pm view on Meta::CPAN
use 5.010;
use strict;
use warnings;
package App::MP4Meta::TV;
{
$App::MP4Meta::TV::VERSION = '1.153340';
}
# ABSTRACT: Add metadata to a TV Series
use App::MP4Meta::Base;
our @ISA = 'App::MP4Meta::Base';
use File::Spec '3.33';
use AtomicParsley::Command::Tags;
use App::MP4Meta::Source::Data::TVEpisode;
# a list of regexes to try to parse the file
my @file_regexes = (
qr/^S(?<season>\d)-E(?<episode>\d)\s+-\s+(?<show>.*)$/,
qr/^S(?<season>\d)-E(?<episode>\d)\s*-\s*E(?<end_episode>\d)\s+-\s+(?<show>.*)$/,
qr/^(?<show>.*)\s+S(?<season>\d\d)(\s|)E(?<episode>\d\d)$/,
qr/^(?<show>.*)\s+S(?<season>\d\d)(\s|)E(?<episode>\d\d)\s*-\s*E(?<end_episode>\d\d)$/,
qr/^(?<show>.*)\.S(?<season>\d\d)E(?<episode>\d\d)/i,
qr/^(?<show>.*)\.S(?<season>\d\d)E(?<episode>\d\d)\s*-\s*E(?<end_episode>\d\d)/i,
qr/^(?<show>.*)\s*-?\s*S(?<season>\d\d?)E(?<episode>\d\d?)/i,
qr/^(?<show>.*)\s*-?\s*S(?<season>\d\d?)E(?<episode>\d\d?)\s*-\s*E(?<end_episode>\d\d)/i,
qr/^(?<show>.*)-S(?<season>\d\d?)E(?<episode>\d\d?)/,
qr/^(?<show>.*)-S(?<season>\d\d?)E(?<episode>\d\d?)\s*-\s*E(?<end_episode>\d\d)/,
qr/^(?<show>.*)-S(?<season>\d\d?)E(?<episode>\d\d?)/i,
qr/^(?<show>.*)-S(?<season>\d\d?)E(?<episode>\d\d?)\s*-\s*E(?<end_episode>\d\d)/i,
qr/S(?<season>\d\d?)E(?<episode>\d\d?)/i,
qr/S(?<season>\d\d?)E(?<episode>\d\d?)\s*-\s*E(?<end_episode>\d\d?)/i,
qr/^(?<show>.*)\s*-?\s*(?<season>\d\d?)x(?<episode>\d\d?)/,
);
sub new {
my $class = shift;
my $args = shift;
my $self = $class->SUPER::new($args);
# args for skipping
$self->{'continue_without_any'} = $args->{'continue_without_any'};
$self->{'continue_without_overview'} = $args->{'continue_without_overview'};
$self->{'continue_without_genre'} = $args->{'continue_without_genre'};
$self->{'continue_without_year'} = $args->{'continue_without_year'};
$self->{'continue_without_cover'} = $args->{'continue_without_cover'};
# attributes
$self->{'season'} = $args->{'season'};
$self->{'episode'} = $args->{'episode'};
$self->{'overview'} = $args->{'overview'};
$self->{'year'} = $args->{'year'};
$self->{'cover'} = $args->{'cover'};
# we are a TV Show
$self->{'media_type'} = 'TV Show';
return $self;
}
sub apply_meta {
my ( $self, $path ) = @_;
my %tags = (
show_title => $self->{'title'},
season => $self->{'season'},
episode => $self->{'episode'},
);
# get the file name
my ( $volume, $directories, $file ) = File::Spec->splitpath($path);
unless ( $tags{show_title} && $tags{season} && $tags{episode} ) {
# parse the filename for the title, season and episode
( $tags{show_title}, $tags{season}, $tags{episode} ) =
$self->_parse_filename($file, $directories);
unless ( $tags{show_title} && $tags{season} && $tags{episode} ) {
return "Error: could not parse the filename for $path";
}
}
my $episode = App::MP4Meta::Source::Data::TVEpisode->new(
genre => $self->{'genre'},
cover => $self->{'cover'},
overview => $self->{'overview'},
year => $self->{'year'},
);
unless ( _episode_is_complete($episode) ) {
for my $source ( @{ $self->{'sources_objects'} } ) {
say sprintf( "trying source '%s'", $source->name )
if $self->{verbose};
# merge new epiosde into previous
$episode->merge( $source->get_tv_episode( \%tags ) );
# last if we have everything
last
if ( _episode_is_complete($episode) );
}
( run in 0.626 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )