File Coverage

blib/lib/Data/iRealPro/Playlist.pm
Criterion Covered Total %
statement 46 68 67.6
branch 15 28 53.5
condition 5 10 50.0
subroutine 9 11 81.8
pod 0 7 0.0
total 75 124 60.4


line stmt bran cond sub pod time code
1             #! perl
2              
3 23     23   1193 use strict;
  23         47  
  23         623  
4 23     23   121 use warnings;
  23         47  
  23         508  
5 23     23   108 use Carp;
  23         42  
  23         1376  
6              
7             package Data::iRealPro::Playlist;
8              
9 23     23   10041 use Data::iRealPro::Song;
  23         64  
  23         15269  
10              
11             sub new {
12 24     24 0 176 my ( $pkg, %args ) = @_;
13 24         164 my $self = bless { %args }, $pkg;
14 24   100     240 $self->{transpose} //= 0;
15 24 100       147 $self->parse( $args{data} ) if $args{data};
16 24 100       115 $self->{songs} = [ $args{song} ] if $args{song};
17 24 100       117 $self->{songs} = $args{songs} if $args{songs};
18 24 50       110 delete $self->{data} unless $self->{debug};
19 24         105 return $self;
20             }
21              
22             sub parse {
23 13     13 0 55 my ( $self, $data ) = @_;
24              
25 13 50 33     231 if ( $data =~ s;^irealb(ook)?://;; && !$self->{variant} ) {
26 0 0       0 $self->{variant} = $1 ? "irealbook" : "irealpro";
27             }
28              
29             # Split the playlist into songs.
30 13         134 my @a = split( '===', $data, -1 );
31              
32 13 100       146 if ( @a > 1 ) { # song===song===song===ThePlaylist
    50          
33 2         7 $self->{name} = pop(@a);
34             }
35             elsif ( $self->{variant} eq "irealbook" ) {
36 0         0 my @b = split( '=', $data, -1 );
37 0         0 @a = ();
38 0         0 while ( @b >= 6 ) {
39 0         0 push( @a, join( "=", splice( @b, 0, 6 ) ) );
40             }
41 0         0 $self->{name} = pop(@b);
42 0 0       0 if ( @b ) {
43 0         0 Carp::croak( "Incorrect ", $self->{variant}, " format 2 " . scalar(@b) );
44             }
45             }
46              
47             # Process the song(s).
48 13         54 foreach ( @a ) {
49 15         40 eval {
50 15         175 push( @{ $self->{songs} },
51             Data::iRealPro::Song->new( variant => $self->{variant},
52             data => $_,
53             debug => $self->{debug},
54             transpose => $self->{transpose},
55 15         62 ) );
56             };
57 15 50       62 warn("$@: $_\n") if $@;
58             }
59 13         56 return $self;
60             }
61              
62             sub songs {
63 1     1 0 4 my ( $self, $song ) = @_;
64 1         14 $self->{songs};
65             }
66              
67             sub add_song {
68 0     0 0 0 my ( $self, $song ) = @_;
69 0         0 push( @{ $self->{songs} }, $song );
  0         0  
70             }
71              
72             sub add_songs {
73 1     1 0 4 my ( $self, $songs ) = @_;
74 1         3 push( @{ $self->{songs} }, @$songs );
  1         16  
75             }
76              
77             sub export {
78 0     0 0 0 my ( $self, %args ) = @_;
79 0         0 carp(__PACKAGE__."::export is deprecated, please use 'as_string' instead");
80              
81 0   0     0 my $v = $args{variant} || $self->{variant} || "irealpro";
82 0 0       0 my $dashes = $v eq "irealbook" ? "=" : "===";
83              
84             my $r = join( $dashes,
85 0         0 map { $_->export( %args ) } @{ $self->{songs} } );
  0         0  
  0         0  
86              
87 0 0       0 $r .= $dashes . $self->{name} if defined $self->{name};
88              
89 0         0 return $r;
90             }
91              
92             sub as_string {
93 9     9 0 39 my ( $self ) = @_;
94              
95 9         31 my $dashes = "===";
96              
97             my $r = join( $dashes,
98 9         18 map { $_->as_string } @{ $self->{songs} } );
  11         45  
  9         28  
99              
100 9         38 my $name = $self->{name};
101 9 50 66     62 if ( !$name && @{ $self->{songs} } > 1 ) {
  6         28  
102 0         0 carp("Playlist without name in as_string");
103 0         0 $name = "NoName";
104             }
105 9 100       85 $r .= $dashes . $name if $name;
106              
107 9         41 return $r;
108             }
109              
110             1;