/* * 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.ui.thumbnails; import ext.services.lastfm.AlbumInfo; import ext.services.lastfm.ArtistInfo; import ext.services.lastfm.LastFmService; import java.awt.Color; import java.awt.image.BufferedImage; import java.net.URL; import java.net.UnknownHostException; import java.util.List; import javax.imageio.IIOException; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JLabel; import net.miginfocom.swing.MigLayout; import org.apache.commons.lang.StringUtils; import org.jajuk.base.ArtistManager; import org.jajuk.base.Item; import org.jajuk.ui.helpers.FontManager; import org.jajuk.ui.helpers.FontManager.JajukFont; import org.jajuk.util.Const; import org.jajuk.util.DownloadManager; import org.jajuk.util.IconLoader; import org.jajuk.util.JajukIcons; import org.jajuk.util.UtilGUI; import org.jajuk.util.UtilString; import org.jajuk.util.UtilSystem; import org.jajuk.util.log.Log; import org.jdesktop.swingx.border.DropShadowBorder; /** * Last.FM Album thumb represented as artists label + (optionally) others text * information display... */ public class LastFmArtistThumbnail extends AbstractThumbnail { /** Generated serialVersionUID. */ private static final long serialVersionUID = -804471264407148566L; /** Associated artist. */ private final ArtistInfo artist; /** Is this artist known in collection ?. */ private final boolean bKnown; /** Thumb associated image *. */ private ImageIcon ii; /** * The Constructor. * * @param artist */ public LastFmArtistThumbnail(ArtistInfo artist) { super(100); this.artist = artist; bKnown = (ArtistManager.getInstance().getArtistByName(artist.getName()) != null); } /* * (non-Javadoc) * * @see org.jajuk.ui.thumbnails.AbstractThumbnail#getItem() */ @Override public Item getItem() { org.jajuk.base.Artist item = ArtistManager.getInstance().getArtistByName(artist.getName()); if (item != null) { return item; } return null; } /* * (non-Javadoc) * * @see org.jajuk.ui.thumbnails.AbstractThumbnail#getDescription() */ @Override public String getDescription() { Color bgcolor = UtilGUI.getUltraLightColor(); Color fgcolor = UtilGUI.getForegroundColor(); String sOut = "<html bgcolor='#" + UtilGUI.getHTMLColor(bgcolor) + "'><TABLE color='" + UtilGUI.getHTMLColor(fgcolor) + "'><TR><TD VALIGN='TOP'> <b>" + "<a href='file://" + Const.XML_URL + '?' + artist.getUrl() + "'>" + artist.getName() + "</a>" + "</b><br><br>"; // display picture sOut += "<img src='" + artist.getImageUrl() + "'></TD>"; // Show each album for this Artist List<AlbumInfo> albums = LastFmService.getInstance().getAlbumList(artist.getName(), true, 0) .getAlbums(); if (albums != null && albums.size() > 0) { sOut += "<TD>"; for (AlbumInfo album : albums) { sOut += "<b>"; if (!StringUtils.isBlank(album.getYear())) { sOut += album.getYear() + " "; } sOut += "<a href='file://" + Const.XML_URL + '?' + album.getUrl() + "'>" + album.getTitle() + "</a>" + "</b><br>"; } } sOut += "</TD></TR></TABLE></html>"; return sOut; } /* * (non-Javadoc) * * @see org.jajuk.ui.thumbnails.AbstractThumbnail#launch() */ @Override public void launch() { if (bKnown) { // Play the artist jmiPlay.doClick(); } else { // Open the last.FM page jmiOpenLastFMSite.doClick(); } } /** * Long part of the populating process. Longest parts (images download) should * have already been done by the caller outside the EDT. we only pop the image * from the cache here. */ private void preLoad() { try { // Check if artist is null String artistUrl = artist.getImageUrl(); if (StringUtils.isBlank(artistUrl)) { return; } // Download thumb URL remote = new URL(artistUrl); // Download the picture and store file reference (to // generate the popup thumb for ie) fCover = DownloadManager.downloadToCache(remote); if (fCover == null) { Log.warn("Could not read remote file: {{" + remote.toString() + "}}"); return; } BufferedImage image = ImageIO.read(fCover); if (image == null) { Log.warn("Could not read image data in file: {{" + fCover + "}}"); return; } ImageIcon downloadedImage = new ImageIcon(image); // In artist view, do not reduce artist picture if (isArtistView()) { ii = downloadedImage; } else { ii = UtilGUI.getScaledImage(downloadedImage, 100); } // Free images memory downloadedImage.getImage().flush(); image.flush(); } catch (IIOException e) { // report IIOException only as warning here as we can expect this to // happen frequently with images on the net Log.warn("Could not read image: {{" + artist.getImageUrl() + "}} Cache: {{" + fCover + "}}", e.getMessage()); } catch (UnknownHostException e) { Log.warn("Could not contact host for loading images: {{" + e.getMessage() + "}}"); } catch (Exception e) { Log.error(e); } } /** * Thumb populating done in EDT. */ @Override public void populate() { preLoad(); if (ii == null) { return; } jlIcon = new JLabel(); postPopulate(); jlIcon.setIcon(ii); setLayout(new MigLayout("ins 0,gapy 2")); // Use a panel to allow text to be bigger than image under it add(jlIcon, "center,wrap"); int textLength = 15; // In artist view, we have plenty of free space if (isArtistView()) { textLength = 50; } JLabel jlTitle = new JLabel(UtilString.getLimitedString(artist.getName(), textLength)); jlTitle.setToolTipText(artist.getName()); jlIcon.setToolTipText(artist.getName()); if (bKnown && !isArtistView()) { // Artist known in collection, display its name in bold jlTitle.setIcon(IconLoader.getIcon(JajukIcons.ARTIST)); jlTitle.setFont(FontManager.getInstance().getFont(JajukFont.BOLD)); } else { jlTitle.setFont(FontManager.getInstance().getFont(JajukFont.PLAIN)); } if (isArtistView()) { add(jlTitle, "center"); } else { add(jlTitle, "left"); } jlIcon.setBorder(new DropShadowBorder(Color.BLACK, 5, 0.5f, 5, false, true, false, true)); // disable inadequate menu items jmiCDDBWizard.setEnabled(false); jmiGetCovers.setEnabled(false); if (getItem() == null) { jmiDelete.setEnabled(false); jmiPlay.setEnabled(false); jmiPlayRepeat.setEnabled(false); jmiPlayShuffle.setEnabled(false); jmiFrontPush.setEnabled(false); jmiPush.setEnabled(false); jmiProperties.setEnabled(false); } // Set URL to open if (UtilSystem.isBrowserSupported()) { jmiOpenLastFMSite.putClientProperty(Const.DETAIL_CONTENT, artist.getUrl()); } } }