use 5.010; use strict; use warnings; package App::MP4Meta::Film; { $App::MP4Meta::Film::VERSION = '1.130100'; } # ABSTRACT: Add metadata to a film use App::MP4Meta::Base; our @ISA = 'App::MP4Meta::Base'; use File::Spec '3.33'; use AtomicParsley::Command::Tags; use App::MP4Meta::Source::Data::Film; sub new { my $class = shift; my $args = shift; my $self = $class->SUPER::new($args); $self->{'media_type'} = 'Movie'; return $self; } sub apply_meta { my ( $self, $path ) = @_; my %tags = ( title => $self->{'title'}, year => $self->{'year'} ); # get the file name my ( $volume, $directories, $file ) = File::Spec->splitpath($path); unless ( $tags{title} ) { # parse the filename for the title, season and episode ( $tags{title}, $tags{year} ) = $self->_parse_filename($file); unless ( $tags{title} ) { return "Error: could not parse the filename for $path"; } } my $film = App::MP4Meta::Source::Data::Film->new( genre => $self->{'genre'}, cover => $self->{'cover'}, year => $self->{'year'}, ); unless ( _film_is_complete($film) ) { for my $source ( @{ $self->{'sources_objects'} } ) { say sprintf( "trying source '%s'", $source->name ) if $self->{verbose}; # merge new epiosde into previous $film->merge( $source->get_film( \%tags ) ); # last if we have everything last if ( _film_is_complete($film) ); } } # check what we have unless ( $film->overview ) { if ( $self->{'continue_without_any'} || $self->{'continue_without_overview'} ) { say 'no overview found; continuing'; } else { return sprintf( 'no overview found for %s', $tags{title} ); } } my $apTags = AtomicParsley::Command::Tags->new( title => $film->title, description => $film->overview, genre => $film->genre, year => $film->year, artwork => $film->cover, stik => $self->{'media_type'}, ); say 'writing tags' if $self->{verbose}; my $error = $self->_write_tags( $path, $apTags ); return $error if $error; return $self->_add_to_itunes( File::Spec->rel2abs($path) ); } # Parse the filename in order to get the film title. Returns the title. sub _parse_filename { my ( $self, $file ) = @_; # strip suffix $file =~ s/\.m4v$//; # is there a year? my $year; if ( $file =~ s/(\d\d\d\d)$// ) { $year = $1; chop $file; } return ( $self->_clean_title($file), $year ); } # true if we have everything we need in a film sub _film_is_complete { my $film = shift; return ( $film->overview && $film->genre && $film->year && $film->cover ); } 1; __END__ =pod =head1 NAME App::MP4Meta::Film - Add metadata to a film =head1 VERSION version 1.130100 =head1 SYNOPSIS my $film = App::MP4Meta::Film->new; $film->apply_meta( '/path/to/The_Truman_Show.m4v' ); =head1 METHODS =head2 apply_meta( $path ) Apply metadata to the file at this path. Returns undef if success; string if error. =head1 AUTHOR Andrew Jones =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2013 by Andrew Jones. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut