package com.quiltplayer.core.scanner.tasks; import java.io.File; import java.util.Collection; import javax.swing.SwingWorker; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.quiltplayer.core.storage.ArtistStorage; import com.quiltplayer.core.storage.Storage; import com.quiltplayer.internal.id3.Id3Extractor; import com.quiltplayer.internal.id3.model.DataStorage; 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.properties.Configuration; public class FileScannerTask extends SwingWorker<Integer, Void> { private static Logger log = Logger.getLogger(FileScannerTask.class); private Id3Extractor id3Extractor; private Storage storage; private ArtistStorage artistStorage; private Collection<File> files; public FileScannerTask(Id3Extractor id3Extractor, Storage storage, ArtistStorage artistStorage) { this.id3Extractor = id3Extractor; this.storage = storage; this.artistStorage = artistStorage; } /* * (non-Javadoc) * * @see javax.swing.SwingWorker#doInBackground() */ @Override protected Integer doInBackground() throws Exception { getLengthOfTask(); id3Extractor.extractId3Tags(files, dataStorage); return null; } private DataStorage dataStorage = new DataStorage() { /* * (non-Javadoc) * * @see com.quiltplayer.internal.id3.model.DataStorage#progress() */ @Override public void progress(int count) { Double d = new Double(count); double f = (d / files.size()); setProgress(((Double) (f * 100)).intValue()); } /* * (non-Javadoc) * * @see com.quiltplayer.id3utils.model.DataStorage#store(com.quiltplayer. * id3utils.model.Id3DataModel) */ @Override public void store(Id3DataModel model) { if (model != null && StringUtils.isNotEmpty(model.getAlbumTitle()) && StringUtils.isNotEmpty(model.getArtistName()) && StringUtils.isNotBlank(model.getSongTitle())) { StringId artistId = new StringId(model.getArtistName()); Artist artist = artistStorage.getArtist(artistId); if (artist == null) { log.debug("Artist not found, creating..."); artist = artistStorage.createArtist(new StringId(model.getArtistName())); } // TODO this sets the same value on name twice artist.setArtistName(new ArtistName(model.getArtistName())); StringId albumId = new StringId(model.getAlbumTitle()); Album album = storage.getAlbum(albumId); if (album == null) { log.debug("Album not found, creating..."); album = storage.createAlbum(albumId); artist.addAlbum(album); } /* If album exists but not on this artist */ if (!artist.hasAlbum(album)) artist.addAlbum(album); File file = model.getPath(); album.setTitle(model.getAlbumTitle()); album.setLastModified(file.getParentFile().lastModified()); album.setArtist(artist); album.setType(Album.TYPE_FILE); album.setSpotifyId(null); StringId songId = new StringId(model.getAlbumTitle() + model.getSongTitle()); Song song = storage.getSong(album.getTitle(), songId); if (song == null) { song = storage.createSong(songId); album.addSong(song); } song.setPath(file.getAbsolutePath()); song.setFileName(file.getName()); song.setTitle(model.getSongTitle()); song.setTrackNumber(model.getTrackNumber()); song.setSpotifyId(null); song.setType(Song.TYPE_FILE); song.setDuration(model.getDuration()); } } }; @SuppressWarnings("unchecked") private int getLengthOfTask() { File root = new File(Configuration.getInstance().getFolderProperties().getMusicPath()); Collection files = FileUtils.listFiles(root, new String[] { "mp3", "MP3" }, true); this.files = files; return files.size(); } }