]>
Commit | Line | Data |
---|---|---|
1 | package Lyrics::Fetcher::LyricsTranslate; | |
2 | ||
3 | use 5.014000; | |
4 | use strict; | |
5 | use warnings; | |
6 | ||
7 | use HTML::TreeBuilder; | |
8 | use HTTP::Tiny; | |
9 | ||
10 | our $VERSION = '0.001'; | |
11 | our $BASE_URL = 'http://lyricstranslate.com'; | |
12 | # 0 means any language, 328 means English | |
13 | our $URL_FORMAT = "$BASE_URL/en/translations/0/328/%s/%s/none"; | |
14 | ||
15 | my $ht = HTTP::Tiny->new(agent => "Lyrics-Fetcher-LyricsTranslate/$VERSION "); | |
16 | ||
17 | sub fetch { | |
18 | my ($self, $artist, $song) = @_; | |
19 | $Lyrics::Fetcher::Error = 'OK'; | |
20 | my $url = sprintf $URL_FORMAT, $artist, $song; | |
21 | my $response = $ht->get($url); | |
22 | unless ($response->{success}) { | |
23 | $Lyrics::Fetcher::Error = 'Search request failed: ' . $response->{reason}; | |
24 | return | |
25 | } | |
26 | my $tree = HTML::TreeBuilder->new_from_content($response->{content}); | |
27 | # First result would be the link to the artist, so we get the second one | |
28 | my (undef, $result) = $tree->look_down(class => 'ltsearch-translatenameoriginal'); | |
29 | unless ($result) { | |
30 | $Lyrics::Fetcher::Error = 'Lyrics not found'; | |
31 | } | |
32 | $response = $ht->get($BASE_URL . $result->find('a')->attr('href')); | |
33 | unless ($response->{success}) { | |
34 | $Lyrics::Fetcher::Error = 'Lyrics request failed: ' . $response->{reason}; | |
35 | return | |
36 | } | |
37 | $tree = HTML::TreeBuilder->new_from_content($response->{content}); | |
38 | my $node = $tree->look_down(class => qr/\btranslate-node-text\b/); | |
39 | my $ltf = $node->look_down(class => qr/\bltf\b/); | |
40 | my @pars = $ltf->look_down(class => 'par'); | |
41 | join "\n", map { | |
42 | join '', map { $_->as_trimmed_text . "\n" } $_->content_list | |
43 | } @pars | |
44 | } | |
45 | ||
46 | 1; | |
47 | __END__ | |
48 | ||
49 | =encoding utf-8 | |
50 | ||
51 | =head1 NAME | |
52 | ||
53 | Lyrics::Fetcher::LyricsTranslate - Get lyrics from lyricstranslate.com | |
54 | ||
55 | =head1 SYNOPSIS | |
56 | ||
57 | # This module should be used directly | |
58 | use Lyrics::Fetcher::LyricsTranslate; | |
59 | print Lyrics::Fetcher::LyricsTranslate->fetch('Lyube', 'Kombat'); | |
60 | ||
61 | # Can also be used via Lyrics::Fetcher but produces ugly output | |
62 | use Lyrics::Fetcher; | |
63 | print Lyrics::Fetcher->fetch('Lyube', 'Kombat', 'LyricsTranslate'); | |
64 | ||
65 | =head1 DESCRIPTION | |
66 | ||
67 | This module tries to get translated lyrics from | |
68 | L<http://lyricstranslate.com>. It does a search for a translation of | |
69 | the given artist and song title from any language to English, and | |
70 | returns the contents of the first result found. | |
71 | ||
72 | This is a very basic implementation of the concept and it should be | |
73 | improved in future versions (for example supporting multiple | |
74 | destination languages). | |
75 | ||
76 | It is recommended to use the module directly, as using it via | |
77 | L<Lyrics::Fetcher> loses empty lines between parahraphs. | |
78 | ||
79 | =head1 SEE ALSO | |
80 | ||
81 | L<Lyrics::Fetcher> | |
82 | ||
83 | =head1 AUTHOR | |
84 | ||
85 | Marius Gavrilescu, E<lt>marius@ieval.roE<gt> | |
86 | ||
87 | =head1 COPYRIGHT AND LICENSE | |
88 | ||
89 | Copyright (C) 2016 by Marius Gavrilescu | |
90 | ||
91 | This library is free software; you can redistribute it and/or modify | |
92 | it under the same terms as Perl itself, either Perl version 5.24.0 or, | |
93 | at your option, any later version of Perl 5 you may have available. | |
94 | ||
95 | ||
96 | =cut |