File Coverage

blib/lib/App/MP4Meta/Base.pm
Criterion Covered Total %
statement 23 76 30.2
branch 0 12 0.0
condition 0 6 0.0
subroutine 7 14 50.0
pod 1 1 100.0
total 31 109 28.4


line stmt bran cond sub pod time code
1 1     1   5659 use 5.010;
  1         3  
2 1     1   6 use strict;
  1         2  
  1         23  
3 1     1   5 use warnings;
  1         1  
  1         47  
4              
5             package App::MP4Meta::Base;
6             {
7             $App::MP4Meta::Base::VERSION = '1.153340';
8             }
9              
10             # ABSTRACT: Base class. Contains common functionality.
11              
12 1     1   757 use Module::Load ();
  1         1103  
  1         21  
13 1     1   7 use Try::Tiny;
  1         2  
  1         63  
14 1     1   693 use AtomicParsley::Command;
  1         45841  
  1         778  
15              
16             sub new {
17 12     12 1 9876 my $class = shift;
18 12         22 my $args = shift;
19 12         25 my $self = {};
20              
21             # file suffixes we support
22 12         45 my @suffixes = qw/mp4 m4a m4p m4v m4b/;
23 12         35 $self->{suffixes} = \@suffixes;
24              
25             # the path to AtomicParsley
26 12         93 $self->{'ap'} = AtomicParsley::Command->new( { ap => $args->{'ap'} } );
27              
28             # if true, replace file
29 0           $self->{'noreplace'} = $args->{'noreplace'};
30              
31             # if true, add to itunes
32 0           $self->{'itunes'} = $args->{'itunes'};
33              
34             # if true, print verbosely
35 0           $self->{'verbose'} = $args->{'verbose'};
36              
37             # internet sources
38 0           $self->{'sources'} = $args->{'sources'};
39              
40             # common attributes for a media file
41 0           $self->{'genre'} = $args->{'genre'};
42 0           $self->{'title'} = $args->{'title'};
43 0           $self->{'coverfile'} = $args->{'coverfile'};
44              
45 0           bless( $self, $class );
46              
47             # create sources now so they are in scope for as long as we are
48 0           $self->{'sources_objects'} = [];
49 0           for my $source ( @{ $self->{'sources'} } ) {
  0            
50             try {
51 0     0     push( @{ $self->{'sources_objects'} },
  0            
52             $self->_new_source($source) );
53             }
54             catch {
55 0     0     say STDERR "could not load source: $_";
56 0           };
57             }
58              
59 0           return $self;
60             }
61              
62             # Calls AtomicParsley and writes the tags to the file
63             sub _write_tags {
64 0     0     my ( $self, $path, $tags ) = @_;
65              
66 0           my $tempfile = $self->{ap}->write_tags( $path, $tags, !$self->{noreplace} );
67              
68 0 0         if ( !$self->{ap}->{success} ) {
69 0   0       return $self->{ap}->{'stdout_buf'}[0] // $self->{ap}->{'full_buf'}[0];
70             }
71              
72 0 0         if ( !$tempfile ) {
73 0           return "Error writing to file";
74             }
75              
76 0           return;
77             }
78              
79             sub _strip_suffix {
80 0     0     my ( $self, $file ) = @_;
81              
82 0           my $regex = sprintf( '\.(%s)$', join( '|', @{ $self->{suffixes} } ) );
  0            
83 0           $file =~ s/$regex//;
84              
85 0           return $file;
86             }
87              
88             # Converts 'THE_OFFICE' to 'The Office'
89             sub _clean_title {
90 0     0     my ( $self, $title ) = @_;
91              
92 0           $title =~ s/(-|_)/ /g;
93 0           $title =~ s/(?<=\w)\.(?=\w)/ /g;
94 0           $title = lc($title);
95 0           $title = join ' ', map( { ucfirst() } split /\s/, $title );
  0            
96              
97 0           return $title;
98             }
99              
100             # adds file to itunes
101             sub _add_to_itunes {
102 0     0     my ( $self, $path ) = @_;
103              
104 0 0         return unless $self->{'itunes'};
105              
106 0 0         unless ( $^O eq 'darwin' ) {
107 0           say STDERR 'can only add to iTunes on Mac OSX';
108 0           return 1;
109             }
110              
111 0           $path =~ s!/!:!g;
112              
113 0           my $cmd = sprintf(
114             "osascript -e 'tell application \"iTunes\" to add file \"%s\" to playlist \"Library\" of source \"Library\"'",
115             $path );
116              
117 0           my $result = `$cmd`;
118 0 0         if ($?) {
119 0           say STDERR "error adding to iTunes: $result";
120 0           return 1;
121             }
122 0 0 0       if ( $self->{'verbose'} and $result ) {
123 0           say $result;
124             }
125              
126 0           return;
127             }
128              
129             # load a module as a new source
130             sub _new_source {
131 0     0     my ( $self, $source ) = @_;
132 0           my $module = 'App::MP4Meta::Source::' . $source;
133 0           Module::Load::load($module);
134 0           return $module->new;
135             }
136              
137             1;
138              
139             __END__