File Coverage

blib/lib/LyricFinder/Letras.pm
Criterion Covered Total %
statement 20 91 21.9
branch 0 30 0.0
condition 0 27 0.0
subroutine 7 10 70.0
pod 2 2 100.0
total 29 160 18.1


line stmt bran cond sub pod time code
1             package LyricFinder::Letras;
2              
3 1     1   5 use strict;
  1         2  
  1         23  
4 1     1   4 use warnings;
  1         1  
  1         17  
5 1     1   4 use Carp;
  1         2  
  1         38  
6 1     1   5 use HTML::Strip;
  1         1  
  1         16  
7 1     1   3 use parent 'LyricFinder::_Class';
  1         2  
  1         4  
8              
9             our $haveLyricsCache;
10             BEGIN {
11 1     1   68 $haveLyricsCache = 0;
12 1     1   53 eval "use LyricFinder::Cache; \$haveLyricsCache = 1; 1";
  1         5  
  1         2  
  1         15  
13             }
14              
15             my $Source = 'Letras';
16             my $Site = 'https://www.letras.mus.br';
17             my $DEBUG = 0;
18              
19             sub new
20             {
21 0     0 1   my $class = shift;
22              
23 0           my $self = $class->SUPER::new($Source, @_);
24 0           @{$self->{'_fetchers'}} = ($Source);
  0            
25 0           unshift(@{$self->{'_fetchers'}}, 'Cache') if ($haveLyricsCache
26 0 0 0       && $self->{'-cache'} && $self->{'-cache'} !~ /^\>/);
      0        
27              
28 0           bless $self, $class; #BLESS IT!
29              
30 0           return $self;
31             }
32              
33             sub fetch {
34 0     0 1   my ($self, $artist_in, $song_in) = @_;
35              
36 0           $self->_debug("Letras::fetch($artist_in, $song_in)!");
37              
38 0 0         return '' unless ($self->_check_inputs($artist_in, $song_in));
39 0 0         return '' if ($self->{'Error'} ne 'Ok');
40              
41 0           my $artist = $artist_in;
42 0           my $song = $song_in;
43             # first, see if we've got it cached:
44 0           $self->_debug("i:haveCache=$haveLyricsCache= -cachedir=".$self->{'-cache'}."=");
45 0 0 0       if ($haveLyricsCache && $self->{'-cache'} && $self->{'-cache'} !~ /^\>/) {
      0        
46 0           my $cache = new LyricFinder::Cache(%{$self});
  0            
47 0 0         if ($cache) {
48 0           my $lyrics = $cache->fetch($artist, $song);
49 0 0 0       if (defined($lyrics) && $lyrics =~ /\w/) {
50 0           $self->_debug("..Got lyrics from cache.");
51 0           $self->{'Source'} = 'Cache';
52 0           $self->{'Site'} = $cache->site();
53 0           $self->{'Url'} = $cache->url();
54              
55 0           return $lyrics;
56             }
57             }
58             }
59              
60 0           $self->{'Site'} = $Site;
61              
62 0           $artist = $self->_remove_accents($artist);
63 0           $song = $self->_remove_accents($song);
64              
65             # Their URLs look like e.g.:
66             # https://www.letras.mus.br// </td> </tr> <tr> <td class="h" > <a name="67">67</a> </td> <td class="c0" > <a href="#68"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> ($self->{'Url'} = $artist) =~ s#\s*\/\s*# and #; #CONVERT "artist1 / artist2" TO "artist1 and artist2"! </td> </tr> <tr> <td class="h" > <a name="68">68</a> </td> <td class="c0" > <a href="#69"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $song =~ s#\s*\/\s*#\-#g; #FIX SONGS WITH "/" IN THEM! </td> </tr> <tr> <td class="h" > <a name="69">69</a> </td> <td class="c0" > <a href="#70"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->{'Url'} .= "/${song}-lyrics"; </td> </tr> <tr> <td class="h" > <a name="70">70</a> </td> <td class="c0" > <a href="#71"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->{'Url'} =~ s/\&/and/g; </td> </tr> <tr> <td class="h" > <a name="71">71</a> </td> <td class="c0" > <a href="#72"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->{'Url'} =~ s/ +/\-/g; </td> </tr> <tr> <td class="h" > <a name="72">72</a> </td> <td class="c0" > <a href="#73"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->{'Url'} = $Site . '/' . $self->{'Url'}; </td> </tr> <tr> <td class="h" > <a name="73">73</a> </td> <td class="c0" > <a href="#74"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->{'Url'} =~ tr/A-Z/a-z/; </td> </tr> <tr> <td class="h" > <a name="74">74</a> </td> <td class="c0" > <a href="#75"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->{'_confirm_title'} = $song_in; </td> </tr> <tr> <td class="h" > <a name="75">75</a> </td> <td class="c0" > <a href="#76"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->{'_confirm_artist'} = $artist_in; </td> </tr> <tr> <td class="h" > <a name="76">76</a> </td> <td class="c0" > <a href="#77"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $lyrics = $self->_web_fetch($artist, $song); </td> </tr> <tr> <td class="h" > <a name="77">77</a> </td> <td class="c0" > <a href="#78"> 0 </a> </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--branch.html#77-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--condition.html#77-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> if ($lyrics && $haveLyricsCache && $self->{'-cache'} && $self->{'-cache'} !~ /^\</) { </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--condition.html#-2"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--condition.html#-3"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="78">78</a> </td> <td class="c0" > <a href="#80"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->_debug("=== WILL CACHE LYRICS! ==="); </td> </tr> <tr> <td class="h" > <a name="79">79</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # cache the fetched lyrics, if we can: </td> </tr> <tr> <td class="h" > <a name="80">80</a> </td> <td class="c0" > <a href="# "> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $cache = new LyricFinder::Cache(%{$self}); </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c0" > <a href="#81"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="81">81</a> </td> <td class="c0" > <a href="#83"> 0 </a> </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--branch.html#81-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $cache->save($artist, $song, $lyrics) if ($cache); </td> </tr> <tr> <td class="h" > <a name="82">82</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="83">83</a> </td> <td class="c0" > <a href="#87"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return $lyrics; </td> </tr> <tr> <td class="h" > <a name="84">84</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="85">85</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="86">86</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub _parse { </td> </tr> <tr> <td class="h" > <a name="87">87</a> </td> <td class="c0" > <a href="#88"> 0 </a> </td> <td >   </td> <td >   </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--subroutine.html#87-1"> 0 </a> </td> <td >   </td> <td >   </td> <td class="s"> my $self = shift; </td> </tr> <tr> <td class="h" > <a name="88">88</a> </td> <td class="c0" > <a href="#90"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $html = shift; </td> </tr> <tr> <td class="h" > <a name="89">89</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="90">90</a> </td> <td class="c0" > <a href="#91"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->_debug("Letras::_parse()!"); </td> </tr> <tr> <td class="h" > <a name="91">91</a> </td> <td class="c0" > <a href="#94"> 0 </a> </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--branch.html#91-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> if (my ($goodbit) = $html =~ </td> </tr> <tr> <td class="h" > <a name="92">92</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> m{\<div\s+class\=\"cnt\-letra\s+p\d+\_premium\"\>(.+?)\<\/div\>}msi) </td> </tr> <tr> <td class="h" > <a name="93">93</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> { </td> </tr> <tr> <td class="h" > <a name="94">94</a> </td> <td class="c0" > <a href="#99"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $hs = HTML::Strip->new(); </td> </tr> <tr> <td class="h" > <a name="95">95</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="96">96</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> #LETRAS SOMETIMES RETURNS "BEST GUESS" (WRONG) SONG LYRICS IF NOT FOUND, AND WE </td> </tr> <tr> <td class="h" > <a name="97">97</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> #DON'T WANT THIS, SO WE MUST CONFIRM THAT THE TITLE AND ARTIST MATCH WHAT WE </td> </tr> <tr> <td class="h" > <a name="98">98</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> #REQUESTED, AND PUNT IF THEY DON'T!: </td> </tr> <tr> <td class="h" > <a name="99">99</a> </td> <td class="c0" > <a href="#100"> 0 </a> </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--branch.html#99-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> if ($html =~ m#\<div\s+class\=\"cnt\-head\_title\"\>(.+?)\<\/div\>#msi) { </td> </tr> <tr> <td class="h" > <a name="100">100</a> </td> <td class="c0" > <a href="#101"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $headers = $1; </td> </tr> <tr> <td class="h" > <a name="101">101</a> </td> <td class="c0" > <a href="#102"> 0 </a> </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--branch.html#101-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $title = ($headers =~ m#\<h1\>(.+?)\<\/h1\>#si) ? $hs->parse($1) : ''; </td> </tr> <tr> <td class="h" > <a name="102">102</a> </td> <td class="c0" > <a href="#103"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $title =~ s/^\s+//; </td> </tr> <tr> <td class="h" > <a name="103">103</a> </td> <td class="c0" > <a href="#104"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $title =~ s/\s+$//; </td> </tr> <tr> <td class="h" > <a name="104">104</a> </td> <td class="c0" > <a href="#105"> 0 </a> </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--branch.html#104-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> if ($title) { </td> </tr> <tr> <td class="h" > <a name="105">105</a> </td> <td class="c0" > <a href="#106"> 0 </a> </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--branch.html#105-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> if ($self->{'_confirm_title'} !~ /^${title}$/i) { </td> </tr> <tr> <td class="h" > <a name="106">106</a> </td> <td class="c0" > <a href="#107"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->{'Error'} = "e:$Source - Results did not match title ($title)."; </td> </tr> <tr> <td class="h" > <a name="107">107</a> </td> <td class="c0" > <a href="#109"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return ''; </td> </tr> <tr> <td class="h" > <a name="108">108</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="109">109</a> </td> <td class="c0" > <a href="#110"> 0 </a> </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--branch.html#109-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $artist = ($headers =~ m#\<h2\>(.+?)\<\/h2\>#si) ? $hs->parse($1) : ''; </td> </tr> <tr> <td class="h" > <a name="110">110</a> </td> <td class="c0" > <a href="#111"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $artist =~ s/^\s+//; </td> </tr> <tr> <td class="h" > <a name="111">111</a> </td> <td class="c0" > <a href="#112"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $artist =~ s/\s+$//; </td> </tr> <tr> <td class="h" > <a name="112">112</a> </td> <td class="c0" > <a href="#113"> 0 </a> </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--branch.html#112-1"> 0 </a> </td> <td class="c0" > <a href="blib-lib-LyricFinder-Letras-pm--condition.html#112-1"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> if ($artist && $self->{'_confirm_artist'} !~ /^${artist}$/i) { </td> </tr> <tr> <td class="h" > <a name="113">113</a> </td> <td class="c0" > <a href="#114"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $self->{'Error'} = "e:$Source - Results did not match artist ($artist)."; </td> </tr> <tr> <td class="h" > <a name="114">114</a> </td> <td class="c0" > <a href="#119"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return ''; </td> </tr> <tr> <td class="h" > <a name="115">115</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="116">116</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="117">117</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="118">118</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="119">119</a> </td> <td class="c0" > <a href="#120"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $goodbit =~ s#\<\/?p\>#\r\n#gsi; </td> </tr> <tr> <td class="h" > <a name="120">120</a> </td> <td class="c0" > <a href="#121"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> $goodbit =~ s#\<br\/?\>#\r\n#gsi; </td> </tr> <tr> <td class="h" > <a name="121">121</a> </td> <td class="c0" > <a href="#123"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $text = $hs->parse($goodbit); </td> </tr> <tr> <td class="h" > <a name="122">122</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="123">123</a> </td> <td class="c0" > <a href="#125"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return $self->_normalize_lyric_text($self->_html2text($text)); </td> </tr> <tr> <td class="h" > <a name="124">124</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } else { </td> </tr> <tr> <td class="h" > <a name="125">125</a> </td> <td class="c0" > <a href="#126"> 0 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> carp($self->{'Error'} = "e:$Source - Failed to identify lyrics on result page."); </td> </tr> <tr> <td class="h" > <a name="126">126</a> </td> <td class="c0" > 0 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return ''; </td> </tr> <tr> <td class="h" > <a name="127">127</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="128">128</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="129">129</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="130">130</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1 </td> </tr> <tr> <td class="h" > <a name="131">131</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="132">132</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> __END__ </td> </tr> </table> </body> </html>