package com.quiltplayer.model.jotify;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import org.apache.commons.lang.NotImplementedException;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.quiltplayer.core.repo.spotify.JotifyRepository;
import com.quiltplayer.external.covers.model.ImageSizes;
import com.quiltplayer.external.covers.model.LocalImage;
import com.quiltplayer.external.covers.model.filesystem.LocalImageFileSystem;
import com.quiltplayer.external.covers.util.ImageUtils;
import com.quiltplayer.model.Album;
import com.quiltplayer.model.Artist;
import com.quiltplayer.model.Song;
import com.quiltplayer.model.SongCollection;
import com.quiltplayer.model.StringId;
import com.quiltplayer.model.impl.LocalImageImpl;
import com.quiltplayer.properties.Configuration;
import de.felixbruns.jotify.media.Disc;
import de.felixbruns.jotify.media.Track;
public class JotifyAlbum implements Album {
private Logger log = Logger.getLogger(JotifyAlbum.class);
private static final long serialVersionUID = 1L;
private de.felixbruns.jotify.media.Album spotifyAlbum;
private SongCollection songCollection;
public JotifyAlbum(de.felixbruns.jotify.media.Album album) {
this.spotifyAlbum = album;
}
@Override
public void addLocalImage(LocalImage image) {
}
@Override
public void addSong(Song song) {
}
@Override
public void changeFrontImage(Album album, LocalImage toFrontImage) {
}
@Override
public Artist getArtist() {
if (spotifyAlbum != null && spotifyAlbum.getArtist() != null)
return new JotifyArtist(spotifyAlbum.getArtist());
return null;
}
@Override
public LocalImage getFrontImage() {
return null;
}
@Override
public StringId getId() {
return new StringId(spotifyAlbum.getId());
}
@Override
public List<LocalImage> getImages() {
List<LocalImage> images = new ArrayList<LocalImage>();
if (spotifyAlbum.getCover() == null)
spotifyAlbum = JotifyRepository.browseAlbum(spotifyAlbum.getId());
File localImagePath = new File(Configuration.getInstance().getFolderProperties().getCovers(), spotifyAlbum
.getCover()
+ ".jpg");
Image image = null;
if (!localImagePath.exists()) {
log.debug("Didn't find cached image, stream&create...");
if (spotifyAlbum.getCover() == null) {
de.felixbruns.jotify.media.Album freshAlbum;
freshAlbum = JotifyRepository.browseAlbum(spotifyAlbum);
image = JotifyRepository.getImage(freshAlbum.getCover());
}
else {
image = JotifyRepository.getImage(spotifyAlbum.getCover());
}
try {
ImageIO.write((RenderedImage) image, "jpg", localImagePath);
}
catch (Exception e) {
e.printStackTrace();
}
LocalImage localImage = new LocalImageFileSystem();
localImage.setLargeImage(localImagePath);
localImage.setSmallImage(createImage(localImagePath, ImageSizes.SMALL));
localImage.setMediumImage(createImage(localImagePath, ImageSizes.MEDIUM));
}
try {
image = ImageIO.read(localImagePath);
}
catch (IOException e) {
e.printStackTrace();
}
LocalImage li = new LocalImageImpl(localImagePath);
images.add(li);
return images;
}
private File createImage(File file, ImageSizes size) {
// TODO this already exist in ImageFetcher.
try {
BufferedImage i = ImageIO.read(file);
BufferedImage image = ImageUtils.scalePicture(i, size.getSize());
File newFile = new File(file.getParent(), size.name() + "-" + file.getName());
boolean b = newFile.createNewFile();
log.debug("Creating new file returned: " + b);
ImageIO.write(image, "jpg", newFile);
return newFile;
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public String getLabel() {
return null;
}
@Override
public long getLastModified() {
return 0;
}
@Override
public String getReleaseId() {
return null;
}
@Override
public SongCollection getSongCollection() {
songCollection = new JotifySongCollection();
List<Song> songs = new ArrayList<Song>();
for (Disc disc : spotifyAlbum.getDiscs()) {
for (Track track : disc.getTracks()) {
songs.add(new JotifySong(track));
}
}
songCollection.setSongs(songs);
return songCollection;
}
@Override
public String getTitle() {
return spotifyAlbum.getName();
}
@Override
public String getTitleToPublish() {
return spotifyAlbum.getName();
}
@Override
public String getYear() {
return spotifyAlbum.getYear() + "";
}
@Override
public void setArtist(Artist artist) {
}
@Override
public void setId(StringId albumId) {
}
@Override
public void setImages(List<LocalImage> images) {
}
@Override
public void setLabel(String label) {
throw new NotImplementedException();
}
@Override
public void setLastModified(long timestamp) {
throw new NotImplementedException();
}
@Override
public void setReleaseId(String releaseId) {
throw new NotImplementedException();
}
@Override
public void setSongCollection(SongCollection songCollection) {
throw new NotImplementedException();
}
@Override
public void setTitle(String title) {
throw new NotImplementedException();
}
@Override
public void setTitleToPublish(String titleToPublish) {
throw new NotImplementedException();
}
@Override
public void setYear(String year) {
throw new NotImplementedException();
}
/**
* @return the spotifyAlbum
*/
public final de.felixbruns.jotify.media.Album getSpotifyAlbum() {
return spotifyAlbum;
}
/**
* @param spotifyAlbum
* the spotifyAlbum to set
*/
public final void setSpotifyAlbum(de.felixbruns.jotify.media.Album spotifyAlbum) {
this.spotifyAlbum = spotifyAlbum;
}
public boolean isPlayable() {
if (spotifyAlbum.getTracks().get(0).getFiles().isEmpty()
|| StringUtils.isEmpty(spotifyAlbum.getTracks().get(0).getFiles().get(0).getId()))
return false;
return true;
}
/*
* (non-Javadoc)
*
* @see com.quiltplayer.model.Album#getType()
*/
@Override
public String getType() {
return Album.TYPE_SPOTIFY;
}
/*
* (non-Javadoc)
*
* @see com.quiltplayer.model.Album#setType(java.lang.String)
*/
@Override
public void setType(String type) {
throw new NotImplementedException("");
}
/*
* (non-Javadoc)
*
* @see com.quiltplayer.model.Album#getSpotifyId()
*/
@Override
public String getSpotifyId() {
return spotifyAlbum.getId();
}
/*
* (non-Javadoc)
*
* @see com.quiltplayer.model.Album#setSpotifyId(java.lang.String)
*/
@Override
public void setSpotifyId(String spotifyId) {
throw new NotImplementedException("");
}
/*
* (non-Javadoc)
*
* @see com.quiltplayer.model.Album#deleteImages()
*/
@Override
public void deleteImages() {
}
/*
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(final Album o) {
return getTitle().compareTo(o.getTitle());
}
@Override
public boolean equals(final Object o) {
return super.equals(o);
}
@Override
public int hashCode() {
return super.hashCode();
}
}