5 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
marc barbier d9d868050f fix bad fetch 2021-07-08 23:02:20 +02:00
8 changed files with 157 additions and 72 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; package downloader;
public class CurseForgeModFile extends ProjectInfo { public class CurseForgeModFile extends ProjectInfo {
private int projectID; private int projectID;
private int fileID; private int fileID;
private boolean clientOnly; private boolean clientOnly;
public CurseForgeModFile(ProjectInfo pj, int projectID, int fileID, boolean clientOnly) {
public CurseForgeModFile(ProjectInfo pj, int projectID, int fileID, boolean clientOnly) { this(pj.getSlug(), pj.getName(), pj.getDesc(), projectID, fileID, 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);
public CurseForgeModFile(String slug, String name, String desc, int projectID, int fileID, boolean clientOnly) { this.projectID = projectID;
super(slug, name, desc); this.fileID = fileID;
this.projectID = projectID; this.clientOnly = clientOnly;
this.fileID = fileID; }
this.clientOnly = clientOnly; public int getFileID() {
} return this.fileID;
}
public int getFileID() { public int getProjectID() {
return this.fileID; return this.projectID;
} }
public int getProjectID() { public boolean isClientOnly() {
return this.projectID; return this.clientOnly;
} }
public boolean isClientOnly() {
return this.clientOnly;
}
} }
@@ -13,14 +13,20 @@ import downloader.forgeSvc.ForgeSvcFile;
import downloader.helper.HttpHelper; import downloader.helper.HttpHelper;
public class Database { public class Database {
DBConnector connector; private DBConnector connector;
private Gson gson;
private static final String ME = "Db";
Gson gson;
public Database() { public Database() {
try { try {
//work around to avoid
Class.forName("org.sqlite.JDBC"); 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(); this.connector = new DBConnector();
try { try {
@@ -34,12 +40,12 @@ public class Database {
private int findProjectBySlug(String slug, int ptype) { private int findProjectBySlug(String slug, int ptype) {
int pjId = -1; int pjId = -1;
ResultSet rs = this.connector.executeRequest("select projectid from projects where type =" + ptype + " and slug LIKE \"%" + slug.trim().toLowerCase() + "%\""); ResultSet rs = this.connector.executeRequest("select projectid from projects where type =" + ptype + " and slug LIKE \"" + slug.trim().toLowerCase() + "\"");
try { try {
if (rs.next()) { if (rs.next()) {
pjId = rs.getInt("projectid"); pjId = rs.getInt("projectid");
} else { } else {
Log.e("DB", "not found " + slug); Log.e(ME, "not found " + slug);
return -1; return -1;
} }
} catch (SQLException e) { } catch (SQLException e) {
@@ -1,7 +1,6 @@
package downloader; package downloader;
import java.io.File; import java.io.File;
import java.io.IOException;
import downloader.helper.ArchiveHelper; import downloader.helper.ArchiveHelper;
import downloader.helper.SlugHelper; import downloader.helper.SlugHelper;
+19 -2
View File
@@ -1,13 +1,30 @@
package downloader; package downloader;
import java.io.PrintStream;
public class Log { public class Log {
private Log() {} private Log() {}
private static String staticLine = "";
private static PrintStream lastStream = System.out;
public static void e(String who, String msg) { 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) { 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.net.MalformedURLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Function;
import downloader.forgeSvc.ForgeSvcFile; import downloader.forgeSvc.ForgeSvcFile;
import downloader.helper.HttpHelper; import downloader.helper.HttpHelper;
public class ModUpdater { public class ModUpdater {
private DirectUpdateManager directUpdateManager; private DirectUpdateManager directUpdateManager;
private CurseUpdateManager curseUpdateManager; private CurseUpdateManager curseUpdateManager;
private Database db; private Database db;
private final String ME = "ModUpdater"; private final String ME = "ModUpdater";
public ModUpdater() {
this.db = new Database();
this.directUpdateManager = new DirectUpdateManager();
this.curseUpdateManager = new CurseUpdateManager();
}
public void update() { public ModUpdater() {
this.db = new Database();
this.directUpdateManager = new DirectUpdateManager();
this.curseUpdateManager = new CurseUpdateManager();
}
public void update() {
File modsList = new File("modpack.txt"); File modsList = new File("modpack.txt");
if(!(modsList.exists() && modsList.isFile())) { if(!(modsList.exists() && modsList.isFile())) {
@@ -35,8 +34,8 @@ public class ModUpdater {
//parse and download //parse and download
List<Thread> threads = new ArrayList<>(Main.threadNb); List<Thread> threads = new ArrayList<>(Main.threadNb);
try { try {
BufferedReader in = new BufferedReader(new FileReader(modsList)); BufferedReader in = new BufferedReader(new FileReader(modsList));
while (in.ready()) { while (in.ready()) {
String line = in.readLine(); String line = in.readLine();
if (!isAComment(line)) { if (!isAComment(line)) {
Thread t = new UpdaterThread(line, db, directUpdateManager, curseUpdateManager, threads); Thread t = new UpdaterThread(line, db, directUpdateManager, curseUpdateManager, threads);
@@ -49,24 +48,24 @@ public class ModUpdater {
Thread.sleep(10); Thread.sleep(10);
} catch (InterruptedException e) {} } catch (InterruptedException e) {}
} }
} }
in.close(); in.close();
} catch( IOException e ) { } catch( IOException e ) {
e.printStackTrace(); e.printStackTrace();
System.exit(1); System.exit(1);
} }
//on attend la fin des threads //on attend la fin des threads
while( !threads.isEmpty() ) { while( !threads.isEmpty() ) {
try { try {
Thread.sleep(10); Thread.sleep(100);
} catch (InterruptedException e) {} } catch (InterruptedException e) {}
} }
Log.i(ME, "finished"); Log.i(ME, "finished");
curseUpdateManager.updateFile(); curseUpdateManager.updateFile();
} }
public static boolean isAComment(String line) public static boolean isAComment(String line)
{ {
return line.startsWith("//"); return line.startsWith("//");
} }
@@ -82,7 +81,7 @@ final class UpdaterThread extends Thread {
private static final String ME = "ModUpdaterThread"; private static final String ME = "ModUpdaterThread";
public UpdaterThread(String line, Database db, DirectUpdateManager directUpdateManager, CurseUpdateManager curseUpdateManager, List<Thread> threads) { public UpdaterThread(String line, Database db, DirectUpdateManager directUpdateManager, CurseUpdateManager curseUpdateManager, List<Thread> threads) {
super(); super(line);
this.line = line; this.line = line;
this.db = db; this.db = db;
this.directUpdateManager = directUpdateManager; this.directUpdateManager = directUpdateManager;
@@ -112,31 +111,30 @@ final class UpdaterThread extends Thread {
} }
private void handleDirectDownload(String line) { private void handleDirectDownload(String line) {
String url = line.replaceFirst("direct=.*@", ""); String url = line.replaceFirst("direct=.*@", "");
String filename=extractNameFromLink(line); String filename=extractNameFromLink(line);
//le slug est une nom de mods qui se trouve dans le nom du fichier //le slug est une nom de mods qui se trouve dans le nom du fichier
String slug = extractSlugFromLink(line); String slug = extractSlugFromLink(line);
//on check si le mods est pas déja installé et si il est a jours //on check si le mods est pas déja installé et si il est a jours
Log.e("who",slug);
boolean upToDate = directUpdateManager.checkAndDelete(filename, slug); boolean upToDate = directUpdateManager.checkAndDelete(filename, slug);
if(!upToDate) if(!upToDate)
{ {
Log.i(ME,"downloading "+ filename); Log.i(ME,"downloading "+ filename);
try { try {
HttpHelper.readFileFromUrlToFolder(url,"mods",filename); HttpHelper.readFileFromUrlToFolder(url,"mods",filename);
Log.i(ME,"done"); Log.i(ME,"done");
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
Log.e(ME, "could not update mod, error while downloading"); Log.e(ME, "could not update mod, error while downloading");
} }
} }
} }
private void handleCurseDownload(String line) { private void handleCurseDownload(String line) {
String name = line.split("/")[5]; String name = line.split("/")[5];
int modID = db.findModBySlug(name); int modID = db.findModBySlug(name);
ProjectInfo pj = db.getProjectInfo(modID); ProjectInfo pj = db.getProjectInfo(modID);
ForgeSvcFile svc = db.fetchMod(pj, modID); ForgeSvcFile svc = db.fetchMod(pj, modID);
if (svc != null) { if (svc != null) {
try { try {
@@ -152,13 +150,13 @@ final class UpdaterThread extends Thread {
Log.i("DB", "NEW MOD DETECTED " + modID); Log.i("DB", "NEW MOD DETECTED " + modID);
upToDate = this.curseUpdateManager.checkAndDelete(new File("mods/" + HttpHelper.getFileNameFromURL(downloadUrl)), pj.getSlug()); upToDate = this.curseUpdateManager.checkAndDelete(new File("mods/" + HttpHelper.getFileNameFromURL(downloadUrl)), pj.getSlug());
if(upToDate) { if(upToDate) {
Log.i("who", "file found");
this.curseUpdateManager.addModsToTheList("mods/" + HttpHelper.getFileNameFromURL(downloadUrl), modID); this.curseUpdateManager.addModsToTheList("mods/" + HttpHelper.getFileNameFromURL(downloadUrl), modID);
} }
} }
if (!upToDate) { if (!upToDate) {
Log.i("MOD", "downloading " + pj.getName().replace(" ", "-")); Log.i("MOD", "downloading " + pj.getName().replace(" ", "-"));
HttpHelper.readFileFromUrlToFolder(downloadUrl, "mods"); HttpHelper.readFileFromUrlToFolder(downloadUrl, "mods");
Log.i("MOD", "download finished"); Log.i("MOD", "download finished");
@@ -10,6 +10,7 @@ import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Locale;
import downloader.Log; import downloader.Log;
@@ -111,6 +112,7 @@ public class HttpHelper {
// imposible vu qu'on l'a crée precedament // imposible vu qu'on l'a crée precedament
} }
double start = System.currentTimeMillis();
try (InputStream in = con.getInputStream()) { try (InputStream in = con.getInputStream()) {
// on lit par tranche de 4mo // on lit par tranche de 4mo
byte[] buffer = new byte[4096]; byte[] buffer = new byte[4096];
@@ -119,6 +121,15 @@ public class HttpHelper {
int bytesRead = in.read(buffer); int bytesRead = in.read(buffer);
if (bytesRead < 0) if (bytesRead < 0)
break; 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.write(buffer, 0, bytesRead);
} }
downloadingWriter.close(); downloadingWriter.close();
@@ -127,7 +138,36 @@ public class HttpHelper {
return null; return null;
} }
/**
*
* @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) public static String getFileNameFromURL(String url)
{ {
String[] urlsplit = url.split("/"); String[] urlsplit = url.split("/");