package music.threads;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.imageio.ImageIO;
import util.Constants;
import music.gui.ImageDialog;
import music.gui.MyFrame;
import music.info.MusicInfo;
import music.search.MusicSearcher;
public class ImageThread implements Runnable
{
public final static String prefix = "http://image.youdao.com/search?q=";
public final static String sufix = "&keyfrom=image.top&size=s";
private final static Pattern PATTERN = Pattern.compile(
"image0\"\\ssrc=\"(.*?)\".*?" // image 0
+ "image1\"\\ssrc=\"(.*?)\".*?" // image 1
+ "image2\"\\ssrc=\"(.*?)\"" // image 2
, Pattern.DOTALL);
private MusicInfo music;
private MyFrame frame;
public ImageThread(MyFrame frm, MusicInfo msc)
{
music = msc;
frame = frm;
}
public void run()
{
Image[] images = new Image[Constants.IMAGE_NUM];
if(music.getArtist()!=null && searchAndDownload(music.getAlbum()+" "+music.getArtist(), images))
{
new ImageDialog(frame, true, images, music);
}
else
{
// image download fail, then use ni.jpg instead
music.setImageName(Constants.DEFAULT_IMAGE);
frame.showMessage(music.getTitle()+" image download fail!");
}
}
public static boolean searchAndDownload(String keyword, Image[] images)
{
String link = prefix+URLEncoder.encode(keyword)+sufix;
String[] urls = new String[Constants.IMAGE_NUM];
//System.out.println(link);
try
{
String content = MusicSearcher.fetchHtmlPage(link, "utf-8");
Matcher matcher = PATTERN.matcher(content);
while(matcher.find())
{
for(int j=0; j<Constants.IMAGE_NUM; j++)
urls[j] = matcher.group(j+1);
}
if(urls[0] == null) return false;
for(int i=0; i<Constants.IMAGE_NUM; i++)
{
if(urls[i] != null)
{
URL url = new URL(urls[i]);
images[i] = ImageIO.read(url);
}
}
return true;
//System.out.println("no");
}
catch (Exception e)
{
e.printStackTrace();
return false;
}
}
public static boolean storeImage(Image image, String pathname)
{ // store image use jpg format
try
{
int width = image.getWidth(null);
int height= image.getHeight(null);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
bi.getGraphics().drawImage(image, 0, 0, width, height, null);
ImageIO.write(bi, "JPEG", new File(pathname));
return true;
}
catch (IOException e)
{
e.printStackTrace();
return false;
}
}
}