package com.sdsmdg.harjot.MusicDNA.utilities; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Process; import com.sdsmdg.harjot.MusicDNA.lyrics.AZLyrics; import com.sdsmdg.harjot.MusicDNA.lyrics.Bollywood; import com.sdsmdg.harjot.MusicDNA.lyrics.Genius; import com.sdsmdg.harjot.MusicDNA.lyrics.JLyric; import com.sdsmdg.harjot.MusicDNA.lyrics.Lololyrics; import com.sdsmdg.harjot.MusicDNA.lyrics.LyricWiki; import com.sdsmdg.harjot.MusicDNA.lyrics.Lyrics; import com.sdsmdg.harjot.MusicDNA.lyrics.LyricsMania; import com.sdsmdg.harjot.MusicDNA.lyrics.MetalArchives; import com.sdsmdg.harjot.MusicDNA.lyrics.PLyrics; import com.sdsmdg.harjot.MusicDNA.lyrics.UrbanLyrics; import com.sdsmdg.harjot.MusicDNA.lyrics.ViewLyrics; import java.util.ArrayList; import java.util.Arrays; public class DownloadThread extends Thread { private static final String[] mainProviders = { "LyricWiki", "Genius", "LyricsMania", "AZLyrics", "Bollywood" }; private static ArrayList<String> providers = new ArrayList<>(Arrays.asList(mainProviders)); public DownloadThread(final Lyrics.Callback callback, boolean positionAvailable, final String... params) { super(DownloadThread.getRunnable(callback, positionAvailable, params)); } public static void setProviders(Iterable<String> providers) { DownloadThread.providers = new ArrayList<>(Arrays.asList(mainProviders)); for (String provider : providers) { if (provider.equals("ViewLyrics")) DownloadThread.providers.add(0, provider); else DownloadThread.providers.add(provider); } } public static Runnable getRunnable(final Lyrics.Callback callback, final boolean positionAvailable, final String... params) { return new Runnable() { @SuppressWarnings("unchecked") public Lyrics download(String url, String artist, String title) { Lyrics lyrics = null; for (String provider : providers) { switch (provider) { case "AZLyrics": lyrics = AZLyrics.fromURL(url, artist, title); break; case "Bollywood": lyrics = Bollywood.fromURL(url, artist, title); break; case "Genius": lyrics = Genius.fromURL(url, artist, title); break; case "JLyric": lyrics = JLyric.fromURL(url, artist, title); break; case "Lololyrics": lyrics = Lololyrics.fromURL(url, artist, title); break; case "LyricsMania": lyrics = LyricsMania.fromURL(url, artist, title); break; case "LyricWiki": lyrics = LyricWiki.fromURL(url, artist, title); break; case "MetalArchives": lyrics = MetalArchives.fromURL(url, artist, title); break; case "PLyrics": lyrics = PLyrics.fromURL(url, artist, title); break; case "UrbanLyrics": lyrics = UrbanLyrics.fromURL(url, artist, title); break; case "ViewLyrics": lyrics = ViewLyrics.fromURL(url, artist, title); break; } if (lyrics.isLRC() && !positionAvailable) continue; if (lyrics != null && lyrics.getFlag() == Lyrics.POSITIVE_RESULT) return lyrics; } return new Lyrics(Lyrics.NO_RESULT); } @SuppressWarnings("unchecked") public Lyrics download(String artist, String title) { Lyrics lyrics = new Lyrics(Lyrics.NO_RESULT); for (String provider : providers) { switch (provider) { case "AZLyrics": lyrics = AZLyrics.fromMetaData(artist, title); break; case "Bollywood": lyrics = Bollywood.fromMetaData(artist, title); break; case "Genius": lyrics = Genius.fromMetaData(artist, title); break; case "JLyric": lyrics = JLyric.fromMetaData(artist, title); break; case "Lololyrics": lyrics = Lololyrics.fromMetaData(artist, title); break; case "LyricsMania": lyrics = LyricsMania.fromMetaData(artist, title); break; case "LyricWiki": lyrics = LyricWiki.fromMetaData(artist, title); break; case "MetalArchives": lyrics = MetalArchives.fromMetaData(artist, title); break; case "PLyrics": lyrics = PLyrics.fromMetaData(artist, title); break; case "UrbanLyrics": lyrics = UrbanLyrics.fromMetaData(artist, title); break; case "ViewLyrics": try { lyrics = ViewLyrics.fromMetaData(artist, title); } catch (Exception e) { e.printStackTrace(); } break; } if (lyrics.isLRC() && !positionAvailable) continue; if (lyrics != null && lyrics.getFlag() == Lyrics.POSITIVE_RESULT) return lyrics; } return lyrics; } public void run() { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); Lyrics lyrics; String artist = null; String title = null; String url = null; switch (params.length) { case 3: // URL + tags artist = params[1]; title = params[2]; case 1: // URL url = params[0]; lyrics = download(url, artist, title); break; default: // just tags artist = params[0]; title = params[1]; lyrics = download(params[0], params[1]); } if (lyrics.getFlag() != Lyrics.POSITIVE_RESULT) { String[] correction = correctTags(artist, title); if (!(correction[0].equals(artist) && correction[1].equals(title)) || url != null) { lyrics = download(correction[0], correction[1]); lyrics.setOriginalArtist(artist); lyrics.setOriginalTitle(title); } } if (lyrics.getArtist() == null) { if (artist != null) { lyrics.setArtist(artist); lyrics.setTitle(title); } else { lyrics.setArtist(""); lyrics.setTitle(""); } } threadMsg(lyrics); } private void threadMsg(Lyrics lyrics) { if (lyrics != null) { Message msgObj = handler.obtainMessage(); Bundle b = new Bundle(); b.putSerializable("lyrics", lyrics); msgObj.setData(b); handler.sendMessage(msgObj); } } // Define the Handler that receives messages from the thread and update the progress private final Handler handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { Lyrics result = (Lyrics) msg.getData().getSerializable("lyrics"); if (result != null) callback.onLyricsDownloaded(result); } }; }; } public static String[] correctTags(String artist, String title) { if (artist == null || title == null) return new String[]{"", ""}; String correctedArtist = artist.replaceAll("\\(.*\\)", "") .replaceAll(" \\- .*", "").trim(); String correctedTrack = title.replaceAll("\\(.*\\)", "") .replaceAll("\\[.*\\]", "").replaceAll(" \\- .*", "").trim(); String[] separatedArtists = correctedArtist.split(", "); correctedArtist = separatedArtists[separatedArtists.length - 1]; return new String[]{correctedArtist, correctedTrack}; } }