4 Commits

Author SHA1 Message Date
Marc BARBIER 47d9e8e392 bandwith wip 2021-07-09 17:36:08 +02:00
Marc BARBIER c64ddd90c5 reindent + add error 2021-07-09 15:09:12 +02:00
Marc barbier 2f1ecef3d6 Merge pull request #1 from Marc-Pierre-Barbier/add-license-1
Create LICENSE
2021-07-09 10:03:41 +02:00
Marc barbier 0cfe34d152 Create LICENSE 2021-07-09 10:03:26 +02:00
8 changed files with 153 additions and 67 deletions
+24
View File
@@ -0,0 +1,24 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <https://unlicense.org>
+5
View File
@@ -0,0 +1,5 @@
{
"java.project.referencedLibraries": [
"lib/**/*.jar"
]
}
@@ -1,29 +1,25 @@
package downloader;
public class CurseForgeModFile extends ProjectInfo {
private int projectID;
private int fileID;
private boolean clientOnly;
public CurseForgeModFile(ProjectInfo pj, int projectID, int fileID, boolean clientOnly) {
this(pj.getSlug(), pj.getName(), pj.getDesc(), projectID, fileID, clientOnly);
}
public CurseForgeModFile(String slug, String name, String desc, int projectID, int fileID, boolean clientOnly) {
super(slug, name, desc);
this.projectID = projectID;
this.fileID = fileID;
this.clientOnly = clientOnly;
}
public int getFileID() {
return this.fileID;
}
public int getProjectID() {
return this.projectID;
}
public boolean isClientOnly() {
return this.clientOnly;
}
private int projectID;
private int fileID;
private boolean clientOnly;
public CurseForgeModFile(ProjectInfo pj, int projectID, int fileID, boolean clientOnly) {
this(pj.getSlug(), pj.getName(), pj.getDesc(), projectID, fileID, clientOnly);
}
public CurseForgeModFile(String slug, String name, String desc, int projectID, int fileID, boolean clientOnly) {
super(slug, name, desc);
this.projectID = projectID;
this.fileID = fileID;
this.clientOnly = clientOnly;
}
public int getFileID() {
return this.fileID;
}
public int getProjectID() {
return this.projectID;
}
public boolean isClientOnly() {
return this.clientOnly;
}
}
@@ -13,14 +13,20 @@ import downloader.forgeSvc.ForgeSvcFile;
import downloader.helper.HttpHelper;
public class Database {
DBConnector connector;
private DBConnector connector;
Gson gson;
private Gson gson;
private static final String ME = "Db";
public Database() {
try {
//work around to avoid
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e1) {} //it will crash anyway
} catch (ClassNotFoundException e1) {
Log.e(ME, "Error sqLite was not found");
System.exit(1);
}
this.connector = new DBConnector();
try {
@@ -39,7 +45,7 @@ public class Database {
if (rs.next()) {
pjId = rs.getInt("projectid");
} else {
Log.e("DB", "not found " + slug);
Log.e(ME, "not found " + slug);
return -1;
}
} catch (SQLException e) {
@@ -1,7 +1,6 @@
package downloader;
import java.io.File;
import java.io.IOException;
import downloader.helper.ArchiveHelper;
import downloader.helper.SlugHelper;
+19 -2
View File
@@ -1,13 +1,30 @@
package downloader;
import java.io.PrintStream;
public class Log {
private Log() {}
private static String staticLine = "";
private static PrintStream lastStream = System.out;
public static void e(String who, String msg) {
System.out.println(String.valueOf(who) + " : " + msg);
printNonStatic(String.valueOf(who) + " : " + msg, System.err);
}
public static void i(String who, String msg) {
if(Main.verbose)System.out.println(String.valueOf(who) + " : " + msg);
if(Main.verbose) printNonStatic(String.valueOf(who) + " : " + msg, System.out);
}
private static void printNonStatic(String line, PrintStream stream) {
//erase last stream since we used \r
lastStream.print("");
stream.println(line);
stream.print(staticLine + "\r");
lastStream = stream;
}
public static void setStaticPrint(String staticString) {
staticLine = staticString;
System.out.print(staticString + "\r");
}
}
@@ -7,24 +7,23 @@ import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import downloader.forgeSvc.ForgeSvcFile;
import downloader.helper.HttpHelper;
public class ModUpdater {
private DirectUpdateManager directUpdateManager;
private CurseUpdateManager curseUpdateManager;
private Database db;
private DirectUpdateManager directUpdateManager;
private CurseUpdateManager curseUpdateManager;
private Database db;
private final String ME = "ModUpdater";
public ModUpdater() {
this.db = new Database();
this.directUpdateManager = new DirectUpdateManager();
this.curseUpdateManager = new CurseUpdateManager();
}
public ModUpdater() {
this.db = new Database();
this.directUpdateManager = new DirectUpdateManager();
this.curseUpdateManager = new CurseUpdateManager();
}
public void update() {
public void update() {
File modsList = new File("modpack.txt");
if(!(modsList.exists() && modsList.isFile())) {
@@ -35,8 +34,8 @@ public class ModUpdater {
//parse and download
List<Thread> threads = new ArrayList<>(Main.threadNb);
try {
BufferedReader in = new BufferedReader(new FileReader(modsList));
while (in.ready()) {
BufferedReader in = new BufferedReader(new FileReader(modsList));
while (in.ready()) {
String line = in.readLine();
if (!isAComment(line)) {
Thread t = new UpdaterThread(line, db, directUpdateManager, curseUpdateManager, threads);
@@ -49,12 +48,12 @@ public class ModUpdater {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
}
in.close();
} catch( IOException e ) {
e.printStackTrace();
System.exit(1);
}
}
in.close();
} catch( IOException e ) {
e.printStackTrace();
System.exit(1);
}
//on attend la fin des threads
while( !threads.isEmpty() ) {
@@ -64,9 +63,9 @@ public class ModUpdater {
}
Log.i(ME, "finished");
curseUpdateManager.updateFile();
}
}
public static boolean isAComment(String line)
public static boolean isAComment(String line)
{
return line.startsWith("//");
}
@@ -112,7 +111,7 @@ final class UpdaterThread extends Thread {
}
private void handleDirectDownload(String line) {
String url = line.replaceFirst("direct=.*@", "");
String url = line.replaceFirst("direct=.*@", "");
String filename=extractNameFromLink(line);
//le slug est une nom de mods qui se trouve dans le nom du fichier
@@ -123,19 +122,19 @@ final class UpdaterThread extends Thread {
{
Log.i(ME,"downloading "+ filename);
try {
HttpHelper.readFileFromUrlToFolder(url,"mods",filename);
Log.i(ME,"done");
} catch (MalformedURLException e) {
Log.e(ME, "could not update mod, error while downloading");
}
HttpHelper.readFileFromUrlToFolder(url,"mods",filename);
Log.i(ME,"done");
} catch (MalformedURLException e) {
Log.e(ME, "could not update mod, error while downloading");
}
}
}
}
private void handleCurseDownload(String line) {
String name = line.split("/")[5];
int modID = db.findModBySlug(name);
private void handleCurseDownload(String line) {
String name = line.split("/")[5];
int modID = db.findModBySlug(name);
ProjectInfo pj = db.getProjectInfo(modID);
ForgeSvcFile svc = db.fetchMod(pj, modID);
ForgeSvcFile svc = db.fetchMod(pj, modID);
if (svc != null) {
try {
@@ -10,6 +10,7 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Locale;
import downloader.Log;
@@ -111,6 +112,7 @@ public class HttpHelper {
// imposible vu qu'on l'a crée precedament
}
double start = System.currentTimeMillis();
try (InputStream in = con.getInputStream()) {
// on lit par tranche de 4mo
byte[] buffer = new byte[4096];
@@ -119,6 +121,15 @@ public class HttpHelper {
int bytesRead = in.read(buffer);
if (bytesRead < 0)
break;
{
double elapsed = ( System.currentTimeMillis() - start ) / 1000;
if(elapsed != 0) {
long estimatedBandwith = (long) (bytesRead / elapsed);
//display the estimate
Log.setStaticPrint(formatBandwidth(estimatedBandwith));
start = System.currentTimeMillis();
}
}
downloadingWriter.write(buffer, 0, bytesRead);
}
downloadingWriter.close();
@@ -128,6 +139,35 @@ public class HttpHelper {
}
/**
*
* @param estimatedBandwith in o/s
* @return
*/
private static String formatBandwidth(long estimatedBandwith) {
//is ko/s
if(estimatedBandwith > 1000) {
//is mo/s
if(estimatedBandwith > 1000 * 1000) {
return String.valueOf(estimatedBandwith/ (1000 * 1000)) + "M" + getLocalizedByte() + "/s";
} else {
return String.valueOf(estimatedBandwith/ 1000) + "K" + getLocalizedByte() + "/s";
}
} else {
return String.valueOf(estimatedBandwith) + getLocalizedByte() + "/s";
}
}
private static String getLocalizedByte() {
Locale l = Locale.getDefault();
if (l.equals(Locale.FRANCE) | l.equals(Locale.FRENCH)) {
return "O";
} else {
return "B";
}
}
public static String getFileNameFromURL(String url)
{
String[] urlsplit = url.split("/");