From 28ed7a85a8cbf3173f17e8ca9f7c8a7d5a7c98ed Mon Sep 17 00:00:00 2001 From: Přemysl Eric Janouch Date: Sun, 18 Sep 2022 09:15:23 +0200 Subject: Implement lyrics lookup There is now a generic mechanism for loading lyrics, or any other arbitrary content related to songs. --- info/10-azlyrics.pl | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100755 info/10-azlyrics.pl (limited to 'info') diff --git a/info/10-azlyrics.pl b/info/10-azlyrics.pl new file mode 100755 index 0000000..4b88bda --- /dev/null +++ b/info/10-azlyrics.pl @@ -0,0 +1,43 @@ +#!/usr/bin/env perl +# 10-azlyrics.pl: nncmpp info plugin to fetch song lyrics on AZLyrics +# +# Copyright (c) 2022, Přemysl Eric Janouch +# SPDX-License-Identifier: 0BSD +# +# Inspired by a similar ncmpc plugin. + +use warnings; +use strict; +use utf8; +use open ':std', ':utf8'; +unless (@ARGV) { + print "Look up on AZLyrics\n"; + exit; +} + +use Encode; +my ($title, $artist, $album) = map {decode_utf8($_)} @ARGV; + +# TODO: An upgrade would be transliteration with, e.g., Text::Unidecode. +use Unicode::Normalize; +$artist = lc(NFD($artist) =~ s/^the\s+//ir =~ s/[^A-Za-z0-9]//gr); +$title = lc(NFD($title) =~ s/\(.*?\)//gr =~ s/[^A-Za-z0-9]//gr); + +# TODO: Consider caching the results in a location like +# $XDG_CACHE_HOME/nncmpp/info/azlyrics/$artist-$title +my $found = 0; +if ($title ne '') { + open(my $curl, '-|', 'curl', '-sA', 'nncmpp/2.0', + "https://www.azlyrics.com/lyrics/$artist/$title.html") or die $!; + while (<$curl>) { + next unless /^
/ .. /^<\/div>/; s///g; s/\s+$//gs; + + $found = 1; + s/<\/?b>/\x01/g; s/<\/?i>/\x02/g; s/
/\n/; s/<.+?>//g; + s/<//g; s/"/"/g; s/'/'/g; s/&/&/g; + print; + } + close($curl) or die $?; +} + +print "No lyrics have been found.\n" unless $found; -- cgit v1.2.3-70-g09d2