private File getDestinationDirectory() { String show = ShowStore.getShow(showName).getName(); String destPath = userPrefs.getDestinationDirectory().getAbsolutePath() + File.separatorChar; destPath = destPath + StringUtils.sanitiseTitle(show) + File.separatorChar; // Defect #50: Only add the 'season #' folder if set, otherwise put files in showname root if (StringUtils.isNotBlank(userPrefs.getSeasonPrefix())) { destPath = destPath + userPrefs.getSeasonPrefix() + (userPrefs.isSeasonPrefixLeadingZero() && this.seasonNumber < 9 ? "0" : "") + this.seasonNumber + File.separatorChar; } return new File(destPath); }
/** * Download the URL and return as a String. Gzip handling from http://goo.gl/J88WG * * @param url the URL to download * @return String of the URL contents * @throws IOException when there is an error connecting or reading the URL */ public String downloadUrl(URL url) throws TVRenamerIOException { InputStream inputStream = null; StringBuilder contents = new StringBuilder(); try { if (url != null) { logger.log(Level.INFO, "Downloading URL {0}", url.toString()); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); HttpURLConnection.setFollowRedirects(true); // allow both GZip and Deflate (ZLib) encodings conn.setRequestProperty("Accept-Encoding", "gzip, deflate"); conn.setConnectTimeout(CONNECT_TIMEOUT_MS); conn.setReadTimeout(READ_TIMEOUT_MS); // create the appropriate stream wrapper based on the encoding type String encoding = conn.getContentEncoding(); if (encoding != null && encoding.equalsIgnoreCase("gzip")) { inputStream = new GZIPInputStream(conn.getInputStream()); } else if (encoding != null && encoding.equalsIgnoreCase("deflate")) { inputStream = new InflaterInputStream(conn.getInputStream(), new Inflater(true)); } else { inputStream = conn.getInputStream(); } // always specify encoding while reading streams BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); logger.finer("Before reading url stream"); String s; while ((s = reader.readLine()) != null) { contents.append(s); } if (logger.isLoggable(Level.FINEST)) { // no need to encode for logger output logger.log(Level.FINEST, "Url stream:\n{0}", contents.toString()); } } } catch (Exception e) { String message = "Exception when attempting to download and parse URL " + url; logger.log(Level.SEVERE, message, e); throw new TVRenamerIOException(message, e); } finally { try { if (inputStream != null) { inputStream.close(); } } catch (IOException e) { logger.log(Level.SEVERE, "Exception when attempting to close input stream", e); } } return StringUtils.encodeSpecialCharacters(contents.toString()); }
public String getNewFilename() { switch (this.status) { case ADDED: { return ADDED_PLACEHOLDER_FILENAME; } case DOWNLOADED: case RENAMED: { String showName = ""; String seasonNum = ""; String titleString = ""; Calendar airDate = Calendar.getInstance(); ; try { Show show = ShowStore.getShow(this.showName); showName = show.getName(); Season season = show.getSeason(this.seasonNumber); if (season == null) { seasonNum = String.valueOf(this.seasonNumber); logger.log( Level.SEVERE, "Season #" + this.seasonNumber + " not found for show '" + this.showName + "'"); } else { seasonNum = String.valueOf(season.getNumber()); try { titleString = season.getTitle(this.episodeNumber); airDate.setTime(season.getAirDate(this.episodeNumber)); } catch (EpisodeNotFoundException e) { logger.log(Level.SEVERE, "Episode not found for '" + this.toString() + "'", e); } } } catch (ShowNotFoundException e) { showName = this.showName; logger.log(Level.SEVERE, "Show not found for '" + this.toString() + "'", e); } String newFilename = userPrefs.getRenameReplacementString(); // Ensure that all special characters in the replacement are quoted showName = Matcher.quoteReplacement(showName); showName = GlobalOverrides.getInstance().getShowName(showName); titleString = Matcher.quoteReplacement(titleString); // Make whatever modifications are required String episodeNumberString = new DecimalFormat("##0").format(this.episodeNumber); String episodeNumberWithLeadingZeros = new DecimalFormat("#00").format(this.episodeNumber); String episodeTitleNoSpaces = titleString.replaceAll(" ", "."); String seasonNumberWithLeadingZero = new DecimalFormat("00").format(this.seasonNumber); newFilename = newFilename.replaceAll(ReplacementToken.SHOW_NAME.getToken(), showName); newFilename = newFilename.replaceAll(ReplacementToken.SEASON_NUM.getToken(), seasonNum); newFilename = newFilename.replaceAll( ReplacementToken.SEASON_NUM_LEADING_ZERO.getToken(), seasonNumberWithLeadingZero); newFilename = newFilename.replaceAll(ReplacementToken.EPISODE_NUM.getToken(), episodeNumberString); newFilename = newFilename.replaceAll( ReplacementToken.EPISODE_NUM_LEADING_ZERO.getToken(), episodeNumberWithLeadingZeros); newFilename = newFilename.replaceAll(ReplacementToken.EPISODE_TITLE.getToken(), titleString); newFilename = newFilename.replaceAll( ReplacementToken.EPISODE_TITLE_NO_SPACES.getToken(), episodeTitleNoSpaces); // Date and times newFilename = newFilename.replaceAll( ReplacementToken.DATE_DAY_NUM.getToken(), formatDate(airDate, "d")); newFilename = newFilename.replaceAll( ReplacementToken.DATE_DAY_NUMLZ.getToken(), formatDate(airDate, "dd")); newFilename = newFilename.replaceAll( ReplacementToken.DATE_MONTH_NUM.getToken(), formatDate(airDate, "M")); newFilename = newFilename.replaceAll( ReplacementToken.DATE_MONTH_NUMLZ.getToken(), formatDate(airDate, "MM")); newFilename = newFilename.replaceAll( ReplacementToken.DATE_YEAR_FULL.getToken(), formatDate(airDate, "yyyy")); newFilename = newFilename.replaceAll( ReplacementToken.DATE_YEAR_MIN.getToken(), formatDate(airDate, "yy")); String resultingFilename = newFilename.concat(".").concat(StringUtils.getExtension(file.getName())); return StringUtils.sanitiseTitle(resultingFilename); } case BROKEN: default: return BROKEN_PLACEHOLDER_FILENAME; } }