- Added file already existing handling
- Switch to Executor Service to handle only 5 SwingWorkers at a time - Added chromedriver.exe task killer at window close
This commit is contained in:
		
							parent
							
								
									f8dd7be711
								
							
						
					
					
						commit
						8d00ff7f90
					
				@ -8,6 +8,7 @@ import org.apache.logging.log4j.Level;
 | 
				
			|||||||
import org.apache.logging.log4j.LogManager;
 | 
					import org.apache.logging.log4j.LogManager;
 | 
				
			||||||
import org.apache.logging.log4j.Logger;
 | 
					import org.apache.logging.log4j.Logger;
 | 
				
			||||||
import org.openqa.selenium.By;
 | 
					import org.openqa.selenium.By;
 | 
				
			||||||
 | 
					import org.openqa.selenium.ElementClickInterceptedException;
 | 
				
			||||||
import org.openqa.selenium.WebDriver;
 | 
					import org.openqa.selenium.WebDriver;
 | 
				
			||||||
import org.openqa.selenium.WebElement;
 | 
					import org.openqa.selenium.WebElement;
 | 
				
			||||||
import org.openqa.selenium.chrome.ChromeDriver;
 | 
					import org.openqa.selenium.chrome.ChromeDriver;
 | 
				
			||||||
@ -74,7 +75,12 @@ public class CrawlerUtil {
 | 
				
			|||||||
        if(!driverSeasonsAndEpisodes.getCurrentUrl().equals(url)){
 | 
					        if(!driverSeasonsAndEpisodes.getCurrentUrl().equals(url)){
 | 
				
			||||||
            driverSeasonsAndEpisodes.get(url);
 | 
					            driverSeasonsAndEpisodes.get(url);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        try{
 | 
				
			||||||
        driverSeasonsAndEpisodes.findElement(By.xpath("/html/body/div[4]/div[1]/div[2]/ul/li[2]/a")).click();
 | 
					        driverSeasonsAndEpisodes.findElement(By.xpath("/html/body/div[4]/div[1]/div[2]/ul/li[2]/a")).click();
 | 
				
			||||||
 | 
					        }catch(ElementClickInterceptedException e){
 | 
				
			||||||
 | 
					            driverSeasonsAndEpisodes.findElement(By.id("cmpbntyestxt")).click();
 | 
				
			||||||
 | 
					            driverSeasonsAndEpisodes.findElement(By.xpath("/html/body/div[4]/div[1]/div[2]/ul/li[2]/a")).click();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
				
			|||||||
@ -37,7 +37,7 @@ public class DownloadTask extends SwingWorker<Void, Void> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public String toString() {
 | 
					    public String toString() {
 | 
				
			||||||
        return episodeWrapper.getTitle();
 | 
					        return episodeWrapper.getTitle()+" : " + getState();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    /** The bytes size of the file to download */
 | 
					    /** The bytes size of the file to download */
 | 
				
			||||||
@ -59,37 +59,50 @@ public class DownloadTask extends SwingWorker<Void, Void> {
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
            ConnectionUtil util = new ConnectionUtil();
 | 
					            ConnectionUtil util = new ConnectionUtil();
 | 
				
			||||||
            util.prepare(downloadURL);
 | 
					            util.prepare(downloadURL);
 | 
				
			||||||
 | 
					            fileSize = util.getContentLength();
 | 
				
			||||||
             
 | 
					             
 | 
				
			||||||
            InputStream inputStream = util.getInputStream();
 | 
					            InputStream inputStream = util.getInputStream();
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            String fixedTitle = episodeWrapper.getTitle().replace(":", " ");
 | 
					            String fixedTitle = episodeWrapper.getTitle().replace(":", " ");
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            File outputFile = new File(SettingsRipperPanel.DOWNLOADFOLDER, fixedTitle+".mp4");
 | 
					            File outputShowFolder = new File(SettingsRipperPanel.DOWNLOADFOLDER, episodeWrapper.getShow());
 | 
				
			||||||
 | 
					            if(!outputShowFolder.exists()){
 | 
				
			||||||
 | 
					                outputShowFolder.mkdir();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            File outputSeasonFolder = new File(outputShowFolder, episodeWrapper.getSeason());
 | 
				
			||||||
 | 
					            if(!outputSeasonFolder.exists()){
 | 
				
			||||||
 | 
					                outputSeasonFolder.mkdir();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            File outputFile = new File(outputSeasonFolder, fixedTitle+".mp4");
 | 
				
			||||||
 | 
					            if(outputFile.exists()){
 | 
				
			||||||
 | 
					                if(outputFile.length() == fileSize){
 | 
				
			||||||
 | 
					                    done();
 | 
				
			||||||
 | 
					                    return null;
 | 
				
			||||||
 | 
					                }else{
 | 
				
			||||||
 | 
					                    outputFile.delete();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
 | 
					            try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
 | 
				
			||||||
                byte[] buffer = new byte[BUFFER_SIZE];
 | 
					                byte[] buffer = new byte[BUFFER_SIZE];
 | 
				
			||||||
                int bytesRead;
 | 
					                int bytesRead;
 | 
				
			||||||
                totalBytesRead = 0;
 | 
					                totalBytesRead = 0;
 | 
				
			||||||
                percentCompleted = 0;
 | 
					                percentCompleted = 0;
 | 
				
			||||||
                int oldPercentCompleted = 0;
 | 
					                int oldPercentCompleted = 0;
 | 
				
			||||||
                fileSize = util.getContentLength();
 | 
					 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                while ((bytesRead = inputStream.read(buffer)) != -1) {
 | 
					                while ((bytesRead = inputStream.read(buffer)) != -1) {
 | 
				
			||||||
                    outputStream.write(buffer, 0, bytesRead);
 | 
					                    outputStream.write(buffer, 0, bytesRead);
 | 
				
			||||||
                    totalBytesRead += bytesRead;
 | 
					                    totalBytesRead += bytesRead;
 | 
				
			||||||
                    percentCompleted = (int) (totalBytesRead * 100 / fileSize);
 | 
					                    percentCompleted = (int) (totalBytesRead * 100 / fileSize);
 | 
				
			||||||
                    firePropertyChange(Long.toString(episodeWrapper.getId()), oldPercentCompleted, percentCompleted);
 | 
					                    firePropertyChange(Long.toString(episodeWrapper.getId()), oldPercentCompleted, percentCompleted);
 | 
				
			||||||
                    oldPercentCompleted = percentCompleted;
 | 
					                    oldPercentCompleted = percentCompleted;
 | 
				
			||||||
                    //setProgress(percentCompleted);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
					 | 
				
			||||||
            util.disconnect();
 | 
					            util.disconnect();
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            // Enable MetaDataWriter
 | 
					            // Enable MetaDataWriter
 | 
				
			||||||
            // MetaDataWriter mdp = new MetaDataWriter();
 | 
					            // MetaDataWriter mdp = new MetaDataWriter();
 | 
				
			||||||
            // mdp.writeMetadata(outputFile.getAbsolutePath(), episodeWrapper.getTitle(), episodeWrapper.getShow(), episodeWrapper.getShow(), episodeWrapper.getEpisode());
 | 
					            // mdp.writeMetadata(outputFile.getAbsolutePath(), episodeWrapper.getTitle(), episodeWrapper.getShow(), episodeWrapper.getShow(), episodeWrapper.getEpisode());
 | 
				
			||||||
            
 | 
					 | 
				
			||||||
        } catch (IOException ex) {
 | 
					        } catch (IOException ex) {
 | 
				
			||||||
            cancel(true);          
 | 
					            cancel(true);          
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,8 @@ import java.beans.PropertyChangeListener;
 | 
				
			|||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Optional;
 | 
					import java.util.Optional;
 | 
				
			||||||
 | 
					import java.util.concurrent.ExecutorService;
 | 
				
			||||||
 | 
					import java.util.concurrent.Executors;
 | 
				
			||||||
import javax.swing.BorderFactory;
 | 
					import javax.swing.BorderFactory;
 | 
				
			||||||
import javax.swing.DefaultListModel;
 | 
					import javax.swing.DefaultListModel;
 | 
				
			||||||
import javax.swing.JLabel;
 | 
					import javax.swing.JLabel;
 | 
				
			||||||
@ -39,6 +41,8 @@ public class DownloadRipperPanel implements PropertyChangeListener{
 | 
				
			|||||||
    /** The information panel for the currently selected task */
 | 
					    /** The information panel for the currently selected task */
 | 
				
			||||||
    private DownloadTaskInformationPanel infoPanel;
 | 
					    private DownloadTaskInformationPanel infoPanel;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    private final ExecutorService threadPool = Executors.newFixedThreadPool(5);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Create a download panel
 | 
					     * Create a download panel
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@ -126,7 +130,8 @@ public class DownloadRipperPanel implements PropertyChangeListener{
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public void addTask(DownloadTask task){
 | 
					    public void addTask(DownloadTask task){
 | 
				
			||||||
        downloadTasks.add(task);
 | 
					        downloadTasks.add(task);
 | 
				
			||||||
        task.execute();
 | 
					        threadPool.submit(task);
 | 
				
			||||||
 | 
					        //task.execute();
 | 
				
			||||||
        listModel.addElement(task);
 | 
					        listModel.addElement(task);
 | 
				
			||||||
        updateTaskCount();
 | 
					        updateTaskCount();
 | 
				
			||||||
        task.addPropertyChangeListener(this);
 | 
					        task.addPropertyChangeListener(this);
 | 
				
			||||||
 | 
				
			|||||||
@ -6,8 +6,15 @@ import com.greinet.tvtotalripper.download.DownloadTask;
 | 
				
			|||||||
import java.awt.Dimension;
 | 
					import java.awt.Dimension;
 | 
				
			||||||
import java.awt.event.ActionEvent;
 | 
					import java.awt.event.ActionEvent;
 | 
				
			||||||
import java.awt.event.ActionListener;
 | 
					import java.awt.event.ActionListener;
 | 
				
			||||||
 | 
					import java.awt.event.WindowAdapter;
 | 
				
			||||||
 | 
					import java.awt.event.WindowEvent;
 | 
				
			||||||
 | 
					import java.io.BufferedReader;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.io.InputStreamReader;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					import java.util.logging.Level;
 | 
				
			||||||
 | 
					import java.util.logging.Logger;
 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
import javax.swing.JComponent;
 | 
					import javax.swing.JComponent;
 | 
				
			||||||
import javax.swing.JFrame;
 | 
					import javax.swing.JFrame;
 | 
				
			||||||
@ -45,7 +52,28 @@ public class RipperWindow {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public RipperWindow(){
 | 
					    public RipperWindow(){
 | 
				
			||||||
        JFrame frame = new JFrame("TV Total Ripper");
 | 
					        JFrame frame = new JFrame("TV Total Ripper");
 | 
				
			||||||
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 | 
					        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
 | 
				
			||||||
 | 
					        frame.addWindowListener(new WindowAdapter() {
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public void windowClosing(WindowEvent e) {
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
 | 
					                    ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c","taskkill /F /IM chromedriver.exe /T");
 | 
				
			||||||
 | 
					                    builder.redirectErrorStream(true);
 | 
				
			||||||
 | 
					                    Process p = builder.start();
 | 
				
			||||||
 | 
					                    BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
 | 
				
			||||||
 | 
					                    String line;
 | 
				
			||||||
 | 
					                    while (true) {
 | 
				
			||||||
 | 
					                        line = r.readLine();
 | 
				
			||||||
 | 
					                        if (line == null) { break; }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                } catch (IOException ex) {
 | 
				
			||||||
 | 
					                    Logger.getLogger(RipperWindow.class.getName()).log(Level.SEVERE, null, ex);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                System.exit(0);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        tabbedPane = new JTabbedPane();
 | 
					        tabbedPane = new JTabbedPane();
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
				
			|||||||
@ -31,7 +31,7 @@ public class SettingsRipperPanel {
 | 
				
			|||||||
    /** The file chooser to select the download folder */
 | 
					    /** The file chooser to select the download folder */
 | 
				
			||||||
    private JFileChooser fileChooserDownloadFolder;
 | 
					    private JFileChooser fileChooserDownloadFolder;
 | 
				
			||||||
    /** The download folder */
 | 
					    /** The download folder */
 | 
				
			||||||
    public static File DOWNLOADFOLDER = new File(".");
 | 
					    public static File DOWNLOADFOLDER = new File("D:/Users/Andreas/Videos/MySpass/");
 | 
				
			||||||
    /** The JButton to open the file chooser dialog */
 | 
					    /** The JButton to open the file chooser dialog */
 | 
				
			||||||
    private final JButton button;
 | 
					    private final JButton button;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user