131 lines
4.1 KiB
Java
131 lines
4.1 KiB
Java
package com.greinet.tvtotalripper.download;
|
|
|
|
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;
|
|
|
|
/**
|
|
* A task representing a single file download
|
|
*/
|
|
public class DownloadTask extends SwingWorker<Void, Void> {
|
|
|
|
/** The download buffer size */
|
|
private static final int BUFFER_SIZE = 4096;
|
|
/** The episode of the downloaded file */
|
|
private final EpisodeWrapper episodeWrapper;
|
|
|
|
/**
|
|
* Create a download task for a episode
|
|
* @param episodeWrapper
|
|
*/
|
|
public DownloadTask(EpisodeWrapper episodeWrapper) {
|
|
this.episodeWrapper = episodeWrapper;
|
|
}
|
|
|
|
/**
|
|
* Get the episode of the download
|
|
* @return the episode
|
|
*/
|
|
public EpisodeWrapper getEpisodeWrapper() {
|
|
return episodeWrapper;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return episodeWrapper.getTitle();
|
|
}
|
|
|
|
/** The bytes size of the file to download */
|
|
private long fileSize = 0;
|
|
|
|
/** the amount of downloaded bytes */
|
|
private long totalBytesRead = 0;
|
|
|
|
/** The completion percentage */
|
|
private 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");
|
|
try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
|
|
byte[] buffer = new byte[BUFFER_SIZE];
|
|
int bytesRead;
|
|
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);
|
|
}
|
|
}
|
|
|
|
util.disconnect();
|
|
|
|
|
|
// Enable MetaDataWriter
|
|
// MetaDataWriter mdp = new MetaDataWriter();
|
|
// mdp.writeMetadata(outputFile.getAbsolutePath(), episodeWrapper.getTitle(), episodeWrapper.getShow(), episodeWrapper.getShow(), episodeWrapper.getEpisode());
|
|
|
|
} catch (IOException ex) {
|
|
cancel(true);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Get the download file size in bytes
|
|
* @return the file size in bytes
|
|
*/
|
|
public long getFileSize() {
|
|
return fileSize;
|
|
}
|
|
|
|
/**
|
|
* Get the amount of already downloaded bytes
|
|
* @return the amount of already downloaded bytes
|
|
*/
|
|
public long getTotalBytesRead() {
|
|
return totalBytesRead;
|
|
}
|
|
|
|
/**
|
|
* Get the completiton percentage
|
|
* @return the completition percentage
|
|
*/
|
|
public int getPercentCompleted() {
|
|
return percentCompleted;
|
|
}
|
|
|
|
/**
|
|
* Fire a property change event with the progress value of 101 meaning that the task is done
|
|
*/
|
|
@Override
|
|
protected void done() {
|
|
firePropertyChange(Long.toString(episodeWrapper.getId()), 0, 101);
|
|
}
|
|
}
|