diff --git a/pom.xml b/pom.xml index b56ac15b..e89c01c6 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.rarchives.ripme ripme jar - 1.0.53 + 1.0.54 ripme http://rip.rarchives.com diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/MediacrushRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/MediacrushRipper.java new file mode 100644 index 00000000..c2963733 --- /dev/null +++ b/src/main/java/com/rarchives/ripme/ripper/rippers/MediacrushRipper.java @@ -0,0 +1,178 @@ +package com.rarchives.ripme.ripper.rippers; + +import java.awt.Desktop; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.security.InvalidAlgorithmParameterException; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.swing.JOptionPane; + +import org.apache.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; +import org.jsoup.Jsoup; + +import com.rarchives.ripme.ripper.AlbumRipper; +import com.rarchives.ripme.ui.RipStatusMessage.STATUS; +import com.rarchives.ripme.utils.Utils; + +public class MediacrushRipper extends AlbumRipper { + + private static final int TIMEOUT = 60000; // Long timeout for this poorly-optimized site. + + private static final String DOMAIN = "mediacru.sh", + HOST = "mediacrush"; + private static final Logger logger = Logger.getLogger(MediacrushRipper.class); + + /** Ordered list of preferred formats, sorted by preference (low-to-high) */ + private static final Map PREFERRED_FORMATS = new HashMap(); + static { + PREFERRED_FORMATS.put("mp4", 0); + PREFERRED_FORMATS.put("wemb",1); + PREFERRED_FORMATS.put("ogv", 2); + PREFERRED_FORMATS.put("mp3", 3); + PREFERRED_FORMATS.put("ogg", 4); + PREFERRED_FORMATS.put("gif", 5); + PREFERRED_FORMATS.put("png", 6); + PREFERRED_FORMATS.put("jpg", 7); + PREFERRED_FORMATS.put("jpeg",8); + }; + + public MediacrushRipper(URL url) throws IOException { + super(url); + } + + @Override + public boolean canRip(URL url) { + return url.getHost().endsWith(DOMAIN); + } + + @Override + public URL sanitizeURL(URL url) throws MalformedURLException { + String u = url.toExternalForm(); + // Strip trailing "/" characters + while (u.endsWith("/")) { + u = u.substring(0, u.length() - 1); + } + // Append .json + if (!u.endsWith(".json")) { + u += ".json"; + } + return new URL(u); + } + + @Override + public void rip() throws IOException { + String url = this.url.toExternalForm(); + logger.info(" Retrieving " + url); + sendUpdate(STATUS.LOADING_RESOURCE, url); + String jsonString = null; + try { + jsonString = Jsoup.connect(url) + .ignoreContentType(true) + .userAgent(USER_AGENT) + .timeout(TIMEOUT) + .execute() + .body(); + } catch (Exception re) { + // Check for >1024 bit encryption but in older versions of Java + if (re.getCause().getCause() instanceof InvalidAlgorithmParameterException) { + // It's the bug. Suggest downloading the latest version. + int selection = JOptionPane.showOptionDialog(null, + "You need to upgrade to the latest Java (7+) to rip this album.\n" + + "Do you want to open java.com and download the latest version?", + "RipMe - Java Error", + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.ERROR_MESSAGE, + null, + new String[] {"Go to java.com", "Cancel"}, + 0); + sendUpdate(STATUS.RIP_ERRORED, "Your version of Java can't handle some secure websites"); + if (selection == 0) { + URL javaUrl = new URL("https://www.java.com/en/download/"); + try { + Desktop.getDesktop().browse(javaUrl.toURI()); + } catch (URISyntaxException use) { } + } + return; + } + throw new IOException("Unexpected error occurred", re); + } + + // Convert to JSON + JSONObject json = new JSONObject(jsonString); + if (!json.has("files")) { + sendUpdate(STATUS.RIP_ERRORED, "No files found at " + url); + throw new IOException("Could not find any files at " + url); + } + // Iterate over all files + JSONArray files = json.getJSONArray("files"); + for (int i = 0; i < files.length(); i++) { + JSONObject file = (JSONObject) files.get(i); + // Find preferred file format + JSONArray subfiles = file.getJSONArray("files"); + String preferredUrl = getPreferredUrl(subfiles); + if (preferredUrl == null) { + sendUpdate(STATUS.DOWNLOAD_ERRORED, "Could not find file inside of " + file); + continue; + } + + // Download + String prefix = ""; + if (Utils.getConfigBoolean("download.save_order", true)) { + prefix = String.format("%03d_", i + 1); + } + addURLToDownload(new URL(preferredUrl), prefix); + } + waitForThreads(); + } + + /** + * Iterates over list if "file" objects and returns the preferred + * image format. + * @param subfiles Array of "files" (JSONObjects) which contain + * @return Preferred media format. + */ + private String getPreferredUrl(JSONArray subfiles) { + String preferredUrl = null; + int preferredIndex = Integer.MAX_VALUE; + // Iterate over all media types + for (int j = 0; j < subfiles.length(); j++) { + JSONObject subfile = subfiles.getJSONObject(j); + String thisurl = subfile.getString("url"); + String extension = thisurl.substring(thisurl.lastIndexOf(".") + 1); + if (!PREFERRED_FORMATS.containsKey(extension)) { + continue; + } + // Keep track of the most-preferred format + int thisindex = PREFERRED_FORMATS.get(extension); + if (preferredUrl == null || thisindex < preferredIndex) { + preferredIndex = thisindex; + preferredUrl = thisurl; + } + } + return preferredUrl; + } + + @Override + public String getHost() { + return HOST; + } + + @Override + public String getGID(URL url) throws MalformedURLException { + Pattern p = Pattern.compile("https?://[wm.]*mediacru\\.sh/([a-zA-Z0-9]+).*"); + Matcher m = p.matcher(url.toExternalForm()); + if (m.matches()) { + return m.group(1); + } + throw new MalformedURLException("Could not find mediacru.sh page ID from " + url + + " expected format: http://mediacru.sh/pageid"); + } +} diff --git a/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java b/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java index afa773e6..da09eefd 100644 --- a/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java +++ b/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java @@ -21,7 +21,7 @@ import com.rarchives.ripme.utils.Utils; public class UpdateUtils { private static final Logger logger = Logger.getLogger(UpdateUtils.class); - private static final String DEFAULT_VERSION = "1.0.53"; + private static final String DEFAULT_VERSION = "1.0.54"; private static final String updateJsonURL = "http://rarchives.com/ripme.json"; private static final String updateJarURL = "http://rarchives.com/ripme.jar"; private static final String mainFileName = "ripme.jar";