File Coverage

blib/lib/WWW/Noss/FeedReader/MediaRSS.pm
Criterion Covered Total %
statement 65 68 95.5
branch 23 32 71.8
condition 8 19 42.1
subroutine 10 10 100.0
pod 0 1 0.0
total 106 130 81.5


line stmt bran cond sub pod time code
1             package WWW::Noss::FeedReader::MediaRSS;
2 5     5   74 use 5.016;
  5         17  
3 5     5   27 use strict;
  5         10  
  5         119  
4 5     5   19 use warnings;
  5         5  
  5         510  
5             our $VERSION = '2.02';
6              
7 5     5   28 use Exporter qw(import);
  5         32  
  5         283  
8             our @EXPORT_OK = qw(parse_media_node);
9              
10 5     5   30 use List::Util qw(uniq);
  5         16  
  5         1009  
11              
12 5     5   3849 use WWW::Noss::TextToHtml qw(text2html strip_tags unescape_html);
  5         17  
  5         4132  
13              
14             sub _parse_media_title {
15              
16 6     6   12 my ($node) = @_;
17              
18 6   100     19 my $type = $node->getAttribute('type') // 'plain';
19              
20 6         81 my ($title, $display);
21 6         22 $title = $node->textContent;
22 6 100       16 if ($type eq 'html') {
23 2         11 $display = unescape_html(strip_tags($title));
24             } else {
25 4         8 $display = $title;
26             }
27              
28 6         45 $display =~ s/\s+/ /g;
29 6         38 $display =~ s/^\s+|\s+$//g;
30              
31 6 50       25 return wantarray ? ($title, $display) : $display;
32              
33             }
34              
35             sub _parse_media_description {
36              
37 6     6   15 my ($node) = @_;
38              
39 6   100     19 my $type = $node->getAttribute('type') // 'plain';
40              
41 6 100       78 if ($type eq 'html') {
42 2         12 return $node->textContent;
43             } else {
44 4         21 return text2html($node->textContent);
45             }
46              
47             }
48              
49             sub _parse_media_content {
50              
51 6     6   13 my ($node) = @_;
52              
53 6         11 my $data = {};
54 6         21 my $url = $node->getAttribute('url');
55 6 50       77 $data->{ link } = $url if defined $url;
56              
57 6         17 for my $n ($node->childNodes) {
58 14 100       85 next if $n->nodeName !~ /^media:/;
59 6         15 my $c = parse_media_node($n);
60 6         17 for my $k (keys %$c) {
61 8   33     44 $data->{ $k } //= $c->{ $k };
62             }
63             }
64              
65 6         43 return $data;
66              
67             }
68              
69             sub parse_media_node {
70              
71 24     24 0 45 my ($node) = @_;
72              
73 24         67 my $data = {};
74              
75 24         128 my $name = $node->nodeName;
76 24 50       103 $name =~ s/^media:// or die "invalid MRSS node";
77              
78 24 100       100 if ($name eq 'content') {
    100          
    100          
    100          
    50          
    0          
79 6         15 my $c = _parse_media_content($node);
80 6         76 for my $k (keys %$c) {
81 14   33     64 $data->{ $k } //= $c->{ $k };
82             }
83             } elsif ($name eq 'group') {
84 2         9 for my $n ($node->childNodes) {
85 18 100       108 next if $n->nodeName !~ /^media:/;
86 8         44 my $c = parse_media_node($n);
87 8         21 for my $k (keys %$c) {
88 10   33     54 $data->{ $k } //= $c->{ $k };
89             }
90             }
91             } elsif ($name eq 'title') {
92 6 50       20 if (not defined $data->{ title }) {
93 6         17 @{ $data }{ qw(title displaytitle) } = _parse_media_title($node);
  6         21  
94             }
95             } elsif ($name eq 'description') {
96 6   33     26 $data->{ summary } //= _parse_media_description($node);
97             } elsif ($name eq 'keywords') {
98 4         9 push @{ $data->{ category } }, split /\s*,\s*/, $node->textContent;
  4         53  
99             } elsif ($name eq 'player') {
100 0         0 my $url = $name->getAttribute('url');
101 0 0       0 if (defined $url) {
102 0   0     0 $data->{ link } //= $url;
103             }
104             }
105              
106 24 100       81 if (defined $data->{ category }) {
107 8         93 $data->{ category } = [ uniq sort @{ $data->{ category } } ];
  8         69  
108             }
109              
110 24         63 return $data;
111              
112             }
113              
114             1;
115              
116             # vim: expandtab shiftwidth=4