package com.quiltplayer.controller;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.quiltplayer.core.player.PlayerFactory;
import com.quiltplayer.core.repo.ArtistRepository;
import com.quiltplayer.core.storage.ArtistStorage;
import com.quiltplayer.core.storage.Storage;
import com.quiltplayer.internal.id3.Id3Extractor;
import com.quiltplayer.internal.id3.Id3Modifier;
import com.quiltplayer.internal.id3.model.Id3DataModel;
import com.quiltplayer.model.Album;
import com.quiltplayer.model.Artist;
import com.quiltplayer.model.ArtistName;
import com.quiltplayer.model.Song;
import com.quiltplayer.model.StringId;
import com.quiltplayer.view.swing.listeners.EditAlbumListener;
import com.quiltplayer.view.swing.panels.UtilityPanel;
import com.quiltplayer.view.swing.panels.utility.EditUtilityPanel;
/**
* Controller for editing ID3s.
*
* @author Vlado Palczynski
*/
@Controller
public class EditAlbumController implements EditAlbumListener {
private Logger log = Logger.getLogger(EditAlbumController.class);
public static final String EVENT_DELETE_ALBUM = "delete.album";
@Autowired
private Id3Extractor id3Extractor;
@Autowired
private Id3Modifier id3Modifier;
@Autowired
private Storage storage;
@Autowired
private ArtistStorage artistStorage;
@Autowired
private ArtistRepository artistRepository;
@Autowired
private PlayerFactory playerFactory;
@Autowired
private UtilityPanel playlistPanel;
/*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public final void actionPerformed(final ActionEvent e) {
String cmd = e.getActionCommand();
if (UtilityPanel.EVENT_UPDATE_ALBUM_ID3 == e.getActionCommand()) {
playlistPanel.toggleEditView();
}
else if (EditUtilityPanel.SAVE == cmd) {
List<Object> l = (List<Object>) e.getSource();
Album album = (Album) l.get(0);
Id3DataModel model = (Id3DataModel) l.get(1);
if (!model.getArtistName().equals(album.getArtist().getArtistName().getNameForSearches())
|| !model.getAlbumTitle().equals(album.getTitle())) {
log.debug("Updating ID3 information.");
modifyID3Tags(album, model);
}
// Check changed artist name
if (!model.getArtistName().equals(album.getArtist().getArtistName().getNameForSearches())) {
changedArtistName(album, model);
}
if (!model.getAlbumTitle().equals(album.getTitle())) {
changeAlbumName(album, model);
}
}
else if (EVENT_DELETE_ALBUM == cmd) {
log.debug("Deleting album");
playerFactory.stop();
playerFactory.removeCurrentSong();
Album album = (Album) e.getSource();
Artist artist = album.getArtist();
artist.removeAlbum(album);
storage.delete(album);
}
}
private void changeAlbumName(Album album, Id3DataModel model) {
Artist artist = album.getArtist();
artist.removeAlbum(album);
Album newAlbum = storage.getAlbum(new StringId(model.getAlbumTitle()));
if (newAlbum == null) {
log.debug("Album does not exist, rename current...");
album.setId(new StringId(model.getAlbumTitle()));
album.setTitle(model.getAlbumTitle());
artist.addAlbum(album);
}
else {
log.debug("Album did exist, moving songs...");
for (Song song : album.getSongCollection().getSongs())
newAlbum.addSong(song);
storage.delete(album);
}
}
private void changedArtistName(Album album, Id3DataModel model) {
Artist oldArtist = album.getArtist();
oldArtist.removeAlbum(album);
if (!oldArtist.hasAlbums())
artistStorage.delete(oldArtist);
Artist newArtist = artistStorage.getArtist(new StringId(model.getArtistName()));
if (newArtist == null) {
newArtist = artistStorage.createArtist(new StringId(model.getArtistName()));
newArtist.setArtistName(new ArtistName(model.getArtistName()));
}
newArtist.addAlbum(album);
artistRepository.rebuildArtistCache(artistStorage.getArtists());
}
/**
* Make the updates to the songs.
*
* @param album
* @param model
*/
private void modifyID3Tags(Album album, Id3DataModel model) {
List<File> songFiles = new ArrayList<File>();
if (album.getType() == Album.TYPE_FILE) {
for (Song song : album.getSongCollection().getSongs()) {
songFiles.add(new File(song.getPath()));
}
Collection<Id3DataModel> list = id3Extractor.extractId3Tags(songFiles);
for (Id3DataModel tmp : list) {
tmp.setArtistName(model.getArtistName());
tmp.setAlbumTitle(model.getAlbumTitle());
}
try {
id3Modifier.modifyId3Tags(list);
}
catch (IOException e1) {
e1.printStackTrace();
}
}
else if (album.getType() == Album.TYPE_SPOTIFY) {
for (Song song : album.getSongCollection().getSongs()) {
song.getAlbum().setTitle(model.getAlbumTitle());
}
}
}
}