16 Commits
0.1.6 ... 0.1.7

Author SHA1 Message Date
959963f9bc more logger work and lib updates
* jfoenix 1.7.0 -> 1.8.0
* sqlite 3.19.1 -> 3.20.0
* replaced all remaining syso/syse with logger output
* fixed a bug in smmdb api integration by only requesting the first 70 courses (this is a temporary workaround)
* code clean up
* typo fixes
2017-09-12 15:04:21 +02:00
85fc66e8d6 logging to file
* the logger output is now written into a file in the cemu_UI directory called app.log
2017-09-02 17:38:40 +02:00
6c1663f386 reworked loadSettings
* loadSettings() should be 100% bulletproof
* replaced a few more syso with logger
2017-08-30 11:29:58 +02:00
71cf0316ec replace syso with logger
* replacing all debug/info syso and all syse with log4j 2 logger
2017-08-27 20:44:08 +02:00
dec767f553 Merge remote-tracking branch 'origin/master' 2017-08-27 18:23:36 +02:00
a24783f18c code clean up
* smmdb api query is not started anymore when closing the smmdb window
* general code clean up
2017-08-27 18:23:09 +02:00
9f0956a674 code clean up
* smmdb api query is not started anymore on closing the smmdb window
* general code clean up
2017-08-27 18:22:05 +02:00
dbd52cbe9c smmdb api integration rework
* fixed wrong placment of the downloaded courses
2017-08-27 17:25:41 +02:00
4c8a0a51e9 smmdb api integration rework part 2/2
* fixed all remaining parameters
* course is downloaded as .zip now
* junrar is replaced by zip4j
2017-08-26 00:13:09 +02:00
7a2112a759 smmd rework part 1
due to changes on the smmdb api i have to rework the smmdb integration
2017-08-25 14:57:15 +02:00
9930a4cb15 added a smmID
* added 44fc5929 to smmIDs
2017-08-24 22:04:06 +02:00
d36b869e80 updated build number 2017-08-11 20:04:36 +02:00
43a7e22254 fixed loading error
* fixed an issue with loading sttings when no cloudService is set
2017-08-11 20:01:43 +02:00
07d33df63a updated libraries
* jfoenix 1.4.0 -> 1.7.0
* sqlite-jdbc 3.18.0 -> 3.19.3
* flow 8.0.1
2017-08-01 20:20:37 +02:00
e394b1a573 Material styled dialogs
* added material styled dialogs
2017-08-01 20:11:17 +02:00
a30def1fd0 Update README.md 2017-07-26 18:08:26 +02:00
58 changed files with 686 additions and 465 deletions

View File

@ -16,11 +16,14 @@
<classpathentry kind="lib" path="src/libraries/google_apis/jetty-util-6.1.25.jar"/> <classpathentry kind="lib" path="src/libraries/google_apis/jetty-util-6.1.25.jar"/>
<classpathentry kind="lib" path="src/libraries/google_apis/jackson-core-2.8.8.jar"/> <classpathentry kind="lib" path="src/libraries/google_apis/jackson-core-2.8.8.jar"/>
<classpathentry kind="lib" path="src/libraries/commons-codec-1.10.jar"/> <classpathentry kind="lib" path="src/libraries/commons-codec-1.10.jar"/>
<classpathentry kind="lib" path="src/libraries/jfoenix-1.4.0.jar"/>
<classpathentry kind="lib" path="src/libraries/sqlite-jdbc-3.18.0.jar"/>
<classpathentry kind="lib" path="src/libraries/minimal-json-0.9.4.jar"/> <classpathentry kind="lib" path="src/libraries/minimal-json-0.9.4.jar"/>
<classpathentry kind="lib" path="src/libraries/junrar-0.7.jar"/>
<classpathentry kind="lib" path="src/libraries/commons-logging-api-1.1.jar"/> <classpathentry kind="lib" path="src/libraries/commons-logging-api-1.1.jar"/>
<classpathentry kind="lib" path="src/libraries/commons-vfs2-2.1.1744488.2.jar"/> <classpathentry kind="lib" path="src/libraries/commons-vfs2-2.1.1744488.2.jar"/>
<classpathentry kind="lib" path="src/libraries/flow-8.0.1.jar"/>
<classpathentry kind="lib" path="src/libraries/zip4j-1.3.2.jar"/>
<classpathentry kind="lib" path="src/libraries/log4j-api-2.8.2.jar"/>
<classpathentry kind="lib" path="src/libraries/log4j-core-2.8.2.jar"/>
<classpathentry kind="lib" path="src/libraries/jfoenix-1.8.0.jar"/>
<classpathentry kind="lib" path="src/libraries/sqlite-jdbc-3.20.0.jar"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>

View File

@ -2,7 +2,7 @@
cemu_UI is a simple, material design graphical frontend for [cemu](http://cemu.info/), a Wii U emulator. Downloads can be found [here](https://github.com/Seil0/cemu_UI/releases). cemu_UI is a simple, material design graphical frontend for [cemu](http://cemu.info/), a Wii U emulator. Downloads can be found [here](https://github.com/Seil0/cemu_UI/releases).
## installation ## Installation
Simply download the cemu_UI.jar from [releases](https://github.com/Seil0/cemu_UI/releases), make sure you have the latest version of java 8 oracle jre/jdk installed, open the file. cemu_UI creats a new directory "C:\Users\USERNAME\Documents\cemu_UI", where the database, settings and covers are stored. **first start can take while!** Simply download the cemu_UI.jar from [releases](https://github.com/Seil0/cemu_UI/releases), make sure you have the latest version of java 8 oracle jre/jdk installed, open the file. cemu_UI creats a new directory "C:\Users\USERNAME\Documents\cemu_UI", where the database, settings and covers are stored. **first start can take while!**
If you want to use the cloud sync function read the [wiki](https://github.com/Seil0/cemu_UI/wiki#cloud-savegame-syncronisation) carefully! If you want to use the cloud sync function read the [wiki](https://github.com/Seil0/cemu_UI/wiki#cloud-savegame-syncronisation) carefully!
@ -22,13 +22,13 @@ If you want to use the cloud sync function read the [wiki](https://github.com/Se
* automatic rom detection (only .rpx files with a app.xml) * automatic rom detection (only .rpx files with a app.xml)
* customisable UI * customisable UI
* [sync savegames via google drive](https://github.com/Seil0/cemu_UI/wiki) * [sync savegames via google drive](https://github.com/Seil0/cemu_UI/wiki)
* [smmdb api](http://smmdb.ddns.net/api) integration
## [planed Features](https://github.com/Seil0/cemu_UI/projects/1) (no ETA) ## [planed Features](https://github.com/Seil0/cemu_UI/projects/1) (no ETA)
* Controller support * Controller support
* more UI improvements * more UI improvements
* support more rom file formats in automatic detection * support more rom file formats in automatic detection
* [smmdb api](http://smmdb.ddns.net/api) integration
### If you have another idea, make a "new issue" with the ![#f03c15](https://placehold.it/15/fbca04/000000?text=+)`idea` lable ### If you have another idea, make a "new issue" with the ![#f03c15](https://placehold.it/15/fbca04/000000?text=+)`idea` lable
@ -41,7 +41,7 @@ If you want to use the cloud sync function read the [wiki](https://github.com/Se
* I have another question * I have another question
* make a new issue and let me know * make a new issue and let me know
## screenshots ## Screenshots
![Screenshot](/downloadContent/cemu_UI4.png) ![Screenshot](/downloadContent/cemu_UI4.png)

2
bin/.gitignore vendored
View File

@ -1 +1,3 @@
/application/ /application/
/resources/
/cloudControllerInstances/

Binary file not shown.

View File

@ -110,7 +110,7 @@
<Font name="System Bold" size="14.0" /> <Font name="System Bold" size="14.0" />
</font> </font>
</JFXButton> </JFXButton>
<JFXButton fx:id="timePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#timePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="516.5" AnchorPane.topAnchor="558.0"> <JFXButton fx:id="totalPlaytimeBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#totalPlaytimeBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="516.5" AnchorPane.topAnchor="558.0">
</JFXButton> </JFXButton>
<JFXButton fx:id="lastTimePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#lastTimePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="516.5" AnchorPane.topAnchor="558.0" /> <JFXButton fx:id="lastTimePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#lastTimePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="516.5" AnchorPane.topAnchor="558.0" />
</children> </children>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -17,7 +17,7 @@
*/ */
.tree-table-view { .tree-table-view {
-fx-tree-table-color: rgba(0, 168, 204, 0.2); -fx-tree-table-color: rgba(0, 168, 204, 0.2);
-fx-tree-table-rippler-color: rgba(0, 168, 204, 0.4); -fx-tree-table-rippler-color: rgba(0, 168, 204, 0.4);
} }
@ -32,7 +32,7 @@
} }
.tree-table-view .jfx-rippler { .tree-table-view .jfx-rippler {
-jfx-rippler-fill: -fx-tree-table-rippler-color; -jfx-rippler-fill: -fx-tree-table-rippler-color;
} }
.tree-table-view .column-header, .tree-table-view .column-header,

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

20
bin/log4j2.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n" />
</Console>
<File name="file" fileName="${sys:logFilename}" immediateFlush="true">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n" />
</File>
</Appenders>
<Loggers>
<Root level="debug" additivity="false">
<AppenderRef ref="console" />
<AppenderRef ref="file"/>
</Root>
</Loggers>
</Configuration>

View File

@ -16,6 +16,9 @@ package application;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import cloudControllerInstances.GoogleDriveController; import cloudControllerInstances.GoogleDriveController;
import javafx.application.Platform; import javafx.application.Platform;
@ -27,33 +30,35 @@ public class CloudController {
private Main main; private Main main;
private GoogleDriveController googleDriveController = new GoogleDriveController(); private GoogleDriveController googleDriveController = new GoogleDriveController();
private static final Logger LOGGER = LogManager.getLogger(CloudController.class.getName());
void initializeConnection(String cloudService, String cemuDirectory) { void initializeConnection(String cloudService, String cemuDirectory) {
System.out.println("sartting cloud initialisation... "); LOGGER.info("sartting cloud initialisation ...");
if(cloudService.equals("GoogleDrive")) { if(cloudService.equals("GoogleDrive")) {
System.out.println("selected service is Google Drive"); LOGGER.info("selected service is Google Drive");
try { try {
googleDriveController.main(cemuDirectory); googleDriveController.main(cemuDirectory);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); LOGGER.error("error while initialize connection", e);
} }
} }
if(cloudService.equals("Dropbox")) { if(cloudService.equals("Dropbox")) {
System.out.println("selected service is Dropbox"); LOGGER.info("selected service is Dropbox");
} }
System.out.println("cloud initialisation done!"); LOGGER.info("cloud initialisation done!");
} }
void stratupCheck(String cloudService, String cemuDirectory) { void stratupCheck(String cloudService, String cemuDirectory) {
if(cloudService.equals("GoogleDrive")) { if(cloudService.equals("GoogleDrive")) {
System.out.println("starting startup check google drive..."); LOGGER.info("starting startup check google drive ...");
try { try {
if (!googleDriveController.checkFolder()) { if (!googleDriveController.checkFolder()) {
googleDriveController.creatFolder(); googleDriveController.creatFolder();
main.mainWindowController.saveSettings(); main.mainWindowController.saveSettings();
Thread thread = new Thread(new Runnable() { Thread thread = new Thread(new Runnable() {
public void run() { @Override
public void run() {
Platform.runLater(() -> { Platform.runLater(() -> {
main.mainWindowController.getPlayBtn().setText("syncing..."); main.mainWindowController.getPlayBtn().setText("syncing...");
}); });
@ -68,7 +73,7 @@ public class CloudController {
sync(cloudService, cemuDirectory); sync(cloudService, cemuDirectory);
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); LOGGER.error("google drive startup check failed", e);
} }
} }
if(cloudService.equals("Dropbox")) { if(cloudService.equals("Dropbox")) {
@ -82,17 +87,18 @@ public class CloudController {
//running sync in a new thread, instead of blocking the main thread //running sync in a new thread, instead of blocking the main thread
Thread thread = new Thread(new Runnable() { Thread thread = new Thread(new Runnable() {
@Override
public void run() { public void run() {
Platform.runLater(() -> { Platform.runLater(() -> {
main.mainWindowController.getPlayBtn().setText("syncing..."); main.mainWindowController.getPlayBtn().setText("syncing...");
}); });
System.out.println("starting sync in new thread..."); LOGGER.info("starting synchronization in new thread ...");
if(cloudService.equals("GoogleDrive")) { if(cloudService.equals("GoogleDrive")) {
try { try {
googleDriveController.sync(cemuDirectory); googleDriveController.sync(cemuDirectory);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); LOGGER.error("google drive synchronization failed", e);
} }
} }
if(cloudService.equals("Dropbox")) { if(cloudService.equals("Dropbox")) {
@ -102,7 +108,7 @@ public class CloudController {
main.mainWindowController.getPlayBtn().setText("play"); main.mainWindowController.getPlayBtn().setText("play");
}); });
main.mainWindowController.saveSettings(); main.mainWindowController.saveSettings();
System.out.println("sync finished!"); LOGGER.info("synchronization successful!");
} }
}); });
thread.start(); thread.start();
@ -113,14 +119,15 @@ public class CloudController {
//running uploadFile in a new thread, instead of blocking the main thread //running uploadFile in a new thread, instead of blocking the main thread
new Thread() { new Thread() {
public void run() { @Override
System.out.println("starting uploadFile in new thread..."); public void run() {
LOGGER.info("starting uploadFile in new thread ...");
if(cloudService.equals("GoogleDrive")) { if(cloudService.equals("GoogleDrive")) {
try { try {
googleDriveController.uploadFile(file); googleDriveController.uploadFile(file);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); LOGGER.error("google drive uploadFile failed" ,e);
} }
} }
if(cloudService.equals("Dropbox")) { if(cloudService.equals("Dropbox")) {
@ -133,21 +140,25 @@ public class CloudController {
public String getFolderID(String cloudService) { public String getFolderID(String cloudService) {
String folderID = ""; String folderID = "";
if(cloudService.equals("GoogleDrive")) { if (cloudService != null) {
folderID = googleDriveController.getFolderID(); if(cloudService.equals("GoogleDrive")) {
} folderID = googleDriveController.getFolderID();
if(cloudService.equals("Dropbox")) { }
if(cloudService.equals("Dropbox")) {
}
} }
return folderID; return folderID;
} }
public void setFolderID(String folderID, String cloudService) { public void setFolderID(String folderID, String cloudService) {
if(cloudService.equals("GoogleDrive")) { if (cloudService != null) {
googleDriveController.setFolderID(folderID); if (cloudService.equals("GoogleDrive")) {
} googleDriveController.setFolderID(folderID);
if(cloudService.equals("Dropbox")) { }
if (cloudService.equals("Dropbox")) {
}
} }
} }
} }

View File

@ -21,6 +21,8 @@ import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel; import java.nio.channels.ReadableByteChannel;
import java.util.Optional; import java.util.Optional;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javafx.application.Application; import javafx.application.Application;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.stage.DirectoryChooser; import javafx.stage.DirectoryChooser;
@ -37,8 +39,10 @@ public class Main extends Application {
Stage primaryStage; Stage primaryStage;
public MainWindowController mainWindowController; //TODO find a better way public MainWindowController mainWindowController; //TODO find a better way
CloudController cloudController; CloudController cloudController;
private String dirWin = System.getProperty("user.home") + "/Documents/cemu_UI"; //Windows: C:/Users/"User"/Documents/HomeFlix AnchorPane pane;
private String dirLinux = System.getProperty("user.home") + "/cemu_UI"; //Linux: /home/"User"/HomeFlix private Scene scene;
private String dirWin = System.getProperty("user.home") + "/Documents/cemu_UI"; //Windows: C:/Users/"User"/Documents/cemu_UI
private String dirLinux = System.getProperty("user.home") + "/cemu_UI"; //Linux: /home/"User"/cemu_UI
private String gamesDBdownloadURL = "https://github.com/Seil0/cemu_UI/raw/master/downloadContent/games.db"; private String gamesDBdownloadURL = "https://github.com/Seil0/cemu_UI/raw/master/downloadContent/games.db";
private File directory; private File directory;
private File configFile; private File configFile;
@ -46,7 +50,7 @@ public class Main extends Application {
@SuppressWarnings("unused") @SuppressWarnings("unused")
private File localDB; private File localDB;
private File pictureCache; private File pictureCache;
private static Logger LOGGER;
@Override @Override
public void start(Stage primaryStage) { public void start(Stage primaryStage) {
@ -58,7 +62,7 @@ public class Main extends Application {
private void mainWindow(){ private void mainWindow(){
try { try {
FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow.fxml")); FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow.fxml"));
AnchorPane pane = loader.load(); pane = loader.load();
primaryStage.setResizable(false); primaryStage.setResizable(false);
primaryStage.setTitle("cemu_UI"); primaryStage.setTitle("cemu_UI");
// primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream("/resources/Homeflix_Icon_64x64.png"))); //adds application icon // primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream("/resources/Homeflix_Icon_64x64.png"))); //adds application icon
@ -73,31 +77,44 @@ public class Main extends Application {
gamesDBFile = new File(dirLinux + "/games.db"); gamesDBFile = new File(dirLinux + "/games.db");
localDB = new File(dirLinux+"/localRoms.db"); localDB = new File(dirLinux+"/localRoms.db");
pictureCache= new File(dirLinux+"/picture_cache"); pictureCache= new File(dirLinux+"/picture_cache");
pane.setPrefWidth(904); //this could be a kde plasma specific issue
}else{ }else{
directory = new File(dirWin); directory = new File(dirWin);
configFile = new File(dirWin + "/config.xml"); configFile = new File(dirWin + "/config.xml");
gamesDBFile = new File(dirWin + "/games.db"); gamesDBFile = new File(dirWin + "/games.db");
localDB = new File(dirWin+"/localRoms.db"); localDB = new File(dirWin+"/localRoms.db");
pictureCache= new File(dirWin+"/picture_cache"); pictureCache= new File(dirWin+"/picture_cache");
pane.setPrefWidth(892);
} }
//startup checks //startup checks
System.out.println("Directory: " + directory.exists()); //check if client_secret.jason is present
System.out.println("configfile: " + configFile.exists()); if (Main.class.getResourceAsStream("/resources/client_secret.json") == null) {
if(directory.exists() != true){ LOGGER.error("client_secret is missing!!!!!");
System.out.println("mkdir all");
Alert alert = new Alert(AlertType.ERROR);
alert.setTitle("cemu_UI");
alert.setHeaderText("Error");
alert.setContentText("client_secret is missing! Please contact the maintainer. \nIf you compiled cemu_UI by yourself see: \nhttps://github.com/Seil0/cemu_UI/wiki/Documantation");
alert.showAndWait();
}
LOGGER.info("Directory: " + directory.exists());
LOGGER.info("Configfile: " + configFile.exists());
if(!directory.exists()){
LOGGER.info("creating cemu_UI directory");
directory.mkdir(); directory.mkdir();
pictureCache.mkdir(); pictureCache.mkdir();
} }
if(configFile.exists() != true){ if(!configFile.exists()){
System.out.println("firststart"); LOGGER.info("firststart, setting default values");
firstStart(); firstStart();
mainWindowController.setColor("00a8cc"); mainWindowController.setColor("00a8cc");
mainWindowController.setxPosHelper(0); mainWindowController.setxPosHelper(0);
mainWindowController.saveSettings(); mainWindowController.saveSettings();
Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again (preventing Bugs) Runtime.getRuntime().exec("java -jar cemu_UI.jar"); //start again (preventing Bugs)
System.exit(0); //finishes itself System.exit(0); //finishes itselfdownloading games.db...
} }
if(pictureCache.exists() != true){ if(pictureCache.exists() != true){
@ -106,13 +123,13 @@ public class Main extends Application {
if(gamesDBFile.exists() != true){ if(gamesDBFile.exists() != true){
try { try {
System.out.print("downloading games.db... "); LOGGER.info("downloading games.db... ");
URL website = new URL(gamesDBdownloadURL); URL website = new URL(gamesDBdownloadURL);
ReadableByteChannel rbc = Channels.newChannel(website.openStream()); ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(gamesDBFile); FileOutputStream fos = new FileOutputStream(gamesDBFile);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close(); fos.close();
System.out.println("done!"); LOGGER.info("finished downloading games.db");
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -129,7 +146,7 @@ public class Main extends Application {
mainWindowController.initActions(); mainWindowController.initActions();
mainWindowController.initUI(); mainWindowController.initUI();
Scene scene = new Scene(pane); //create new scene, append pane to scene scene = new Scene(pane); //create new scene, append pane to scene
scene.getStylesheets().add(Main.class.getResource("MainWindows.css").toExternalForm()); scene.getStylesheets().add(Main.class.getResource("MainWindows.css").toExternalForm());
primaryStage.setScene(scene); //append scene to stage primaryStage.setScene(scene); //append scene to stage
primaryStage.show(); //show stage primaryStage.show(); //show stage
@ -171,6 +188,17 @@ public class Main extends Application {
} }
public static void main(String[] args) { public static void main(String[] args) {
//delete old log file and create new
if(System.getProperty("os.name").equals("Linux")){
System.setProperty("logFilename", System.getProperty("user.home") + "/cemu_UI/app.log");
File logFile = new File(System.getProperty("user.home") + "/cemu_UI/app.log");
logFile.delete();
}else{
System.setProperty("logFilename", System.getProperty("user.home") + "/Documents/cemu_UI/app.log");
File logFile = new File(System.getProperty("user.home") + "/Documents/cemu_UI/app.log");
logFile.delete();
}
LOGGER = LogManager.getLogger(Main.class.getName());
launch(args); launch(args);
} }
} }

View File

@ -110,7 +110,7 @@
<Font name="System Bold" size="14.0" /> <Font name="System Bold" size="14.0" />
</font> </font>
</JFXButton> </JFXButton>
<JFXButton fx:id="timePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#timePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="516.5" AnchorPane.topAnchor="558.0"> <JFXButton fx:id="totalPlaytimeBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#totalPlaytimeBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.rightAnchor="516.5" AnchorPane.topAnchor="558.0">
</JFXButton> </JFXButton>
<JFXButton fx:id="lastTimePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#lastTimePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="516.5" AnchorPane.topAnchor="558.0" /> <JFXButton fx:id="lastTimePlayedBtn" buttonType="RAISED" maxHeight="32.0" minWidth="100.0" onAction="#lastTimePlayedBtnAction" prefHeight="32.0" style="-fx-background-color: #ffffff; -fx-button-type: RAISED; -fx-text-fill: BLACK;" visible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="516.5" AnchorPane.topAnchor="558.0" />
</children> </children>

View File

@ -40,12 +40,13 @@ import javax.swing.ProgressMonitor;
import javax.swing.ProgressMonitorInputStream; import javax.swing.ProgressMonitorInputStream;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import com.github.junrar.Archive; import org.apache.logging.log4j.LogManager;
import com.github.junrar.exception.RarException; import org.apache.logging.log4j.Logger;
import com.github.junrar.impl.FileVolumeManager;
import com.github.junrar.rarfile.FileHeader;
import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXColorPicker; import com.jfoenix.controls.JFXColorPicker;
import com.jfoenix.controls.JFXDialog;
import com.jfoenix.controls.JFXDialogLayout;
import com.jfoenix.controls.JFXHamburger; import com.jfoenix.controls.JFXHamburger;
import com.jfoenix.controls.JFXTextField; import com.jfoenix.controls.JFXTextField;
import com.jfoenix.controls.JFXToggleButton; import com.jfoenix.controls.JFXToggleButton;
@ -82,6 +83,7 @@ import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent; import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import javafx.scene.paint.Paint; import javafx.scene.paint.Paint;
@ -92,6 +94,8 @@ import javafx.scene.text.TextFlow;
import javafx.stage.DirectoryChooser; import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser; import javafx.stage.FileChooser;
import javafx.util.Duration; import javafx.util.Duration;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
public class MainWindowController { public class MainWindowController {
@ -126,7 +130,7 @@ public class MainWindowController {
private JFXButton lastTimePlayedBtn; private JFXButton lastTimePlayedBtn;
@FXML @FXML
JFXButton timePlayedBtn; JFXButton totalPlaytimeBtn;
@FXML @FXML
private JFXHamburger menuHam; private JFXHamburger menuHam;
@ -181,19 +185,19 @@ public class MainWindowController {
private JFXTreeTableView<CourseTableDataType> courseTreeTable = new JFXTreeTableView<CourseTableDataType>(); private JFXTreeTableView<CourseTableDataType> courseTreeTable = new JFXTreeTableView<CourseTableDataType>();
@FXML @FXML
TreeItem<CourseTableDataType> root = new TreeItem<>(new CourseTableDataType("",0,0,0)); TreeItem<CourseTableDataType> root = new TreeItem<>(new CourseTableDataType("","",0,0));
@FXML @FXML
private JFXTreeTableColumn<CourseTableDataType, String> titleColumn = new JFXTreeTableColumn<>("title"); private JFXTreeTableColumn<CourseTableDataType, String> titleColumn = new JFXTreeTableColumn<>("title");
@FXML
private JFXTreeTableColumn<CourseTableDataType, String> idColumn = new JFXTreeTableColumn<>("id");
@FXML @FXML
private JFXTreeTableColumn<CourseTableDataType, Integer> starsColumn = new JFXTreeTableColumn<>("stars"); private JFXTreeTableColumn<CourseTableDataType, Integer> starsColumn = new JFXTreeTableColumn<>("stars");
@FXML @FXML
private JFXTreeTableColumn<CourseTableDataType, Integer> downloadsColumn = new JFXTreeTableColumn<>("downloads"); private JFXTreeTableColumn<CourseTableDataType, Integer> timeColumn = new JFXTreeTableColumn<>("time");
@FXML
private JFXTreeTableColumn<CourseTableDataType, Integer> idColumn = new JFXTreeTableColumn<>("id");
Main main; Main main;
dbController dbController; dbController dbController;
@ -209,32 +213,34 @@ public class MainWindowController {
private String cemuPath; private String cemuPath;
private String romPath; private String romPath;
private String gameExecutePath; private String gameExecutePath;
private String color;
private String dialogBtnStyle;
private String selectedGameTitleID; private String selectedGameTitleID;
private String selectedGameTitle; private String selectedGameTitle;
private String color; private String id;
private String version = "0.1.6"; private String version = "0.1.7";
private String buildNumber = "027"; private String buildNumber = "039";
private String versionName = "Throwback Galaxy"; private String versionName = "Throwback Galaxy";
private int xPos = -200; private int xPos = -200;
private int yPos = 17; private int yPos = 17;
private int xPosHelper; private int xPosHelper;
private int selectedUIDataIndex; private int selectedUIDataIndex;
private int selected; private int selected;
private int id;
private DirectoryChooser directoryChooser = new DirectoryChooser(); private DirectoryChooser directoryChooser = new DirectoryChooser();
private File dirWin = new File(System.getProperty("user.home") + "/Documents/cemu_UI"); private File dirWin = new File(System.getProperty("user.home") + "/Documents/cemu_UI");
private File dirLinux = new File(System.getProperty("user.home") + "/cemu_UI"); private File dirLinux = new File(System.getProperty("user.home") + "/cemu_UI");
private File fileWin = new File(dirWin + "/config.xml"); private File configFileWin = new File(dirWin + "/config.xml");
private File fileLinux = new File(dirLinux + "/config.xml"); private File configFileLinux = new File(dirLinux + "/config.xml");
File pictureCacheWin = new File(dirWin+"/picture_cache"); File pictureCacheWin = new File(dirWin+"/picture_cache");
File pictureCacheLinux = new File(dirLinux+"/picture_cache"); File pictureCacheLinux = new File(dirLinux+"/picture_cache");
private ObservableList<String> smmIDs = FXCollections.observableArrayList("fe31b7f2"); //TODO add more IDs private ObservableList<String> smmIDs = FXCollections.observableArrayList("fe31b7f2", "44fc5929"); //TODO add more IDs
private ObservableList<UIROMDataType> games = FXCollections.observableArrayList(); private ObservableList<UIROMDataType> games = FXCollections.observableArrayList();
ObservableList<SmmdbApiDataType> courses = FXCollections.observableArrayList(); ObservableList<SmmdbApiDataType> courses = FXCollections.observableArrayList();
ArrayList<Text> courseText = new ArrayList<Text>(); ArrayList<Text> courseText = new ArrayList<Text>();
ArrayList<Text> nameText = new ArrayList<Text>(); ArrayList<Text> nameText = new ArrayList<Text>();
Properties props = new Properties(); Properties props = new Properties();
Properties gameProps = new Properties(); Properties gameProps = new Properties();
private static final Logger LOGGER = LogManager.getLogger(MainWindowController.class.getName());
private MenuItem edit = new MenuItem("edit"); private MenuItem edit = new MenuItem("edit");
private MenuItem remove = new MenuItem("remove"); private MenuItem remove = new MenuItem("remove");
private MenuItem update = new MenuItem("update"); private MenuItem update = new MenuItem("update");
@ -260,7 +266,6 @@ public class MainWindowController {
smmdbApiQuery = new SmmdbApiQuery(); smmdbApiQuery = new SmmdbApiQuery();
} }
@SuppressWarnings("unchecked") //FIXME SuppressWarnings
void initUI(){ void initUI(){
cemuTextField.setText(cemuPath); cemuTextField.setText(cemuPath);
romTextField.setText(romPath); romTextField.setText(romPath);
@ -272,7 +277,7 @@ public class MainWindowController {
//initialize courseTable //initialize courseTable
titleColumn.setPrefWidth(160); titleColumn.setPrefWidth(160);
downloadsColumn.setPrefWidth(127); timeColumn.setPrefWidth(127);
starsColumn.setPrefWidth(100); starsColumn.setPrefWidth(100);
courseTreeTable.setRoot(root); courseTreeTable.setRoot(root);
@ -280,16 +285,22 @@ public class MainWindowController {
courseTreeTable.setEditable(false); courseTreeTable.setEditable(false);
titleColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().title); titleColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().title);
idColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().id);
starsColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().stars.asObject()); starsColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().stars.asObject());
downloadsColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().downloads.asObject()); timeColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().time.asObject());
idColumn.setCellValueFactory(cellData -> cellData.getValue().getValue().id.asObject());
courseTreeTable.getColumns().setAll(titleColumn, downloadsColumn, starsColumn, idColumn); courseTreeTable.getColumns().add(titleColumn);
courseTreeTable.getColumns().add(timeColumn);
courseTreeTable.getColumns().add(starsColumn);
courseTreeTable.getColumns().add(idColumn);
courseTreeTable.getColumns().get(3).setVisible(false); //hide idColumn (important) courseTreeTable.getColumns().get(3).setVisible(false); //hide idColumn (important)
} }
/**
* initialize all actions not initialized by a own method
*/
void initActions() { void initActions() {
System.out.println("initializing Actions... "); LOGGER.info("initializing Actions... ");
HamburgerBackArrowBasicTransition burgerTask = new HamburgerBackArrowBasicTransition(menuHam); HamburgerBackArrowBasicTransition burgerTask = new HamburgerBackArrowBasicTransition(menuHam);
menuHam.addEventHandler(MouseEvent.MOUSE_PRESSED, (e)->{ menuHam.addEventHandler(MouseEvent.MOUSE_PRESSED, (e)->{
@ -339,7 +350,6 @@ public class MainWindowController {
}); });
remove.setOnAction(new EventHandler<ActionEvent>() { remove.setOnAction(new EventHandler<ActionEvent>() {
@SuppressWarnings("unlikely-arg-type") //FIXME SuppressWarnings("unlikely-arg-type")
@Override @Override
public void handle(ActionEvent event) { public void handle(ActionEvent event) {
System.out.println("remove "+selectedGameTitleID); System.out.println("remove "+selectedGameTitleID);
@ -371,7 +381,7 @@ public class MainWindowController {
games.remove(selectedUIDataIndex); games.remove(selectedUIDataIndex);
dbController.removeRom(selectedGameTitleID); dbController.removeRom(selectedGameTitleID);
//remove all games form gamesAnchorPane (UI) //remove all games form gamesAnchorPane (UI)
gamesAnchorPane.getChildren().removeAll(games); gamesAnchorPane.getChildren().removeAll(gamesAnchorPane.getChildren());
//reset position //reset position
xPos = -200; xPos = -200;
yPos = 17; yPos = 17;
@ -398,7 +408,7 @@ public class MainWindowController {
String updatePath; String updatePath;
System.out.println("update: "+selectedGameTitleID); System.out.println("update: "+selectedGameTitleID);
if(selectedGameTitleID == null){ if(selectedGameTitleID == null){
System.out.println("trying to update null! null is not valid!"); LOGGER.error("trying to update null! null is not valid!");
Alert alert = new Alert(AlertType.WARNING); Alert alert = new Alert(AlertType.WARNING);
alert.setTitle("edit"); alert.setTitle("edit");
alert.setHeaderText("cemu_UI"); alert.setHeaderText("cemu_UI");
@ -422,21 +432,21 @@ public class MainWindowController {
File srcDir = new File(updatePath); File srcDir = new File(updatePath);
File destDir = new File(cemuPath+"\\mlc01\\usr\\title\\"+parts[0]+"\\"+parts[1]); File destDir = new File(cemuPath+"\\mlc01\\usr\\title\\"+parts[0]+"\\"+parts[1]);
System.out.println(updatePath); LOGGER.info(updatePath);
System.out.println(destDir.toString()); LOGGER.info(destDir.toString());
if(destDir.exists() != true){ if(destDir.exists() != true){
destDir.mkdir(); destDir.mkdir();
} }
try { try {
System.out.println("copying files..."); LOGGER.info("copying files...");
playBtn.setText("updating..."); playBtn.setText("updating...");
playBtn.setDisable(true); playBtn.setDisable(true);
FileUtils.copyDirectory(srcDir, destDir); //TODO progress indicator FileUtils.copyDirectory(srcDir, destDir); //TODO progress indicator
playBtn.setText("play"); playBtn.setText("play");
playBtn.setDisable(false); playBtn.setDisable(false);
System.out.println("done!"); LOGGER.info("copying files done!");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -453,7 +463,7 @@ public class MainWindowController {
String titleID = selectedGameTitleID; String titleID = selectedGameTitleID;
String dlcPath; String dlcPath;
System.out.println("add DLC: "+selectedGameTitleID); LOGGER.info("add DLC: "+selectedGameTitleID);
if(selectedGameTitleID == null){ if(selectedGameTitleID == null){
System.out.println("trying to add a dlc to null! null is not valid!"); System.out.println("trying to add a dlc to null! null is not valid!");
Alert alert = new Alert(AlertType.WARNING); Alert alert = new Alert(AlertType.WARNING);
@ -479,21 +489,21 @@ public class MainWindowController {
File srcDir = new File(dlcPath); File srcDir = new File(dlcPath);
File destDir = new File(cemuPath+"\\mlc01\\usr\\title\\"+parts[0]+"\\"+parts[1]+"\\aoc"); File destDir = new File(cemuPath+"\\mlc01\\usr\\title\\"+parts[0]+"\\"+parts[1]+"\\aoc");
System.out.println(dlcPath); LOGGER.info(dlcPath);
System.out.println(destDir.toString()); LOGGER.info(destDir.toString());
if(destDir.exists() != true){ if(destDir.exists() != true){
destDir.mkdir(); destDir.mkdir();
} }
try { try {
System.out.println("copying files..."); LOGGER.info("copying files...");
playBtn.setText("copying files..."); playBtn.setText("copying files...");
playBtn.setDisable(true); playBtn.setDisable(true);
FileUtils.copyDirectory(srcDir, destDir); //TODO progress indicator FileUtils.copyDirectory(srcDir, destDir); //TODO progress indicator
playBtn.setText("play"); playBtn.setText("play");
playBtn.setDisable(false); playBtn.setDisable(false);
System.out.println("done!"); LOGGER.info("copying files done!");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -527,20 +537,18 @@ public class MainWindowController {
@Override @Override
public void changed(ObservableValue<?> observable, Object oldVal, Object newVal){ public void changed(ObservableValue<?> observable, Object oldVal, Object newVal){
selected = courseTreeTable.getSelectionModel().getSelectedIndex(); //get selected item selected = courseTreeTable.getSelectionModel().getSelectedIndex(); //get selected item
id = idColumn.getCellData(selected); //get name of selected item
//FIXME if a item is selected and you change the sorting,you can't select a new item
id = idColumn.getCellData(selected); //get name of selected item
for (int i = 0; i < courses.size(); i++) { for (int i = 0; i < courses.size(); i++) {
if (courses.get(i).getId() == id) { if (courses.get(i).getId() == id) {
try {
if (courses.get(i).getHasimage() == 1) { URL url = new URL("http://smmdb.ddns.net/courseimg/" + id + "_full.jpg?v=3");
try { Image image = new Image(url.toURI().toString());
URL url = new URL("http://smmdb.ddns.net/img/courses/thumbnails/" + id + ".pic"); smmdbImageView.setImage(image);
Image image = new Image(url.toURI().toString()); } catch (MalformedURLException | URISyntaxException e) {
smmdbImageView.setImage(image); e.printStackTrace();
} catch (MalformedURLException | URISyntaxException e) {
e.printStackTrace();
}
} else {
smmdbImageView.setImage(close_black); smmdbImageView.setImage(close_black);
} }
addCourseDescription(courses.get(i)); addCourseDescription(courses.get(i));
@ -562,8 +570,7 @@ public class MainWindowController {
} }
} }
}); });
LOGGER.info("initializing Actions done!");
System.out.println("initializing Actions done!");
} }
@FXML @FXML
@ -572,13 +579,29 @@ public class MainWindowController {
} }
@FXML @FXML
void aboutBtnAction(){ void aboutBtnAction(){
Alert alert = new Alert(AlertType.INFORMATION); JFXDialogLayout content= new JFXDialogLayout();
alert.setTitle("about"); content.setHeading(new Text("cemu_UI"));
alert.setHeaderText("cemu_UI"); content.setBody(new Text("cemu_UI by @Seil0 \nVersion: "+version+" ("+buildNumber+") \""+versionName+"\" \nThis Application is made with free Software\nwww.kellerkinder.xyz"));
alert.setContentText("cemu_UI by @Seil0 \nVersion: "+version+" ("+buildNumber+") \""+versionName+"\" \nwww.kellerkinder.xyz"); content.setPrefSize(350, 170);
alert.initOwner(main.primaryStage); StackPane stackPane = new StackPane();
alert.showAndWait(); stackPane.autosize();
JFXDialog dialog =new JFXDialog(stackPane, content, JFXDialog.DialogTransition.LEFT, true);
JFXButton button=new JFXButton("Okay");
button.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event){
dialog.close();
}
});
button.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED);
button.setPrefHeight(32);
button.setStyle(dialogBtnStyle);
content.setActions(button);
main.pane.getChildren().add(stackPane);
AnchorPane.setTopAnchor(stackPane, (main.pane.getHeight()-content.getPrefHeight())/2);
AnchorPane.setLeftAnchor(stackPane, (main.pane.getWidth()-content.getPrefWidth())/2);
dialog.show();
} }
@FXML @FXML
@ -614,21 +637,19 @@ public class MainWindowController {
} else { } else {
smmdbAnchorPane.setVisible(true); smmdbAnchorPane.setVisible(true);
smmdbTrue = true; smmdbTrue = true;
}
//start query //start query
courses.addAll(smmdbApiQuery.startQuery()); courses.removeAll(courses);
courses.addAll(smmdbApiQuery.startQuery());
System.out.println("size: " + courses.size());
System.out.println(courses.get(3).getNintendoid()); //add query response to courseTreeTable
for(int i = 0; i < courses.size(); i++){
//add query response to courseTreeTable CourseTableDataType helpCourse = new CourseTableDataType(courses.get(i).getTitle(), courses.get(i).getId(),
for(int i = 0; i < courses.size(); i++){ courses.get(i).getTime(), courses.get(i).getStars());
CourseTableDataType helpCourse = new CourseTableDataType(courses.get(i).getTitle(), courses.get(i).getDownloads(),
courses.get(i).getStars(), courses.get(i).getId()); root.getChildren().add(new TreeItem<CourseTableDataType>(helpCourse)); //add data to root-node
}
root.getChildren().add(new TreeItem<CourseTableDataType>(helpCourse)); //add data to root-node }
}
} }
@FXML @FXML
@ -640,7 +661,7 @@ public class MainWindowController {
} }
@FXML @FXML
void timePlayedBtnAction(ActionEvent event){ void totalPlaytimeBtnAction(ActionEvent event){
} }
@ -653,7 +674,7 @@ public class MainWindowController {
void cemuTFBtnAction(ActionEvent event) { void cemuTFBtnAction(ActionEvent event) {
File cemuDirectory = directoryChooser.showDialog(main.primaryStage); File cemuDirectory = directoryChooser.showDialog(main.primaryStage);
if(cemuDirectory == null){ if(cemuDirectory == null){
System.out.println("No Directory selected"); LOGGER.info("No Directory selected");
}else{ }else{
setCemuPath(cemuDirectory.getAbsolutePath()); setCemuPath(cemuDirectory.getAbsolutePath());
saveSettings(); saveSettings();
@ -672,7 +693,7 @@ public class MainWindowController {
void romTFBtnAction(ActionEvent event) { void romTFBtnAction(ActionEvent event) {
File romDirectory = directoryChooser.showDialog(main.primaryStage); File romDirectory = directoryChooser.showDialog(main.primaryStage);
if(romDirectory == null){ if(romDirectory == null){
System.out.println("No Directory selected"); LOGGER.info("No Directory selected");
}else{ }else{
setRomPath(romDirectory.getAbsolutePath()); setRomPath(romDirectory.getAbsolutePath());
saveSettings(); saveSettings();
@ -689,8 +710,8 @@ public class MainWindowController {
@FXML @FXML
void smmdbDownloadBtnAction(ActionEvent event){ void smmdbDownloadBtnAction(ActionEvent event){
String downloadUrl = "http://smmdb.ddns.net/courses/" + id; String downloadUrl = "http://smmdb.ddns.net/api/downloadcourse?id=" + id + "&type=zip";
String downloadFileURL = getCemuPath() + "/" + id + ".rar"; //getCemuPath() + "/" + smmID + "/" + id + ".rar" String downloadFileURL = getCemuPath() + "/" + id + ".zip"; //getCemuPath() + "/" + smmID + "/" + id + ".rar"
String outputFile = getCemuPath() + "/"; String outputFile = getCemuPath() + "/";
try { try {
@ -703,51 +724,52 @@ public class MainWindowController {
pm.setMaximum(conn.getContentLength()); // tell the progress bar the total number of bytes we are going to read. pm.setMaximum(conn.getContentLength()); // tell the progress bar the total number of bytes we are going to read.
FileUtils.copyInputStreamToFile(pmis, new File(downloadFileURL)); //download file + "/mlc01/emulatorSave" FileUtils.copyInputStreamToFile(pmis, new File(downloadFileURL)); //download file + "/mlc01/emulatorSave"
pmis.close(); pmis.close();
System.out.println("downloaded successfull"); LOGGER.info("downloaded successfull");
File downloadFile = new File(downloadFileURL); File downloadFile = new File(downloadFileURL);
Archive a = null;
try { String source = downloadFileURL;
a = new Archive(new FileVolumeManager(downloadFile)); String destination = null;
} catch (RarException | IOException e) { int highestCourseNumber = 0;
// Auto-generated catch block String courseName = null;
e.printStackTrace();
} for (int i = 0; i < smmIDs.size(); i++) {
if (a != null) { File smmDirectory = new File(outputFile + "mlc01/emulatorSave/" + smmIDs.get(i));
a.getMainHeader().print();
FileHeader fh = a.nextFileHeader();
for (int i = 0; i < smmIDs.size(); i++) {
if (new File(outputFile + "mlc01/emulatorSave/" + smmIDs.get(i)).exists()) {
File courseDirectory = new File(outputFile + "mlc01/emulatorSave/" + smmIDs.get(0) + "/" + fh.getFileNameString().substring(0, fh.getFileNameString().indexOf('\\')));
System.out.println("Path: " + courseDirectory.getAbsolutePath());
if (!courseDirectory.exists()) {
courseDirectory.mkdir();
}
while (fh != null) {
try {
File out = new File(outputFile + "mlc01/emulatorSave/" + smmIDs.get(0) + "/" + fh.getFileNameString().trim());
if (!out.getAbsolutePath().equals(courseDirectory.getAbsolutePath())) {
System.out.println(out.getAbsolutePath());
FileOutputStream os = new FileOutputStream(out);
a.extractFile(fh, os);
os.close();
}
} catch (RarException | IOException e) { if (smmDirectory.exists()) {
// Auto-generated catch block File[] courses = smmDirectory.listFiles(File::isDirectory);
e.printStackTrace();
} //get all existing courses in smm directory, new name is highest number +1
fh = a.nextFileHeader(); for (int j = 0; j < courses.length; j++) {
int courseNumber = Integer.parseInt(courses[j].getName().substring(6));
if (courseNumber > highestCourseNumber) {
highestCourseNumber = courseNumber;
} }
} }
}
String number = "000" + (highestCourseNumber +1);
courseName = "course" + number.substring(number.length() -3, number.length());
File courseDirectory = new File(outputFile + "mlc01/emulatorSave/" + smmIDs.get(i) + "/");
destination = courseDirectory.getPath();
}
} }
a.close();
try {
ZipFile zipFile = new ZipFile(source);
zipFile.extractAll(destination);
//rename zipfile
File course = new File(destination + "/course000");
course.renameTo( new File(destination + "/" + courseName));
LOGGER.info("Added new course: " + courseName + ", full path is: " + destination + "/" + courseName);
} catch (ZipException e) {
LOGGER.error("an error occurred during unziping the file!", e);
}
downloadFile.delete(); downloadFile.delete();
} catch (IOException e) { } catch (IOException e) {
System.err.println("something went wrong during downloading the course"); LOGGER.error("something went wrong during downloading the course", e);
e.printStackTrace();
} }
} }
@ -778,24 +800,49 @@ public class MainWindowController {
if(cloudSync) { if(cloudSync) {
cloudSync = false; cloudSync = false;
} else { } else {
Alert cloudWarningAlert = new Alert(AlertType.CONFIRMATION); //new alert with file-chooser
cloudWarningAlert.setTitle("cemu_UI"); JFXDialogLayout content= new JFXDialogLayout();
cloudWarningAlert.setHeaderText("activate cloud savegame sync (beta)"); content.setHeading(new Text("activate cloud savegame sync (beta)"));
cloudWarningAlert.setContentText("You just activate the cloud savegame sync function of cemu_UI which is currently in beta. Are you sure you want to do this?"); content.setBody(new Text("You just activate the cloud savegame sync function of cemu_UI, \nwhich is currently in beta. Are you sure you want to do this?"));
cloudWarningAlert.initOwner(main.primaryStage); StackPane stackPane = new StackPane();
Optional<ButtonType> coverResult = cloudWarningAlert.showAndWait(); stackPane.autosize();
if (coverResult.get() == ButtonType.OK){ JFXDialog dialog = new JFXDialog(stackPane, content, JFXDialog.DialogTransition.LEFT, true);
cloudSync = true; JFXButton okayBtn = new JFXButton("Okay");
//TODO rework for other cloud services okayBtn.setOnAction(new EventHandler<ActionEvent>(){
cloudService = "GoogleDrive"; @Override
main.cloudController.initializeConnection(getCloudService(), getCemuPath()); public void handle(ActionEvent event){
main.cloudController.sync(getCloudService(), getCemuPath()); cloudSync = true;
} else { //TODO rework for other cloud services
cloudSyncToggleBtn.setSelected(false); cloudService = "GoogleDrive";
} main.cloudController.initializeConnection(getCloudService(), getCemuPath());
main.cloudController.sync(getCloudService(), getCemuPath());
saveSettings();
dialog.close();
}
});
JFXButton cancelBtn = new JFXButton("Cancel");
cancelBtn.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event){
cloudSyncToggleBtn.setSelected(false);
dialog.close();
}
});
Label placeholder = new Label();
placeholder.setPrefSize(15, 10);
okayBtn.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED);
cancelBtn.setButtonType(com.jfoenix.controls.JFXButton.ButtonType.RAISED);
okayBtn.setPrefHeight(32);
cancelBtn.setPrefHeight(32);
okayBtn.setStyle(dialogBtnStyle);
cancelBtn.setStyle(dialogBtnStyle);
content.setActions(cancelBtn, placeholder, okayBtn);
content.setPrefSize(419, 140);
main.pane.getChildren().add(stackPane);
AnchorPane.setTopAnchor(stackPane, (main.pane.getHeight()-content.getPrefHeight())/2);
AnchorPane.setLeftAnchor(stackPane, (main.pane.getWidth()-content.getPrefWidth())/2);
dialog.show();
} }
saveSettings();
} }
@FXML @FXML
@ -882,7 +929,7 @@ public class MainWindowController {
* then add the rom to the local_roms database * then add the rom to the local_roms database
*/ */
if(exit){ if(exit){
System.out.println("No parameter set!"); LOGGER.info("No parameter set!");
}else{ }else{
coverName = new File(coverPath).getName(); coverName = new File(coverPath).getName();
try { try {
@ -898,16 +945,14 @@ public class MainWindowController {
ImageIO.write(resizeImagePNG, "png", new File(pictureCache+"\\"+coverName)); //save image to pictureCache ImageIO.write(resizeImagePNG, "png", new File(pictureCache+"\\"+coverName)); //save image to pictureCache
coverPath = pictureCache+"\\"+coverName; coverPath = pictureCache+"\\"+coverName;
} catch (IOException e) { } catch (IOException e) {
System.out.println("Ops something went wrong!"); LOGGER.error("Ops something went wrong!", e);
} }
try { try {
dbController.addRom(title, coverPath, romPath, titleID, "", "", "", "0"); dbController.addRom(title, coverPath, romPath, titleID, "", "", "", "0");
dbController.loadSingleRom(titleID); dbController.loadSingleRom(titleID);
} catch (SQLException e) { } catch (SQLException e) {
// Auto-generated catch block LOGGER.error("Oops, something went wrong! Error during adding a game.", e);
System.out.println("Oops, something went wrong! Error during adding a game.");
e.printStackTrace();
} }
} }
} }
@ -928,7 +973,7 @@ public class MainWindowController {
Image coverImage = new Image(coverFile.toURI().toString()); Image coverImage = new Image(coverFile.toURI().toString());
generatePosition(); generatePosition();
LOGGER.info("add " + getxPos()); //TODO debug
VBox.setLayoutX(getxPos()); VBox.setLayoutX(getxPos());
VBox.setLayoutY(getyPos()); VBox.setLayoutY(getyPos());
VBox.getChildren().addAll(gameTitleLabel,gameBtn); VBox.getChildren().addAll(gameTitleLabel,gameBtn);
@ -944,7 +989,7 @@ public class MainWindowController {
gameBtn.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { gameBtn.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override @Override
public void handle(MouseEvent event) { public void handle(MouseEvent event) {
System.out.println("selected: "+title+"; ID: "+titleID); LOGGER.info("selected: "+title+"; ID: "+titleID);
//getting the selected game index by comparing event.getSource() with games.get(i).getButton() //getting the selected game index by comparing event.getSource() with games.get(i).getButton()
for(int i=0; i<games.size(); i++){ for(int i=0; i<games.size(); i++){
@ -965,7 +1010,7 @@ public class MainWindowController {
//setting last played //setting last played
if(dbController.getLastPlayed(titleID).equals("") || dbController.getLastPlayed(titleID).equals(null)){ if(dbController.getLastPlayed(titleID).equals("") || dbController.getLastPlayed(titleID).equals(null)){
lastTimePlayedBtn.setText("Last played, never"); lastTimePlayedBtn.setText("Last played, never");
timePlayedBtn.setText(dbController.getTimePlayed(titleID)+ " min"); totalPlaytimeBtn.setText(dbController.getTotalPlaytime(titleID)+ " min");
}else{ }else{
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd"); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@ -980,12 +1025,12 @@ public class MainWindowController {
}else{ }else{
lastTimePlayedBtn.setText("Last played, "+dbController.getLastPlayed(titleID)); lastTimePlayedBtn.setText("Last played, "+dbController.getLastPlayed(titleID));
} }
if(Integer.parseInt(dbController.getTimePlayed(titleID)) > 60){ if(Integer.parseInt(dbController.getTotalPlaytime(titleID)) > 60){
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTimePlayed(titleID))/60); int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTotalPlaytime(titleID))/60);
int minutesPlayed = Integer.parseInt(dbController.getTimePlayed(titleID))-60*hoursPlayed; int minutesPlayed = Integer.parseInt(dbController.getTotalPlaytime(titleID))-60*hoursPlayed;
timePlayedBtn.setText(hoursPlayed+"h "+minutesPlayed+"min"); totalPlaytimeBtn.setText(hoursPlayed+"h "+minutesPlayed+"min");
}else{ }else{
timePlayedBtn.setText(dbController.getTimePlayed(titleID)+ " min"); totalPlaytimeBtn.setText(dbController.getTotalPlaytime(titleID)+ " min");
} }
} }
@ -1009,46 +1054,53 @@ public class MainWindowController {
} }
private void addCourseDescription(SmmdbApiDataType course) { private void addCourseDescription(SmmdbApiDataType course) {
String coursetype; String courseTheme;
String leveltype; String gameStyle;
String difficulty; String difficulty;
String autoscroll;
smmdbTextFlow.getChildren().remove(0, smmdbTextFlow.getChildren().size()); smmdbTextFlow.getChildren().remove(0, smmdbTextFlow.getChildren().size());
nameText.clear(); nameText.clear();
courseText.clear(); courseText.clear();
switch (course.getCoursetype()) { switch (course.getCourseTheme()) {
case 0: case 0:
coursetype = "Creation"; courseTheme = "Ground";
break; break;
case 1: case 1:
coursetype = "Recreation"; courseTheme = "Underground";
break; break;
case 2: case 2:
coursetype = "Wii U Dump"; courseTheme = "Castle";
break;
case 3:
courseTheme = "Airship";
break;
case 4:
courseTheme = "Underwater";
break;
case 5:
courseTheme = "Ghost House";
break; break;
default: default:
coursetype = "notset"; courseTheme = "notset";
break; break;
} }
switch (course.getLeveltype()) { switch (course.getGameStyle()) {
case 0: case 0:
leveltype = "NSMBU"; gameStyle = "SMB";
break; break;
case 1: case 1:
leveltype = "SMW"; gameStyle = "SMB3";
break; break;
case 2: case 2:
leveltype = "SMB3"; gameStyle = "SMW";
break; break;
case 3: case 3:
leveltype = "SMB"; gameStyle = "NSMBU";
break;
case 4:
leveltype = "Mixed";
break; break;
default: default:
leveltype = "notset"; gameStyle = "notset";
break; break;
} }
@ -1073,23 +1125,45 @@ public class MainWindowController {
break; break;
} }
switch (course.getAutoScroll()) {
case 0:
autoscroll = "disabled";
break;
case 1:
autoscroll = "slow";
break;
case 2:
autoscroll = "medium";
break;
case 3:
autoscroll = "fast";
break;
default:
autoscroll = "notset";
break;
}
nameText.add(0, new Text("title" + ": ")); nameText.add(0, new Text("title" + ": "));
nameText.add(1, new Text("owner" + ": ")); nameText.add(1, new Text("owner" + ": "));
nameText.add(2, new Text("coursetype" + ": ")); nameText.add(2, new Text("Course-Theme" + ": "));
nameText.add(3, new Text("leveltype" + ": ")); nameText.add(3, new Text("Game-Style" + ": "));
nameText.add(4, new Text("difficulty" + ": ")); nameText.add(4, new Text("difficulty" + ": "));
nameText.add(5, new Text("lastmodified" + ": ")); nameText.add(5, new Text("Auto-Scroll" + ": "));
nameText.add(6, new Text("uploaded" + ": ")); nameText.add(6, new Text("Time" + ": "));
nameText.add(7, new Text("nintendoid" + ": ")); nameText.add(7, new Text("lastmodified" + ": "));
nameText.add(8, new Text("uploaded" + ": "));
nameText.add(9, new Text("nintendoid" + ": "));
courseText.add(0, new Text(course.getTitle() + "\n")); courseText.add(0, new Text(course.getTitle() + "\n"));
courseText.add(1, new Text(Integer.toString(course.getOwner()) + "\n")); courseText.add(1, new Text(course.getOwner() + "\n"));
courseText.add(2, new Text(coursetype + "\n")); courseText.add(2, new Text(courseTheme + "\n"));
courseText.add(3, new Text(leveltype + "\n")); courseText.add(3, new Text(gameStyle + "\n"));
courseText.add(4, new Text(difficulty + "\n")); courseText.add(4, new Text(difficulty + "\n"));
courseText.add(5, new Text(new java.util.Date((long)course.getLastmodified()*1000) + "\n")); courseText.add(5, new Text(autoscroll + "\n"));
courseText.add(6, new Text(new java.util.Date((long)course.getUploaded()*1000) + "\n")); courseText.add(6, new Text(course.getTime() + "\n"));
courseText.add(7, new Text(course.getNintendoid() + "\n")); courseText.add(7, new Text(new java.util.Date((long)course.getLastmodified()*1000) + "\n"));
courseText.add(8, new Text(new java.util.Date((long)course.getUploaded()*1000) + "\n"));
courseText.add(9, new Text(course.getNintendoid() + "\n"));
for(int i=0; i<nameText.size(); i++){ for(int i=0; i<nameText.size(); i++){
nameText.get(i).setFont(Font.font ("System", FontWeight.BOLD, 14)); nameText.get(i).setFont(Font.font ("System", FontWeight.BOLD, 14));
@ -1099,10 +1173,19 @@ public class MainWindowController {
} }
//TODO xPosHelper based on window with //TODO Changelistener for resizing
/**
* xPosHelper based on window width = -24(Windows)/-36(Linux)
* calculates how many games can be displayed in one row
*/
private void generatePosition() { private void generatePosition() {
// System.out.println(main.primaryStage.getWidth()); int xPosHelperMax;
if(xPosHelper == 4){ if(System.getProperty("os.name").equals("Linux")){
xPosHelperMax = (int) Math.floor((main.pane.getPrefWidth() - 36) / 217);
} else {
xPosHelperMax = (int) Math.floor((main.pane.getPrefWidth() - 24) / 217);
}
if(xPosHelper == xPosHelperMax){
xPos = 17; xPos = 17;
yPos = yPos + 345; yPos = yPos + 345;
xPosHelper = 1; xPosHelper = 1;
@ -1110,6 +1193,10 @@ public class MainWindowController {
xPos = xPos + 217; xPos = xPos + 217;
xPosHelper++; xPosHelper++;
} }
// System.out.println("Breit: " + main.pane.getPrefWidth());
// System.out.println("xPosHelper: " + xPosHelper);
// System.out.println("yPos: " + yPos);
// System.out.println("xPos: " + xPos);
} }
private void applyColor() { private void applyColor() {
@ -1125,6 +1212,8 @@ public class MainWindowController {
romTextField.setFocusColor(Color.valueOf(getColor())); romTextField.setFocusColor(Color.valueOf(getColor()));
if(icolor.compareTo(ccolor) == -1){ if(icolor.compareTo(ccolor) == -1){
dialogBtnStyle = btnStyleWhite;
aboutBtn.setStyle("-fx-text-fill: WHITE;"); aboutBtn.setStyle("-fx-text-fill: WHITE;");
settingsBtn.setStyle("-fx-text-fill: WHITE;"); settingsBtn.setStyle("-fx-text-fill: WHITE;");
addBtn.setStyle("-fx-text-fill: WHITE;"); addBtn.setStyle("-fx-text-fill: WHITE;");
@ -1144,6 +1233,8 @@ public class MainWindowController {
menuHam.getStyleClass().add("jfx-hamburgerW"); menuHam.getStyleClass().add("jfx-hamburgerW");
}else{ }else{
dialogBtnStyle = btnStyleBlack;
aboutBtn.setStyle("-fx-text-fill: BLACK;"); aboutBtn.setStyle("-fx-text-fill: BLACK;");
settingsBtn.setStyle("-fx-text-fill: BLACK;"); settingsBtn.setStyle("-fx-text-fill: BLACK;");
addBtn.setStyle("-fx-text-fill: BLACK;"); addBtn.setStyle("-fx-text-fill: BLACK;");
@ -1170,50 +1261,101 @@ public class MainWindowController {
} }
void saveSettings(){ void saveSettings(){
System.out.print("saving Settings... "); LOGGER.info("saving Settings ...");
OutputStream outputStream; //new output-stream OutputStream outputStream; //new output-stream
try { try {
props.setProperty("cemuPath", getCemuPath()); props.setProperty("cemuPath", getCemuPath());
props.setProperty("romPath", getRomPath()); props.setProperty("romPath", getRomPath());
props.setProperty("color", getColor()); props.setProperty("color", getColor());
props.setProperty("fullscreen", String.valueOf(isFullscreen())); props.setProperty("fullscreen", String.valueOf(isFullscreen()));
props.setProperty("cloudSync", String.valueOf(cloudSync)); props.setProperty("cloudSync", String.valueOf(cloudSync));
if (getCloudService() == null) {
props.setProperty("cloudService", "");
} else {
props.setProperty("cloudService", getCloudService()); props.setProperty("cloudService", getCloudService());
props.setProperty("folderID", main.cloudController.getFolderID(getCloudService())); }
if(System.getProperty("os.name").equals("Linux")){ props.setProperty("folderID", main.cloudController.getFolderID(getCloudService()));
outputStream = new FileOutputStream(fileLinux); if(System.getProperty("os.name").equals("Linux")){
}else{ outputStream = new FileOutputStream(configFileLinux);
outputStream = new FileOutputStream(fileWin); }else{
} outputStream = new FileOutputStream(configFileWin);
props.storeToXML(outputStream, "cemu_UI settings"); //write new .xml
outputStream.close();
System.out.println("done!");
} catch (IOException e) {
e.printStackTrace();
} }
props.storeToXML(outputStream, "cemu_UI settings"); //write new .xml
outputStream.close();
LOGGER.info("saving Settings done!");
} catch (IOException e) {
LOGGER.error("an error occured", e);
}
} }
/**
* loading saved settings from the config.xml file
* if a value is not present, default is used instead
*/
void loadSettings(){ void loadSettings(){
System.out.print("loading settings... "); LOGGER.info("loading settings ...");
InputStream inputStream; InputStream inputStream;
try { try {
if(System.getProperty("os.name").equals("Linux")){ if(System.getProperty("os.name").equals("Linux")){
inputStream = new FileInputStream(fileLinux); inputStream = new FileInputStream(configFileLinux);
}else{ }else{
inputStream = new FileInputStream(fileWin); inputStream = new FileInputStream(configFileWin);
} }
props.loadFromXML(inputStream); //new input-stream from .xml props.loadFromXML(inputStream); //new input-stream from .xml
setCemuPath(props.getProperty("cemuPath"));
setRomPath(props.getProperty("romPath")); try {
setColor(props.getProperty("color")); setCemuPath(props.getProperty("cemuPath"));
setFullscreen(Boolean.parseBoolean(props.getProperty("fullscreen"))); } catch (Exception e) {
setCloudSync(Boolean.parseBoolean(props.getProperty("cloudSync"))); LOGGER.error("cloud not load cemuPath", e);
setCloudService(props.getProperty("cloudService")); setCemuPath("");
main.cloudController.setFolderID(props.getProperty("folderID"), getCloudService()); }
try {
setRomPath(props.getProperty("romPath"));
} catch (Exception e) {
LOGGER.error("could not load romPath", e);
setRomPath("");
}
try {
setColor(props.getProperty("color"));
} catch (Exception e) {
LOGGER.error("could not load color value, setting default instead", e);
setColor("00a8cc");
}
try {
setFullscreen(Boolean.parseBoolean(props.getProperty("fullscreen")));
} catch (Exception e) {
LOGGER.error("could not load fullscreen, setting default instead", e);
setFullscreen(false);
}
try {
setCloudSync(Boolean.parseBoolean(props.getProperty("cloudSync")));
} catch (Exception e) {
LOGGER.error("could not load cloudSync, setting default instead", e);
setCloudSync(false);
}
try {
setCloudService(props.getProperty("cloudService"));
} catch (Exception e) {
LOGGER.error("could not load cloudSync", e);
setCloudService("");
}
try {
main.cloudController.setFolderID(props.getProperty("folderID"), getCloudService());
} catch (Exception e) {
LOGGER.error("could not load folderID, disable cloud sync. Please contact an developer", e);
setCloudSync(false);
}
inputStream.close(); inputStream.close();
System.out.println("done!"); LOGGER.info("loading settings done!");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); LOGGER.error("an error occured", e);
} }
} }
@ -1252,7 +1394,7 @@ public class MainWindowController {
private void playBtnSlideIn(){ private void playBtnSlideIn(){
playBtn.setVisible(true); playBtn.setVisible(true);
lastTimePlayedBtn.setVisible(true); lastTimePlayedBtn.setVisible(true);
timePlayedBtn.setVisible(true); totalPlaytimeBtn.setVisible(true);
playTrue = true; playTrue = true;
TranslateTransition playBtnTransition = new TranslateTransition(Duration.millis(300), playBtn); TranslateTransition playBtnTransition = new TranslateTransition(Duration.millis(300), playBtn);
@ -1265,7 +1407,7 @@ public class MainWindowController {
lastTimePlayedBtnTransition.setToY(0); lastTimePlayedBtnTransition.setToY(0);
lastTimePlayedBtnTransition.play(); lastTimePlayedBtnTransition.play();
TranslateTransition timePlayedBtnTransition = new TranslateTransition(Duration.millis(300), timePlayedBtn); TranslateTransition timePlayedBtnTransition = new TranslateTransition(Duration.millis(300), totalPlaytimeBtn);
timePlayedBtnTransition.setFromY(55); timePlayedBtnTransition.setFromY(55);
timePlayedBtnTransition.setToY(0); timePlayedBtnTransition.setToY(0);
timePlayedBtnTransition.play(); timePlayedBtnTransition.play();
@ -1283,7 +1425,7 @@ public class MainWindowController {
lastTimePlayedBtnTransition.setToY(56); lastTimePlayedBtnTransition.setToY(56);
lastTimePlayedBtnTransition.play(); lastTimePlayedBtnTransition.play();
TranslateTransition timePlayedBtnTransition = new TranslateTransition(Duration.millis(300), timePlayedBtn); TranslateTransition timePlayedBtnTransition = new TranslateTransition(Duration.millis(300), totalPlaytimeBtn);
timePlayedBtnTransition.setFromY(0); timePlayedBtnTransition.setFromY(0);
timePlayedBtnTransition.setToY(56); timePlayedBtnTransition.setToY(56);
timePlayedBtnTransition.play(); timePlayedBtnTransition.play();
@ -1297,6 +1439,9 @@ public class MainWindowController {
} }
@SuppressWarnings("unused") @SuppressWarnings("unused")
/**
* @return the main color in hexadecimal format
*/
private String hexToRgb() { private String hexToRgb() {
System.out.println(getColor()); System.out.println(getColor());
int hex = Integer.parseInt(getColor().substring(0, 5), 16); int hex = Integer.parseInt(getColor().substring(0, 5), 16);
@ -1308,6 +1453,14 @@ public class MainWindowController {
return r + ", " + g + ", " + b; return r + ", " + g + ", " + b;
} }
/**
*
* @param originalImage original image which size is changed
* @param type type of the original image (PNG,JPEG,...)
* @param imgWidth wanted width
* @param imgHeigth wanted height
* @return the rezised image
*/
private static BufferedImage resizeImage(BufferedImage originalImage, int type, int imgWidth, int imgHeigth) { private static BufferedImage resizeImage(BufferedImage originalImage, int type, int imgWidth, int imgHeigth) {
BufferedImage resizedImage = new BufferedImage(imgWidth, imgHeigth, type); BufferedImage resizedImage = new BufferedImage(imgWidth, imgHeigth, type);
Graphics2D g = resizedImage.createGraphics(); Graphics2D g = resizedImage.createGraphics();

View File

@ -17,7 +17,7 @@
*/ */
.tree-table-view { .tree-table-view {
-fx-tree-table-color: rgba(0, 168, 204, 0.2); -fx-tree-table-color: rgba(0, 168, 204, 0.2);
-fx-tree-table-rippler-color: rgba(0, 168, 204, 0.4); -fx-tree-table-rippler-color: rgba(0, 168, 204, 0.4);
} }
@ -32,7 +32,7 @@
} }
.tree-table-view .jfx-rippler { .tree-table-view .jfx-rippler {
-jfx-rippler-fill: -fx-tree-table-rippler-color; -jfx-rippler-fill: -fx-tree-table-rippler-color;
} }
.tree-table-view .column-header, .tree-table-view .column-header,

View File

@ -9,24 +9,31 @@ import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.eclipsesource.json.Json; import com.eclipsesource.json.Json;
import com.eclipsesource.json.JsonArray; import com.eclipsesource.json.JsonArray;
import com.eclipsesource.json.JsonObject;
import com.eclipsesource.json.JsonValue; import com.eclipsesource.json.JsonValue;
import datatypes.SmmdbApiDataType; import datatypes.SmmdbApiDataType;
public class SmmdbApiQuery { public class SmmdbApiQuery {
private String URL = "http://smmdb.ddns.net/api/getcourses?"; //FIXME limit=70 as workaround for to long response, courseDataGz is to long
private String URL = "http://smmdb.ddns.net/api/getcourses?format=json&limit=70";
private static final Logger LOGGER = LogManager.getLogger(SmmdbApiQuery.class.getName());
public SmmdbApiQuery() { public SmmdbApiQuery() {
//Auto-generated constructor stub //Auto-generated constructor stub
} }
//start api query /**
* start smmdb api query
* @return a ArryList with all courses found at smmdb
*/
public ArrayList<SmmdbApiDataType> startQuery() { public ArrayList<SmmdbApiDataType> startQuery() {
ArrayList<Integer> courseIDs = new ArrayList<>();
ArrayList<SmmdbApiDataType> course = new ArrayList<>(); ArrayList<SmmdbApiDataType> course = new ArrayList<>();
String output = ""; String output = "";
@ -36,98 +43,95 @@ public class SmmdbApiQuery {
BufferedReader ina = new BufferedReader(new InputStreamReader(apiUrl.openStream())); BufferedReader ina = new BufferedReader(new InputStreamReader(apiUrl.openStream()));
output = ina.readLine(); output = ina.readLine();
ina.close(); ina.close();
System.out.println(output);
LOGGER.info("response from " + URL + " was valid");
} catch (IOException e) { } catch (IOException e) {
System.out.println("error while making api request or reading response"); LOGGER.error("error while making api request or reading response");
e.printStackTrace(); LOGGER.error("response from " + URL + " was: " + output, e);
} }
JsonObject mainObject = Json.parse(output).asObject().get("courses").asObject(); String apiOutput = "{ \"courses\": " + output + "}";
JsonArray objectAssets = Json.parse(output).asObject().get("order").asArray(); JsonArray items = Json.parse(apiOutput).asObject().get("courses").asArray();
for (JsonValue asset : objectAssets) { for (JsonValue item : items) {
courseIDs.add(asset.asInt()); int courseTheme, gameStyle, difficulty, lastmodified, uploaded, autoScroll, stars ,time;
} String owner, id, nintendoid, title;
//if value is 9 or "notset" the api returned NULL as value
for (int i = 0; i < courseIDs.size(); i++) {
int id, owner, coursetype, leveltype, difficulty, lastmodified, uploaded, downloads, stars, hasimage, ispackage, updatereq;
String nintendoid, title;
JsonObject singleObject = mainObject.get(courseIDs.get(i).toString()).asObject();
try { try {
id = singleObject.getInt("id", 0); courseTheme = item.asObject().getInt("courseTheme", 9);
} catch (Exception e) { } catch (Exception e) {
id = 9; courseTheme = 9;
} }
try { try {
owner = singleObject.getInt("owner", 0); gameStyle = item.asObject().getInt("gameStyle", 9);
} catch (Exception e) { } catch (Exception e) {
owner = 9; gameStyle = 9;
} }
try { try {
coursetype = singleObject.getInt("coursetype", 0); difficulty = item.asObject().getInt("difficulty", 9);
} catch (Exception e) {
coursetype = 9;
}
try {
leveltype = singleObject.getInt("leveltype", 0);
} catch (Exception e) {
leveltype = 9;
}
try {
difficulty = singleObject.getInt("difficulty", 0);
} catch (Exception e) { } catch (Exception e) {
difficulty = 9; difficulty = 9;
} }
try { try {
lastmodified = singleObject.getInt("lastmodified", 0); lastmodified = item.asObject().getInt("lastmodified", 9);
} catch (Exception e) { } catch (Exception e) {
lastmodified = 9; lastmodified = 9;
} }
try { try {
uploaded = singleObject.getInt("uploaded", 0); uploaded = item.asObject().getInt("uploaded", 9);
} catch (Exception e) { } catch (Exception e) {
uploaded = 9; uploaded = 9;
} }
try { try {
downloads = singleObject.getInt("downloads", 0); autoScroll = item.asObject().getInt("autoScroll", 9);
} catch (Exception e) { } catch (Exception e) {
downloads = 9; autoScroll = 9;
} }
try { try {
stars = singleObject.getInt("stars", 0); stars = item.asObject().getInt("stars", 9);
} catch (Exception e) { } catch (Exception e) {
stars = 9; stars = 9;
} }
try { try {
hasimage = singleObject.getInt("hasimage", 0); time = item.asObject().getInt("time", 9);
} catch (Exception e) { } catch (Exception e) {
hasimage = 9; time = 9;
} }
try { try {
ispackage = singleObject.getInt("ispackage", 0); owner = item.asObject().getString("owner", "");
} catch (Exception e) { } catch (Exception e) {
ispackage = 9; owner = "notset";
} }
try { try {
updatereq = singleObject.getInt("updatereq", 0); id = item.asObject().getString("id", "");
} catch (Exception e) { } catch (Exception e) {
updatereq = 9; id = "notset";
} }
try { try {
nintendoid = singleObject.getString("nintendoid", ""); nintendoid = item.asObject().getString("nintendoid", "");
} catch (Exception e) { } catch (Exception e) {
nintendoid = "notset"; nintendoid = "notset";
} }
try { try {
title = singleObject.getString("title", "");; title = item.asObject().getString("title", "");;
} catch (Exception e) { } catch (Exception e) {
title = "notset"; title = "notset";
} }
course.add(new SmmdbApiDataType(id, owner, coursetype, leveltype, difficulty, lastmodified, uploaded, downloads, course.add(new SmmdbApiDataType(courseTheme, gameStyle, difficulty, lastmodified, uploaded, autoScroll,
stars, hasimage, ispackage, updatereq, nintendoid, title)); stars, time, owner, id, nintendoid, title));
} }
return course; return course;
} }

View File

@ -32,6 +32,8 @@ import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
@ -47,15 +49,16 @@ public class dbController {
private String DB_PATH_games; private String DB_PATH_games;
private Connection connection = null; private Connection connection = null;
private Connection connectionGames = null; private Connection connectionGames = null;
private static final Logger LOGGER = LogManager.getLogger(dbController.class.getName());
public void main(){ public void main(){
System.out.println("<==========starting loading sql==========>"); LOGGER.info("<==========starting loading sql==========>");
loadRomDatabase(); loadRomDatabase();
loadGamesDatabase(); loadGamesDatabase();
createRomDatabase(); createRomDatabase();
loadAllRoms(); loadAllRoms();
checkRemoveEntry(); checkRemoveEntry();
System.out.println("<==========finished loading sql==========>"); LOGGER.info("<==========finished loading sql==========>");
} }
private void loadRomDatabase(){ private void loadRomDatabase(){
@ -70,9 +73,9 @@ public class dbController {
connection.setAutoCommit(false); //AutoCommit to false -> manual commit is active connection.setAutoCommit(false); //AutoCommit to false -> manual commit is active
} catch (SQLException e) { } catch (SQLException e) {
// if the error message is "out of memory", it probably means no database file is found // if the error message is "out of memory", it probably means no database file is found
System.err.println(e.getMessage()); LOGGER.error("error while loading the ROM database", e);
} }
System.out.println("rom database loaded successfull"); LOGGER.info("ROM database loaded successfull");
} }
/** /**
@ -91,9 +94,9 @@ public class dbController {
connectionGames.setAutoCommit(false); //AutoCommit to false -> manual commit is active connectionGames.setAutoCommit(false); //AutoCommit to false -> manual commit is active
} catch (SQLException e) { } catch (SQLException e) {
// if the error message is "out of memory", it probably means no database file is found // if the error message is "out of memory", it probably means no database file is found
System.err.println(e.getMessage()); LOGGER.error("error while loading the games database", e);
} }
System.out.println("games database loaded successfull"); LOGGER.info("games database loaded successfull");
} }
//creating database, if database has 0 entries search for all .rpx files in the roms directory and add them //creating database, if database has 0 entries search for all .rpx files in the roms directory and add them
@ -103,8 +106,8 @@ public class dbController {
stmt.executeUpdate("create table if not exists local_roms (title, coverPath, romPath, titleID, productCode, region, lastPlayed, timePlayed)"); stmt.executeUpdate("create table if not exists local_roms (title, coverPath, romPath, titleID, productCode, region, lastPlayed, timePlayed)");
stmt.close(); stmt.close();
connection.commit(); connection.commit();
} catch (SQLException e1) { } catch (SQLException e) {
e1.printStackTrace(); LOGGER.error("error while creating ROM database", e);
} }
try { try {
@ -115,9 +118,8 @@ public class dbController {
} }
stmt.close(); stmt.close();
rs.close(); rs.close();
}catch (SQLException ea){ }catch (SQLException e){
System.err.println("Ups! an error occured!"); LOGGER.error("error while loading ROMs from ROM database, local_roms table", e);
ea.printStackTrace();
} }
if(entries.size() == 0){ if(entries.size() == 0){
loadRomDirectory(mainWindowController.getRomPath()); loadRomDirectory(mainWindowController.getRomPath());
@ -129,7 +131,7 @@ public class dbController {
stmt.executeUpdate("insert into local_roms values ('"+title+"','"+coverPath+"','"+romPath+"','"+titleID+"','"+productCode+"','"+region+"','"+lastPlayed+"','"+timePlayed+"')"); stmt.executeUpdate("insert into local_roms values ('"+title+"','"+coverPath+"','"+romPath+"','"+titleID+"','"+productCode+"','"+region+"','"+lastPlayed+"','"+timePlayed+"')");
connection.commit(); connection.commit();
stmt.close(); stmt.close();
System.out.println("added \""+title+"\" to databsae"); LOGGER.info("added \""+title+"\" to ROM database");
} }
void removeRom(String titleID) throws SQLException{ void removeRom(String titleID) throws SQLException{
@ -137,12 +139,12 @@ public class dbController {
stmt.executeUpdate("delete from local_roms where titleID = '"+titleID+"'"); stmt.executeUpdate("delete from local_roms where titleID = '"+titleID+"'");
connection.commit(); connection.commit();
stmt.close(); stmt.close();
System.out.println("removed \""+titleID+"\" from databsae"); LOGGER.info("removed \""+titleID+"\" from ROM database");
} }
//load all rom's on startup to the UI //load all ROMs on startup to the mainWindowController
void loadAllRoms(){ void loadAllRoms(){
System.out.println("loading all rom's on startup to mwc ..."); LOGGER.info("loading all rom's on startup into the mainWindowController ...");
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms"); ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms");
@ -152,13 +154,13 @@ public class dbController {
stmt.close(); stmt.close();
rs.close(); rs.close();
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); LOGGER.error("error while loading all ROMs into the mainWindowController", e);
} }
} }
//load one single rom after manual adding one //load one single ROM after manual adding into the mainWindowController
void loadSingleRom(String titleID){ void loadSingleRom(String titleID){
System.out.println("loading a single rom (ID: "+titleID+") to mwc ..."); LOGGER.info("loading a single ROM (ID: "+titleID+") into the mainWindowController ...");
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms where titleID = '"+titleID+"'"); ResultSet rs = stmt.executeQuery("SELECT * FROM local_roms where titleID = '"+titleID+"'");
@ -168,7 +170,7 @@ public class dbController {
stmt.close(); stmt.close();
rs.close(); rs.close();
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); LOGGER.error("error while loading a single ROM into the mainWindowController", e);
} }
} }
@ -188,7 +190,7 @@ public class dbController {
try { try {
Statement stmt = connectionGames.createStatement(); Statement stmt = connectionGames.createStatement();
System.out.println("Getting all .rpx files in " + dir.getCanonicalPath()+" including those in subdirectories \n"); LOGGER.info("Getting all .rpx files in " + dir.getCanonicalPath()+" including those in subdirectories");
List<File> files = (List<File>) FileUtils.listFiles(dir, extensions, true); List<File> files = (List<File>) FileUtils.listFiles(dir, extensions, true);
for (File file : files) { for (File file : files) {
if(System.getProperty("os.name").equals("Linux")){ if(System.getProperty("os.name").equals("Linux")){
@ -201,16 +203,13 @@ public class dbController {
Document document = documentBuilder.parse(appFile); Document document = documentBuilder.parse(appFile);
String title_ID = document.getElementsByTagName("title_id").item(0).getTextContent(); String title_ID = document.getElementsByTagName("title_id").item(0).getTextContent();
title_ID = title_ID.substring(0, 8) + "-" + title_ID.substring(8, title_ID.length()); title_ID = title_ID.substring(0, 8) + "-" + title_ID.substring(8, title_ID.length());
System.out.println("Name: "+file.getName()+"; Title ID: "+title_ID); LOGGER.info("Name: "+file.getName()+"; Title ID: "+title_ID);
ResultSet rs = stmt.executeQuery("SELECT * FROM games WHERE TitleID = '"+title_ID+"';"); ResultSet rs = stmt.executeQuery("SELECT * FROM games WHERE TitleID = '"+title_ID+"';");
while (rs.next()) { while (rs.next()) {
System.out.print(rs.getString(2));
if (checkEntry(rs.getString(2))) { if (checkEntry(rs.getString(2))) {
System.out.println(": game already in database"); LOGGER.info(rs.getString(2) + ": game already in database");
}else{ }else{
System.out.println(": add game"); LOGGER.info("adding cover to cache ...");
System.out.println("adding cover to cache ...");
BufferedImage originalImage = ImageIO.read(new URL(rs.getString(6)));//change path to where file is located BufferedImage originalImage = ImageIO.read(new URL(rs.getString(6)));//change path to where file is located
int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType(); int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
BufferedImage resizeImagePNG = resizeImage(originalImage, type, 400, 600); BufferedImage resizeImagePNG = resizeImage(originalImage, type, 400, 600);
@ -221,15 +220,14 @@ public class dbController {
ImageIO.write(resizeImagePNG, "png", new File(pictureCache+"\\"+rs.getString(3)+".png")); //change path where you want it saved ImageIO.write(resizeImagePNG, "png", new File(pictureCache+"\\"+rs.getString(3)+".png")); //change path where you want it saved
coverPath = pictureCache+"\\"+rs.getString(3)+".png"; coverPath = pictureCache+"\\"+rs.getString(3)+".png";
} }
LOGGER.info(rs.getString(2) + ": adding ROM");
addRom(rs.getString(2), coverPath, file.getCanonicalPath(), rs.getString(1), rs.getString(3), rs.getString(5),"","0"); addRom(rs.getString(2), coverPath, file.getCanonicalPath(), rs.getString(1), rs.getString(3), rs.getString(5),"","0");
} }
} }
System.out.println("");
} }
} catch (IOException | SQLException | ParserConfigurationException | SAXException e) { } catch (IOException | SQLException | ParserConfigurationException | SAXException e) {
System.out.println("Ups something went wrong!"); LOGGER.error("error while loading ROMs from directory", e);
e.printStackTrace();
} }
} }
@ -244,8 +242,11 @@ public class dbController {
} }
private void checkRemoveEntry() { private void checkRemoveEntry() {
// TODO needs to be implemented! /**
System.out.println("check if entry removed not done yet!"); * TODO needs to be implemented!
* don't show ROM on the UI, but keep all parameter in case it's showing up again ask if old data should be used
*/
//LOGGER.info("check if entry removed not done yet!");
} }
private static BufferedImage resizeImage(BufferedImage originalImage, int type, int IMG_WIDTH, int IMG_HEIGHT) { private static BufferedImage resizeImage(BufferedImage originalImage, int type, int IMG_WIDTH, int IMG_HEIGHT) {
@ -264,7 +265,7 @@ public class dbController {
connection.commit(); connection.commit();
stmt.close(); stmt.close();
}catch(SQLException e){ }catch(SQLException e){
e.printStackTrace(); LOGGER.error("failed to set the last played", e);
} }
} }
@ -277,23 +278,24 @@ public class dbController {
stmt.close(); stmt.close();
rs.close(); rs.close();
}catch(SQLException e){ }catch(SQLException e){
e.printStackTrace(); LOGGER.error("failed to get the last played", e);
} }
return lastPlayed; return lastPlayed;
} }
void setTimePlayed(String timePlayed, String titleID){ void setTotalPlaytime(String timePlayed, String titleID){
try{ try{
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
stmt.executeUpdate("UPDATE local_roms SET timePlayed='"+timePlayed+"' WHERE titleID = '"+titleID+"';"); stmt.executeUpdate("UPDATE local_roms SET timePlayed='"+timePlayed+"' WHERE titleID = '"+titleID+"';");
connection.commit(); connection.commit();
stmt.close(); stmt.close();
}catch(SQLException e){ }catch(SQLException e){
LOGGER.error("failed to set total play time", e);
e.printStackTrace(); e.printStackTrace();
} }
} }
String getTimePlayed(String titleID){ String getTotalPlaytime(String titleID){
String timePlayed = null; String timePlayed = null;
try{ try{
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
@ -302,7 +304,7 @@ public class dbController {
stmt.close(); stmt.close();
rs.close(); rs.close();
}catch(SQLException e){ }catch(SQLException e){
e.printStackTrace(); LOGGER.error("failed to get total play time", e);
} }
return timePlayed; return timePlayed;
} }

View File

@ -16,18 +16,23 @@ package application;
import java.io.IOException; import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javafx.application.Platform; import javafx.application.Platform;
public class playGame extends Thread{ public class playGame extends Thread{
MainWindowController mainWindowController; MainWindowController mainWindowController;
dbController dbController; dbController dbController;
private static final Logger LOGGER = LogManager.getLogger(playGame.class.getName());
public playGame(MainWindowController m, dbController db){ public playGame(MainWindowController m, dbController db){
mainWindowController = m; mainWindowController = m;
dbController = db; dbController = db;
} }
@Override
public void run(){ public void run(){
String selectedGameTitleID = mainWindowController.getSelectedGameTitleID(); String selectedGameTitleID = mainWindowController.getSelectedGameTitleID();
String executeComand; String executeComand;
@ -55,22 +60,22 @@ public class playGame extends Thread{
executeComand = mainWindowController.getCemuPath()+"\\Cemu.exe -g \""+mainWindowController.getGameExecutePath()+"\""; executeComand = mainWindowController.getCemuPath()+"\\Cemu.exe -g \""+mainWindowController.getGameExecutePath()+"\"";
} }
} }
System.out.println(executeComand); LOGGER.info(executeComand);
p = Runtime.getRuntime().exec(executeComand); p = Runtime.getRuntime().exec(executeComand);
p.waitFor(); p.waitFor();
endTime = System.currentTimeMillis(); endTime = System.currentTimeMillis();
timePlayedNow = (int) Math.floor(((endTime - startTime)/1000/60)); timePlayedNow = (int) Math.floor(((endTime - startTime)/1000/60));
timePlayed = Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID))+timePlayedNow; timePlayed = Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID))+timePlayedNow;
dbController.setTimePlayed(Integer.toString(timePlayed), selectedGameTitleID); dbController.setTotalPlaytime(Integer.toString(timePlayed), selectedGameTitleID);
Platform.runLater(() -> { Platform.runLater(() -> {
if(Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID)) > 60){ if(Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID)) > 60){
int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID))/60); int hoursPlayed = (int) Math.floor(Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID))/60);
int minutesPlayed = Integer.parseInt(dbController.getTimePlayed(selectedGameTitleID))-60*hoursPlayed; int minutesPlayed = Integer.parseInt(dbController.getTotalPlaytime(selectedGameTitleID))-60*hoursPlayed;
mainWindowController.timePlayedBtn.setText(hoursPlayed+"h "+minutesPlayed+"min"); mainWindowController.totalPlaytimeBtn.setText(hoursPlayed+"h "+minutesPlayed+"min");
}else{ }else{
mainWindowController.timePlayedBtn.setText(dbController.getTimePlayed(selectedGameTitleID)+ " min"); mainWindowController.totalPlaytimeBtn.setText(dbController.getTotalPlaytime(selectedGameTitleID)+ " min");
} }
mainWindowController.main.primaryStage.setIconified(false); mainWindowController.main.primaryStage.setIconified(false);
}); });

View File

@ -11,6 +11,8 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
@ -39,6 +41,7 @@ public class GoogleDriveController {
private ArrayList<File> cloudSavegames = new ArrayList<>(); private ArrayList<File> cloudSavegames = new ArrayList<>();
private ArrayList<String> localSavegamesName = new ArrayList<>(); private ArrayList<String> localSavegamesName = new ArrayList<>();
private ArrayList<String> cloudSavegamesName = new ArrayList<>(); private ArrayList<String> cloudSavegamesName = new ArrayList<>();
private static final Logger LOGGER = LogManager.getLogger(GoogleDriveController.class.getName());
private final String APPLICATION_NAME ="cemu_Ui Drive API Controller"; private final String APPLICATION_NAME ="cemu_Ui Drive API Controller";
@ -65,7 +68,7 @@ public class GoogleDriveController {
DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
folderID = ""; folderID = "";
} catch (Throwable t) { } catch (Throwable t) {
t.printStackTrace(); LOGGER.error("error", t);
System.exit(1); System.exit(1);
} }
} }
@ -87,7 +90,7 @@ public class GoogleDriveController {
.setAccessType("offline") .setAccessType("offline")
.build(); .build();
Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); LOGGER.info("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
return credential; return credential;
} }
@ -129,19 +132,19 @@ public class GoogleDriveController {
FileInputStream fis = new FileInputStream(localSavegames.get(localSavegamesNumber)); FileInputStream fis = new FileInputStream(localSavegames.get(localSavegamesNumber));
if (cloudSavegames.get(i).getMd5Checksum().equals(org.apache.commons.codec.digest.DigestUtils.md5Hex(fis))) { if (cloudSavegames.get(i).getMd5Checksum().equals(org.apache.commons.codec.digest.DigestUtils.md5Hex(fis))) {
System.out.println("both files are the same, nothing to do"); LOGGER.info("both files are the same, nothing to do");
} else { } else {
if (localModified >= cloudModified) { if (localModified >= cloudModified) {
System.out.print("local is newer, "); LOGGER.info("local is newer");
updateFile(cloudSavegames.get(i), localSavegames.get(localSavegamesNumber)); updateFile(cloudSavegames.get(i), localSavegames.get(localSavegamesNumber));
} else { } else {
System.out.print("cloud is newer, "); LOGGER.info("cloud is newer");
downloadFile(cloudSavegames.get(i)); downloadFile(cloudSavegames.get(i));
} }
} }
} else { } else {
System.out.print("file doesn't exist locally, "); LOGGER.info("file doesn't exist locally");
downloadFile(cloudSavegames.get(i)); downloadFile(cloudSavegames.get(i));
} }
} }
@ -149,7 +152,7 @@ public class GoogleDriveController {
// upload file to cloud which don't exist in the cloud // upload file to cloud which don't exist in the cloud
for (int j = 0; j < localSavegames.size(); j++) { for (int j = 0; j < localSavegames.size(); j++) {
if (!cloudSavegamesName.contains(localSavegamesName.get(j))) { if (!cloudSavegamesName.contains(localSavegamesName.get(j))) {
System.out.print("file doesn't exist in the cloud, "); LOGGER.info("file doesn't exist in the cloud");
uploadFile(localSavegames.get(j)); uploadFile(localSavegames.get(j));
} }
} }
@ -157,13 +160,13 @@ public class GoogleDriveController {
//create a folder in google drive //create a folder in google drive
public void creatFolder() throws IOException { public void creatFolder() throws IOException {
System.out.println("creating new folder"); LOGGER.info("creating new folder");
File fileMetadata = new File(); File fileMetadata = new File();
fileMetadata.setName("cemu_savegames"); fileMetadata.setName("cemu_savegames");
fileMetadata.setMimeType("application/vnd.google-apps.folder"); fileMetadata.setMimeType("application/vnd.google-apps.folder");
File file = service.files().create(fileMetadata).setFields("id").execute(); File file = service.files().create(fileMetadata).setFields("id").execute();
System.out.println("Folder ID: " + file.getId()); LOGGER.info("Folder ID: " + file.getId());
folderID = file.getId(); folderID = file.getId();
} }
@ -189,7 +192,7 @@ public class GoogleDriveController {
String[] extensions = new String[] { "dat","sav","bin" }; String[] extensions = new String[] { "dat","sav","bin" };
localSavegames.removeAll(localSavegames); localSavegames.removeAll(localSavegames);
localSavegamesName.removeAll(localSavegamesName); localSavegamesName.removeAll(localSavegamesName);
System.out.println("Getting all dat,sav,bin files in " + dir.getCanonicalPath()+" including those in subdirectories"); LOGGER.info("Getting all dat,sav,bin files in " + dir.getCanonicalPath()+" including those in subdirectories");
List<java.io.File> files = (List<java.io.File>) FileUtils.listFiles(dir, extensions, true); List<java.io.File> files = (List<java.io.File>) FileUtils.listFiles(dir, extensions, true);
for (java.io.File file : files) { for (java.io.File file : files) {
localSavegamesName.add(file.getParentFile().getName()+"_"+file.getName()); localSavegamesName.add(file.getParentFile().getName()+"_"+file.getName());
@ -199,7 +202,7 @@ public class GoogleDriveController {
//reading all cloud savegames //reading all cloud savegames
private void getCloudSavegames() throws IOException { private void getCloudSavegames() throws IOException {
System.out.println("getting all cloud savegames"); LOGGER.info("getting all cloud savegames");
cloudSavegames.removeAll(cloudSavegames); cloudSavegames.removeAll(cloudSavegames);
cloudSavegamesName.removeAll(cloudSavegamesName); cloudSavegamesName.removeAll(cloudSavegamesName);
Files.List request = service.files().list().setQ("'"+folderID+"' in parents").setFields("nextPageToken, files(id, name, size, modifiedTime, createdTime, md5Checksum)"); Files.List request = service.files().list().setQ("'"+folderID+"' in parents").setFields("nextPageToken, files(id, name, size, modifiedTime, createdTime, md5Checksum)");
@ -216,46 +219,45 @@ public class GoogleDriveController {
FileList files = request.execute(); FileList files = request.execute();
try { try {
System.out.println("FolderID: " + files.getFiles().get(0).getId()); LOGGER.info("FolderID: " + files.getFiles().get(0).getId());
setFolderID(files.getFiles().get(0).getId()); setFolderID(files.getFiles().get(0).getId());
} catch (Exception e) { } catch (Exception e) {
System.out.println("Oops, something went wrong! It seems that you have more than one folder called 'cemu_savegames'!"); LOGGER.error("Oops, something went wrong! It seems that you have more than one folder called 'cemu_savegames'!", e);
e.printStackTrace();
} }
} }
//upload a file to the cloud from the local savegames folder //upload a file to the cloud from the local savegames folder
public void uploadFile(java.io.File uploadFile) throws IOException{ public void uploadFile(java.io.File uploadFile) throws IOException{
System.out.println("uploading " + uploadFile.getName() + "..."); LOGGER.info("uploading " + uploadFile.getName() + " ...");
File fileMetadata = new File(); File fileMetadata = new File();
fileMetadata.setName(uploadFile.getParentFile().getName()+"_"+uploadFile.getName()); fileMetadata.setName(uploadFile.getParentFile().getName()+"_"+uploadFile.getName());
fileMetadata.setParents(Collections.singletonList(folderID)); fileMetadata.setParents(Collections.singletonList(folderID));
fileMetadata.setModifiedTime(new DateTime(uploadFile.lastModified())); fileMetadata.setModifiedTime(new DateTime(uploadFile.lastModified()));
FileContent mediaContent = new FileContent("", uploadFile); FileContent mediaContent = new FileContent("", uploadFile);
File file = service.files().create(fileMetadata, mediaContent).setFields("id, parents").execute(); File file = service.files().create(fileMetadata, mediaContent).setFields("id, parents").execute();
System.out.println("upload successfull, File ID: " + file.getId()); LOGGER.info("upload successfull, File ID: " + file.getId());
} }
//download a file from the cloud to the local savegames folder //download a file from the cloud to the local savegames folder
private void downloadFile(File downloadFile) throws IOException{ private void downloadFile(File downloadFile) throws IOException{
System.out.print("downloading "+downloadFile.getName()+"... "); LOGGER.info("downloading "+downloadFile.getName()+" ...");
java.io.File directory = new java.io.File(cemuDirectory+"/mlc01/emulatorSave/"+ downloadFile.getName().substring(0,8)); java.io.File directory = new java.io.File(cemuDirectory+"/mlc01/emulatorSave/"+ downloadFile.getName().substring(0,8));
String file = downloadFile.getName().substring(9,downloadFile.getName().length()); String file = downloadFile.getName().substring(9,downloadFile.getName().length());
if(!directory.exists()) { if(!directory.exists()) {
System.out.print("dir dosent exist... "); LOGGER.info("dir dosent exist");
directory.mkdir(); directory.mkdir();
} }
OutputStream outputStream = new FileOutputStream(directory +"/"+ file); OutputStream outputStream = new FileOutputStream(directory +"/"+ file);
service.files().get(downloadFile.getId()).executeMediaAndDownloadTo(outputStream); service.files().get(downloadFile.getId()).executeMediaAndDownloadTo(outputStream);
outputStream.close(); outputStream.close();
System.out.println("done"); LOGGER.info("download successfull, File ID: " + file); //TODO add FileID
} }
//update a file in the cloud, by deleting the old one and uploading an new with the same id //update a file in the cloud, by deleting the old one and uploading an new with the same id
private void updateFile(File oldFile, java.io.File newFile) throws IOException { private void updateFile(File oldFile, java.io.File newFile) throws IOException {
System.out.println("updating " +oldFile.getName()+"... "); LOGGER.info("updating " +oldFile.getName()+" ...");
service.files().delete(oldFile.getId()).execute(); //deleting old file service.files().delete(oldFile.getId()).execute(); //deleting old file
//uploading new file //uploading new file
@ -266,21 +268,19 @@ public class GoogleDriveController {
FileContent mediaContent = new FileContent("", newFile); FileContent mediaContent = new FileContent("", newFile);
File file = service.files().create(fileMetadata, mediaContent).setFields("id, parents").execute(); File file = service.files().create(fileMetadata, mediaContent).setFields("id, parents").execute();
System.out.println("File ID: " + file.getId()); LOGGER.info("update successfull, File ID: " + file.getId());
} }
public void uploadAllFiles() { public void uploadAllFiles() {
try { try {
getLocalSavegames(); getLocalSavegames();
System.out.println("uploading " + localSavegames.size() + " files..."); LOGGER.info("uploading " + localSavegames.size() + " files ...");
for (int i = 0; i < localSavegames.size(); i++) { for (int i = 0; i < localSavegames.size(); i++) {
uploadFile(localSavegames.get(i)); uploadFile(localSavegames.get(i));
} }
System.out.println("finished uploading all files!"); LOGGER.info("finished uploading all files");
} catch (IOException e) { } catch (IOException e) {
//Auto-generated catch block LOGGER.error("error while uploading all files", e);
System.out.println("Oops, there went something wrong! Error during uploading all files.");
e.printStackTrace();
} }
} }

View File

@ -13,14 +13,14 @@ import javafx.beans.property.StringProperty;
public class CourseTableDataType extends RecursiveTreeObject<CourseTableDataType> { public class CourseTableDataType extends RecursiveTreeObject<CourseTableDataType> {
public final StringProperty title; public final StringProperty title;
public final IntegerProperty downloads; public final StringProperty id;
public final IntegerProperty time;
public final IntegerProperty stars; public final IntegerProperty stars;
public final IntegerProperty id;
public CourseTableDataType(String title, int downloads, int stars, int id) { public CourseTableDataType(String title, String id, int time, int stars) {
this.title = new SimpleStringProperty(title); this.title = new SimpleStringProperty(title);
this.downloads = new SimpleIntegerProperty(downloads); this.id = new SimpleStringProperty(id);
this.time = new SimpleIntegerProperty(time);
this.stars = new SimpleIntegerProperty(stars); this.stars = new SimpleIntegerProperty(stars);
this.id = new SimpleIntegerProperty(id);
} }
} }

View File

@ -10,58 +10,43 @@ import javafx.beans.property.StringProperty;
public class SmmdbApiDataType { public class SmmdbApiDataType {
private final IntegerProperty id = new SimpleIntegerProperty(); private final IntegerProperty courseTheme = new SimpleIntegerProperty();
private final IntegerProperty owner = new SimpleIntegerProperty(); private final IntegerProperty gameStyle = new SimpleIntegerProperty();
private final IntegerProperty coursetype = new SimpleIntegerProperty();
private final IntegerProperty leveltype = new SimpleIntegerProperty();
private final IntegerProperty difficulty = new SimpleIntegerProperty(); private final IntegerProperty difficulty = new SimpleIntegerProperty();
private final IntegerProperty lastmodified = new SimpleIntegerProperty(); private final IntegerProperty lastmodified = new SimpleIntegerProperty();
private final IntegerProperty uploaded = new SimpleIntegerProperty(); private final IntegerProperty uploaded = new SimpleIntegerProperty();
private final IntegerProperty downloads = new SimpleIntegerProperty(); private final IntegerProperty autoScroll = new SimpleIntegerProperty();
private final IntegerProperty stars = new SimpleIntegerProperty(); private final IntegerProperty stars = new SimpleIntegerProperty();
private final IntegerProperty hasimage = new SimpleIntegerProperty(); private final IntegerProperty time = new SimpleIntegerProperty();
private final IntegerProperty ispackage = new SimpleIntegerProperty(); private final StringProperty owner = new SimpleStringProperty();
private final IntegerProperty updatereq = new SimpleIntegerProperty(); private final StringProperty id = new SimpleStringProperty();
private final StringProperty nintendoid = new SimpleStringProperty(); private final StringProperty nintendoid = new SimpleStringProperty();
private final StringProperty title = new SimpleStringProperty(); private final StringProperty title = new SimpleStringProperty();
public SmmdbApiDataType(final int id, final int owner, final int coursetype, final int leveltype, final int difficulty, public SmmdbApiDataType(final int courseTheme, final int gameStyle, final int difficulty, final int lastmodified,
final int lastmodified, final int uploaded, final int downloads, final int stars, final int hasimage, final int uploaded, final int autoScroll, final int stars, final int time,
final int ispackage, final int updatereq, final String nintendoid, final String title) { final String owner, final String id, final String nintendoid, final String title) {
this.id.set(id); this.id.set(id);
this.owner.set(owner); this.owner.set(owner);
this.coursetype.set(coursetype); this.courseTheme.set(courseTheme);
this.leveltype.set(leveltype); this.gameStyle.set(gameStyle);
this.difficulty.set(difficulty); this.difficulty.set(difficulty);
this.lastmodified.set(lastmodified); this.lastmodified.set(lastmodified);
this.uploaded.set(uploaded); this.uploaded.set(uploaded);
this.downloads.set(downloads); this.autoScroll.set(autoScroll);
this.stars.set(stars); this.stars.set(stars);
this.hasimage.set(hasimage); this.time.set(time);
this.ispackage.set(ispackage);
this.updatereq.set(updatereq);
this.nintendoid.set(nintendoid); this.nintendoid.set(nintendoid);
this.title.set(title); this.title.set(title);
} }
public IntegerProperty idProperty(){ public IntegerProperty courseThemeProperty(){
return id; return courseTheme;
} }
public IntegerProperty ownerProperty(){
return owner;
}
public IntegerProperty coursetypeProperty(){ public IntegerProperty gameStyleProperty(){
return coursetype; return gameStyle;
}
public StringProperty nintendoidProperty(){
return nintendoid;
}
public IntegerProperty leveltypeProperty(){
return leveltype;
} }
public IntegerProperty difficultyProperty(){ public IntegerProperty difficultyProperty(){
@ -76,44 +61,40 @@ public class SmmdbApiDataType {
return uploaded; return uploaded;
} }
public IntegerProperty downloadsProperty(){ public IntegerProperty autoScrollProperty(){
return downloads; return autoScroll;
} }
public IntegerProperty starsProperty(){ public IntegerProperty starsProperty(){
return stars; return stars;
} }
public IntegerProperty hasimageProperty(){ public IntegerProperty timeProperty(){
return hasimage; return time;
} }
public IntegerProperty ispackageProperty(){ public StringProperty ownerProperty(){
return ispackage; return owner;
} }
public IntegerProperty updatereqProperty(){ public StringProperty idProperty(){
return updatereq; return id;
}
public StringProperty nintendoidProperty(){
return nintendoid;
} }
public StringProperty titleProperty(){ public StringProperty titleProperty(){
return title; return title;
} }
public int getId() { public int getCourseTheme() {
return idProperty().get(); return courseThemeProperty().get();
} }
public int getOwner() { public int getGameStyle() {
return ownerProperty().get(); return gameStyleProperty().get();
}
public int getCoursetype() {
return coursetypeProperty().get();
}
public int getLeveltype() {
return leveltypeProperty().get();
} }
public int getDifficulty() { public int getDifficulty() {
@ -128,24 +109,24 @@ public class SmmdbApiDataType {
return uploadedProperty().get(); return uploadedProperty().get();
} }
public int getDownloads() { public int getAutoScroll() {
return downloadsProperty().get(); return autoScrollProperty().get();
} }
public int getStars() { public int getStars() {
return starsProperty().get(); return starsProperty().get();
} }
public int getHasimage() { public int getTime() {
return hasimageProperty().get(); return timeProperty().get();
} }
public int getIspackage() { public String getOwner() {
return ispackageProperty().get(); return ownerProperty().get();
} }
public int getUpdatereq() { public String getId() {
return updatereqProperty().get(); return idProperty().get();
} }
public String getNintendoid() { public String getNintendoid() {
@ -156,20 +137,12 @@ public class SmmdbApiDataType {
return titleProperty().get(); return titleProperty().get();
} }
public final void setId(int id) { public final void setCourseTheme(int courseTheme) {
idProperty().set(id); courseThemeProperty().set(courseTheme);
} }
public final void setOwner(int owner) { public final void setGameStyle(int gameStyle) {
ownerProperty().set(owner); gameStyleProperty().set(gameStyle);
}
public final void setCoursetype(int coursetype) {
coursetypeProperty().set(coursetype);
}
public final void setLeveltype(int leveltype) {
leveltypeProperty().set(leveltype);
} }
public final void setDifficulty(int difficulty) { public final void setDifficulty(int difficulty) {
@ -184,26 +157,26 @@ public class SmmdbApiDataType {
uploadedProperty().set(uploaded); uploadedProperty().set(uploaded);
} }
public final void setDownloads(int downloads) { public final void setAutoScroll(int autoScroll) {
downloadsProperty().set(downloads); autoScrollProperty().set(autoScroll);
} }
public final void setStars(int stars) { public final void setStars(int stars) {
starsProperty().set(stars); starsProperty().set(stars);
} }
public final void setHasimage(int hasimage) { public final void setTime(int time) {
hasimageProperty().set(hasimage); timeProperty().set(time);
} }
public final void setIspackage(int ispackage) { public final void setOwner(String owner) {
ispackageProperty().set(ispackage); ownerProperty().set(owner);
} }
public final void setUpdatereq(int updatereq) { public final void setId(String id) {
updatereqProperty().set(updatereq); idProperty().set(id);
} }
public final void setNintendoid(String nintendoid) { public final void setNintendoid(String nintendoid) {
nintendoidProperty().set(nintendoid); nintendoidProperty().set(nintendoid);
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

20
src/log4j2.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n" />
</Console>
<File name="file" fileName="${sys:logFilename}" immediateFlush="true">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n" />
</File>
</Appenders>
<Loggers>
<Root level="debug" additivity="false">
<AppenderRef ref="console" />
<AppenderRef ref="file"/>
</Root>
</Loggers>
</Configuration>