package moviescraper.doctord.controller; import java.awt.Cursor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import javax.swing.SwingWorker; import org.apache.commons.io.FileExistsException; import org.apache.commons.io.FileUtils; import moviescraper.doctord.model.Movie; import moviescraper.doctord.model.preferences.MoviescraperPreferences; import moviescraper.doctord.view.GUIMain; public class WriteFileDataAction implements ActionListener { /** * */ private final GUIMain guiMain; SwingWorker<Void, String> worker; /** * @param guiMain */ public WriteFileDataAction(GUIMain guiMain) { this.guiMain = guiMain; } @Override public void actionPerformed(ActionEvent arg0) { this.guiMain.setMainGUIEnabled(false); worker = new SwingWorker<Void, String>() { @Override protected Void doInBackground() throws Exception { for(int movieNumberInList = 0; movieNumberInList < guiMain.getCurrentlySelectedMovieFileList().size(); movieNumberInList++) { try { //Display a wait cursor since file IO sometimes takes a little bit of time guiMain.getFrmMoviescraper().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); // Write the user or automatic selection using amalgamation // of different scraping sites if(guiMain.movieToWriteToDiskList == null) { //I don't think this should happen anymore, just display an error message instead of executing the above code System.err.println("Code I thought was not supposed to execute did, WriteFileDataAction, line 59"); } if(guiMain.movieToWriteToDiskList.get(movieNumberInList) == null || !guiMain.movieToWriteToDiskList.get(movieNumberInList).hasValidTitle()) { System.out.println("No match for this movie in the array or there was no title filled in; skipping writing"); continue; } System.out.println("Writing this movie to file: " + guiMain.movieToWriteToDiskList.get(movieNumberInList).getTitle()); if(guiMain.movieToWriteToDiskList != null) { if ( guiMain.getPreferences().getRenameMovieFile() ) { File oldMovieFile = guiMain.getCurrentlySelectedMovieFileList().get(movieNumberInList); Movie movie = guiMain.movieToWriteToDiskList.get(movieNumberInList); String sanitizerString = MoviescraperPreferences.getSanitizerForFilename(); String fileRenameString = MoviescraperPreferences.getRenamerString(); String folderRenameString = MoviescraperPreferences.getFolderRenamerString(); Renamer renamer = new Renamer(fileRenameString, folderRenameString, sanitizerString, movie, oldMovieFile); String newMovieFilename = renamer.getNewFileName(oldMovieFile.isDirectory()); System.out.println( "New Filename : " + newMovieFilename ); File newMovieFile = new File(newMovieFilename); /* * old method boolean renameStatus = oldMovieFile.renameTo(newMovieFile); if(!renameStatus) { System.err.println("There was a problem renaming " + oldMovieFile + " to "+ newMovieFile); }*/ try{ if(oldMovieFile.isDirectory()) { FileUtils.moveDirectory(oldMovieFile, newMovieFile); } else if(oldMovieFile.isFile()) { /* Faster on network shares to move to directory then rename */ File oldMovieDirectoryFile = oldMovieFile.getParentFile().getCanonicalFile(); File newMovieDirectoryFile = newMovieFile.getParentFile().getCanonicalFile(); File oldMovieNameFile = new File(oldMovieFile.getName()); File newMovieNameFile = new File(newMovieFile.getName()); if(!newMovieDirectoryFile.equals(oldMovieDirectoryFile)) { // Move to new directory FileUtils.moveFileToDirectory(oldMovieFile, newMovieDirectoryFile, true); } // Create paths based on new directory and rename file File newDirOldNameFile = new File(newMovieDirectoryFile, oldMovieNameFile.toString()); File newDirNewNameFile = new File(newMovieDirectoryFile, newMovieNameFile.toString()); FileUtils.moveFile(newDirOldNameFile, newDirNewNameFile); } } catch(FileExistsException e) { System.out.println("A file or directory already exists at " + newMovieFile + " - skipping overwrite or creation of new folder."); } guiMain.movieToWriteToDiskList.get(movieNumberInList).writeToFile( new File( Movie.getFileNameOfNfo(newMovieFile, guiMain.getPreferences().getNfoNamedMovieDotNfo()) ), new File( Movie.getFileNameOfPoster(newMovieFile, guiMain.getPreferences().getNoMovieNameInImageFiles()) ), new File( Movie.getFileNameOfFanart(newMovieFile, guiMain.getPreferences().getNoMovieNameInImageFiles())), new File( Movie.getFileNameOfFolderJpg(newMovieFile) ), new File(Movie.getFileNameOfExtraFanartFolderName(newMovieFile)), new File(Movie.getFileNameOfTrailer(newMovieFile)), guiMain.getPreferences()); } else { //save without renaming movie guiMain.movieToWriteToDiskList.get(movieNumberInList).writeToFile( guiMain.getCurrentlySelectedNfoFileList().get(movieNumberInList), guiMain.getCurrentlySelectedPosterFileList().get(movieNumberInList), guiMain.getCurrentlySelectedFanartFileList().get(movieNumberInList), guiMain.getCurrentlySelectedFolderJpgFileList().get(movieNumberInList), new File(Movie.getFileNameOfExtraFanartFolderName(guiMain.getCurrentlySelectedMovieFileList().get(movieNumberInList))), new File(Movie.getFileNameOfTrailer(guiMain.getCurrentlySelectedMovieFileList().get(movieNumberInList))), guiMain.getPreferences()); } //we can only output extra fanart if we're scraping a folder, because otherwise the extra fanart will get mixed in with other files if(guiMain.getPreferences().getExtraFanartScrapingEnabledPreference() && guiMain.getCurrentlySelectedMovieFileList().get(movieNumberInList).isDirectory()) { guiMain.movieToWriteToDiskList.get(movieNumberInList).writeExtraFanart(guiMain.getCurrentlySelectedMovieFileList().get(movieNumberInList)); } } //now write out the actor images if the user preference is set if(guiMain.getPreferences().getDownloadActorImagesToActorFolderPreference() && guiMain.getCurrentlySelectedMovieFileList() != null && guiMain.getCurrentlySelectedDirectoryList() != null) { guiMain.movieToWriteToDiskList.get(movieNumberInList).writeActorImagesToFolder(guiMain.getCurrentlySelectedMovieFileList().get(movieNumberInList)); } System.out.println("Finished writing a movie file"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); guiMain.getFrmMoviescraper().setCursor(Cursor.getDefaultCursor()); } finally{ done(); } } return null; } @Override protected void done() { guiMain.setMainGUIEnabled(true); //out of loop and done writing files, update the gui guiMain.updateFileListModel(guiMain.getCurrentlySelectedDirectoryList(), true); guiMain.getFrmMoviescraper().setCursor(Cursor.getDefaultCursor()); } }; //end SwingWorker definition worker.execute(); } }