package com.greinet.tvtotalripper.download; import com.greinet.tvtotalripper.MetaDataWriter; import com.greinet.tvtotalripper.crawler.CrawlerUtil; import com.greinet.tvtotalripper.crawler.EpisodeWrapper; import com.greinet.tvtotalripper.ui.SettingsRipperPanel; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import javax.swing.SwingWorker; /** * * @author agreiner */ public class DownloadTask extends SwingWorker { private static final int BUFFER_SIZE = 4096; private final EpisodeWrapper episodeWrapper; public DownloadTask(EpisodeWrapper episodeWrapper) { this.episodeWrapper = episodeWrapper; } public EpisodeWrapper getEpisodeWrapper() { return episodeWrapper; } @Override public String toString() { return episodeWrapper.getTitle(); } public long fileSize = 0; public long totalBytesRead = 0; public int percentCompleted = 0; /** * Executed in background thread */ @Override protected Void doInBackground() throws Exception { try { String downloadURL = CrawlerUtil.getFetchfileURL(episodeWrapper.getUrl()); ConnectionUtil util = new ConnectionUtil(); util.prepare(downloadURL); InputStream inputStream = util.getInputStream(); String fixedTitle = episodeWrapper.getTitle().replace(":", " "); File outputFile = new File(SettingsRipperPanel.DOWNLOADFOLDER, fixedTitle+".mp4"); FileOutputStream outputStream = new FileOutputStream(outputFile); byte[] buffer = new byte[BUFFER_SIZE]; int bytesRead = -1; totalBytesRead = 0; percentCompleted = 0; int oldPercentCompleted = 0; fileSize = util.getContentLength(); while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); totalBytesRead += bytesRead; percentCompleted = (int) (totalBytesRead * 100 / fileSize); firePropertyChange(Long.toString(episodeWrapper.getId()), oldPercentCompleted, percentCompleted); oldPercentCompleted = percentCompleted; //setProgress(percentCompleted); } outputStream.close(); util.disconnect(); MetaDataWriter mdp = new MetaDataWriter(); mdp.writeMetadata(outputFile.getAbsolutePath(), episodeWrapper.getTitle(), episodeWrapper.getShow(), episodeWrapper.getShow(), episodeWrapper.getEpisode()); } catch (IOException ex) { cancel(true); } return null; } /** * Executed in Swing's event dispatching thread */ @Override protected void done() { firePropertyChange(Long.toString(episodeWrapper.getId()), 0, 101); } }