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 21     21   1150 use strict;
  21         47  
  21         566  
4 21     21   104 use warnings;
  21         40  
  21         487  
5 21     21   101 use Carp;
  21         36  
  21         1246  
6              
7             package Data::iRealPro::Playlist;
8              
9 21     21   8514 use Data::iRealPro::Song;
  21         62  
  21         13553  
10              
11             sub new {
12 22     22 0 132 my ( $pkg, %args ) = @_;
13 22         126 my $self = bless { %args }, $pkg;
14 22   100     230 $self->{transpose} //= 0;
15 22 100       125 $self->parse( $args{data} ) if $args{data};
16 22 100       111 $self->{songs} = [ $args{song} ] if $args{song};
17 22 100       112 $self->{songs} = $args{songs} if $args{songs};
18 22 50       94 delete $self->{data} unless $self->{debug};
19 22         86 return $self;
20             }
21              
22             sub parse {
23 12     12 0 39 my ( $self, $data ) = @_;
24              
25 12 50 33     230 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 12         115 my @a = split( '===', $data, -1 );
31              
32 12 100       95 if ( @a > 1 ) { # song===song===song===ThePlaylist
    50          
33 2         6 $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 12         44 foreach ( @a ) {
49 14         29 eval {
50 14         145 push( @{ $self->{songs} },
51             Data::iRealPro::Song->new( variant => $self->{variant},
52             data => $_,
53             debug => $self->{debug},
54             transpose => $self->{transpose},
55 14         24 ) );
56             };
57 14 50       60 warn("$@: $_\n") if $@;
58             }
59 12         37 return $self;
60             }
61              
62             sub songs {
63 1     1 0 3 my ( $self, $song ) = @_;
64 1         3 $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 3 my ( $self, $songs ) = @_;
74 1         10 push( @{ $self->{songs} }, @$songs );
  1         17  
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         27 my $dashes = "===";
96              
97             my $r = join( $dashes,
98 9         19 map { $_->as_string } @{ $self->{songs} } );
  11         72  
  9         29  
99              
100 9         34 my $name = $self->{name};
101 9 50 66     41 if ( !$name && @{ $self->{songs} } > 1 ) {
  6         25  
102 0         0 carp("Playlist without name in as_string");
103 0         0 $name = "NoName";
104             }
105 9 100       38 $r .= $dashes . $name if $name;
106              
107 9         36 return $r;
108             }
109              
110             1;