diff --git a/src/main/java/com/rogiel/httpchannel/service/AbstractDownloader.java b/src/main/java/com/rogiel/httpchannel/service/AbstractDownloader.java index a6ea153..f61b226 100644 --- a/src/main/java/com/rogiel/httpchannel/service/AbstractDownloader.java +++ b/src/main/java/com/rogiel/httpchannel/service/AbstractDownloader.java @@ -16,29 +16,37 @@ */ package com.rogiel.httpchannel.service; -import java.io.IOException; +import org.apache.http.Header; +import org.apache.http.HttpResponse; -import com.rogiel.httpchannel.service.DownloadListener.TimerWaitReason; import com.rogiel.httpchannel.util.ThreadUtils; - /** * @author rogiel */ public abstract class AbstractDownloader implements Downloader { - protected void timer(DownloadListener listener, long timer) { - listener.timer(timer, TimerWaitReason.DOWNLOAD_TIMER); - ThreadUtils.sleep(timer); + protected int parseTimer(String stringTimer) { + int timer = 0; + if (stringTimer != null && stringTimer.length() > 0) { + timer = Integer.parseInt(stringTimer); + } + return timer; } - protected boolean cooldown(DownloadListener listener, long cooldown) - throws IOException { - if (listener.timer(cooldown, TimerWaitReason.COOLDOWN)) { - ThreadUtils.sleep(cooldown); - return true; - } else { - throw new IOException("Timer " + TimerWaitReason.COOLDOWN - + " aborted due to listener request"); + protected long getContentLength(HttpResponse response) { + final Header contentLengthHeader = response + .getFirstHeader("Content-Length"); + long contentLength = -1; + if (contentLengthHeader != null) { + contentLength = Long.valueOf(contentLengthHeader.getValue()); } + return contentLength; + } + + protected void timer(DownloadListener listener, long timer) { + if (listener != null) { + listener.timer(timer); + } + ThreadUtils.sleep(timer); } } diff --git a/src/main/java/com/rogiel/httpchannel/service/AbstractHttpService.java b/src/main/java/com/rogiel/httpchannel/service/AbstractHttpService.java index 4ef3a7b..4b075f0 100644 --- a/src/main/java/com/rogiel/httpchannel/service/AbstractHttpService.java +++ b/src/main/java/com/rogiel/httpchannel/service/AbstractHttpService.java @@ -19,6 +19,7 @@ package com.rogiel.httpchannel.service; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.DefaultHttpClient; +import com.rogiel.httpchannel.service.captcha.CaptchaResolver; import com.rogiel.httpchannel.service.config.ServiceConfiguration; import com.rogiel.httpchannel.util.AlwaysRedirectStrategy; @@ -35,6 +36,11 @@ public abstract class AbstractHttpService */ protected DefaultHttpClient client = new DefaultHttpClient(); + /** + * The captcha resolver + */ + protected CaptchaResolver captchaResolver; + protected AbstractHttpService(T configuration) { super(configuration); client.setRedirectStrategy(new AlwaysRedirectStrategy()); diff --git a/src/main/java/com/rogiel/httpchannel/service/Authenticator.java b/src/main/java/com/rogiel/httpchannel/service/Authenticator.java index 5f868ad..b2284ce 100644 --- a/src/main/java/com/rogiel/httpchannel/service/Authenticator.java +++ b/src/main/java/com/rogiel/httpchannel/service/Authenticator.java @@ -18,6 +18,8 @@ package com.rogiel.httpchannel.service; import java.io.IOException; +import com.rogiel.httpchannel.service.exception.AuthenticationInvalidCredentialException; + /** * This interfaces provides authentication for an service. * @@ -31,15 +33,19 @@ public interface Authenticator { * Note: If you want to logout the user, see * {@link Authenticator#logout()} * - * @return true if login was successful + * @throws IOException + * if any IO error occur + * @throws AuthenticationInvalidCredentialException + * if the credentials are not valid or cannot be used */ - boolean login() throws IOException; + void login() throws IOException, AuthenticationInvalidCredentialException; /** * Logout into the {@link Service}. The session is restored to an not * logged-in state. * - * @return true if logout was successful + * @throws IOException + * if any IO error occur */ - boolean logout() throws IOException; + void logout() throws IOException; } diff --git a/src/main/java/com/rogiel/httpchannel/service/DownloadChannel.java b/src/main/java/com/rogiel/httpchannel/service/DownloadChannel.java index 47f7bb2..a32229d 100644 --- a/src/main/java/com/rogiel/httpchannel/service/DownloadChannel.java +++ b/src/main/java/com/rogiel/httpchannel/service/DownloadChannel.java @@ -16,13 +16,29 @@ */ package com.rogiel.httpchannel.service; +import java.nio.channels.Channel; import java.nio.channels.ReadableByteChannel; /** + * This is an {@link Channel} for downloads. Any data to be downloaded, must be + * Redden from this channel. + *

+ * Since this {@link Channel} implements {@link ReadableByteChannel} + * you can treat it as any other regular IO {@link Channel}. + *

+ * Remember: always close the {@link Channel}, if you do otherwise, the + * resources will not be freed and will consume machine resources. + * * @author Rogiel */ public interface DownloadChannel extends ReadableByteChannel { - long getLength(); + /** + * @return the file size + */ + long getFilesize(); + /** + * @return the file name + */ String getFilename(); } diff --git a/src/main/java/com/rogiel/httpchannel/service/DownloadListener.java b/src/main/java/com/rogiel/httpchannel/service/DownloadListener.java index cf97ba3..c799e10 100644 --- a/src/main/java/com/rogiel/httpchannel/service/DownloadListener.java +++ b/src/main/java/com/rogiel/httpchannel/service/DownloadListener.java @@ -16,8 +16,6 @@ */ package com.rogiel.httpchannel.service; -import com.rogiel.httpchannel.service.captcha.Captcha; - /** * This listener keeps an track on the progress on an {@link Downloader} * service. @@ -32,39 +30,7 @@ public interface DownloadListener { * * @param time * the time in ms in which the service will be be waiting. - * @param reason - * the reason why this timer is running * @return true if desires to wait, false otherwise */ - boolean timer(long time, TimerWaitReason reason); - - /** - * The reason why an certain timer is being ran. - * - * @author Rogiel - */ - public enum TimerWaitReason { - /** - * Normal download timer. An annoyance. - */ - DOWNLOAD_TIMER, - /** - * This IP has already download up to the limit, waiting for releasing - * of the block. - */ - COOLDOWN, - /** - * This is an unknown wait time. - */ - UNKNOWN; - } - - /** - * Passes an captcha by parameter and waits for the response of the - * challenge. - * - * @param captcha - * the captcha challenge - */ - String captcha(Captcha captcha); + boolean timer(long time); } diff --git a/src/main/java/com/rogiel/httpchannel/service/DownloadService.java b/src/main/java/com/rogiel/httpchannel/service/DownloadService.java index c33f3f1..f96826e 100644 --- a/src/main/java/com/rogiel/httpchannel/service/DownloadService.java +++ b/src/main/java/com/rogiel/httpchannel/service/DownloadService.java @@ -43,6 +43,9 @@ public interface DownloadService extends Service { /** * Check if this {@link Service} can download from this URL. Implemtations * might or might not perform network activity. + *

+ * Please note that the value returned by this method may vary based + * on it's state (i.e. premium or not). * * @param url * the {@link URL} to be tested. diff --git a/src/main/java/com/rogiel/httpchannel/service/Downloader.java b/src/main/java/com/rogiel/httpchannel/service/Downloader.java index fb2e683..e165634 100644 --- a/src/main/java/com/rogiel/httpchannel/service/Downloader.java +++ b/src/main/java/com/rogiel/httpchannel/service/Downloader.java @@ -18,6 +18,9 @@ package com.rogiel.httpchannel.service; import java.io.IOException; +import com.rogiel.httpchannel.service.exception.DownloadLimitExceededException; +import com.rogiel.httpchannel.service.exception.DownloadLinkNotFoundException; + /** * This interfaces provides downloading for an service. * @@ -30,6 +33,17 @@ public interface Downloader { * * @param listener * the listener to keep a track on the download progress + * + * @return the {@link DownloadChannel} instance + * @throws IOException + * if any IO error occur + * @throws DownloadLinkNotFoundException + * if the direct download link cannot be found (the file could + * have been deleted) + * @throws DownloadLimitExceededException + * if the download limit has been exceed, most times thrown when + * downloading as a non-premium user */ - DownloadChannel download(DownloadListener listener) throws IOException; + DownloadChannel download(DownloadListener listener) throws IOException, + DownloadLinkNotFoundException, DownloadLimitExceededException; } diff --git a/src/main/java/com/rogiel/httpchannel/service/Service.java b/src/main/java/com/rogiel/httpchannel/service/Service.java index 8a33e61..01b0ff6 100644 --- a/src/main/java/com/rogiel/httpchannel/service/Service.java +++ b/src/main/java/com/rogiel/httpchannel/service/Service.java @@ -36,7 +36,7 @@ public interface Service { * * @return the id of the service */ - String getId(); + String getID(); /** * Get Major version of this service diff --git a/src/main/java/com/rogiel/httpchannel/service/UploadChannel.java b/src/main/java/com/rogiel/httpchannel/service/UploadChannel.java index 572c613..71b1873 100644 --- a/src/main/java/com/rogiel/httpchannel/service/UploadChannel.java +++ b/src/main/java/com/rogiel/httpchannel/service/UploadChannel.java @@ -16,15 +16,48 @@ */ package com.rogiel.httpchannel.service; +import java.io.IOException; +import java.nio.channels.Channel; import java.nio.channels.WritableByteChannel; +import com.rogiel.httpchannel.service.exception.UploadLinkNotFoundException; + /** + * This is an {@link Channel} for uploads. Any data to be uploaded, must be + * written into this channel. + *

+ * Since this {@link Channel} implements {@link WritableByteChannel} + * you can treat it as any other regular IO {@link Channel}. + *

+ * Remember: always close the {@link Channel}, if you do otherwise, your + * upload will not finish and will never return the link. + * * @author Rogiel */ public interface UploadChannel extends WritableByteChannel { - long getLength(); + /** + * @return the file size + */ + long getFilesize(); + /** + * @return the file name + */ String getFilename(); + /** + * The link is located after you call {@link UploadChannel#close()}, but it + * can only be retrieved by calling this method. If {@link #close()} throwed + * an exception, this method might return null. + * + * @return the download link for this upload + */ String getDownloadLink(); + + /** + * @throws UploadLinkNotFoundException + * if after the upload, the download link cannot be found + */ + @Override + void close() throws IOException, UploadLinkNotFoundException; } diff --git a/src/main/java/com/rogiel/httpchannel/service/UploadListenerContentBody.java b/src/main/java/com/rogiel/httpchannel/service/UploadListenerContentBody.java index 83f93c7..2bbdc18 100644 --- a/src/main/java/com/rogiel/httpchannel/service/UploadListenerContentBody.java +++ b/src/main/java/com/rogiel/httpchannel/service/UploadListenerContentBody.java @@ -64,7 +64,7 @@ public class UploadListenerContentBody extends AbstractContentBody { @Override public long getContentLength() { - return channel.getLength(); + return channel.getFilesize(); } @Override diff --git a/src/main/java/com/rogiel/httpchannel/service/UploadService.java b/src/main/java/com/rogiel/httpchannel/service/UploadService.java index 65bd3fe..8300d3b 100644 --- a/src/main/java/com/rogiel/httpchannel/service/UploadService.java +++ b/src/main/java/com/rogiel/httpchannel/service/UploadService.java @@ -28,8 +28,10 @@ public interface UploadService extends Service { * with the parent {@link Service} instance.
* Note: not all services might support description * - * @param file - * the file to be uploaded + * @param filename + * the name of the file to be uploaded + * @param filesize + * the size of the file to be uploaded. This must be exact. * @param description * the description of the upload. If supported. * @return the new {@link Uploader} instance @@ -38,6 +40,9 @@ public interface UploadService extends Service { /** * Get the maximum upload file size supported by this service. + *

+ * Please note that the value returned by this method may vary based + * on it's state (i.e. premium or not). * * @return the maximum filesize supported */ @@ -46,6 +51,9 @@ public interface UploadService extends Service { /** * Get the list of all supported extensions. Might return null if * there is no restriction. + *

+ * Please note that the value returned by this method may vary based + * on it's state (i.e. premium or not). * * @return the list of supported file extensions. Can return null * if there is not restriction diff --git a/src/main/java/com/rogiel/httpchannel/service/Uploader.java b/src/main/java/com/rogiel/httpchannel/service/Uploader.java index ceb328d..230edf1 100644 --- a/src/main/java/com/rogiel/httpchannel/service/Uploader.java +++ b/src/main/java/com/rogiel/httpchannel/service/Uploader.java @@ -28,11 +28,9 @@ public interface Uploader { /** * Starts the upload process on this service. * - * @param listener - * the listener do keep an track on the upload process - * @throws UploadServiceException - * thrown if something went wrong + * @return the {@link UploadChannel} instance * @throws IOException + * if any IO error occur */ UploadChannel upload() throws IOException; } diff --git a/src/main/java/com/rogiel/httpchannel/service/ServiceException.java b/src/main/java/com/rogiel/httpchannel/service/captcha/CaptchaResolver.java similarity index 60% rename from src/main/java/com/rogiel/httpchannel/service/ServiceException.java rename to src/main/java/com/rogiel/httpchannel/service/captcha/CaptchaResolver.java index 44f102b..d19dee0 100644 --- a/src/main/java/com/rogiel/httpchannel/service/ServiceException.java +++ b/src/main/java/com/rogiel/httpchannel/service/captcha/CaptchaResolver.java @@ -14,28 +14,19 @@ * You should have received a copy of the GNU General Public License * along with seedbox. If not, see . */ -package com.rogiel.httpchannel.service; - -import java.io.IOException; +package com.rogiel.httpchannel.service.captcha; /** - * Base exception for any {@link Service}. - * - * @author Rogiel - * @since 1.0 + * @author Rogiel + * */ -public class ServiceException extends IOException { - private static final long serialVersionUID = 1L; - - public ServiceException(String message) { - super(message); - } - - public ServiceException(Throwable t) { - super(t); - } - - public ServiceException(String message, Throwable t) { - super(message, t); - } +public interface CaptchaResolver { + /** + * Passes an captcha by parameter and waits for the response of the + * challenge. + * + * @param captcha + * the captcha challenge + */ + String resolve(Captcha captcha); } diff --git a/src/main/java/com/rogiel/httpchannel/service/channel/InputStreamDownloadChannel.java b/src/main/java/com/rogiel/httpchannel/service/channel/InputStreamDownloadChannel.java index d7f1811..9688d7d 100644 --- a/src/main/java/com/rogiel/httpchannel/service/channel/InputStreamDownloadChannel.java +++ b/src/main/java/com/rogiel/httpchannel/service/channel/InputStreamDownloadChannel.java @@ -58,7 +58,7 @@ public class InputStreamDownloadChannel implements DownloadChannel { } @Override - public long getLength() { + public long getFilesize() { return length; } diff --git a/src/main/java/com/rogiel/httpchannel/service/channel/LinkedUploadChannel.java b/src/main/java/com/rogiel/httpchannel/service/channel/LinkedUploadChannel.java index 8309855..6d8de0c 100644 --- a/src/main/java/com/rogiel/httpchannel/service/channel/LinkedUploadChannel.java +++ b/src/main/java/com/rogiel/httpchannel/service/channel/LinkedUploadChannel.java @@ -67,7 +67,7 @@ public class LinkedUploadChannel implements UploadChannel { } @Override - public long getLength() { + public long getFilesize() { return length; } diff --git a/src/main/java/com/rogiel/httpchannel/service/exception/AuthenticationInvalidCredentialException.java b/src/main/java/com/rogiel/httpchannel/service/exception/AuthenticationInvalidCredentialException.java new file mode 100644 index 0000000..2236785 --- /dev/null +++ b/src/main/java/com/rogiel/httpchannel/service/exception/AuthenticationInvalidCredentialException.java @@ -0,0 +1,61 @@ +/* + * This file is part of seedbox . + * + * seedbox is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * seedbox is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with seedbox. If not, see . + */ +package com.rogiel.httpchannel.service.exception; + +/** + * Exception thrown if the authentication credential is not valid. + * + * @author Rogiel + */ +public class AuthenticationInvalidCredentialException extends + AuthenticationServiceException { + private static final long serialVersionUID = 1L; + + /** + * Creates a new empty instance of this exception + */ + public AuthenticationInvalidCredentialException() { + super(); + } + + /** + * @param message + * the message + * @param cause + * the root cause + */ + public AuthenticationInvalidCredentialException(String message, + Throwable cause) { + super(message, cause); + } + + /** + * @param message + * the message + */ + public AuthenticationInvalidCredentialException(String message) { + super(message); + } + + /** + * @param cause + * the root cause + */ + public AuthenticationInvalidCredentialException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/rogiel/httpchannel/service/exception/AuthenticationServiceException.java b/src/main/java/com/rogiel/httpchannel/service/exception/AuthenticationServiceException.java new file mode 100644 index 0000000..156c33a --- /dev/null +++ b/src/main/java/com/rogiel/httpchannel/service/exception/AuthenticationServiceException.java @@ -0,0 +1,51 @@ +/* + * This file is part of seedbox . + * + * seedbox is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * seedbox is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with seedbox. If not, see . + */ +package com.rogiel.httpchannel.service.exception; + +/** + * @author Rogiel + * + */ +public class AuthenticationServiceException extends ChannelServiceException { + private static final long serialVersionUID = 1L; + + public AuthenticationServiceException() { + super(); + } + + /** + * @param message + * @param cause + */ + public AuthenticationServiceException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param message + */ + public AuthenticationServiceException(String message) { + super(message); + } + + /** + * @param cause + */ + public AuthenticationServiceException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/rogiel/httpchannel/service/exception/ChannelServiceException.java b/src/main/java/com/rogiel/httpchannel/service/exception/ChannelServiceException.java new file mode 100644 index 0000000..628343b --- /dev/null +++ b/src/main/java/com/rogiel/httpchannel/service/exception/ChannelServiceException.java @@ -0,0 +1,53 @@ +/* + * This file is part of seedbox . + * + * seedbox is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * seedbox is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with seedbox. If not, see . + */ +package com.rogiel.httpchannel.service.exception; + +import java.io.IOException; + +/** + * @author Rogiel + * + */ +public class ChannelServiceException extends IOException { + private static final long serialVersionUID = 1L; + + public ChannelServiceException() { + super(); + } + + /** + * @param message + * @param cause + */ + public ChannelServiceException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param message + */ + public ChannelServiceException(String message) { + super(message); + } + + /** + * @param cause + */ + public ChannelServiceException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/rogiel/httpchannel/service/exception/DownloadInvalidCaptchaException.java b/src/main/java/com/rogiel/httpchannel/service/exception/DownloadInvalidCaptchaException.java new file mode 100644 index 0000000..d1e3ca8 --- /dev/null +++ b/src/main/java/com/rogiel/httpchannel/service/exception/DownloadInvalidCaptchaException.java @@ -0,0 +1,62 @@ +/* + * This file is part of seedbox . + * + * seedbox is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * seedbox is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with seedbox. If not, see . + */ +package com.rogiel.httpchannel.service.exception; + +import com.rogiel.httpchannel.service.captcha.CaptchaResolver; + +/** + * Exception thrown if the {@link CaptchaResolver} has returned an invalid + * captcha + * + * @author Rogiel + */ +public class DownloadInvalidCaptchaException extends DownloadServiceException { + private static final long serialVersionUID = 1L; + + /** + * Creates a new empty instance of this exception + */ + public DownloadInvalidCaptchaException() { + super(); + } + + /** + * @param message + * the message + * @param cause + * the root cause + */ + public DownloadInvalidCaptchaException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param message + * the message + */ + public DownloadInvalidCaptchaException(String message) { + super(message); + } + + /** + * @param cause + * the root cause + */ + public DownloadInvalidCaptchaException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/rogiel/httpchannel/service/exception/DownloadLimitExceededException.java b/src/main/java/com/rogiel/httpchannel/service/exception/DownloadLimitExceededException.java new file mode 100644 index 0000000..3ce7209 --- /dev/null +++ b/src/main/java/com/rogiel/httpchannel/service/exception/DownloadLimitExceededException.java @@ -0,0 +1,59 @@ +/* + * This file is part of seedbox . + * + * seedbox is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * seedbox is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with seedbox. If not, see . + */ +package com.rogiel.httpchannel.service.exception; + +/** + * Exception thrown if the download limit has been exceeded. + * + * @author Rogiel + */ +public class DownloadLimitExceededException extends DownloadServiceException { + private static final long serialVersionUID = 1L; + + /** + * Creates a new empty instance of this exception + */ + public DownloadLimitExceededException() { + super(); + } + + /** + * @param message + * the message + * @param cause + * the root cause + */ + public DownloadLimitExceededException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param message + * the message + */ + public DownloadLimitExceededException(String message) { + super(message); + } + + /** + * @param cause + * the root cause + */ + public DownloadLimitExceededException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/rogiel/httpchannel/service/exception/DownloadLinkNotFoundException.java b/src/main/java/com/rogiel/httpchannel/service/exception/DownloadLinkNotFoundException.java new file mode 100644 index 0000000..aacf730 --- /dev/null +++ b/src/main/java/com/rogiel/httpchannel/service/exception/DownloadLinkNotFoundException.java @@ -0,0 +1,59 @@ +/* + * This file is part of seedbox . + * + * seedbox is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * seedbox is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with seedbox. If not, see . + */ +package com.rogiel.httpchannel.service.exception; + +/** + * Exception thrown if the direct download link could not be found. + * + * @author Rogiel + */ +public class DownloadLinkNotFoundException extends DownloadServiceException { + private static final long serialVersionUID = 1L; + + /** + * Creates a new empty instance of this exception + */ + public DownloadLinkNotFoundException() { + super(); + } + + /** + * @param message + * the message + * @param cause + * the root cause + */ + public DownloadLinkNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param message + * the message + */ + public DownloadLinkNotFoundException(String message) { + super(message); + } + + /** + * @param cause + * the root cause + */ + public DownloadLinkNotFoundException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/rogiel/httpchannel/service/exception/DownloadServiceException.java b/src/main/java/com/rogiel/httpchannel/service/exception/DownloadServiceException.java new file mode 100644 index 0000000..daa16fe --- /dev/null +++ b/src/main/java/com/rogiel/httpchannel/service/exception/DownloadServiceException.java @@ -0,0 +1,51 @@ +/* + * This file is part of seedbox . + * + * seedbox is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * seedbox is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with seedbox. If not, see . + */ +package com.rogiel.httpchannel.service.exception; + +/** + * @author Rogiel + * + */ +public class DownloadServiceException extends ChannelServiceException { + private static final long serialVersionUID = 1L; + + public DownloadServiceException() { + super(); + } + + /** + * @param message + * @param cause + */ + public DownloadServiceException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param message + */ + public DownloadServiceException(String message) { + super(message); + } + + /** + * @param cause + */ + public DownloadServiceException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/rogiel/httpchannel/service/exception/UploadLinkNotFoundException.java b/src/main/java/com/rogiel/httpchannel/service/exception/UploadLinkNotFoundException.java new file mode 100644 index 0000000..5540877 --- /dev/null +++ b/src/main/java/com/rogiel/httpchannel/service/exception/UploadLinkNotFoundException.java @@ -0,0 +1,59 @@ +/* + * This file is part of seedbox . + * + * seedbox is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * seedbox is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with seedbox. If not, see . + */ +package com.rogiel.httpchannel.service.exception; + +/** + * Exception thrown if the download link could not be located after the upload. + * + * @author Rogiel + */ +public class UploadLinkNotFoundException extends UploadServiceException { + private static final long serialVersionUID = 1L; + + /** + * Creates a new empty instance of this exception + */ + public UploadLinkNotFoundException() { + super(); + } + + /** + * @param message + * the message + * @param cause + * the root cause + */ + public UploadLinkNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param message + * the message + */ + public UploadLinkNotFoundException(String message) { + super(message); + } + + /** + * @param cause + * the root cause + */ + public UploadLinkNotFoundException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/rogiel/httpchannel/service/exception/UploadServiceException.java b/src/main/java/com/rogiel/httpchannel/service/exception/UploadServiceException.java new file mode 100644 index 0000000..54166cd --- /dev/null +++ b/src/main/java/com/rogiel/httpchannel/service/exception/UploadServiceException.java @@ -0,0 +1,51 @@ +/* + * This file is part of seedbox . + * + * seedbox is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * seedbox is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with seedbox. If not, see . + */ +package com.rogiel.httpchannel.service.exception; + +/** + * @author Rogiel + * + */ +public class UploadServiceException extends ChannelServiceException { + private static final long serialVersionUID = 1L; + + public UploadServiceException() { + super(); + } + + /** + * @param message + * @param cause + */ + public UploadServiceException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param message + */ + public UploadServiceException(String message) { + super(message); + } + + /** + * @param cause + */ + public UploadServiceException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/rogiel/httpchannel/service/impl/HotFileService.java b/src/main/java/com/rogiel/httpchannel/service/impl/HotFileService.java index 2d96cd4..6ff60e8 100644 --- a/src/main/java/com/rogiel/httpchannel/service/impl/HotFileService.java +++ b/src/main/java/com/rogiel/httpchannel/service/impl/HotFileService.java @@ -24,7 +24,6 @@ import java.util.regex.Pattern; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; -import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; @@ -54,6 +53,7 @@ import com.rogiel.httpchannel.service.channel.InputStreamDownloadChannel; import com.rogiel.httpchannel.service.channel.LinkedUploadChannel; import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback; import com.rogiel.httpchannel.service.config.ServiceConfiguration; +import com.rogiel.httpchannel.service.exception.AuthenticationInvalidCredentialException; import com.rogiel.httpchannel.service.impl.HotFileService.HotFileServiceConfiguration; import com.rogiel.httpchannel.util.HttpClientUtils; import com.rogiel.httpchannel.util.PatternUtils; @@ -73,20 +73,35 @@ public class HotFileService extends private static final Pattern DOWNLOAD_DIRECT_LINK_PATTERN = Pattern .compile("http://hotfile\\.com/get/([0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([^\"]*)"); - private static final Pattern DOWNLOAD_TIMER = Pattern - .compile("timerend=d\\.getTime\\(\\)\\+([0-9]*);"); + // private static final Pattern DOWNLOAD_TIMER = Pattern + // .compile("timerend=d\\.getTime\\(\\)\\+([0-9]*);"); // private static final Pattern DOWNLOAD_FILESIZE = Pattern // .compile("[0-9]*(\\.[0-9]*)? (K|M|G)B"); private static final Pattern DOWNLOAD_URL_PATTERN = Pattern .compile("http://hotfile\\.com/dl/([0-9]*)/([A-Za-z0-9]*)/([^\"]*)"); + // private static final Pattern FREE_DOWNLOAD_URL_PATTERN = Pattern + // .compile("/dl/([0-9]*)/([A-Za-z0-9]*)/([^\"]*)"); + // private static final Pattern DOWNLOAD_ACTION_PATTERN = Pattern + // .compile("name=action value=([A-Za-z0-9]*)"); + // private static final Pattern DOWNLOAD_TM_PATTERN = Pattern + // .compile("name=tm value=([A-Za-z0-9]*)"); + // private static final Pattern DOWNLOAD_TMHASH_PATTERN = Pattern + // .compile("name=tmhash value=([A-Za-z0-9]*)"); + // private static final Pattern DOWNLOAD_WAIT_PATTERN = Pattern + // .compile("name=wait value=([A-Za-z0-9]*)"); + // private static final Pattern DOWNLOAD_WAITHASH_PATTERN = Pattern + // .compile("name=waithash value=([A-Za-z0-9]*)"); + // private static final Pattern DOWNLOAD_UPIDHASH_PATTERN = Pattern + // .compile("name=upidhash value=([A-Za-z0-9]*)"); + public HotFileService(final HotFileServiceConfiguration configuration) { super(configuration); } @Override - public String getId() { + public String getID() { return "hotfile"; } @@ -137,8 +152,6 @@ public class HotFileService extends @Override public CapabilityMatrix getDownloadCapabilities() { return new CapabilityMatrix( - DownloaderCapability.UNAUTHENTICATED_DOWNLOAD, - DownloaderCapability.NON_PREMIUM_ACCOUNT_DOWNLOAD, DownloaderCapability.PREMIUM_ACCOUNT_DOWNLOAD); } @@ -167,7 +180,7 @@ public class HotFileService extends @Override public UploadChannel upload() throws IOException { - final String body = HttpClientUtils.get(client, + final String body = HttpClientUtils.getString(client, "http://www.hotfile.com/"); final String url = PatternUtils.find(UPLOAD_URL_PATTERN, body); @@ -215,36 +228,75 @@ public class HotFileService extends final String content = IOUtils.toString(response.getEntity() .getContent()); - // try to find timer - final String stringTimer = PatternUtils.find(DOWNLOAD_TIMER, - content, 2, 1); - int timer = 0; - if (stringTimer != null && stringTimer.length() > 0) { - timer = Integer.parseInt(stringTimer); - } - if (timer > 0) { - cooldown(listener, timer); - return download(listener); - } + // // try to find timer + // final String stringTimer = PatternUtils.find(DOWNLOAD_TIMER, + // content, 2, 1); + // int timer = 0; + // if (stringTimer != null && stringTimer.length() > 0) { + // timer = Integer.parseInt(stringTimer); + // } + // if (timer > 0) { + // throw new DownloadLimitExceededException("Must wait " + timer + // + " milliseconds"); + // } final String downloadUrl = PatternUtils.find( DOWNLOAD_DIRECT_LINK_PATTERN, content, 0); + // final String tmHash = PatternUtils.find(DOWNLOAD_TMHASH_PATTERN, + // content);F if (downloadUrl != null && downloadUrl.length() > 0) { final HttpGet downloadRequest = new HttpGet(downloadUrl); final HttpResponse downloadResponse = client .execute(downloadRequest); - final String filename = FilenameUtils.getName(downloadUrl); - final Header contentLengthHeader = downloadResponse - .getFirstHeader("Content-Length"); - long contentLength = -1; - if (contentLengthHeader != null) { - contentLength = Long - .valueOf(contentLengthHeader.getValue()); - } + final String filename = FilenameUtils.getName(downloadUrl); + long contentLength = getContentLength(downloadResponse); return new InputStreamDownloadChannel(downloadResponse .getEntity().getContent(), contentLength, filename); + // } else if (tmHash != null) { + // String dlUrl = PatternUtils.find(FREE_DOWNLOAD_URL_PATTERN, + // content); + // + // String action = PatternUtils.find(DOWNLOAD_ACTION_PATTERN, + // content, 1); + // int tm = PatternUtils.findInt(DOWNLOAD_TM_PATTERN, content, + // 1); + // int wait = PatternUtils.findInt(DOWNLOAD_WAIT_PATTERN, + // content, + // 1); + // String waitHash = + // PatternUtils.find(DOWNLOAD_WAITHASH_PATTERN, + // content, 1); + // String upId = PatternUtils.find(DOWNLOAD_UPIDHASH_PATTERN, + // content, 1); + // + // System.out.println("Wait time: "+wait); + // + // if (wait > 0) + // timer(listener, wait * 1000); + // + // final HttpPost downloadPost = new + // HttpPost("http://www.hotfile.com"+dlUrl); + // final List pairs = new + // ArrayList(); + // pairs.add(new BasicNameValuePair("action", action)); + // pairs.add(new BasicNameValuePair("tm", + // Integer.toString(tm))); + // pairs.add(new BasicNameValuePair("tmhash", tmHash)); + // pairs.add(new BasicNameValuePair("wait", + // Integer.toString(wait))); + // pairs.add(new BasicNameValuePair("waithash", waitHash)); + // pairs.add(new BasicNameValuePair("upidhash", upId)); + // + // downloadPost.setEntity(new UrlEncodedFormEntity(pairs)); + // + // final HttpResponse downloadResponse = client + // .execute(downloadPost); + // System.out.println(IOUtils.toString(downloadResponse.getEntity().getContent())); + // + // return new InputStreamDownloadChannel(downloadResponse + // .getEntity().getContent(), 0, "haha"); } else { throw new IOException("Download link not found"); } @@ -259,7 +311,7 @@ public class HotFileService extends } @Override - public boolean login() throws ClientProtocolException, IOException { + public void login() throws ClientProtocolException, IOException { final HttpPost login = new HttpPost( "http://www.hotfile.com/login.php"); final MultipartEntity entity = new MultipartEntity(); @@ -272,12 +324,11 @@ public class HotFileService extends String response = HttpClientUtils.execute(client, login); if (response.toLowerCase().contains( credential.getUsername().toLowerCase())) - return true; - return false; + throw new AuthenticationInvalidCredentialException(); } @Override - public boolean logout() throws IOException { + public void logout() throws IOException { final HttpPost logout = new HttpPost( "http://www.megaupload.com/?c=account"); final MultipartEntity entity = new MultipartEntity(); @@ -287,8 +338,6 @@ public class HotFileService extends HttpClientUtils.execute(client, logout); // TODO check logout status - - return true; } } diff --git a/src/main/java/com/rogiel/httpchannel/service/impl/MegaUploadService.java b/src/main/java/com/rogiel/httpchannel/service/impl/MegaUploadService.java index 09c5b3f..1e5a98e 100644 --- a/src/main/java/com/rogiel/httpchannel/service/impl/MegaUploadService.java +++ b/src/main/java/com/rogiel/httpchannel/service/impl/MegaUploadService.java @@ -18,19 +18,23 @@ package com.rogiel.httpchannel.service.impl; import java.io.IOException; import java.net.URL; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.regex.Pattern; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; -import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.StringBody; +import org.apache.http.message.BasicNameValuePair; import com.rogiel.httpchannel.service.AbstractDownloader; import com.rogiel.httpchannel.service.AbstractHttpService; @@ -55,6 +59,10 @@ import com.rogiel.httpchannel.service.channel.LinkedUploadChannel; import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback; import com.rogiel.httpchannel.service.config.ServiceConfiguration; import com.rogiel.httpchannel.service.config.ServiceConfigurationProperty; +import com.rogiel.httpchannel.service.exception.AuthenticationInvalidCredentialException; +import com.rogiel.httpchannel.service.exception.DownloadLimitExceededException; +import com.rogiel.httpchannel.service.exception.DownloadLinkNotFoundException; +import com.rogiel.httpchannel.service.exception.UploadLinkNotFoundException; import com.rogiel.httpchannel.service.impl.MegaUploadService.MegaUploadServiceConfiguration; import com.rogiel.httpchannel.util.HttpClientUtils; import com.rogiel.httpchannel.util.PatternUtils; @@ -87,7 +95,7 @@ public class MegaUploadService extends } @Override - public String getId() { + public String getID() { return "megaupload"; } @@ -111,7 +119,7 @@ public class MegaUploadService extends public long getMaximumFilesize() { return 1 * 1024 * 1024 * 1024; } - + @Override public String[] getSupportedExtensions() { return null; @@ -171,7 +179,7 @@ public class MegaUploadService extends @Override public UploadChannel upload() throws IOException { - final String body = HttpClientUtils.get(client, + final String body = HttpClientUtils.getString(client, "http://www.megaupload.com/multiupload/"); final String url = PatternUtils.find(UPLOAD_URL_PATTERN, body); @@ -196,8 +204,11 @@ public class MegaUploadService extends @Override public String finish() throws IOException { try { - return PatternUtils.find(DOWNLOAD_URL_PATTERN, + String link = PatternUtils.find(DOWNLOAD_URL_PATTERN, uploadFuture.get()); + if (link == null) + throw new UploadLinkNotFoundException(); + return link; } catch (InterruptedException e) { return null; } catch (ExecutionException e) { @@ -216,18 +227,32 @@ public class MegaUploadService extends @Override public DownloadChannel download(DownloadListener listener) throws IOException { - final HttpGet request = new HttpGet(url.toString()); - final HttpResponse response = client.execute(request); + HttpResponse response = HttpClientUtils.get(client, url.toString()); + + // disable direct downloads, we don't support them! + if (response.getEntity().getContentType().getValue() + .equals("application/octet-stream")) { + final HttpPost updateAutoDownload = new HttpPost( + "http://www.megaupload.com/?c=account"); + final List pairs = new ArrayList(); + pairs.add(new BasicNameValuePair("do", "directdownloads")); + pairs.add(new BasicNameValuePair("accountupdate", "1")); + pairs.add(new BasicNameValuePair("set_ddl", "0")); + updateAutoDownload.setEntity(new UrlEncodedFormEntity(pairs)); + + // close connection + response.getEntity().getContent().close(); + + // execute and re-request download + response = HttpClientUtils.get(client, url.toString()); + } + final String content = IOUtils.toString(response.getEntity() .getContent()); // try to find timer - final String stringTimer = PatternUtils.find(DOWNLOAD_TIMER, - content, 1); - int timer = 0; - if (stringTimer != null && stringTimer.length() > 0) { - timer = Integer.parseInt(stringTimer); - } + int timer = parseTimer(PatternUtils + .find(DOWNLOAD_TIMER, content, 1)); if (timer > 0 && configuration.respectWaitTime()) { timer(listener, timer * 1000); } @@ -241,28 +266,19 @@ public class MegaUploadService extends if (downloadResponse.getStatusLine().getStatusCode() == HttpStatus.SC_FORBIDDEN || downloadResponse.getStatusLine().getStatusCode() == HttpStatus.SC_SERVICE_UNAVAILABLE) { downloadResponse.getEntity().getContent().close(); - if (cooldown(listener, 60 * 1000)) - return download(listener); // retry download + throw new DownloadLimitExceededException("HTTP " + + downloadResponse.getStatusLine().getStatusCode() + + " response"); } else { final String filename = FilenameUtils.getName(downloadUrl); - // listener.fileName(filename); - - final Header contentLengthHeader = downloadResponse - .getFirstHeader("Content-Length"); - long contentLength = -1; - if (contentLengthHeader != null) { - contentLength = Long.valueOf(contentLengthHeader - .getValue()); - // listener.fileSize(contentLength); - } + final long contentLength = getContentLength(downloadResponse); return new InputStreamDownloadChannel(downloadResponse .getEntity().getContent(), contentLength, filename); } } else { - throw new IOException("Download link not found"); + throw new DownloadLinkNotFoundException(); } - throw new IOException("Unknown error"); } } @@ -274,7 +290,7 @@ public class MegaUploadService extends } @Override - public boolean login() throws IOException { + public void login() throws IOException { final HttpPost login = new HttpPost( "http://www.megaupload.com/?c=login"); final MultipartEntity entity = new MultipartEntity(); @@ -287,12 +303,11 @@ public class MegaUploadService extends final String response = HttpClientUtils.execute(client, login); if (response.contains("Username and password do " + "not match. Please try again!")) - return false; - return true; + throw new AuthenticationInvalidCredentialException(); } @Override - public boolean logout() throws IOException { + public void logout() throws IOException { final HttpPost logout = new HttpPost( "http://www.megaupload.com/?c=account"); final MultipartEntity entity = new MultipartEntity(); @@ -302,8 +317,6 @@ public class MegaUploadService extends HttpClientUtils.execute(client, logout); // TODO check logout status - - return true; } } diff --git a/src/main/java/com/rogiel/httpchannel/util/HttpClientUtils.java b/src/main/java/com/rogiel/httpchannel/util/HttpClientUtils.java index b0417f8..d8d88f5 100644 --- a/src/main/java/com/rogiel/httpchannel/util/HttpClientUtils.java +++ b/src/main/java/com/rogiel/httpchannel/util/HttpClientUtils.java @@ -33,8 +33,14 @@ public class HttpClientUtils { private static final ExecutorService threadPool = Executors .newCachedThreadPool(); - public static String get(HttpClient client, String url) throws IOException { - return execute(client, new HttpGet(url)); + public static HttpResponse get(HttpClient client, String url) + throws IOException { + return client.execute(new HttpGet(url)); + } + + public static String getString(HttpClient client, String url) + throws IOException { + return toString(get(client, url)); } public static String execute(HttpClient client, HttpUriRequest request) diff --git a/src/main/java/com/rogiel/httpchannel/util/PatternUtils.java b/src/main/java/com/rogiel/httpchannel/util/PatternUtils.java index fab5403..06e1d97 100644 --- a/src/main/java/com/rogiel/httpchannel/util/PatternUtils.java +++ b/src/main/java/com/rogiel/httpchannel/util/PatternUtils.java @@ -24,6 +24,11 @@ public class PatternUtils { return find(pattern, text, 0); } + public static int findInt(Pattern pattern, String text, int n) { + String found = find(pattern, text, n); + return (found != null ? Integer.parseInt(found) : 0); + } + public static String find(Pattern pattern, String text, int n) { final Matcher matcher = pattern.matcher(text); if (matcher.find()) { diff --git a/src/test/java/com/rogiel/httpchannel/service/impl/HotFileServiceTest.java b/src/test/java/com/rogiel/httpchannel/service/impl/HotFileServiceTest.java index d882c97..6de15bb 100644 --- a/src/test/java/com/rogiel/httpchannel/service/impl/HotFileServiceTest.java +++ b/src/test/java/com/rogiel/httpchannel/service/impl/HotFileServiceTest.java @@ -41,14 +41,13 @@ import org.junit.Test; import com.rogiel.httpchannel.service.AuthenticationService; import com.rogiel.httpchannel.service.Credential; import com.rogiel.httpchannel.service.DownloadChannel; -import com.rogiel.httpchannel.service.DownloadListener; import com.rogiel.httpchannel.service.DownloadService; import com.rogiel.httpchannel.service.Service; import com.rogiel.httpchannel.service.UploadChannel; import com.rogiel.httpchannel.service.UploadService; import com.rogiel.httpchannel.service.UploaderCapability; -import com.rogiel.httpchannel.service.captcha.Captcha; import com.rogiel.httpchannel.service.config.ServiceConfigurationHelper; +import com.rogiel.httpchannel.service.exception.AuthenticationInvalidCredentialException; import com.rogiel.httpchannel.service.impl.HotFileService.HotFileServiceConfiguration; public class HotFileServiceTest { @@ -87,19 +86,19 @@ public class HotFileServiceTest { @Test public void testServiceId() { System.out.println("Service: " + service.toString()); - assertEquals("hotfile", service.getId()); + assertEquals("hotfile", service.getID()); } @Test public void testValidAuthenticator() throws IOException { - Assert.assertTrue(((AuthenticationService) service).getAuthenticator( - new Credential(VALID_USERNAME, VALID_PASSWORD)).login()); + ((AuthenticationService) service).getAuthenticator( + new Credential(VALID_USERNAME, VALID_PASSWORD)).login(); } - @Test + @Test(expected = AuthenticationInvalidCredentialException.class) public void testInvalidAuthenticator() throws IOException { - Assert.assertFalse(((AuthenticationService) service).getAuthenticator( - new Credential(INVALID_USERNAME, INVALID_PASSWORD)).login()); + ((AuthenticationService) service).getAuthenticator( + new Credential(INVALID_USERNAME, INVALID_PASSWORD)).login(); } @Test @@ -130,8 +129,8 @@ public class HotFileServiceTest { ((UploadService) service).getUploadCapabilities().has( UploaderCapability.PREMIUM_ACCOUNT_UPLOAD)); - Assert.assertTrue(((AuthenticationService) service).getAuthenticator( - new Credential(VALID_USERNAME, VALID_PASSWORD)).login()); + ((AuthenticationService) service).getAuthenticator( + new Credential(VALID_USERNAME, VALID_PASSWORD)).login(); final UploadChannel channel = ((UploadService) service).getUploader( "simulado_2010_1_res_all.zip", @@ -154,20 +153,7 @@ public class HotFileServiceTest { .getDownloader( new URL( "http://hotfile.com/dl/129251605/9b4faf2/simulado_2010_1_res_all.zip.html")) - .download(new DownloadListener() { - @Override - public boolean timer(long time, TimerWaitReason reason) { - System.out.println("Waiting " + time + " in " + reason); - // if (reason == TimerWaitReason.DOWNLOAD_TIMER) - // return true; - return true; - } - - @Override - public String captcha(Captcha captcha) { - return null; - } - }); + .download(null); final ByteArrayOutputStream bout = new ByteArrayOutputStream(); IOUtils.copy(Channels.newInputStream(channel), bout); System.out.println(bout.size()); @@ -176,28 +162,14 @@ public class HotFileServiceTest { @Test public void testLoggedInDownloader() throws IOException, MalformedURLException { - Assert.assertTrue(((AuthenticationService) service).getAuthenticator( - new Credential(VALID_USERNAME, VALID_PASSWORD)).login()); + ((AuthenticationService) service).getAuthenticator( + new Credential(VALID_USERNAME, VALID_PASSWORD)).login(); final DownloadChannel channel = ((DownloadService) service) .getDownloader( new URL( "http://hotfile.com/dl/129251605/9b4faf2/simulado_2010_1_res_all.zip.html")) - .download(new DownloadListener() { - @Override - public boolean timer(long time, TimerWaitReason reason) { - System.out.println("Waiting " + time + " in " + reason); - if (reason == TimerWaitReason.DOWNLOAD_TIMER) - return true; - return false; - } - - @Override - public String captcha(Captcha captcha) { - // TODO Auto-generated method stub - return null; - } - }); + .download(null); final ByteArrayOutputStream bout = new ByteArrayOutputStream(); IOUtils.copy(Channels.newInputStream(channel), bout); diff --git a/src/test/java/com/rogiel/httpchannel/service/impl/MegaUploadServiceTest.java b/src/test/java/com/rogiel/httpchannel/service/impl/MegaUploadServiceTest.java index 0b40f38..9396e7d 100644 --- a/src/test/java/com/rogiel/httpchannel/service/impl/MegaUploadServiceTest.java +++ b/src/test/java/com/rogiel/httpchannel/service/impl/MegaUploadServiceTest.java @@ -44,8 +44,8 @@ import com.rogiel.httpchannel.service.Service; import com.rogiel.httpchannel.service.UploadChannel; import com.rogiel.httpchannel.service.UploadService; import com.rogiel.httpchannel.service.UploaderCapability; -import com.rogiel.httpchannel.service.captcha.Captcha; import com.rogiel.httpchannel.service.config.ServiceConfigurationHelper; +import com.rogiel.httpchannel.service.exception.AuthenticationInvalidCredentialException; import com.rogiel.httpchannel.service.impl.MegaUploadService.MegaUploadServiceConfiguration; public class MegaUploadServiceTest { @@ -84,19 +84,19 @@ public class MegaUploadServiceTest { @Test public void testServiceId() { System.out.println("Service: " + service.toString()); - assertEquals("megaupload", service.getId()); + assertEquals("megaupload", service.getID()); } @Test public void testValidAuthenticator() throws IOException { - Assert.assertTrue(((AuthenticationService) service).getAuthenticator( - new Credential(VALID_USERNAME, VALID_PASSWORD)).login()); + ((AuthenticationService) service).getAuthenticator( + new Credential(VALID_USERNAME, VALID_PASSWORD)).login(); } - @Test + @Test(expected = AuthenticationInvalidCredentialException.class) public void testInvalidAuthenticator() throws IOException { - Assert.assertFalse(((AuthenticationService) service).getAuthenticator( - new Credential(INVALID_USERNAME, INVALID_PASSWORD)).login()); + ((AuthenticationService) service).getAuthenticator( + new Credential(INVALID_USERNAME, INVALID_PASSWORD)).login(); } @Test @@ -133,8 +133,8 @@ public class MegaUploadServiceTest { ((UploadService) service).getUploadCapabilities().has( UploaderCapability.PREMIUM_ACCOUNT_UPLOAD)); - Assert.assertTrue(((AuthenticationService) service).getAuthenticator( - new Credential(VALID_USERNAME, VALID_PASSWORD)).login()); + ((AuthenticationService) service).getAuthenticator( + new Credential(VALID_USERNAME, VALID_PASSWORD)).login(); final UploadChannel channel = ((UploadService) service).getUploader( "test.bin", 10, "Upload by httpchannel").upload(); @@ -158,21 +158,36 @@ public class MegaUploadServiceTest { } @Test - public void testDownloader() throws IOException, MalformedURLException { + public void testFreeDownloader() throws IOException, MalformedURLException { final DownloadChannel channel = ((DownloadService) service) .getDownloader(new URL("http://www.megaupload.com/?d=CVQKJ1KM")) .download(new DownloadListener() { @Override - public boolean timer(long time, TimerWaitReason reason) { - System.out.println("Waiting " + time + " in " + reason); + public boolean timer(long time) { + System.out.println("Waiting " + time); // if (reason == TimerWaitReason.DOWNLOAD_TIMER) // return true; return true; } + }); + final ByteArrayOutputStream bout = new ByteArrayOutputStream(); + IOUtils.copy(Channels.newInputStream(channel), bout); + System.out.println(bout.size()); + } + @Test + public void testPremiumDownloader() throws IOException, + MalformedURLException { + ((AuthenticationService) service).getAuthenticator( + new Credential(VALID_USERNAME, VALID_PASSWORD)).login(); + + final DownloadChannel channel = ((DownloadService) service) + .getDownloader(new URL("http://www.megaupload.com/?d=CVQKJ1KM")) + .download(new DownloadListener() { @Override - public String captcha(Captcha captcha) { - return null; + public boolean timer(long time) { + System.out.println("Waiting " + time); + return true; } }); final ByteArrayOutputStream bout = new ByteArrayOutputStream(); @@ -187,22 +202,15 @@ public class MegaUploadServiceTest { MegaUploadServiceConfiguration.class, new File( "src/test/resources/megaupload-nowait.properties"))); + @SuppressWarnings("unused") final DownloadChannel channel = ((DownloadService) service) .getDownloader(new URL("http://www.megaupload.com/?d=CVQKJ1KM")) .download(new DownloadListener() { @Override - public boolean timer(long time, TimerWaitReason reason) { - System.out.println("Waiting " + time + " in " + reason); - if (reason == TimerWaitReason.DOWNLOAD_TIMER) - return true; + public boolean timer(long time) { + System.out.println("Waiting " + time); return false; } - - @Override - public String captcha(Captcha captcha) { - // TODO Auto-generated method stub - return null; - } }); } }