org.jajuk.services.lyrics.providers.LyricsManiaWebLyricsProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.jajuk.services.lyrics.providers.LyricsManiaWebLyricsProvider.java

Source

/*
 *  Jajuk
 *  Copyright (C) The Jajuk Team
 *  http://jajuk.info
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *  
 */
package org.jajuk.services.lyrics.providers;

import ext.services.network.NetworkUtils;

import java.net.MalformedURLException;
import java.text.Normalizer;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.jajuk.util.Const;
import org.jajuk.util.log.Log;

/**
 * Lyrics Provider extracting lyrics from lyricsmania.com
 */
public class LyricsManiaWebLyricsProvider extends GenericWebLyricsProvider {
    /** URL pattern used by jajuk to retrieve lyrics. */
    private static final String URL = "http://www.lyricsmania.com/%title_lyrics_%artist.html";
    /** URL pattern to web page (see ILyricsProvider interface for details). */
    private static final String WEB_URL = "http://www.lyricsmania.com/%title_lyrics_%artist.html";

    /**
     * Instantiates a new lyricsmania web lyrics provider.
     */
    public LyricsManiaWebLyricsProvider() {
        super(URL);
    }

    /**
     * {@inheritDoc}
     * 
     * @see ext.services.lyrics.providers.GenericProvider#getLyrics(java.lang.String,
     * java.lang.String)
     */
    @Override
    public String getLyrics(final String artist, final String title) {
        try {
            String lyrics = null;
            if (StringUtils.isNotBlank(artist) && StringUtils.isNotBlank(title)) {
                // Specific rule for artist : lowercase, no space, no accent 
                String formattedArtist = removeAccent(artist).replace(" ", "_").toLowerCase();
                // Specific rule for title : lowercas, no space with accent
                String formattedTitle = title.replace(" ", "_").replace("(", "").replace(")", "");
                formattedTitle = formattedTitle.replace("'", "").toLowerCase();
                String html = callProvider(formattedArtist, formattedTitle);
                String result = cleanLyrics(html);
                if (StringUtils.isNotBlank(result)) {
                    lyrics = result;
                } else {
                    // Another trial without accent on title
                    formattedTitle = removeAccent(title).replaceAll(" ", "_").replace("(", "");
                    formattedTitle = formattedTitle.replace(")", "").replace("'", "").toLowerCase();
                    html = callProvider(formattedArtist, formattedTitle);
                    if (StringUtils.isNotBlank(html)) {
                        lyrics = cleanLyrics(html);
                    } else {
                        Log.debug("Empty return from callProvider().");
                    }
                }
            }
            return lyrics;
        } catch (Exception e) {
            Log.debug("Cannot fetch lyrics for: {{" + artist + "/" + title + "}}");
            return null;
        }
    }

    /**
     * Extracts lyrics from the HTML page. The correct subsection is to be
     * extracted first, before being cleaned and stripped from useless HTML tags.
     * 
     * @param html 
     * 
     * @return the lyrics
     */
    private String cleanLyrics(final String html) {
        String ret = null;
        if (html != null) {
            String searchString = "<div class=\"lyrics-body\"";
            int startIndex = html.indexOf(searchString);
            if (startIndex > -1) {
                ret = html.substring(startIndex + searchString.length());
                int secondIndex = ret.indexOf("</strong>");
                if (secondIndex > -1) {
                    ret = ret.substring(secondIndex + 10);
                    int stopIndex = ret.indexOf("</div>");
                    ret = ret.substring(0, stopIndex);
                    ret = ret.replace('\r', '\n');
                    ret = ret.replace("<div class=\"p402_premium\">", "");
                    ret += "\n<-- LyricsMania -->";
                    ret = cleanHtml(ret);
                } else {
                    ret = null;
                }
            }
        }
        return ret;
    }

    /**
     * {@inheritDoc}
     * 
     * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getResponseEncoding()
     */
    @Override
    public String getResponseEncoding() {
        return "UTF-8";
    }

    /**
     * {@inheritDoc}
     * 
     * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getWebURL(java.lang .String,
     * java.lang.String)
     */
    @Override
    public java.net.URL getWebURL(final String pArtist, final String pTitle) {
        String queryString = WEB_URL;
        // Replace spaces by _
        String artist = removeAccent(pArtist).replaceAll(" ", "").toLowerCase();
        String title = removeAccent(pTitle).replaceAll(" ", "").replace("(", "").replace(")", "").toLowerCase();
        queryString = queryString.replace(Const.PATTERN_ARTIST,
                (artist != null) ? NetworkUtils.encodeString(artist) : "");
        queryString = queryString.replace(Const.PATTERN_TRACKNAME,
                (title != null) ? NetworkUtils.encodeString(title) : "");
        java.net.URL out = null;
        try {
            out = new java.net.URL(queryString);
        } catch (MalformedURLException e) {
            Log.error(e);
        }
        return out;
    }

    /**
     * {@inheritDoc}
     * 
     * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getLyrics()
     */
    @Override
    public String getLyrics() {
        return getLyrics(audioFile.getTrack().getArtist().getName2(), audioFile.getTrack().getName());
    }

    /**
     * Replace each accent in the string with the non accent character.
     * @param s the string to process
     * @return the string without accents
     */
    public String removeAccent(String s) {
        String strTemp = Normalizer.normalize(s, Normalizer.Form.NFD);
        Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
        return pattern.matcher(strTemp).replaceAll("");
    }
}