Compare commits

...

15 Commits

Author SHA1 Message Date
tonikelope
fda0fac577 Revert "Added Remote Rest API Support for Downloads (#704)"
This reverts commit fed9f142d08d641d101cdc8e4bce942bc23908d2.
2025-03-20 11:51:51 +01:00
Evan Trowbridge
fed9f142d0
Added Remote Rest API Support for Downloads (#704)
* added remote api for automated management of downloads

* api updates

* api updates

T-H-A-N-K Y-O-U
2025-03-20 11:38:21 +01:00
Antonio L. Vivar
fadb7ea2cc
Update README.md 2024-11-19 12:23:56 +01:00
Antonio L. Vivar
762d3692e9
Add files via upload 2024-11-19 12:22:16 +01:00
Antonio L. Vivar
5378954bb5
Update README.md 2024-11-19 12:21:36 +01:00
tonikelope
d16baf4866 8.22
https://github.com/tonikelope/megabasterd/issues/647

https://github.com/tonikelope/megabasterd/issues/643
2024-08-06 16:09:38 +02:00
tonikelope
5353110c3e https://github.com/tonikelope/megabasterd/issues/643
JOIN CHUNKS LOCK (one file at time)
2024-08-06 16:08:25 +02:00
tonikelope
91dafbce45 Merge origin/master 2024-08-05 19:14:37 +02:00
tonikelope
53c65de717 https://github.com/tonikelope/megabasterd/issues/647 FIX
File split/merge sha1 removed
2024-08-05 19:14:09 +02:00
tonikelope
ba8336e60d test key 2024-08-05 16:07:54 +02:00
tonikelope
fc03de1d3b 8.21
https://github.com/tonikelope/megabasterd/issues/633
https://github.com/tonikelope/megabasterd/issues/634
https://github.com/tonikelope/megabasterd/issues/632
2023-12-13 15:06:05 +01:00
tonikelope
7f8ba83209 8.20
Trying to mitigate https://github.com/tonikelope/megabasterd/issues/623
2023-12-09 12:50:42 +01:00
tonikelope
c2c0c764b5 8.19
Tunning dark mode disabled text

Truing to mitigate https://github.com/tonikelope/megabasterd/issues/623
2023-12-09 12:29:08 +01:00
tonikelope
7a8f1d5ea3 8.18
Mitigate https://github.com/tonikelope/megabasterd/issues/623
2023-12-07 19:44:10 +01:00
tonikelope
62de862ac8 8.17
Dark mode in advanced settings (experimental)
2023-12-07 11:49:52 +01:00
12 changed files with 218 additions and 145 deletions

View File

@ -14,8 +14,11 @@
<p align="center"><a href="https://youtu.be/5TkBXT7osQI"><b>MegaBasterd DEMO</b></a></p> <p align="center"><a href="https://youtu.be/5TkBXT7osQI"><b>MegaBasterd DEMO</b></a></p>
<p align="center"><img src="https://raw.githubusercontent.com/tonikelope/megabasterd/master/src/main/resources/images/ethereum_toni.png"></p> <p align="center"><img src="https://raw.githubusercontent.com/tonikelope/megabasterd/master/coffee.png"><br><img src="https://raw.githubusercontent.com/tonikelope/megabasterd/master/src/main/resources/images/ethereum_toni.png"></p>
<p align="center"><a href="https://github.com/tonikelope/megabasterd/issues/385#issuecomment-1019215670">BONUS: Why the f*ck has MegaBasterd stopped downloading?</a></p> <p align="center"><a href="https://github.com/tonikelope/megabasterd/issues/385#issuecomment-1019215670">BONUS: Why the f*ck has MegaBasterd stopped downloading?</a></p>
<p align="center"><b>IMPORTANT:</b> You are not authorized to use MegaBasterd in any way that violates <a href="https://mega.io/es/terms"><b>MEGA's terms of use</b></a>.</p>

BIN
coffee.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.tonikelope</groupId> <groupId>com.tonikelope</groupId>
<artifactId>MegaBasterd</artifactId> <artifactId>MegaBasterd</artifactId>
<version>8.16</version> <version>8.22</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<repositories> <repositories>
<repository> <repository>

View File

@ -19,6 +19,7 @@ import java.nio.file.Paths;
import java.security.InvalidAlgorithmParameterException; import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.crypto.CipherInputStream; import javax.crypto.CipherInputStream;
@ -32,6 +33,8 @@ public class ChunkWriterManager implements Runnable, SecureSingleThreadNotifiabl
private static final Logger LOG = Logger.getLogger(ChunkWriterManager.class.getName()); private static final Logger LOG = Logger.getLogger(ChunkWriterManager.class.getName());
private static final ReentrantLock JOIN_CHUNKS_LOCK = new ReentrantLock();
public static long calculateChunkOffset(long chunk_id, int size_multi) { public static long calculateChunkOffset(long chunk_id, int size_multi) {
long[] offs = {0, 128, 384, 768, 1280, 1920, 2688}; long[] offs = {0, 128, 384, 768, 1280, 1920, 2688};
@ -179,71 +182,89 @@ public class ChunkWriterManager implements Runnable, SecureSingleThreadNotifiabl
LOG.log(Level.INFO, "{0} ChunkWriterManager LAST CHUNK WRITTEN -> [{1}] {2} {3}...", new Object[]{Thread.currentThread().getName(), _last_chunk_id_written, _bytes_written, _download.getFile_name()}); LOG.log(Level.INFO, "{0} ChunkWriterManager LAST CHUNK WRITTEN -> [{1}] {2} {3}...", new Object[]{Thread.currentThread().getName(), _last_chunk_id_written, _bytes_written, _download.getFile_name()});
boolean download_finished = false; boolean download_finished = false;
if (_file_size > 0) { if (_file_size > 0) {
while (!_exit && (!_download.isStopped() || !_download.getChunkworkers().isEmpty()) && _bytes_written < _file_size) {
if (!download_finished && _download.getProgress() == _file_size) { try {
finishDownload(); while (!_exit && (!_download.isStopped() || !_download.getChunkworkers().isEmpty()) && _bytes_written < _file_size) {
download_finished = true;
}
boolean chunk_io_error; if (!JOIN_CHUNKS_LOCK.isHeldByCurrentThread()) {
LOG.log(Level.INFO, "{0} ChunkWriterManager: JOIN LOCK LOCKED FOR {1}", new Object[]{Thread.currentThread().getName(), _download.getFile_name()});
do { JOIN_CHUNKS_LOCK.lock();
chunk_io_error = false;
try {
File chunk_file = new File(getChunks_dir() + "/" + MiscTools.HashString("sha1", _download.getUrl()) + ".chunk" + String.valueOf(_last_chunk_id_written + 1));
while (chunk_file.exists() && chunk_file.canRead() && chunk_file.canWrite() && chunk_file.length() > 0) {
if (!download_finished && _download.getProgress() == _file_size) {
finishDownload();
download_finished = true;
}
byte[] buffer = new byte[MainPanel.DEFAULT_BYTE_BUFFER_SIZE];
int reads;
try (CipherInputStream cis = new CipherInputStream(new BufferedInputStream(new FileInputStream(chunk_file)), genDecrypter("AES", "AES/CTR/NoPadding", _byte_file_key, forwardMEGALinkKeyIV(_byte_iv, _bytes_written)))) {
while ((reads = cis.read(buffer)) != -1) {
_download.getOutput_stream().write(buffer, 0, reads);
}
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException ex) {
LOG.log(Level.SEVERE, ex.getMessage());
}
_bytes_written += chunk_file.length();
_last_chunk_id_written++;
LOG.log(Level.INFO, "{0} ChunkWriterManager has written to disk chunk [{1}] {2} {3} {4}...", new Object[]{Thread.currentThread().getName(), _last_chunk_id_written, _bytes_written, _download.calculateLastWrittenChunk(_bytes_written), _download.getFile_name()});
chunk_file.delete();
chunk_file = new File(getChunks_dir() + "/" + MiscTools.HashString("sha1", _download.getUrl()) + ".chunk" + String.valueOf(_last_chunk_id_written + 1));
}
} catch (IOException ex) {
chunk_io_error = true;
LOG.log(Level.WARNING, ex.getMessage());
MiscTools.pausar(1000);
} }
} while (chunk_io_error); if (!download_finished && _download.getProgress() == _file_size) {
if (!_exit && (!_download.isStopped() || !_download.getChunkworkers().isEmpty()) && _bytes_written < _file_size) { finishDownload();
download_finished = true;
}
LOG.log(Level.INFO, "{0} ChunkWriterManager waiting for chunk [{1}] {2}...", new Object[]{Thread.currentThread().getName(), _last_chunk_id_written + 1, _download.getFile_name()}); boolean chunk_io_error;
secureWait(); do {
chunk_io_error = false;
try {
File chunk_file = new File(getChunks_dir() + "/" + MiscTools.HashString("sha1", _download.getUrl()) + ".chunk" + String.valueOf(_last_chunk_id_written + 1));
while (chunk_file.exists() && chunk_file.canRead() && chunk_file.canWrite() && chunk_file.length() > 0) {
if (!download_finished && _download.getProgress() == _file_size) {
finishDownload();
download_finished = true;
}
byte[] buffer = new byte[MainPanel.DEFAULT_BYTE_BUFFER_SIZE];
int reads;
try (CipherInputStream cis = new CipherInputStream(new BufferedInputStream(new FileInputStream(chunk_file)), genDecrypter("AES", "AES/CTR/NoPadding", _byte_file_key, forwardMEGALinkKeyIV(_byte_iv, _bytes_written)))) {
while ((reads = cis.read(buffer)) != -1) {
_download.getOutput_stream().write(buffer, 0, reads);
}
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException ex) {
LOG.log(Level.SEVERE, ex.getMessage());
}
_bytes_written += chunk_file.length();
_last_chunk_id_written++;
LOG.log(Level.INFO, "{0} ChunkWriterManager has written to disk chunk [{1}] {2} {3} {4}...", new Object[]{Thread.currentThread().getName(), _last_chunk_id_written, _bytes_written, _download.calculateLastWrittenChunk(_bytes_written), _download.getFile_name()});
chunk_file.delete();
chunk_file = new File(getChunks_dir() + "/" + MiscTools.HashString("sha1", _download.getUrl()) + ".chunk" + String.valueOf(_last_chunk_id_written + 1));
}
} catch (IOException ex) {
chunk_io_error = true;
LOG.log(Level.WARNING, ex.getMessage());
MiscTools.pausar(1000);
}
} while (chunk_io_error);
if (!_exit && (!_download.isStopped() || !_download.getChunkworkers().isEmpty()) && _bytes_written < _file_size) {
LOG.log(Level.INFO, "{0} ChunkWriterManager waiting for chunk [{1}] {2}...", new Object[]{Thread.currentThread().getName(), _last_chunk_id_written + 1, _download.getFile_name()});
if (JOIN_CHUNKS_LOCK.isHeldByCurrentThread() && JOIN_CHUNKS_LOCK.isLocked()) {
LOG.log(Level.INFO, "{0} ChunkWriterManager: JOIN LOCK RELEASED FOR {1}", new Object[]{Thread.currentThread().getName(), _download.getFile_name()});
JOIN_CHUNKS_LOCK.unlock();
}
secureWait();
}
} }
} finally {
if (JOIN_CHUNKS_LOCK.isHeldByCurrentThread() && JOIN_CHUNKS_LOCK.isLocked()) {
LOG.log(Level.INFO, "{0} ChunkWriterManager: JOIN LOCK RELEASED FOR {1}", new Object[]{Thread.currentThread().getName(), _download.getFile_name()});
JOIN_CHUNKS_LOCK.unlock();
}
} }
if (_bytes_written == _file_size && MiscTools.isDirEmpty(Paths.get(getChunks_dir()))) { if (_bytes_written == _file_size && MiscTools.isDirEmpty(Paths.get(getChunks_dir()))) {

View File

@ -1534,7 +1534,6 @@ public class Download implements Transference, Runnable, SecureSingleThreadNotif
_retrying_request = true; _retrying_request = true;
MiscTools.GUIRun(() -> { MiscTools.GUIRun(() -> {
getMain_panel().getView().getNew_download_menu().setEnabled(true);
getView().getStop_button().setVisible(true); getView().getStop_button().setVisible(true);

View File

@ -41,7 +41,6 @@ public class FileSplitterDialog extends javax.swing.JDialog {
private final MainPanel _main_panel; private final MainPanel _main_panel;
private File[] _files = null; private File[] _files = null;
private File _output_dir = null; private File _output_dir = null;
private volatile String _sha1 = null;
private volatile long _progress = 0L; private volatile long _progress = 0L;
private volatile Path _current_part = null; private volatile Path _current_part = null;
private volatile int _current_file = 0; private volatile int _current_file = 0;
@ -86,17 +85,6 @@ public class FileSplitterDialog extends javax.swing.JDialog {
private boolean _splitFile(int i) throws IOException { private boolean _splitFile(int i) throws IOException {
_sha1 = "";
THREAD_POOL.execute(() -> {
try {
_sha1 = MiscTools.computeFileSHA1(new File(_files[i].getAbsolutePath()));
} catch (IOException ex) {
Logger.getLogger(FileSplitterDialog.class.getName()).log(Level.SEVERE, null, ex);
}
});
this._progress = 0L; this._progress = 0L;
int mBperSplit = Integer.parseInt(this.split_size_text.getText()); int mBperSplit = Integer.parseInt(this.split_size_text.getText());
@ -135,20 +123,6 @@ public class FileSplitterDialog extends javax.swing.JDialog {
} }
} }
while ("".equals(_sha1)) {
MiscTools.GUIRunAndWait(() -> {
split_button.setText(LabelTranslatorSingleton.getInstance().translate("GENERATING SHA1, please wait..."));
});
MiscTools.pausar(1000);
}
if (_sha1 != null) {
Files.writeString(Paths.get(this._files[i].getAbsolutePath() + ".sha1"), _sha1);
}
return true; return true;
} }
@ -195,9 +169,13 @@ public class FileSplitterDialog extends javax.swing.JDialog {
monitorProgress(f, byteSize); monitorProgress(f, byteSize);
if (!_exit) { if (!_exit) {
long dest_bytes_copied = Files.exists(fileName) ? Files.size(fileName) : 0;
try (RandomAccessFile toFile = new RandomAccessFile(fileName.toFile(), "rw"); FileChannel toChannel = toFile.getChannel()) { try (RandomAccessFile toFile = new RandomAccessFile(fileName.toFile(), "rw"); FileChannel toChannel = toFile.getChannel()) {
sourceChannel.position(position); while (dest_bytes_copied < byteSize) {
toChannel.transferFrom(sourceChannel, 0, byteSize); sourceChannel.position(position + dest_bytes_copied);
dest_bytes_copied += toChannel.transferFrom(sourceChannel, dest_bytes_copied, byteSize - dest_bytes_copied);
}
} }
} }

View File

@ -61,7 +61,6 @@ import static javax.swing.JOptionPane.YES_NO_CANCEL_OPTION;
import static javax.swing.JOptionPane.showOptionDialog; import static javax.swing.JOptionPane.showOptionDialog;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.UIDefaults;
import javax.swing.UIManager; import javax.swing.UIManager;
/** /**
@ -70,7 +69,7 @@ import javax.swing.UIManager;
*/ */
public final class MainPanel { public final class MainPanel {
public static final String VERSION = "8.16"; public static final String VERSION = "8.22";
public static final boolean FORCE_SMART_PROXY = false; //TRUE FOR DEBUGING SMART PROXY public static final boolean FORCE_SMART_PROXY = false; //TRUE FOR DEBUGING SMART PROXY
public static final int THROTTLE_SLICE_SIZE = 16 * 1024; public static final int THROTTLE_SLICE_SIZE = 16 * 1024;
public static final int DEFAULT_BYTE_BUFFER_SIZE = 16 * 1024; public static final int DEFAULT_BYTE_BUFFER_SIZE = 16 * 1024;
@ -107,11 +106,6 @@ public final class MainPanel {
public static void main(String args[]) { public static void main(String args[]) {
setNimbusLookAndFeel();
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
defaults.put("nimbusOrange", defaults.get("nimbusFocus"));
if (args.length > 0) { if (args.length > 0) {
if (args.length > 1) { if (args.length > 1) {
@ -136,6 +130,20 @@ public final class MainPanel {
MEGABASTERD_HOME_DIR = f.getParentFile().getAbsolutePath(); MEGABASTERD_HOME_DIR = f.getParentFile().getAbsolutePath();
} }
try {
setupSqliteTables();
} catch (SQLException ex) {
Logger.getLogger(MainPanel.class.getName()).log(SEVERE, null, ex);
}
setNimbusLookAndFeel("yes".equals(DBTools.selectSettingValue("dark_mode")));
if ("yes".equals(DBTools.selectSettingValue("upload_log"))) {
MiscTools.createUploadLogDir();
}
final MainPanel main_panel = new MainPanel(); final MainPanel main_panel = new MainPanel();
invokeLater(() -> { invokeLater(() -> {
@ -256,16 +264,6 @@ public final class MainPanel {
_resume_downloads = false; _resume_downloads = false;
MiscTools.createUploadLogDir();
try {
setupSqliteTables();
} catch (SQLException ex) {
Logger.getLogger(MainPanel.class.getName()).log(SEVERE, null, ex);
}
loadUserSettings(); loadUserSettings();
if (_debug_file) { if (_debug_file) {

View File

@ -276,6 +276,8 @@ public final class MainPanelView extends javax.swing.JFrame {
if (dialog.getUpload_log_checkbox().isSelected()) { if (dialog.getUpload_log_checkbox().isSelected()) {
MiscTools.createUploadLogDir();
File upload_log = new File(MiscTools.UPLOAD_LOGS_DIR + "/megabasterd_upload_" + parent_node + ".log"); File upload_log = new File(MiscTools.UPLOAD_LOGS_DIR + "/megabasterd_upload_" + parent_node + ".log");
upload_log.createNewFile(); upload_log.createNewFile();
@ -1026,8 +1028,6 @@ public final class MainPanelView extends javax.swing.JFrame {
private void new_download_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_new_download_menuActionPerformed private void new_download_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_new_download_menuActionPerformed
new_download_menu.setEnabled(false);
final LinkGrabberDialog dialog = new LinkGrabberDialog(this, true, _main_panel.getDefault_download_path(), _main_panel.getClipboardspy()); final LinkGrabberDialog dialog = new LinkGrabberDialog(this, true, _main_panel.getDefault_download_path(), _main_panel.getClipboardspy());
_main_panel.getClipboardspy().attachObserver(dialog); _main_panel.getClipboardspy().attachObserver(dialog);
@ -1134,10 +1134,6 @@ public final class MainPanelView extends javax.swing.JFrame {
getMain_panel().getDownload_manager().secureNotify(); getMain_panel().getDownload_manager().secureNotify();
MiscTools.GUIRun(() -> {
new_download_menu.setEnabled(true);
});
boolean link_warning; boolean link_warning;
for (String url : urls) { for (String url : urls) {
@ -1254,10 +1250,6 @@ public final class MainPanelView extends javax.swing.JFrame {
} }
} else {
MiscTools.GUIRun(() -> {
new_download_menu.setEnabled(true);
});
} }
}; };
@ -1265,9 +1257,6 @@ public final class MainPanelView extends javax.swing.JFrame {
getMain_panel().getDownload_manager().secureNotify(); getMain_panel().getDownload_manager().secureNotify();
} else {
new_download_menu.setEnabled(true);
} }
dialog.dispose(); dialog.dispose();

View File

@ -11,6 +11,7 @@ package com.tonikelope.megabasterd;
import static com.tonikelope.megabasterd.MainPanel.THREAD_POOL; import static com.tonikelope.megabasterd.MainPanel.THREAD_POOL;
import static com.tonikelope.megabasterd.MainPanel.VERSION; import static com.tonikelope.megabasterd.MainPanel.VERSION;
import java.awt.Color;
import java.awt.Component; import java.awt.Component;
import java.awt.Container; import java.awt.Container;
import java.awt.Desktop; import java.awt.Desktop;
@ -99,6 +100,8 @@ import javax.swing.JOptionPane;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JTree; import javax.swing.JTree;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder; import javax.swing.border.TitledBorder;
import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.DefaultTreeModel;
@ -280,16 +283,41 @@ public class MiscTools {
return font; return font;
} }
public static void setNimbusLookAndFeel() { public static void setNimbusLookAndFeel(boolean dark) {
try { try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) { if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName()); javax.swing.UIManager.setLookAndFeel(info.getClassName());
if (dark) {
// Dark LAF
UIManager.put("control", new Color(128, 128, 128));
UIManager.put("info", new Color(128, 128, 128));
UIManager.put("nimbusBase", new Color(18, 30, 49));
UIManager.put("nimbusAlertYellow", new Color(248, 187, 0));
UIManager.put("nimbusDisabledText", new Color(100, 100, 100));
UIManager.put("nimbusFocus", new Color(115, 164, 209));
UIManager.put("nimbusGreen", new Color(176, 179, 50));
UIManager.put("nimbusInfoBlue", new Color(66, 139, 221));
UIManager.put("nimbusLightBackground", new Color(18, 30, 49));
UIManager.put("nimbusOrange", new Color(191, 98, 4));
UIManager.put("nimbusRed", new Color(169, 46, 34));
UIManager.put("nimbusSelectedText", new Color(255, 255, 255));
UIManager.put("nimbusSelectionBackground", new Color(104, 93, 156));
UIManager.put("text", new Color(230, 230, 230));
} else {
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
defaults.put("nimbusOrange", defaults.get("nimbusFocus"));
}
break; break;
} }
} }
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) { } catch (Exception ex) {
java.util.logging.Logger.getLogger(MiscTools.class.getName()).log(java.util.logging.Level.SEVERE, ex.getMessage()); java.util.logging.Logger.getLogger(MiscTools.class.getName()).log(java.util.logging.Level.SEVERE, ex.getMessage());
} }
} }

View File

@ -405,6 +405,9 @@
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="18" style="0"/> <Font name="Dialog" size="18" style="0"/>
</Property> </Property>
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="ff" green="0" red="33" type="rgb"/>
</Property>
<Property name="text" type="java.lang.String" value="default dir"/> <Property name="text" type="java.lang.String" value="default dir"/>
<Property name="opaque" type="boolean" value="true"/> <Property name="opaque" type="boolean" value="true"/>
</Properties> </Properties>
@ -1010,6 +1013,9 @@
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Noto Sans" size="18" style="1"/> <Font name="Noto Sans" size="18" style="1"/>
</Property> </Property>
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="ff" green="33" red="0" type="rgb"/>
</Property>
<Property name="lineWrap" type="boolean" value="true"/> <Property name="lineWrap" type="boolean" value="true"/>
<Property name="rows" type="int" value="5"/> <Property name="rows" type="int" value="5"/>
<Property name="text" type="java.lang.String" value="THIS OPTION IS NOT RECOMMENDED. Using this will cause MegaBasterd uploaded folder to appear in your account as NOT DECRYPTABLE. &#xa;&#xa;At the time of writing this text, there is a method to FIX IT:&#xa;&#xa;1) Move first upload subfolder to the ROOT (CLOUD) folder of your account. &#xa;&#xa;2) Go to account settings and click RELOAD ACCOUNT. &#xa;&#xa;I don&apos;t know how long this method will last. USE THIS OPTION AT YOUR OWN RISK."/> <Property name="text" type="java.lang.String" value="THIS OPTION IS NOT RECOMMENDED. Using this will cause MegaBasterd uploaded folder to appear in your account as NOT DECRYPTABLE. &#xa;&#xa;At the time of writing this text, there is a method to FIX IT:&#xa;&#xa;1) Move first upload subfolder to the ROOT (CLOUD) folder of your account. &#xa;&#xa;2) Go to account settings and click RELOAD ACCOUNT. &#xa;&#xa;I don&apos;t know how long this method will last. USE THIS OPTION AT YOUR OWN RISK."/>
@ -1825,23 +1831,26 @@
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Group type="103" alignment="0" groupAlignment="0" max="-2" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="103" groupAlignment="0" max="-2" attributes="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<Component id="zoom_label" alignment="0" min="-2" max="-2" attributes="0"/> <Group type="103" groupAlignment="0" attributes="0">
<Component id="font_label" alignment="0" min="-2" max="-2" attributes="0"/> <Component id="zoom_label" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="font_label" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="32767" attributes="0"/>
<Group type="103" groupAlignment="0" max="-2" attributes="0">
<Component id="font_combo" max="32767" attributes="0"/>
<Component id="zoom_spinner" min="-2" pref="351" max="-2" attributes="0"/>
</Group>
</Group> </Group>
<EmptySpace max="32767" attributes="0"/> <Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="0" max="-2" attributes="0"> <Component id="jLabel2" min="-2" max="-2" attributes="0"/>
<Component id="font_combo" max="32767" attributes="0"/> <EmptySpace max="32767" attributes="0"/>
<Component id="zoom_spinner" min="-2" pref="351" max="-2" attributes="0"/> <Component id="language_combo" min="-2" pref="351" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
<Group type="102" alignment="0" attributes="0"> <Component id="dark_mode_checkbox" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
<Component id="language_combo" min="-2" pref="351" max="-2" attributes="0"/>
</Group>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
</Group> </Group>
@ -1866,6 +1875,8 @@
<Component id="language_combo" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="language_combo" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="dark_mode_checkbox" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -1930,6 +1941,14 @@
<Property name="doubleBuffered" type="boolean" value="true"/> <Property name="doubleBuffered" type="boolean" value="true"/>
</Properties> </Properties>
</Component> </Component>
<Component class="javax.swing.JCheckBox" name="dark_mode_checkbox">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="18" style="1"/>
</Property>
<Property name="text" type="java.lang.String" value="DARK MODE"/>
</Properties>
</Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Component class="javax.swing.JLabel" name="debug_file_path"> <Component class="javax.swing.JLabel" name="debug_file_path">

View File

@ -387,6 +387,17 @@ public class SettingsDialog extends javax.swing.JDialog {
proxy_sequential_radio.setSelected(true); proxy_sequential_radio.setSelected(true);
} }
boolean dark_mode = false;
String dark_mode_select = DBTools.selectSettingValue("dark_mode");
if (dark_mode_select != null) {
dark_mode = dark_mode_select.equals("yes");
}
dark_mode_checkbox.setSelected(dark_mode);
String max_ul_speed = DBTools.selectSettingValue("max_upload_speed"); String max_ul_speed = DBTools.selectSettingValue("max_upload_speed");
int max_upload_speed = Upload.MAX_TRANSFERENCE_SPEED_DEFAULT; int max_upload_speed = Upload.MAX_TRANSFERENCE_SPEED_DEFAULT;
@ -883,6 +894,7 @@ public class SettingsDialog extends javax.swing.JDialog {
font_combo = new javax.swing.JComboBox<>(); font_combo = new javax.swing.JComboBox<>();
zoom_label = new javax.swing.JLabel(); zoom_label = new javax.swing.JLabel();
zoom_spinner = new javax.swing.JSpinner(); zoom_spinner = new javax.swing.JSpinner();
dark_mode_checkbox = new javax.swing.JCheckBox();
debug_file_path = new javax.swing.JLabel(); debug_file_path = new javax.swing.JLabel();
status = new javax.swing.JLabel(); status = new javax.swing.JLabel();
@ -996,6 +1008,7 @@ public class SettingsDialog extends javax.swing.JDialog {
default_dir_label.setBackground(new java.awt.Color(153, 255, 153)); default_dir_label.setBackground(new java.awt.Color(153, 255, 153));
default_dir_label.setFont(new java.awt.Font("Dialog", 0, 18)); // NOI18N default_dir_label.setFont(new java.awt.Font("Dialog", 0, 18)); // NOI18N
default_dir_label.setForeground(new java.awt.Color(51, 0, 255));
default_dir_label.setText("default dir"); default_dir_label.setText("default dir");
default_dir_label.setOpaque(true); default_dir_label.setOpaque(true);
@ -1364,6 +1377,7 @@ public class SettingsDialog extends javax.swing.JDialog {
public_folder_warning.setBackground(new java.awt.Color(255, 255, 51)); public_folder_warning.setBackground(new java.awt.Color(255, 255, 51));
public_folder_warning.setColumns(20); public_folder_warning.setColumns(20);
public_folder_warning.setFont(new java.awt.Font("Noto Sans", 1, 18)); // NOI18N public_folder_warning.setFont(new java.awt.Font("Noto Sans", 1, 18)); // NOI18N
public_folder_warning.setForeground(new java.awt.Color(0, 51, 255));
public_folder_warning.setLineWrap(true); public_folder_warning.setLineWrap(true);
public_folder_warning.setRows(5); public_folder_warning.setRows(5);
public_folder_warning.setText("THIS OPTION IS NOT RECOMMENDED. Using this will cause MegaBasterd uploaded folder to appear in your account as NOT DECRYPTABLE. \n\nAt the time of writing this text, there is a method to FIX IT:\n\n1) Move first upload subfolder to the ROOT (CLOUD) folder of your account. \n\n2) Go to account settings and click RELOAD ACCOUNT. \n\nI don't know how long this method will last. USE THIS OPTION AT YOUR OWN RISK."); public_folder_warning.setText("THIS OPTION IS NOT RECOMMENDED. Using this will cause MegaBasterd uploaded folder to appear in your account as NOT DECRYPTABLE. \n\nAt the time of writing this text, there is a method to FIX IT:\n\n1) Move first upload subfolder to the ROOT (CLOUD) folder of your account. \n\n2) Go to account settings and click RELOAD ACCOUNT. \n\nI don't know how long this method will last. USE THIS OPTION AT YOUR OWN RISK.");
@ -1889,25 +1903,30 @@ public class SettingsDialog extends javax.swing.JDialog {
zoom_spinner.setFont(new java.awt.Font("Dialog", 0, 18)); // NOI18N zoom_spinner.setFont(new java.awt.Font("Dialog", 0, 18)); // NOI18N
zoom_spinner.setDoubleBuffered(true); zoom_spinner.setDoubleBuffered(true);
dark_mode_checkbox.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
dark_mode_checkbox.setText("DARK MODE");
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout); jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup( jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup() .addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap() .addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(zoom_label) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(font_label)) .addComponent(zoom_label)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(font_label))
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(font_combo, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(zoom_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, 351, javax.swing.GroupLayout.PREFERRED_SIZE))) .addComponent(font_combo, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanel2Layout.createSequentialGroup() .addComponent(zoom_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, 351, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addComponent(jLabel2) .addGroup(jPanel2Layout.createSequentialGroup()
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel2)
.addComponent(language_combo, javax.swing.GroupLayout.PREFERRED_SIZE, 351, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(language_combo, javax.swing.GroupLayout.PREFERRED_SIZE, 351, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addComponent(dark_mode_checkbox))
.addContainerGap()) .addContainerGap())
); );
jPanel2Layout.setVerticalGroup( jPanel2Layout.setVerticalGroup(
@ -1925,6 +1944,8 @@ public class SettingsDialog extends javax.swing.JDialog {
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2) .addComponent(jLabel2)
.addComponent(language_combo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(language_combo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(dark_mode_checkbox)
.addContainerGap()) .addContainerGap())
); );
@ -2102,11 +2123,16 @@ public class SettingsDialog extends javax.swing.JDialog {
settings.put("force_smart_proxy", force_smart_proxy_checkbox.isSelected() ? "yes" : "no"); settings.put("force_smart_proxy", force_smart_proxy_checkbox.isSelected() ? "yes" : "no");
settings.put("reset_slot_proxy", proxy_reset_slot_checkbox.isSelected() ? "yes" : "no"); settings.put("reset_slot_proxy", proxy_reset_slot_checkbox.isSelected() ? "yes" : "no");
settings.put("random_proxy", proxy_random_radio.isSelected() ? "yes" : "no"); settings.put("random_proxy", proxy_random_radio.isSelected() ? "yes" : "no");
settings.put("dark_mode", dark_mode_checkbox.isSelected() ? "yes" : "no");
settings.put("upload_public_folder", upload_public_folder_checkbox.isSelected() ? "yes" : "no"); settings.put("upload_public_folder", upload_public_folder_checkbox.isSelected() ? "yes" : "no");
settings.put("smartproxy_ban_time", String.valueOf(bad_proxy_time_spinner.getValue())); settings.put("smartproxy_ban_time", String.valueOf(bad_proxy_time_spinner.getValue()));
settings.put("smartproxy_timeout", String.valueOf(proxy_timeout_spinner.getValue())); settings.put("smartproxy_timeout", String.valueOf(proxy_timeout_spinner.getValue()));
settings.put("smartproxy_autorefresh_time", String.valueOf(auto_refresh_proxy_time_spinner.getValue())); settings.put("smartproxy_autorefresh_time", String.valueOf(auto_refresh_proxy_time_spinner.getValue()));
if (upload_log_checkbox.isSelected()) {
createUploadLogDir();
}
if (custom_proxy_textarea.getText().trim().length() == 0) { if (custom_proxy_textarea.getText().trim().length() == 0) {
smart_proxy_checkbox.setSelected(false); smart_proxy_checkbox.setSelected(false);
} }
@ -2169,6 +2195,16 @@ public class SettingsDialog extends javax.swing.JDialog {
String zoom = String.valueOf(zoom_spinner.getValue()); String zoom = String.valueOf(zoom_spinner.getValue());
boolean old_dark_mode = false;
String dark_mode_val = DBTools.selectSettingValue("dark_mode");
if (dark_mode_val != null) {
old_dark_mode = (dark_mode_val.equals("yes"));
}
boolean dark_mode = dark_mode_checkbox.isSelected();
boolean old_use_proxy = false; boolean old_use_proxy = false;
String use_proxy_val = DBTools.selectSettingValue("use_proxy"); String use_proxy_val = DBTools.selectSettingValue("use_proxy");
@ -2242,7 +2278,8 @@ public class SettingsDialog extends javax.swing.JDialog {
|| !proxy_host.equals(old_proxy_host) || !proxy_host.equals(old_proxy_host)
|| !proxy_port.equals(old_proxy_port) || !proxy_port.equals(old_proxy_port)
|| !proxy_user.equals(old_proxy_user) || !proxy_user.equals(old_proxy_user)
|| !proxy_pass.equals(old_proxy_pass)) { || !proxy_pass.equals(old_proxy_pass)
|| dark_mode != old_dark_mode) {
_main_panel.setRestart(true); _main_panel.setRestart(true);
} }
@ -3416,6 +3453,7 @@ public class SettingsDialog extends javax.swing.JDialog {
private javax.swing.JLabel custom_chunks_dir_current_label; private javax.swing.JLabel custom_chunks_dir_current_label;
private javax.swing.JLabel custom_proxy_list_label; private javax.swing.JLabel custom_proxy_list_label;
private javax.swing.JTextArea custom_proxy_textarea; private javax.swing.JTextArea custom_proxy_textarea;
private javax.swing.JCheckBox dark_mode_checkbox;
private javax.swing.JCheckBox debug_file_checkbox; private javax.swing.JCheckBox debug_file_checkbox;
private javax.swing.JLabel debug_file_path; private javax.swing.JLabel debug_file_path;
private javax.swing.JLabel default_dir_label; private javax.swing.JLabel default_dir_label;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 KiB

After

Width:  |  Height:  |  Size: 214 KiB