mirror of
https://github.com/tonikelope/megabasterd.git
synced 2025-05-28 20:40:13 +02:00
Refactoring and cleaning
1.6
This commit is contained in:
parent
c8ae3bc4be
commit
f39da85605
@ -166,7 +166,7 @@ public final class AboutDialog extends javax.swing.JDialog {
|
|||||||
|
|
||||||
swingReflectionInvoke("setEnabled", check_version_button, false);
|
swingReflectionInvoke("setEnabled", check_version_button, false);
|
||||||
|
|
||||||
final AboutDialog main = this;
|
final AboutDialog tthis = this;
|
||||||
|
|
||||||
THREAD_POOL.execute(new Runnable(){
|
THREAD_POOL.execute(new Runnable(){
|
||||||
@Override
|
@Override
|
||||||
@ -186,7 +186,7 @@ public final class AboutDialog extends javax.swing.JDialog {
|
|||||||
|
|
||||||
if(((String)current_node.get("name")).contains("_"+VERSION.replaceAll(" *beta *", "")+".")) {
|
if(((String)current_node.get("name")).contains("_"+VERSION.replaceAll(" *beta *", "")+".")) {
|
||||||
|
|
||||||
JOptionPane.showMessageDialog(main, "You have the latest version ;)");
|
JOptionPane.showMessageDialog(tthis, "You have the latest version ;)");
|
||||||
|
|
||||||
new_version = false;
|
new_version = false;
|
||||||
|
|
||||||
@ -196,14 +196,14 @@ public final class AboutDialog extends javax.swing.JDialog {
|
|||||||
|
|
||||||
if(new_version) {
|
if(new_version) {
|
||||||
|
|
||||||
JOptionPane.showMessageDialog(main, "NEW VERSION IS AVAILABLE!");
|
JOptionPane.showMessageDialog(tthis, "NEW VERSION IS AVAILABLE!");
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
getLogger(AboutDialog.class.getName()).log(Level.SEVERE, null, ex);
|
getLogger(AboutDialog.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
swingReflectionInvoke("setEnabled", main.check_version_button, true);
|
swingReflectionInvoke("setEnabled", check_version_button, true);
|
||||||
|
|
||||||
}});
|
}});
|
||||||
|
|
||||||
|
@ -14,8 +14,6 @@ import static java.lang.Long.valueOf;
|
|||||||
import static java.lang.Math.ceil;
|
import static java.lang.Math.ceil;
|
||||||
import static java.lang.System.out;
|
import static java.lang.System.out;
|
||||||
import static java.lang.Thread.sleep;
|
import static java.lang.Thread.sleep;
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLConnection;
|
|
||||||
import java.nio.channels.FileChannel;
|
import java.nio.channels.FileChannel;
|
||||||
import java.security.InvalidAlgorithmParameterException;
|
import java.security.InvalidAlgorithmParameterException;
|
||||||
import java.security.InvalidKeyException;
|
import java.security.InvalidKeyException;
|
||||||
@ -36,11 +34,10 @@ import static megabasterd.CryptTools.genCrypter;
|
|||||||
import static megabasterd.DBTools.deleteDownload;
|
import static megabasterd.DBTools.deleteDownload;
|
||||||
import static megabasterd.DBTools.insertDownload;
|
import static megabasterd.DBTools.insertDownload;
|
||||||
import static megabasterd.DBTools.selectSettingValueFromDB;
|
import static megabasterd.DBTools.selectSettingValueFromDB;
|
||||||
import static megabasterd.MainPanel.CONNECTION_TIMEOUT;
|
|
||||||
import static megabasterd.MainPanel.THREAD_POOL;
|
import static megabasterd.MainPanel.THREAD_POOL;
|
||||||
import static megabasterd.MainPanel.USER_AGENT;
|
|
||||||
import static megabasterd.MiscTools.UrlBASE642Bin;
|
import static megabasterd.MiscTools.UrlBASE642Bin;
|
||||||
import static megabasterd.MiscTools.bin2i32a;
|
import static megabasterd.MiscTools.bin2i32a;
|
||||||
|
import static megabasterd.MiscTools.checkMegaDownloadUrl;
|
||||||
import static megabasterd.MiscTools.findFirstRegex;
|
import static megabasterd.MiscTools.findFirstRegex;
|
||||||
import static megabasterd.MiscTools.formatBytes;
|
import static megabasterd.MiscTools.formatBytes;
|
||||||
import static megabasterd.MiscTools.getWaitTimeExpBackOff;
|
import static megabasterd.MiscTools.getWaitTimeExpBackOff;
|
||||||
@ -855,30 +852,11 @@ public final class Download implements Transference, Runnable, SecureNotifiable
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean checkDownloadUrl(String string_url)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
URL url = new URL(string_url+"/0-0");
|
|
||||||
URLConnection connection = url.openConnection();
|
|
||||||
connection.setConnectTimeout(CONNECTION_TIMEOUT);
|
|
||||||
connection.setRequestProperty("User-Agent", USER_AGENT);
|
|
||||||
|
|
||||||
try (InputStream is = connection.getInputStream()) {
|
|
||||||
while(is.read()!=-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
}catch (Exception ex) {
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* OJO!! -> ESTO ESTÁ CAMBIADO Y NO COMPROBADO!! */
|
/* OJO!! -> ESTO ESTÁ CAMBIADO Y NO COMPROBADO!! */
|
||||||
public synchronized String getDownloadUrlForWorker() throws IOException
|
public synchronized String getDownloadUrlForWorker() throws IOException
|
||||||
{
|
{
|
||||||
if(_last_download_url != null && checkDownloadUrl(_last_download_url)) {
|
if(_last_download_url != null && checkMegaDownloadUrl(_last_download_url)) {
|
||||||
|
|
||||||
return _last_download_url;
|
return _last_download_url;
|
||||||
}
|
}
|
||||||
@ -905,7 +883,7 @@ public final class Download implements Transference, Runnable, SecureNotifiable
|
|||||||
download_url = MegaCrypterAPI.getMegaFileDownloadUrl(_url, _file_pass, _file_noexpire);
|
download_url = MegaCrypterAPI.getMegaFileDownloadUrl(_url, _file_pass, _file_noexpire);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(checkDownloadUrl(download_url)) {
|
if(checkMegaDownloadUrl(download_url)) {
|
||||||
|
|
||||||
_last_download_url = download_url;
|
_last_download_url = download_url;
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ public final class DownloadManager extends TransferenceManager {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
this._provision((Download)download, false);
|
_provision((Download)download, false);
|
||||||
|
|
||||||
secureNotify();
|
secureNotify();
|
||||||
|
|
||||||
@ -53,15 +53,13 @@ public final class DownloadManager extends TransferenceManager {
|
|||||||
|
|
||||||
System.out.println("Provision failed! Retrying in separated thread...");
|
System.out.println("Provision failed! Retrying in separated thread...");
|
||||||
|
|
||||||
final DownloadManager tthis = this;
|
|
||||||
|
|
||||||
THREAD_POOL.execute(new Runnable(){
|
THREAD_POOL.execute(new Runnable(){
|
||||||
@Override
|
@Override
|
||||||
public void run(){
|
public void run(){
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
tthis._provision((Download)download, true);
|
_provision((Download)download, true);
|
||||||
|
|
||||||
} catch (MegaAPIException | MegaCrypterAPIException ex1) {
|
} catch (MegaAPIException | MegaCrypterAPIException ex1) {
|
||||||
|
|
||||||
|
@ -269,23 +269,23 @@ public final class FolderLinkDialog extends javax.swing.JDialog {
|
|||||||
|
|
||||||
swingReflectionInvoke("setEnabled", file_tree, false);
|
swingReflectionInvoke("setEnabled", file_tree, false);
|
||||||
|
|
||||||
final FolderLinkDialog main = this;
|
|
||||||
|
|
||||||
THREAD_POOL.execute(new Runnable(){
|
THREAD_POOL.execute(new Runnable(){
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
main._loadMegaDirTree();
|
_loadMegaDirTree();
|
||||||
|
|
||||||
main._genDownloadLiks();
|
_genDownloadLiks();
|
||||||
|
|
||||||
swingReflectionInvoke("setEnabled", main.restore_button, true);
|
swingReflectionInvoke("setEnabled", restore_button, true);
|
||||||
|
|
||||||
swingReflectionInvoke("setVisible", main.restore_button, false);
|
swingReflectionInvoke("setVisible", restore_button, false);
|
||||||
|
|
||||||
swingReflectionInvoke("setEnabled", main.dance_button, true);
|
swingReflectionInvoke("setEnabled", dance_button, true);
|
||||||
|
|
||||||
swingReflectionInvoke("setEnabled", main.file_tree, true);
|
swingReflectionInvoke("setEnabled", file_tree, true);
|
||||||
|
|
||||||
}});
|
}});
|
||||||
}//GEN-LAST:event_restore_buttonActionPerformed
|
}//GEN-LAST:event_restore_buttonActionPerformed
|
||||||
|
@ -1,125 +1,211 @@
|
|||||||
package megabasterd;
|
package megabasterd;
|
||||||
|
|
||||||
|
import com.sun.net.httpserver.Headers;
|
||||||
|
import com.sun.net.httpserver.HttpExchange;
|
||||||
|
import com.sun.net.httpserver.HttpHandler;
|
||||||
import com.sun.net.httpserver.HttpServer;
|
import com.sun.net.httpserver.HttpServer;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import static java.awt.Frame.NORMAL;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLConnection;
|
import java.net.URLConnection;
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.logging.Level;
|
||||||
|
import static java.util.logging.Level.SEVERE;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import static java.util.logging.Logger.getLogger;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
import javax.crypto.CipherInputStream;
|
||||||
import static megabasterd.MainPanel.STREAMER_PORT;
|
import static megabasterd.MainPanel.STREAMER_PORT;
|
||||||
|
import static megabasterd.MainPanel.THREAD_POOL;
|
||||||
|
import static megabasterd.MiscTools.checkMegaDownloadUrl;
|
||||||
import static megabasterd.MiscTools.findFirstRegex;
|
import static megabasterd.MiscTools.findFirstRegex;
|
||||||
import static megabasterd.MiscTools.getWaitTimeExpBackOff;
|
import static megabasterd.MiscTools.getWaitTimeExpBackOff;
|
||||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||||
|
|
||||||
|
|
||||||
public final class KissVideoStreamServer {
|
public final class KissVideoStreamServer implements HttpHandler, SecureNotifiable {
|
||||||
|
|
||||||
|
public static final int WORKER_STATUS_FILE_INFO=0x01;
|
||||||
|
public static final int WORKER_STATUS_CONNECT=0x02;
|
||||||
|
public static final int WORKER_STATUS_STREAM=0x03;
|
||||||
|
public static final int WORKER_STATUS_RETRY=0x04;
|
||||||
|
public static final int WORKER_STATUS_EXIT=0x05;
|
||||||
|
|
||||||
public static final int TIMEOUT=30000;
|
|
||||||
public static final int EXP_BACKOFF_BASE=2;
|
|
||||||
public static final int EXP_BACKOFF_SECS_RETRY=1;
|
|
||||||
public static final int EXP_BACKOFF_MAX_WAIT_TIME=128;
|
|
||||||
private HttpServer _httpserver;
|
private HttpServer _httpserver;
|
||||||
private final MainPanelView _main_panel;
|
private final MainPanel _main_panel;
|
||||||
private final ConcurrentHashMap<String, String[]> _link_cache;
|
private final ConcurrentHashMap<String, String[]> _link_cache;
|
||||||
private final ConcurrentHashMap<Thread, Boolean> _working;
|
private final ConcurrentHashMap<Thread, Integer> _working_threads;
|
||||||
private final ContentType _ctype;
|
private final ContentType _ctype;
|
||||||
private KissVideoStreamServerHandler _http_handler;
|
private boolean _notified;
|
||||||
public KissVideoStreamServer(MainPanelView panel) {
|
private final Object _secure_notify_lock;
|
||||||
|
|
||||||
|
public KissVideoStreamServer(MainPanel panel) {
|
||||||
_main_panel = panel;
|
_main_panel = panel;
|
||||||
_link_cache = new ConcurrentHashMap();
|
_link_cache = new ConcurrentHashMap();
|
||||||
_working = new ConcurrentHashMap();
|
_working_threads = new ConcurrentHashMap();
|
||||||
_ctype = new ContentType();
|
_ctype = new ContentType();
|
||||||
|
_notified=false;
|
||||||
|
_secure_notify_lock = new Object();
|
||||||
}
|
}
|
||||||
|
|
||||||
public KissVideoStreamServerHandler getHandler()
|
public MainPanel getMain_panel() {
|
||||||
{
|
|
||||||
return _http_handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MainPanelView getPanel()
|
|
||||||
{
|
|
||||||
return _main_panel;
|
return _main_panel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ContentType getCtype()
|
public ConcurrentHashMap<String, String[]> getLink_cache() {
|
||||||
{
|
return _link_cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConcurrentHashMap<Thread, Integer> getWorking_threads() {
|
||||||
|
return _working_threads;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ContentType getCtype() {
|
||||||
return _ctype;
|
return _ctype;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConcurrentHashMap getStreaming()
|
@Override
|
||||||
|
public void secureNotify()
|
||||||
{
|
{
|
||||||
return _working;
|
synchronized(_secure_notify_lock) {
|
||||||
|
|
||||||
|
_notified = true;
|
||||||
|
|
||||||
|
_secure_notify_lock.notify();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isWorking()
|
@Override
|
||||||
{
|
public void secureWait() {
|
||||||
return !_working.isEmpty();
|
|
||||||
|
synchronized(_secure_notify_lock)
|
||||||
|
{
|
||||||
|
while(!_notified) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
_secure_notify_lock.wait();
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
getLogger(Download.class.getName()).log(SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_notified = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void secureNotifyAll() {
|
||||||
|
|
||||||
|
synchronized(_secure_notify_lock) {
|
||||||
|
|
||||||
|
_notified = true;
|
||||||
|
|
||||||
|
_secure_notify_lock.notifyAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void start(int port, String context) throws IOException
|
public void start(int port, String context) throws IOException
|
||||||
{
|
{
|
||||||
|
swingReflectionInvoke("setForeground", _main_panel.getView().getKiss_server_status(), new Color(0,128,0));
|
||||||
|
|
||||||
|
swingReflectionInvoke("setText", _main_panel.getView().getKiss_server_status(), "Kissvideostreamer on localhost:"+STREAMER_PORT+" (Waiting for request...)");
|
||||||
|
|
||||||
_httpserver = HttpServer.create(new InetSocketAddress(InetAddress.getLoopbackAddress(), port), 0);
|
_httpserver = HttpServer.create(new InetSocketAddress(InetAddress.getLoopbackAddress(), port), 0);
|
||||||
printStatusOK("Kissvideostreamer on localhost:"+STREAMER_PORT+" (Waiting for request...)");
|
|
||||||
_httpserver.createContext(context, (_http_handler = new KissVideoStreamServerHandler(this, _main_panel)));
|
_httpserver.createContext(context, this);
|
||||||
_httpserver.setExecutor(Executors.newCachedThreadPool());
|
|
||||||
|
_httpserver.setExecutor(THREAD_POOL);
|
||||||
|
|
||||||
_httpserver.start();
|
_httpserver.start();
|
||||||
}
|
|
||||||
|
|
||||||
public void stop()
|
|
||||||
{
|
|
||||||
_httpserver.stop(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void printStatusError(String message)
|
|
||||||
{
|
|
||||||
swingReflectionInvoke("setForeground", _main_panel.getKiss_server_status(), Color.red);
|
|
||||||
swingReflectionInvoke("setText", _main_panel.getKiss_server_status(), message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void printStatusOK(String message)
|
|
||||||
{
|
|
||||||
swingReflectionInvoke("setForeground", _main_panel.getKiss_server_status(), new Color(0,128,0));
|
|
||||||
swingReflectionInvoke("setText", _main_panel.getKiss_server_status(), message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String[] getFromLinkCache(String link)
|
|
||||||
{
|
|
||||||
return _link_cache.containsKey(link)?_link_cache.get(link):null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateLinkCache(String link, String[] info) {
|
|
||||||
|
|
||||||
_link_cache.put(link, info);
|
THREAD_POOL.execute(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
|
||||||
|
secureWait();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
Logger.getLogger(KissVideoStreamServer.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_working_threads.isEmpty()) {
|
||||||
|
|
||||||
|
swingReflectionInvoke("setExtendedState", _main_panel.getView(), NORMAL);
|
||||||
|
|
||||||
|
swingReflectionInvoke("setVisible", _main_panel.getView(), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeFromLinkCache(String link) {
|
private void updateStatus(Integer new_status) {
|
||||||
_link_cache.remove(link);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String[] getMegaFileMetadata(String link, MainPanelView panel) throws IOException, InterruptedException
|
|
||||||
{
|
|
||||||
|
|
||||||
|
if(new_status != WORKER_STATUS_EXIT) {
|
||||||
|
|
||||||
|
getWorking_threads().put(Thread.currentThread(), new_status);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
getWorking_threads().remove(Thread.currentThread());
|
||||||
|
}
|
||||||
|
|
||||||
|
int conta_info=0, conta_connect=0, conta_stream=0, conta_retry=0;
|
||||||
|
|
||||||
|
for(Integer thread_status:getWorking_threads().values()) {
|
||||||
|
|
||||||
|
switch(thread_status) {
|
||||||
|
|
||||||
|
case WORKER_STATUS_FILE_INFO:
|
||||||
|
conta_info++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WORKER_STATUS_CONNECT:
|
||||||
|
conta_connect++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WORKER_STATUS_STREAM:
|
||||||
|
conta_stream++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WORKER_STATUS_RETRY:
|
||||||
|
conta_retry++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String status="Kissvideostreamer on localhost:"+STREAMER_PORT+" Info: "+conta_info+" / Conn: "+conta_connect+" / Stream: "+conta_stream+" / Retry: "+conta_retry;
|
||||||
|
|
||||||
|
swingReflectionInvoke("setText", _main_panel.getView().getKiss_server_status(), status);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[] getMegaFileMetadata(String link, MainPanelView panel) throws IOException, InterruptedException
|
||||||
|
{
|
||||||
String[] file_info=null;
|
String[] file_info=null;
|
||||||
int retry=0, error_code=0;
|
int retry=0;
|
||||||
boolean error;
|
boolean error;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
updateStatus(WORKER_STATUS_FILE_INFO);
|
||||||
|
|
||||||
error=false;
|
error=false;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if( findFirstRegex("://mega(\\.co)?\\.nz/", link, 0) != null)
|
||||||
|
|
||||||
if( findFirstRegex("://mega(\\.co)?\\.nz/", link, 0) != null)
|
|
||||||
{
|
{
|
||||||
MegaAPI ma = new MegaAPI();
|
MegaAPI ma = new MegaAPI();
|
||||||
|
|
||||||
@ -128,17 +214,14 @@ public final class KissVideoStreamServer {
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
file_info = MegaCrypterAPI.getMegaFileMetadata(link, panel);
|
file_info = MegaCrypterAPI.getMegaFileMetadata(link, panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch(MegaAPIException | MegaCrypterAPIException e)
|
catch(MegaAPIException | MegaCrypterAPIException e)
|
||||||
{
|
{
|
||||||
error=true;
|
error=true;
|
||||||
|
|
||||||
error_code = Integer.parseInt(e.getMessage());
|
switch(Integer.parseInt(e.getMessage()))
|
||||||
|
|
||||||
switch(error_code)
|
|
||||||
{
|
{
|
||||||
case -2:
|
case -2:
|
||||||
throw new IOException("Mega link is not valid!");
|
throw new IOException("Mega link is not valid!");
|
||||||
@ -156,23 +239,17 @@ public final class KissVideoStreamServer {
|
|||||||
throw new IOException("MegaCrypter link has expired!");
|
throw new IOException("MegaCrypter link has expired!");
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
|
updateStatus(WORKER_STATUS_RETRY);
|
||||||
|
|
||||||
for(long i=getWaitTimeExpBackOff(retry++); i>0; i--)
|
for(long i=getWaitTimeExpBackOff(retry++); i>0; i--)
|
||||||
{
|
{
|
||||||
if(error_code == -18)
|
|
||||||
{
|
|
||||||
printStatusError("File temporarily unavailable! (Retrying in "+i+" secs...)");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printStatusError("Mega/MC APIException error "+e.getMessage()+" (Retrying in "+i+" secs...)");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
} catch (InterruptedException ex) {}
|
} catch (InterruptedException ex) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch(Exception ex) {
|
} catch(Exception ex) {
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -183,65 +260,36 @@ public final class KissVideoStreamServer {
|
|||||||
return file_info;
|
return file_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getMegaFileDownloadUrl(String link, String pass_hash, String noexpire_token) throws IOException, InterruptedException
|
private String getMegaFileDownloadUrl(String link, String pass_hash, String noexpire_token) throws IOException, InterruptedException
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
String dl_url=null;
|
String dl_url=null;
|
||||||
int retry=0, error_code;
|
int retry=0;
|
||||||
boolean error;
|
boolean error;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
updateStatus(WORKER_STATUS_FILE_INFO);
|
||||||
|
|
||||||
error=false;
|
error=false;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if( findFirstRegex("://mega(\\.co)?\\.nz/", link, 0) != null)
|
||||||
|
{
|
||||||
|
MegaAPI ma = new MegaAPI();
|
||||||
|
|
||||||
|
dl_url = ma.getMegaFileDownloadUrl(link);
|
||||||
if( findFirstRegex("://mega(\\.co)?\\.nz/", link, 0) != null)
|
}
|
||||||
{
|
else
|
||||||
MegaAPI ma = new MegaAPI();
|
{
|
||||||
|
dl_url = MegaCrypterAPI.getMegaFileDownloadUrl(link,pass_hash,noexpire_token);
|
||||||
dl_url = ma.getMegaFileDownloadUrl(link);
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dl_url = MegaCrypterAPI.getMegaFileDownloadUrl(link,pass_hash,noexpire_token);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch(MegaAPIException e)
|
catch(MegaAPIException | MegaCrypterAPIException e)
|
||||||
{
|
{
|
||||||
error=true;
|
error=true;
|
||||||
|
|
||||||
error_code = Integer.parseInt(e.getMessage());
|
switch(Integer.parseInt(e.getMessage()))
|
||||||
|
|
||||||
for(long i=getWaitTimeExpBackOff(retry++); i>0; i--)
|
|
||||||
{
|
|
||||||
if(error_code == -18)
|
|
||||||
{
|
|
||||||
printStatusError("File temporarily unavailable! (Retrying in "+i+" secs...)");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printStatusError("MegaAPIException error "+e.getMessage()+" (Retrying in "+i+" secs...)");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Thread.sleep(1000);
|
|
||||||
} catch (InterruptedException ex) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(MegaCrypterAPIException e)
|
|
||||||
{
|
|
||||||
error=true;
|
|
||||||
|
|
||||||
error_code = Integer.parseInt(e.getMessage());
|
|
||||||
|
|
||||||
switch(error_code)
|
|
||||||
{
|
{
|
||||||
case 22:
|
case 22:
|
||||||
throw new IOException("MegaCrypter link is not valid!");
|
throw new IOException("MegaCrypter link is not valid!");
|
||||||
@ -253,17 +301,11 @@ public final class KissVideoStreamServer {
|
|||||||
throw new IOException("MegaCrypter link has expired!");
|
throw new IOException("MegaCrypter link has expired!");
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
|
updateStatus(WORKER_STATUS_RETRY);
|
||||||
|
|
||||||
for(long i=getWaitTimeExpBackOff(retry++); i>0; i--)
|
for(long i=getWaitTimeExpBackOff(retry++); i>0; i--)
|
||||||
{
|
{
|
||||||
if(error_code == -18)
|
|
||||||
{
|
|
||||||
printStatusError("File temporarily unavailable! (Retrying in "+i+" secs...)");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printStatusError("MegaCrypterAPIException error "+e.getMessage()+" (Retrying in "+i+" secs...)");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
} catch (InterruptedException ex) {}
|
} catch (InterruptedException ex) {}
|
||||||
@ -275,28 +317,8 @@ public final class KissVideoStreamServer {
|
|||||||
|
|
||||||
return dl_url;
|
return dl_url;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean checkDownloadUrl(String string_url)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
URL url = new URL(string_url+"/0-0");
|
|
||||||
URLConnection connection = url.openConnection();
|
|
||||||
connection.setConnectTimeout(TIMEOUT);
|
|
||||||
connection.setRequestProperty("User-Agent", MainPanel.USER_AGENT);
|
|
||||||
connection.setRequestProperty("Connection", "close");
|
|
||||||
try (InputStream is = connection.getInputStream()) {
|
|
||||||
while(is.read()!=-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
}catch (Exception ex) {
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public long[] parseRangeHeader(String header)
|
private long[] parseRangeHeader(String header)
|
||||||
{
|
{
|
||||||
Pattern pattern = Pattern.compile("bytes\\=([0-9]+)\\-([0-9]+)?");
|
Pattern pattern = Pattern.compile("bytes\\=([0-9]+)\\-([0-9]+)?");
|
||||||
|
|
||||||
@ -319,16 +341,238 @@ public final class KissVideoStreamServer {
|
|||||||
return ranges;
|
return ranges;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String cookRangeUrl(String url, long[] ranges, int sync_bytes)
|
private String cookRangeUrl(String url, long[] ranges, int sync_bytes)
|
||||||
{
|
{
|
||||||
return url+"/"+String.valueOf(ranges[0]-sync_bytes)+(ranges[1]>=0?"-"+String.valueOf(ranges[1]):"");
|
return url+"/"+String.valueOf(ranges[0]-sync_bytes)+(ranges[1]>=0?"-"+String.valueOf(ranges[1]):"");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void restoreMainWindow() {
|
@Override
|
||||||
|
public void handle(HttpExchange xchg) throws IOException {
|
||||||
_main_panel.setExtendedState(javax.swing.JFrame.NORMAL);
|
|
||||||
swingReflectionInvoke("setVisible", _main_panel, true);
|
long clength;
|
||||||
}
|
|
||||||
|
OutputStream os;
|
||||||
|
|
||||||
|
CipherInputStream cis = null;
|
||||||
|
|
||||||
|
String httpmethod = xchg.getRequestMethod();
|
||||||
|
|
||||||
|
try{
|
||||||
|
|
||||||
|
Headers reqheaders=xchg.getRequestHeaders();
|
||||||
|
|
||||||
|
Headers resheaders = xchg.getResponseHeaders();
|
||||||
|
|
||||||
|
String url_path = xchg.getRequestURI().getPath();
|
||||||
|
|
||||||
|
String link = url_path.substring(url_path.indexOf("/video/")+7);
|
||||||
|
|
||||||
|
if(link.indexOf("mega/") == 0)
|
||||||
|
{
|
||||||
|
link = link.replaceAll("mega/", "https://mega.co.nz/#");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
String mc_host = findFirstRegex("^[^/]+/", link, 0);
|
||||||
|
|
||||||
|
link = "http://" + mc_host + link;
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] cache_info, file_info;
|
||||||
|
|
||||||
|
cache_info = getLink_cache().get(link);
|
||||||
|
|
||||||
|
if(cache_info!=null) {
|
||||||
|
|
||||||
|
file_info = new String[6];
|
||||||
|
|
||||||
|
System.arraycopy( cache_info, 0, file_info, 0, cache_info.length );
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
file_info = getMegaFileMetadata(link, _main_panel.getView());
|
||||||
|
|
||||||
|
cache_info = new String[6];
|
||||||
|
|
||||||
|
System.arraycopy( file_info, 0, cache_info, 0, file_info.length );
|
||||||
|
|
||||||
|
cache_info[5]=null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
String file_name = file_info[0];
|
||||||
|
|
||||||
|
long file_size = Long.parseLong(file_info[1]);
|
||||||
|
|
||||||
|
String file_key = file_info[2];
|
||||||
|
|
||||||
|
String pass_hash, noexpire_token;
|
||||||
|
|
||||||
|
if(file_info.length >= 5)
|
||||||
|
{
|
||||||
|
pass_hash = file_info[3];
|
||||||
|
|
||||||
|
noexpire_token = file_info[4];
|
||||||
|
|
||||||
|
} else {
|
||||||
|
pass_hash = null;
|
||||||
|
|
||||||
|
noexpire_token = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
String file_ext = file_name.substring(file_name.lastIndexOf('.')+1).toLowerCase();
|
||||||
|
|
||||||
|
URLConnection urlConn;
|
||||||
|
|
||||||
|
if(httpmethod.equals("HEAD")) {
|
||||||
|
|
||||||
|
resheaders.add("Accept-Ranges", "bytes");
|
||||||
|
|
||||||
|
resheaders.add("transferMode.dlna.org", "Streaming");
|
||||||
|
|
||||||
|
resheaders.add("contentFeatures.dlna.org", "DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000");
|
||||||
|
|
||||||
|
resheaders.add("Content-Type", getCtype().getMIME(file_ext));
|
||||||
|
|
||||||
|
resheaders.add("Content-Length", String.valueOf(file_size));
|
||||||
|
|
||||||
|
resheaders.add("Connection", "close");
|
||||||
|
|
||||||
|
xchg.sendResponseHeaders(HttpURLConnection.HTTP_OK, 0);
|
||||||
|
|
||||||
|
} else if(httpmethod.equals("GET")) {
|
||||||
|
|
||||||
|
resheaders.add("Accept-Ranges", "bytes");
|
||||||
|
|
||||||
|
resheaders.add("transferMode.dlna.org", "Streaming");
|
||||||
|
|
||||||
|
resheaders.add("contentFeatures.dlna.org", "DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000");
|
||||||
|
|
||||||
|
resheaders.add("Content-Type", getCtype().getMIME(file_ext));
|
||||||
|
|
||||||
|
resheaders.add("Connection", "close");
|
||||||
|
|
||||||
|
byte[] buffer = new byte[16*1024];
|
||||||
|
|
||||||
|
int reads;
|
||||||
|
|
||||||
|
String temp_url;
|
||||||
|
|
||||||
|
if(cache_info[5]!=null) {
|
||||||
|
|
||||||
|
temp_url = cache_info[5];
|
||||||
|
|
||||||
|
if(!checkMegaDownloadUrl(temp_url)) {
|
||||||
|
|
||||||
|
temp_url = getMegaFileDownloadUrl(link,pass_hash,noexpire_token);
|
||||||
|
|
||||||
|
cache_info[5] = temp_url;
|
||||||
|
|
||||||
|
getLink_cache().put(link, file_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
temp_url = getMegaFileDownloadUrl(link,pass_hash,noexpire_token);
|
||||||
|
|
||||||
|
cache_info[5] = temp_url;
|
||||||
|
|
||||||
|
getLink_cache().put(link, cache_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
long[] ranges=new long[2];
|
||||||
|
|
||||||
|
int sync_bytes=0;
|
||||||
|
|
||||||
|
String header_range=null;
|
||||||
|
|
||||||
|
InputStream is;
|
||||||
|
|
||||||
|
URL url;
|
||||||
|
|
||||||
|
if(reqheaders.containsKey("Range"))
|
||||||
|
{
|
||||||
|
header_range = "Range";
|
||||||
|
|
||||||
|
} else if(reqheaders.containsKey("range")) {
|
||||||
|
|
||||||
|
header_range = "range";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(header_range != null)
|
||||||
|
{
|
||||||
|
List<String> ranges_raw = reqheaders.get(header_range);
|
||||||
|
|
||||||
|
String range_header=ranges_raw.get(0);
|
||||||
|
|
||||||
|
ranges = parseRangeHeader(range_header);
|
||||||
|
|
||||||
|
sync_bytes = (int)ranges[0] % 16;
|
||||||
|
|
||||||
|
if(ranges[1]>=0 && ranges[1]>=ranges[0]) {
|
||||||
|
|
||||||
|
clength = ranges[1]-ranges[0]+1;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
clength = file_size - ranges[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
resheaders.add("Content-Range", "bytes "+ranges[0]+"-"+(ranges[1]>=0?ranges[1]:(file_size-1))+"/"+file_size);
|
||||||
|
|
||||||
|
xchg.sendResponseHeaders(HttpURLConnection.HTTP_PARTIAL, clength);
|
||||||
|
|
||||||
|
url = new URL(cookRangeUrl(temp_url, ranges, sync_bytes));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
xchg.sendResponseHeaders(HttpURLConnection.HTTP_OK, file_size);
|
||||||
|
|
||||||
|
url = new URL(temp_url);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateStatus(WORKER_STATUS_CONNECT);
|
||||||
|
|
||||||
|
urlConn = url.openConnection();
|
||||||
|
|
||||||
|
urlConn.setConnectTimeout(MainPanel.CONNECTION_TIMEOUT);
|
||||||
|
|
||||||
|
urlConn.setRequestProperty("User-Agent", MainPanel.USER_AGENT);
|
||||||
|
|
||||||
|
urlConn.setRequestProperty("Connection", "close");
|
||||||
|
|
||||||
|
is = urlConn.getInputStream();
|
||||||
|
|
||||||
|
byte[] iv = CryptTools.initMEGALinkKeyIV(file_key);
|
||||||
|
|
||||||
|
cis = new CipherInputStream(is, CryptTools.genDecrypter("AES", "AES/CTR/NoPadding", CryptTools.initMEGALinkKey(file_key), (header_range!=null && (ranges[0]-sync_bytes)>0)?CryptTools.forwardMEGALinkKeyIV(iv, ranges[0]-sync_bytes):iv));
|
||||||
|
|
||||||
|
os = xchg.getResponseBody();
|
||||||
|
|
||||||
|
cis.skip(sync_bytes);
|
||||||
|
|
||||||
|
updateStatus(WORKER_STATUS_STREAM);
|
||||||
|
|
||||||
|
while((reads=cis.read(buffer))!=-1) {
|
||||||
|
|
||||||
|
os.write(buffer, 0, reads);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(Exception ex){ }
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if(cis!=null) {
|
||||||
|
cis.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
xchg.close();
|
||||||
|
|
||||||
|
updateStatus(WORKER_STATUS_EXIT);
|
||||||
|
|
||||||
|
secureNotify();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,301 +0,0 @@
|
|||||||
package megabasterd;
|
|
||||||
|
|
||||||
import com.sun.net.httpserver.Headers;
|
|
||||||
import com.sun.net.httpserver.HttpExchange;
|
|
||||||
import com.sun.net.httpserver.HttpHandler;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.net.HttpURLConnection;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLConnection;
|
|
||||||
import java.security.InvalidAlgorithmParameterException;
|
|
||||||
import java.security.InvalidKeyException;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import static java.util.logging.Logger.getLogger;
|
|
||||||
import javax.crypto.CipherInputStream;
|
|
||||||
import javax.crypto.NoSuchPaddingException;
|
|
||||||
import static megabasterd.MainPanel.STREAMER_PORT;
|
|
||||||
import static megabasterd.MiscTools.findFirstRegex;
|
|
||||||
|
|
||||||
|
|
||||||
public final class KissVideoStreamServerHandler implements HttpHandler {
|
|
||||||
|
|
||||||
private final KissVideoStreamServer _httpserver;
|
|
||||||
|
|
||||||
private final MainPanelView _view;
|
|
||||||
|
|
||||||
private String _file_name;
|
|
||||||
|
|
||||||
private long _file_size;
|
|
||||||
|
|
||||||
private String _file_key;
|
|
||||||
|
|
||||||
private String _pass_hash;
|
|
||||||
|
|
||||||
private String _noexpire_token;
|
|
||||||
|
|
||||||
public KissVideoStreamServerHandler(KissVideoStreamServer server, MainPanelView view) {
|
|
||||||
|
|
||||||
_httpserver = server;
|
|
||||||
_view = view;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void handle(HttpExchange xchg) throws IOException {
|
|
||||||
|
|
||||||
_httpserver.getStreaming().put(Thread.currentThread(), true);
|
|
||||||
|
|
||||||
long clength;
|
|
||||||
|
|
||||||
OutputStream os;
|
|
||||||
|
|
||||||
CipherInputStream cis = null;
|
|
||||||
|
|
||||||
String httpmethod = xchg.getRequestMethod();
|
|
||||||
|
|
||||||
_httpserver.printStatusOK("Kissvideostreamer (Request received! Dispatching it...)");
|
|
||||||
|
|
||||||
Headers reqheaders=xchg.getRequestHeaders();
|
|
||||||
|
|
||||||
Headers resheaders = xchg.getResponseHeaders();
|
|
||||||
|
|
||||||
String url_path = xchg.getRequestURI().getPath();
|
|
||||||
|
|
||||||
String link = url_path.substring(url_path.indexOf("/video/")+7);
|
|
||||||
|
|
||||||
if(link.indexOf("mega/") == 0)
|
|
||||||
{
|
|
||||||
link = link.replaceAll("mega/", "https://mega.co.nz/#");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
String mc_host = findFirstRegex("^[^/]+/", link, 0);
|
|
||||||
|
|
||||||
link = "http://" + mc_host + link;
|
|
||||||
}
|
|
||||||
|
|
||||||
_httpserver.printStatusOK("Kissvideostreamer (Retrieving file metadata...)");
|
|
||||||
|
|
||||||
String[] cache_info, file_info=null;
|
|
||||||
|
|
||||||
cache_info = _httpserver.getFromLinkCache(link);
|
|
||||||
|
|
||||||
if(cache_info!=null) {
|
|
||||||
|
|
||||||
file_info = new String[6];
|
|
||||||
|
|
||||||
System.arraycopy( cache_info, 0, file_info, 0, cache_info.length );
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
file_info = _httpserver.getMegaFileMetadata(link, _view);
|
|
||||||
|
|
||||||
} catch (InterruptedException ex) {
|
|
||||||
getLogger(KissVideoStreamServerHandler.class.getName()).log(Level.SEVERE, null, ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
cache_info = new String[6];
|
|
||||||
|
|
||||||
System.arraycopy( file_info, 0, cache_info, 0, file_info.length );
|
|
||||||
|
|
||||||
cache_info[5]=null;
|
|
||||||
}
|
|
||||||
|
|
||||||
_file_name = file_info[0];
|
|
||||||
|
|
||||||
_file_size = Long.parseLong(file_info[1]);
|
|
||||||
|
|
||||||
_file_key = file_info[2];
|
|
||||||
|
|
||||||
if(file_info.length >= 5)
|
|
||||||
{
|
|
||||||
_pass_hash = file_info[3];
|
|
||||||
|
|
||||||
_noexpire_token = file_info[4];
|
|
||||||
|
|
||||||
} else {
|
|
||||||
_pass_hash = null;
|
|
||||||
|
|
||||||
_noexpire_token = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
String file_ext = _file_name.substring(_file_name.lastIndexOf('.')+1).toLowerCase();
|
|
||||||
|
|
||||||
URLConnection urlConn;
|
|
||||||
|
|
||||||
try{
|
|
||||||
|
|
||||||
if(httpmethod.equals("HEAD")) {
|
|
||||||
|
|
||||||
resheaders.add("Accept-Ranges", "bytes");
|
|
||||||
|
|
||||||
resheaders.add("transferMode.dlna.org", "Streaming");
|
|
||||||
|
|
||||||
resheaders.add("contentFeatures.dlna.org", "DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000");
|
|
||||||
|
|
||||||
resheaders.add("Content-Type", _httpserver.getCtype().getMIME(file_ext));
|
|
||||||
|
|
||||||
resheaders.add("Content-Length", String.valueOf(_file_size));
|
|
||||||
|
|
||||||
resheaders.add("Connection", "close");
|
|
||||||
|
|
||||||
xchg.sendResponseHeaders(HttpURLConnection.HTTP_OK, 0);
|
|
||||||
|
|
||||||
} else if(httpmethod.equals("GET")) {
|
|
||||||
|
|
||||||
resheaders.add("Accept-Ranges", "bytes");
|
|
||||||
|
|
||||||
resheaders.add("transferMode.dlna.org", "Streaming");
|
|
||||||
|
|
||||||
resheaders.add("contentFeatures.dlna.org", "DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000");
|
|
||||||
|
|
||||||
resheaders.add("Content-Type", _httpserver.getCtype().getMIME(file_ext));
|
|
||||||
|
|
||||||
resheaders.add("Connection", "close");
|
|
||||||
|
|
||||||
byte[] buffer = new byte[16*1024];
|
|
||||||
|
|
||||||
int reads;
|
|
||||||
|
|
||||||
_httpserver.printStatusOK("Kissvideostreamer (Retrieving mega temp url...)");
|
|
||||||
|
|
||||||
String temp_url;
|
|
||||||
|
|
||||||
if(cache_info[5]!=null) {
|
|
||||||
|
|
||||||
temp_url = cache_info[5];
|
|
||||||
|
|
||||||
if(!_httpserver.checkDownloadUrl(temp_url)) {
|
|
||||||
|
|
||||||
temp_url = _httpserver.getMegaFileDownloadUrl(link,_pass_hash,_noexpire_token);
|
|
||||||
|
|
||||||
cache_info[5] = temp_url;
|
|
||||||
|
|
||||||
_httpserver.updateLinkCache(link, cache_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
temp_url = _httpserver.getMegaFileDownloadUrl(link,_pass_hash,_noexpire_token);
|
|
||||||
|
|
||||||
cache_info[5] = temp_url;
|
|
||||||
|
|
||||||
_httpserver.updateLinkCache(link, cache_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
_httpserver.printStatusOK("Kissvideostreamer (Connecting...)");
|
|
||||||
|
|
||||||
long[] ranges=new long[2];
|
|
||||||
|
|
||||||
int sync_bytes=0;
|
|
||||||
|
|
||||||
String header_range=null;
|
|
||||||
|
|
||||||
InputStream is;
|
|
||||||
|
|
||||||
URL url;
|
|
||||||
|
|
||||||
if(reqheaders.containsKey("Range"))
|
|
||||||
{
|
|
||||||
header_range = "Range";
|
|
||||||
|
|
||||||
} else if(reqheaders.containsKey("range")) {
|
|
||||||
|
|
||||||
header_range = "range";
|
|
||||||
}
|
|
||||||
|
|
||||||
if(header_range != null)
|
|
||||||
{
|
|
||||||
List<String> ranges_raw = reqheaders.get(header_range);
|
|
||||||
|
|
||||||
String range_header=ranges_raw.get(0);
|
|
||||||
|
|
||||||
ranges = _httpserver.parseRangeHeader(range_header);
|
|
||||||
|
|
||||||
sync_bytes = (int)ranges[0] % 16;
|
|
||||||
|
|
||||||
if(ranges[1]>=0 && ranges[1]>=ranges[0]) {
|
|
||||||
|
|
||||||
clength = ranges[1]-ranges[0]+1;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
clength = _file_size - ranges[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
resheaders.add("Content-Range", "bytes "+ranges[0]+"-"+(ranges[1]>=0?ranges[1]:(_file_size-1))+"/"+_file_size);
|
|
||||||
|
|
||||||
xchg.sendResponseHeaders(HttpURLConnection.HTTP_PARTIAL, clength);
|
|
||||||
|
|
||||||
url = new URL(_httpserver.cookRangeUrl(temp_url, ranges, sync_bytes));
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
xchg.sendResponseHeaders(HttpURLConnection.HTTP_OK, _file_size);
|
|
||||||
|
|
||||||
url = new URL(temp_url);
|
|
||||||
}
|
|
||||||
|
|
||||||
urlConn = url.openConnection();
|
|
||||||
urlConn.setConnectTimeout(KissVideoStreamServer.TIMEOUT);
|
|
||||||
urlConn.setRequestProperty("User-Agent", MainPanel.USER_AGENT);
|
|
||||||
urlConn.setRequestProperty("Connection", "close");
|
|
||||||
is = urlConn.getInputStream();
|
|
||||||
|
|
||||||
byte[] iv = CryptTools.initMEGALinkKeyIV(_file_key);
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
cis = new CipherInputStream(is, CryptTools.genDecrypter("AES", "AES/CTR/NoPadding", CryptTools.initMEGALinkKey(_file_key), (header_range!=null && (ranges[0]-sync_bytes)>0)?CryptTools.forwardMEGALinkKeyIV(iv, ranges[0]-sync_bytes):iv));
|
|
||||||
|
|
||||||
} catch ( NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException ex) {
|
|
||||||
getLogger(KissVideoStreamServerHandler.class.getName()).log(Level.SEVERE, null, ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
os = xchg.getResponseBody();
|
|
||||||
|
|
||||||
_httpserver.printStatusOK("Kissvideostreamer (Streaming file "+_file_name+" ...)");
|
|
||||||
|
|
||||||
//Skip sync bytes
|
|
||||||
cis.skip(sync_bytes);
|
|
||||||
|
|
||||||
while((reads=cis.read(buffer))!=-1) {
|
|
||||||
|
|
||||||
os.write(buffer, 0, reads);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(Exception ex)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if(cis!=null) {
|
|
||||||
cis.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
xchg.close();
|
|
||||||
|
|
||||||
_httpserver.printStatusOK("Kissvideostreamer on localhost:"+STREAMER_PORT+" (Waiting for request...)");
|
|
||||||
|
|
||||||
_httpserver.getStreaming().remove(Thread.currentThread());
|
|
||||||
|
|
||||||
try {
|
|
||||||
Thread.sleep(1000);
|
|
||||||
} catch (InterruptedException ex) {
|
|
||||||
getLogger(KissVideoStreamServerHandler.class.getName()).log(Level.SEVERE, null, ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!_httpserver.isWorking()) {
|
|
||||||
|
|
||||||
_httpserver.restoreMainWindow();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -57,7 +57,7 @@ import static megabasterd.Transference.MAX_TRANSFERENCE_SPEED_DEFAULT;
|
|||||||
*/
|
*/
|
||||||
public final class MainPanel {
|
public final class MainPanel {
|
||||||
|
|
||||||
public static final String VERSION="1.5";
|
public static final String VERSION="1.6";
|
||||||
public static final String USER_AGENT="Mozilla/5.0 (X11; Linux x8664; rv:48.0) Gecko/20100101 Firefox/48.0";
|
public static final String USER_AGENT="Mozilla/5.0 (X11; Linux x8664; rv:48.0) Gecko/20100101 Firefox/48.0";
|
||||||
public static final int CONNECTION_TIMEOUT = 30000;
|
public static final int CONNECTION_TIMEOUT = 30000;
|
||||||
public static final int THROTTLE_SLICE_SIZE=16*1024;
|
public static final int THROTTLE_SLICE_SIZE=16*1024;
|
||||||
@ -138,7 +138,7 @@ public final class MainPanel {
|
|||||||
|
|
||||||
resumeUploads();
|
resumeUploads();
|
||||||
|
|
||||||
_streamserver = new KissVideoStreamServer(getView());
|
_streamserver = new KissVideoStreamServer(this);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
_streamserver.start(STREAMER_PORT, "/video");
|
_streamserver.start(STREAMER_PORT, "/video");
|
||||||
@ -341,7 +341,7 @@ public final class MainPanel {
|
|||||||
|
|
||||||
public void _byebye() {
|
public void _byebye() {
|
||||||
|
|
||||||
if(_streamserver.isWorking()) {
|
if(!_streamserver.getWorking_threads().isEmpty()) {
|
||||||
|
|
||||||
Object[] options = {"No",
|
Object[] options = {"No",
|
||||||
"Yes"};
|
"Yes"};
|
||||||
@ -437,7 +437,7 @@ public final class MainPanel {
|
|||||||
|
|
||||||
swingReflectionInvoke("setText", getView().getStatus_down_label(), "Resuming previous downloads, please wait...");
|
swingReflectionInvoke("setText", getView().getStatus_down_label(), "Resuming previous downloads, please wait...");
|
||||||
|
|
||||||
final MainPanel main =this;
|
final MainPanel tthis =this;
|
||||||
|
|
||||||
THREAD_POOL.execute(new Runnable(){
|
THREAD_POOL.execute(new Runnable(){
|
||||||
|
|
||||||
@ -452,9 +452,9 @@ public final class MainPanel {
|
|||||||
|
|
||||||
for(HashMap<String,Object> o:res) {
|
for(HashMap<String,Object> o:res) {
|
||||||
|
|
||||||
Download download = new Download(main, (String)o.get("url"), (String)o.get("path"), (String)o.get("filename"), (String)o.get("filekey"), (Long)o.get("filesize"), (String)o.get("filepass"), (String)o.get("filenoexpire"), main._use_slots_down, main._default_slots_down, false);
|
Download download = new Download(tthis, (String)o.get("url"), (String)o.get("path"), (String)o.get("filename"), (String)o.get("filekey"), (Long)o.get("filesize"), (String)o.get("filepass"), (String)o.get("filenoexpire"), _use_slots_down, _default_slots_down, false);
|
||||||
|
|
||||||
main.getDownload_manager().getTransference_provision_queue().add(download);
|
getDownload_manager().getTransference_provision_queue().add(download);
|
||||||
|
|
||||||
conta_downloads++;
|
conta_downloads++;
|
||||||
}
|
}
|
||||||
@ -466,15 +466,15 @@ public final class MainPanel {
|
|||||||
|
|
||||||
if(conta_downloads>0) {
|
if(conta_downloads>0) {
|
||||||
|
|
||||||
swingReflectionInvoke("setText", main.getView().getStatus_down_label(), "Starting downloads provisioning, please wait...");
|
swingReflectionInvoke("setText", getView().getStatus_down_label(), "Starting downloads provisioning, please wait...");
|
||||||
|
|
||||||
main.getDownload_manager().secureNotify();
|
getDownload_manager().secureNotify();
|
||||||
|
|
||||||
main.getView().getjTabbedPane1().setSelectedIndex(0);
|
getView().getjTabbedPane1().setSelectedIndex(0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
swingReflectionInvoke("setText", main.getView().getStatus_down_label(), "");
|
swingReflectionInvoke("setText", getView().getStatus_down_label(), "");
|
||||||
|
|
||||||
|
|
||||||
}});
|
}});
|
||||||
@ -517,12 +517,11 @@ public final class MainPanel {
|
|||||||
|
|
||||||
MenuItem closeItem = new MenuItem("EXIT");
|
MenuItem closeItem = new MenuItem("EXIT");
|
||||||
|
|
||||||
final MainPanel main=this;
|
|
||||||
|
|
||||||
closeItem.addActionListener(new ActionListener() {
|
closeItem.addActionListener(new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
main._byebye();
|
_byebye();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -565,7 +564,7 @@ public final class MainPanel {
|
|||||||
|
|
||||||
swingReflectionInvoke("setText", getView().getStatus_up_label(), "Resuming previous uploads, please wait...");
|
swingReflectionInvoke("setText", getView().getStatus_up_label(), "Resuming previous uploads, please wait...");
|
||||||
|
|
||||||
final MainPanel main =this;
|
final MainPanel tthis =this;
|
||||||
|
|
||||||
THREAD_POOL.execute(new Runnable(){
|
THREAD_POOL.execute(new Runnable(){
|
||||||
@Override
|
@Override
|
||||||
@ -585,11 +584,11 @@ public final class MainPanel {
|
|||||||
|
|
||||||
MegaAPI ma;
|
MegaAPI ma;
|
||||||
|
|
||||||
if(main._mega_accounts.get(email) != null) {
|
if(_mega_accounts.get(email) != null) {
|
||||||
|
|
||||||
final HashMap<String,Object> account_info = (HashMap)main._mega_accounts.get(email);
|
final HashMap<String,Object> account_info = (HashMap)_mega_accounts.get(email);
|
||||||
|
|
||||||
ma = main._mega_active_accounts.get(email);
|
ma = _mega_active_accounts.get(email);
|
||||||
|
|
||||||
if(ma == null) {
|
if(ma == null) {
|
||||||
|
|
||||||
@ -599,16 +598,16 @@ public final class MainPanel {
|
|||||||
|
|
||||||
ma.login(email, bin2i32a(BASE642Bin((String)account_info.get("password_aes"))), (String)account_info.get("user_hash"));
|
ma.login(email, bin2i32a(BASE642Bin((String)account_info.get("password_aes"))), (String)account_info.get("user_hash"));
|
||||||
|
|
||||||
main._mega_active_accounts.put(email, ma);
|
_mega_active_accounts.put(email, ma);
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
getLogger(MainPanelView.class.getName()).log(SEVERE, null, ex);
|
getLogger(MainPanelView.class.getName()).log(SEVERE, null, ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Upload upload = new Upload(main, ma, (String)o.get("filename"), (String)o.get("parent_node"), (String)o.get("ul_key")!=null?bin2i32a(BASE642Bin((String)o.get("ul_key"))):null, (String)o.get("url"), (String)o.get("root_node"), BASE642Bin((String)o.get("share_key")), (String)o.get("folder_link"), main._use_slots_up, main._default_slots_up, false);
|
Upload upload = new Upload(tthis, ma, (String)o.get("filename"), (String)o.get("parent_node"), (String)o.get("ul_key")!=null?bin2i32a(BASE642Bin((String)o.get("ul_key"))):null, (String)o.get("url"), (String)o.get("root_node"), BASE642Bin((String)o.get("share_key")), (String)o.get("folder_link"), _use_slots_up, _default_slots_up, false);
|
||||||
|
|
||||||
main.getUpload_manager().getTransference_provision_queue().add(upload);
|
getUpload_manager().getTransference_provision_queue().add(upload);
|
||||||
|
|
||||||
conta_uploads++;
|
conta_uploads++;
|
||||||
|
|
||||||
@ -620,15 +619,15 @@ public final class MainPanel {
|
|||||||
|
|
||||||
if(conta_uploads>0) {
|
if(conta_uploads>0) {
|
||||||
|
|
||||||
swingReflectionInvoke("setText", main.getView().getStatus_up_label(), "Starting uploads provisioning, please wait...");
|
swingReflectionInvoke("setText", getView().getStatus_up_label(), "Starting uploads provisioning, please wait...");
|
||||||
|
|
||||||
main.getUpload_manager().secureNotify();
|
getUpload_manager().secureNotify();
|
||||||
|
|
||||||
main.getView().getjTabbedPane1().setSelectedIndex(1);
|
getView().getjTabbedPane1().setSelectedIndex(1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
swingReflectionInvoke("setText", main.getView().getStatus_up_label(), "");
|
swingReflectionInvoke("setText", getView().getStatus_up_label(), "");
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
getLogger(MainPanel.class.getName()).log(SEVERE, null, ex);
|
getLogger(MainPanel.class.getName()).log(SEVERE, null, ex);
|
||||||
|
@ -510,7 +510,7 @@ public final class MainPanelView extends javax.swing.JFrame {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
swingReflectionInvoke("setText", tthis.status_down_label, "Pre-processing downloads, please wait...");
|
swingReflectionInvoke("setText", status_down_label, "Pre-processing downloads, please wait...");
|
||||||
|
|
||||||
Set<String> urls = new HashSet(findAllRegex("(?:https?|mega)://[^/]*/(#.*?)?!.+![^\r\n]+", dialog.getLinks_textarea().getText(), 0));
|
Set<String> urls = new HashSet(findAllRegex("(?:https?|mega)://[^/]*/(#.*?)?!.+![^\r\n]+", dialog.getLinks_textarea().getText(), 0));
|
||||||
|
|
||||||
@ -555,9 +555,9 @@ public final class MainPanelView extends javax.swing.JFrame {
|
|||||||
|
|
||||||
for(HashMap folder_link:folder_links) {
|
for(HashMap folder_link:folder_links) {
|
||||||
|
|
||||||
download = new Download(tthis.getMain_panel(), (String)folder_link.get("url"), dl_path, (String)folder_link.get("filename"), (String)folder_link.get("filekey"), (long)folder_link.get("filesize"), null, null, tthis.getMain_panel().isUse_slots_down(), tthis.getMain_panel().getDefault_slots_down(), true);
|
download = new Download(getMain_panel(), (String)folder_link.get("url"), dl_path, (String)folder_link.get("filename"), (String)folder_link.get("filekey"), (long)folder_link.get("filesize"), null, null, getMain_panel().isUse_slots_down(), getMain_panel().getDefault_slots_down(), true);
|
||||||
|
|
||||||
tthis.getMain_panel().getDownload_manager().getTransference_provision_queue().add(download);
|
getMain_panel().getDownload_manager().getTransference_provision_queue().add(download);
|
||||||
|
|
||||||
conta_downloads++;
|
conta_downloads++;
|
||||||
}
|
}
|
||||||
@ -570,9 +570,9 @@ public final class MainPanelView extends javax.swing.JFrame {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
download = new Download(tthis.getMain_panel(), url, dl_path, null, null, null, null, null, tthis.getMain_panel().isUse_slots_down(), tthis.getMain_panel().getDefault_slots_down(), false);
|
download = new Download(getMain_panel(), url, dl_path, null, null, null, null, null, getMain_panel().isUse_slots_down(), getMain_panel().getDefault_slots_down(), false);
|
||||||
|
|
||||||
tthis.getMain_panel().getDownload_manager().getTransference_provision_queue().add(download);
|
getMain_panel().getDownload_manager().getTransference_provision_queue().add(download);
|
||||||
|
|
||||||
conta_downloads++;
|
conta_downloads++;
|
||||||
}
|
}
|
||||||
@ -580,18 +580,18 @@ public final class MainPanelView extends javax.swing.JFrame {
|
|||||||
|
|
||||||
if(conta_downloads > 0) {
|
if(conta_downloads > 0) {
|
||||||
|
|
||||||
swingReflectionInvoke("setText", tthis.status_down_label, "Starting downloads provisioning, please wait...");
|
swingReflectionInvoke("setText", status_down_label, "Starting downloads provisioning, please wait...");
|
||||||
|
|
||||||
tthis.getMain_panel().getDownload_manager().secureNotify();
|
getMain_panel().getDownload_manager().secureNotify();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
swingReflectionInvoke("setText", tthis.status_down_label, "");
|
swingReflectionInvoke("setText", status_down_label, "");
|
||||||
|
|
||||||
swingReflectionInvoke("setEnabled", new_download_menu, true);
|
swingReflectionInvoke("setEnabled", new_download_menu, true);
|
||||||
|
|
||||||
tthis.getMain_panel().getDownload_manager().setPreprocessing_transferences(false);
|
getMain_panel().getDownload_manager().setPreprocessing_transferences(false);
|
||||||
|
|
||||||
}});
|
}});
|
||||||
} else {
|
} else {
|
||||||
@ -742,21 +742,19 @@ public final class MainPanelView extends javax.swing.JFrame {
|
|||||||
|
|
||||||
final ArrayList<File> files = dialog.getFiles();
|
final ArrayList<File> files = dialog.getFiles();
|
||||||
|
|
||||||
final MainPanelView main = this;
|
|
||||||
|
|
||||||
jTabbedPane1.setSelectedIndex(1);
|
jTabbedPane1.setSelectedIndex(1);
|
||||||
|
|
||||||
THREAD_POOL.execute(new Runnable(){
|
THREAD_POOL.execute(new Runnable(){
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
MegaAPI ma=main.getMain_panel().getMega_active_accounts().get(mega_account)!=null?main.getMain_panel().getMega_active_accounts().get(mega_account):new MegaAPI();
|
MegaAPI ma=getMain_panel().getMega_active_accounts().get(mega_account)!=null?getMain_panel().getMega_active_accounts().get(mega_account):new MegaAPI();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
ma.login(mega_account, mega_aes_pass, mega_user_hash);
|
ma.login(mega_account, mega_aes_pass, mega_user_hash);
|
||||||
|
|
||||||
main.getMain_panel().getMega_active_accounts().put(mega_account, ma);
|
getMain_panel().getMega_active_accounts().put(mega_account, ma);
|
||||||
|
|
||||||
byte[] parent_key = ma.genFolderKey();
|
byte[] parent_key = ma.genFolderKey();
|
||||||
|
|
||||||
@ -778,7 +776,7 @@ public final class MainPanelView extends javax.swing.JFrame {
|
|||||||
|
|
||||||
for(File f:files) {
|
for(File f:files) {
|
||||||
|
|
||||||
swingReflectionInvoke("setText", main.status_up_label, "Pre-processing ("+(conta++)+"/"+files.size()+") uploads, please wait...");
|
swingReflectionInvoke("setText", status_up_label, "Pre-processing ("+(conta++)+"/"+files.size()+") uploads, please wait...");
|
||||||
|
|
||||||
String file_path = f.getParentFile().getAbsolutePath().replace(base_path, "");
|
String file_path = f.getParentFile().getAbsolutePath().replace(base_path, "");
|
||||||
|
|
||||||
@ -813,15 +811,15 @@ public final class MainPanelView extends javax.swing.JFrame {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Upload upload = new Upload(main.getMain_panel(), ma, f.getAbsolutePath(), file_parent, null, null, parent_node, share_key, folder_link, main.getMain_panel().isUse_slots_up(), main.getMain_panel().getDefault_slots_up(), false);
|
Upload upload = new Upload(getMain_panel(), ma, f.getAbsolutePath(), file_parent, null, null, parent_node, share_key, folder_link, getMain_panel().isUse_slots_up(), getMain_panel().getDefault_slots_up(), false);
|
||||||
|
|
||||||
main.getMain_panel().getUpload_manager().getTransference_provision_queue().add(upload);
|
getMain_panel().getUpload_manager().getTransference_provision_queue().add(upload);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
swingReflectionInvoke("setText", main.status_up_label, "Starting uploads provisioning, please wait...");
|
swingReflectionInvoke("setText", status_up_label, "Starting uploads provisioning, please wait...");
|
||||||
|
|
||||||
main.getMain_panel().getUpload_manager().secureNotify();
|
getMain_panel().getUpload_manager().secureNotify();
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
|
|
||||||
@ -830,7 +828,7 @@ public final class MainPanelView extends javax.swing.JFrame {
|
|||||||
|
|
||||||
swingReflectionInvoke("setEnabled", new_upload_menu, true);
|
swingReflectionInvoke("setEnabled", new_upload_menu, true);
|
||||||
|
|
||||||
main.getMain_panel().getUpload_manager().setPreprocessing_transferences(false);
|
getMain_panel().getUpload_manager().setPreprocessing_transferences(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -58,12 +58,10 @@ public final class MegaAPI {
|
|||||||
|
|
||||||
private String _root_id;
|
private String _root_id;
|
||||||
|
|
||||||
|
|
||||||
private String _inbox_id;
|
private String _inbox_id;
|
||||||
|
|
||||||
private String _email;
|
private String _email;
|
||||||
|
|
||||||
|
|
||||||
private String _trashbin_id;
|
private String _trashbin_id;
|
||||||
|
|
||||||
private String _req_id;
|
private String _req_id;
|
||||||
|
@ -50,6 +50,8 @@ import javax.swing.tree.MutableTreeNode;
|
|||||||
import javax.swing.tree.TreeNode;
|
import javax.swing.tree.TreeNode;
|
||||||
import javax.swing.tree.TreePath;
|
import javax.swing.tree.TreePath;
|
||||||
import javax.xml.bind.DatatypeConverter;
|
import javax.xml.bind.DatatypeConverter;
|
||||||
|
import static megabasterd.MainPanel.CONNECTION_TIMEOUT;
|
||||||
|
import static megabasterd.MainPanel.USER_AGENT;
|
||||||
|
|
||||||
public final class MiscTools {
|
public final class MiscTools {
|
||||||
|
|
||||||
@ -812,6 +814,29 @@ public final class MiscTools {
|
|||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean checkMegaDownloadUrl(String string_url) {
|
||||||
|
|
||||||
|
boolean url_ok=false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
URL url = new URL(string_url+"/0-0");
|
||||||
|
URLConnection connection = url.openConnection();
|
||||||
|
connection.setConnectTimeout(CONNECTION_TIMEOUT);
|
||||||
|
connection.setRequestProperty("User-Agent", USER_AGENT);
|
||||||
|
|
||||||
|
try (InputStream is = connection.getInputStream()) {
|
||||||
|
while(is.read()!=-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
url_ok=true;
|
||||||
|
|
||||||
|
}catch (Exception ex) {}
|
||||||
|
|
||||||
|
return url_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private MiscTools() {
|
private MiscTools() {
|
||||||
}
|
}
|
||||||
|
@ -179,9 +179,9 @@ public final class StreamerDialog extends javax.swing.JDialog implements Clipboa
|
|||||||
|
|
||||||
JOptionPane.showMessageDialog(tthis, "Streaming link was copied to clipboard!\n(Remember to keep MegaBasterd running in background while playing)");
|
JOptionPane.showMessageDialog(tthis, "Streaming link was copied to clipboard!\n(Remember to keep MegaBasterd running in background while playing)");
|
||||||
|
|
||||||
tthis.dispose();
|
dispose();
|
||||||
|
|
||||||
tthis.getParent().dispatchEvent(new WindowEvent(tthis, WINDOW_CLOSING));
|
getParent().dispatchEvent(new WindowEvent(tthis, WINDOW_CLOSING));
|
||||||
|
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
Logger.getLogger(StreamerDialog.class.getName()).log(Level.SEVERE, null, ex);
|
Logger.getLogger(StreamerDialog.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
@ -270,8 +270,6 @@ abstract public class TransferenceManager implements Runnable, SecureNotifiable
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
final TransferenceManager tthis = this;
|
|
||||||
|
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
@ -283,7 +281,6 @@ abstract public class TransferenceManager implements Runnable, SecureNotifiable
|
|||||||
@Override
|
@Override
|
||||||
public void run(){
|
public void run(){
|
||||||
|
|
||||||
|
|
||||||
while(!getTransference_provision_queue().isEmpty())
|
while(!getTransference_provision_queue().isEmpty())
|
||||||
{
|
{
|
||||||
final Transference transference = getTransference_provision_queue().poll();
|
final Transference transference = getTransference_provision_queue().poll();
|
||||||
@ -295,9 +292,9 @@ abstract public class TransferenceManager implements Runnable, SecureNotifiable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tthis.setProvisioning_transferences(false);
|
setProvisioning_transferences(false);
|
||||||
|
|
||||||
tthis.secureNotify();
|
secureNotify();
|
||||||
|
|
||||||
}});
|
}});
|
||||||
|
|
||||||
@ -321,9 +318,9 @@ abstract public class TransferenceManager implements Runnable, SecureNotifiable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tthis.setRemoving_transferences(false);
|
setRemoving_transferences(false);
|
||||||
|
|
||||||
tthis.secureNotify();
|
secureNotify();
|
||||||
|
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
@ -346,9 +343,9 @@ abstract public class TransferenceManager implements Runnable, SecureNotifiable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tthis.setStarting_transferences(false);
|
setStarting_transferences(false);
|
||||||
|
|
||||||
tthis.secureNotify();
|
secureNotify();
|
||||||
|
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user