diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000..ab989c4
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,31 @@
+pipeline {
+ agent {
+ docker {
+ image 'maven:3-alpine'
+ args '-v /home/docker/jenkins/files/m2:/root/.m2'
+ }
+ }
+
+ stages {
+ stage('Build') {
+ steps {
+ sh 'mvn -B -DskipTests clean package'
+ }
+ }
+ stage('Test') {
+ steps {
+ echo 'Skip testing...'
+ }
+ }
+ stage('Deploy') {
+ steps {
+ echo 'Skip deployment...'
+ }
+ }
+ }
+ post {
+ always {
+ archiveArtifacts artifacts: 'target/*-jar-with-dependencies.jar', onlyIfSuccessful: true
+ }
+ }
+}
\ No newline at end of file
diff --git a/Main.java b/Main.java
deleted file mode 100644
index ab76f68..0000000
--- a/Main.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package mplayer4anime;
-/**
-Name: mplayer4anime
-@author Dmitry Isaenko
-License: GNU GPL v.3
-@version 0.11
-@see https://developersu.blogspot.com/search/label/mplayer4anime
-@see https://github.com/developersu/mplayer4anime
-2018, Russia
-*/
-
-import javafx.application.Application;
-import javafx.fxml.FXMLLoader;
-import javafx.scene.Parent;
-import javafx.scene.Scene;
-import javafx.scene.image.Image;
-import javafx.stage.Stage;
-
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-
-public class Main extends Application {
-
- public static void main(String[] args) {
- launch(args);
- }
-
- @Override
- public void start(Stage primaryStage) throws Exception{
- FXMLLoader loader = new FXMLLoader(getClass().getResource("landingPage.fxml"));
-
- if (Locale.getDefault().getISO3Language().equals("rus")) {
- loader.setResources(ResourceBundle.getBundle("mplayer4anime.localization.locale", new Locale("ru")));
- } else {
- loader.setResources(ResourceBundle.getBundle("mplayer4anime.localization.locale", new Locale("en")));
- }
-
- Parent root = loader.load();
-
- // tmp?
- Controller controller = loader.getController();
- controller.setHostServices(getHostServices());
- // end
-
- primaryStage.getIcons().addAll(
- new Image(Main.class.getResourceAsStream("/mplayer4anime/res/app_icon32x32.png")),
- new Image(Main.class.getResourceAsStream("/mplayer4anime/res/app_icon48x48.png")),
- new Image(Main.class.getResourceAsStream("/mplayer4anime/res/app_icon64x64.png")),
- new Image(Main.class.getResourceAsStream("/mplayer4anime/res/app_icon128x128.png"))
- );
- primaryStage.setTitle("mplayer4anime");
- primaryStage.setMinWidth(500);
- primaryStage.setMinHeight(375);
- primaryStage.setScene(new Scene(root, 1200, 800));
- // Make linkage to controller method to handle exit() event in there.
- primaryStage.setOnHidden(e -> controller.shutdown());
- primaryStage.show();
- }
-}
diff --git a/Readme.md b/Readme.md
index 14d1888..0eadd49 100644
--- a/Readme.md
+++ b/Readme.md
@@ -1,13 +1,13 @@
# mplayer4anime
-mplayer4anime is mplayer launcher to play video file with audio layer and/or subtitles (.ass and .srt) at once.
+mplayer4anime is mplayer launcher to play video file with audio layer and/or subtitles (.ass, .srt, etc,,,) at once.
## License
Source code spreads under the GNU General Public License v.3. You can find it in LICENSE file or just visit www.gnu.org (it should be there for sure).
Note: Since 0.10 application supports playlists management and implements own json-based format that (somehow) could be used in third-party application,
-it would be nice to leave it as is. At least, I would prefer to have .alpr file extension used for this. As for the format of playlist format, please
+it would be nice to leave it as is. At least, I would prefer to have .alpr file extension used for this. As for the format of playlist, please
refer to WFTPL license.
## Used libraries
diff --git a/lib/gson-2.8.5.jar b/lib/gson-2.8.5.jar
deleted file mode 100644
index 0d5baf3..0000000
Binary files a/lib/gson-2.8.5.jar and /dev/null differ
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..2f3cd76
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,63 @@
+
+
+ 4.0.0
+
+ loper
+ mplayer4anime
+ 0.12-SNAPSHOT
+ jar
+ InnaIrcBot
+
+ UTF-8
+
+
+
+ com.google.code.gson
+ gson
+ 2.8.5
+ compile
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.1
+
+
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 2.5.3
+
+
+
+
+ mplayer4anime.Main
+
+
+
+
+ jar-with-dependencies
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..dcd19b4
--- /dev/null
+++ b/src/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: mplayer4anime.Main
+
diff --git a/About/AboutController.java b/src/main/java/mplayer4anime/About/AboutController.java
similarity index 100%
rename from About/AboutController.java
rename to src/main/java/mplayer4anime/About/AboutController.java
diff --git a/About/AboutWindow.java b/src/main/java/mplayer4anime/About/AboutWindow.java
similarity index 66%
rename from About/AboutWindow.java
rename to src/main/java/mplayer4anime/About/AboutWindow.java
index 61ee68d..0bacf66 100644
--- a/About/AboutWindow.java
+++ b/src/main/java/mplayer4anime/About/AboutWindow.java
@@ -20,13 +20,13 @@ public class AboutWindow {
stageAbout.setMinWidth(500);
stageAbout.setMinHeight(500);
- FXMLLoader loaderAbout = new FXMLLoader(getClass().getResource("AboutLayout.fxml"));
+ FXMLLoader loaderAbout = new FXMLLoader(getClass().getResource("/About/AboutLayout.fxml"));
ResourceBundle resourceBundle;
if (Locale.getDefault().getISO3Language().equals("rus")) {
- resourceBundle = ResourceBundle.getBundle("mplayer4anime.localization.locale", new Locale("ru"));
+ resourceBundle = ResourceBundle.getBundle("locale", new Locale("ru"));
} else {
- resourceBundle = ResourceBundle.getBundle("mplayer4anime.localization.locale", new Locale("en"));
+ resourceBundle = ResourceBundle.getBundle("locale", new Locale("en"));
}
loaderAbout.setResources(resourceBundle);
@@ -37,10 +37,10 @@ public class AboutWindow {
stageAbout.setTitle(resourceBundle.getString("about_AboutName"));
stageAbout.getIcons().addAll(
- new Image(Main.class.getResourceAsStream("/mplayer4anime/res/app_icon32x32.png")),
- new Image(Main.class.getResourceAsStream("/mplayer4anime/res/app_icon48x48.png")),
- new Image(Main.class.getResourceAsStream("/mplayer4anime/res/app_icon64x64.png")),
- new Image(Main.class.getResourceAsStream("/mplayer4anime/res/app_icon128x128.png"))
+ new Image(Main.class.getResourceAsStream("/res/app_icon32x32.png")),
+ new Image(Main.class.getResourceAsStream("/res/app_icon48x48.png")),
+ new Image(Main.class.getResourceAsStream("/res/app_icon64x64.png")),
+ new Image(Main.class.getResourceAsStream("/res/app_icon128x128.png"))
); // TODO: change to something reliable
stageAbout.setScene(new Scene(parentAbout, 500, 500));
diff --git a/AppPreferences.java b/src/main/java/mplayer4anime/AppPreferences.java
similarity index 100%
rename from AppPreferences.java
rename to src/main/java/mplayer4anime/AppPreferences.java
diff --git a/Controller.java b/src/main/java/mplayer4anime/Controller.java
similarity index 93%
rename from Controller.java
rename to src/main/java/mplayer4anime/Controller.java
index 004afe5..8f429fa 100644
--- a/Controller.java
+++ b/src/main/java/mplayer4anime/Controller.java
@@ -50,6 +50,13 @@ public class Controller implements Initializable {
private CheckMenuItem subsHide;
private String currentPlaylistLocation = null; //TODO: move to the constructor?
+
+ // If application started with playlist passed as an argument, then we'll try to load it (if it's valid).
+ public void setPlaylistAsArgument(String playlist) {
+ JsonStorage jsonStorage = Playlists.ReadByPath(resourceBundle, new File(playlist));
+ setAllLists(jsonStorage);
+ }
+
@Override
public void initialize(URL url, ResourceBundle rb) {
mkvPaneController.setPaneType("Video");
@@ -77,7 +84,7 @@ public class Controller implements Initializable {
addRecentlyOpened(recentPlaylists[i]);
}
- public void setHostServices(HostServices hostServices) {
+ void setHostServices(HostServices hostServices) {
this.hostServices = hostServices;
}
@@ -139,10 +146,19 @@ public class Controller implements Initializable {
}
int index;
index = mkvPaneController.getElementSelectedIndex();
+ // TODO: add 'link' button
if (index+1 < mkvPaneController.getElementsCount() ) {
mkvPaneController.setElementSelectedByIndex(index+1);
- playBtn();
}
+ index = mkaPaneController.getElementSelectedIndex();
+ if (index+1 < mkaPaneController.getElementsCount() ) {
+ mkaPaneController.setElementSelectedByIndex(index+1);
+ }
+ index = subPaneController.getElementSelectedIndex();
+ if (index+1 < subPaneController.getElementsCount() ) {
+ subPaneController.setElementSelectedByIndex(index+1);
+ }
+ playBtn();
}
private Process player;
@@ -225,7 +241,6 @@ public class Controller implements Initializable {
storeRecentArr[i] = (String) recentlyOpenedMenu.getItems().get(i).getUserData();
}
appPreferences.setRecentPlaylists(storeRecentArr);
-
Platform.exit();
}
@@ -260,6 +275,7 @@ public class Controller implements Initializable {
subPaneController.selectEncodingValue(jsonStorage.getSubEncoding(), appPreferences);
currentPlaylistLocation = Playlists.getPlaylistLocation(); // TODO: Implement listener? mmm...
+ //System.out.println(currentPlaylistLocation);
statusLbl.setText(currentPlaylistLocation);
addRecentlyOpened(currentPlaylistLocation);
}
@@ -308,17 +324,10 @@ public class Controller implements Initializable {
MenuItem menuItem = new MenuItem();
String fileNameOnly;
- if (playlistPath.contains("/")) { // Unix
- fileNameOnly = playlistPath.substring(playlistPath.lastIndexOf("/") + 1, playlistPath.length());
- menuItem.setText(fileNameOnly);
- }
- else if (playlistPath.contains("\\")) { // Windows
- fileNameOnly = playlistPath.substring(playlistPath.lastIndexOf("\\") + 1, playlistPath.length());
- menuItem.setText(fileNameOnly);
- }
- else { // Other o_0
- menuItem.setText(playlistPath);
- }
+
+ fileNameOnly = playlistPath.substring(playlistPath.lastIndexOf(File.separator) + 1);
+ menuItem.setText(fileNameOnly);
+
menuItem.setUserData(playlistPath);
menuItem.setOnAction(new EventHandler() {
@Override
diff --git a/IMediatorContol.java b/src/main/java/mplayer4anime/IMediatorContol.java
similarity index 100%
rename from IMediatorContol.java
rename to src/main/java/mplayer4anime/IMediatorContol.java
diff --git a/src/main/java/mplayer4anime/IPC/ServerSocketProvider.java b/src/main/java/mplayer4anime/IPC/ServerSocketProvider.java
new file mode 100644
index 0000000..5ee1142
--- /dev/null
+++ b/src/main/java/mplayer4anime/IPC/ServerSocketProvider.java
@@ -0,0 +1,48 @@
+package mplayer4anime.IPC;
+
+import javafx.application.Platform;
+import mplayer4anime.Controller;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+class ServerSocketProvider implements Runnable{
+
+ private ServerSocket serverSocket;
+ private Controller controller;
+
+ ServerSocketProvider(Controller mainCntrl, ServerSocket srvSock){
+ this.serverSocket = srvSock;
+ this.controller = mainCntrl;
+ }
+
+ @Override
+ public void run() {
+ Socket servSockClient;
+ try{
+ while (!serverSocket.isClosed()){
+ servSockClient = serverSocket.accept();
+ BufferedReader servInpRdr = new BufferedReader(
+ new InputStreamReader(servSockClient.getInputStream())
+ );
+
+ String line = servInpRdr.readLine();
+ // Avoid 'Not on FX application thread' error.
+ Platform.runLater(new Runnable() {
+ @Override
+ public void run() {
+ controller.setPlaylistAsArgument(line);
+ }
+ });
+
+ servSockClient.close();
+ }
+ }
+ catch (IOException ex){
+ System.out.println("Socket has been closed.");
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/mplayer4anime/IPC/SingleInstanceHandler.java b/src/main/java/mplayer4anime/IPC/SingleInstanceHandler.java
new file mode 100644
index 0000000..2ddecac
--- /dev/null
+++ b/src/main/java/mplayer4anime/IPC/SingleInstanceHandler.java
@@ -0,0 +1,55 @@
+package mplayer4anime.IPC;
+
+import mplayer4anime.Controller;
+
+import java.io.*;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+public class SingleInstanceHandler implements Runnable{
+
+ private ServerSocket servSock;
+
+ public SingleInstanceHandler(Controller mainCntrl, String argument){
+ int PORT = 65042;
+ // Creating client server socket;
+ try {
+ servSock = new ServerSocket(PORT, 10, InetAddress.getLocalHost());
+ Thread ssp = new Thread(new ServerSocketProvider(mainCntrl, servSock));
+ ssp.start();
+ } catch (IOException e) {
+ if (argument != null){
+ // Creating client socket;
+ try {
+ Socket clientSocket = new Socket(InetAddress.getLocalHost(), PORT);
+ OutputStream outStream = clientSocket.getOutputStream();
+ OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream);
+ outStreamWriter.write(argument + "\n");
+ outStreamWriter.flush();
+ outStream.close();
+ clientSocket.close();
+ } catch (IOException ex){
+ System.out.println("Internal issue: unable to create client socket.");
+ }
+ }
+ else
+ System.out.println("Application is already running.");
+ System.exit(0);
+ }
+ }
+
+ @Override
+ public void run() {
+ while (true) {
+ if ( Thread.currentThread().isInterrupted() ){
+ try {
+ servSock.close();
+ } catch (IOException e) {
+ System.out.println("Internal issue: unable to create client socket.");
+ }
+ break;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/LineRedirecter.java b/src/main/java/mplayer4anime/LineRedirecter.java
similarity index 100%
rename from LineRedirecter.java
rename to src/main/java/mplayer4anime/LineRedirecter.java
diff --git a/src/main/java/mplayer4anime/Main.java b/src/main/java/mplayer4anime/Main.java
new file mode 100644
index 0000000..c93bd64
--- /dev/null
+++ b/src/main/java/mplayer4anime/Main.java
@@ -0,0 +1,77 @@
+package mplayer4anime;
+/**
+Name: mplayer4anime
+@author Dmitry Isaenko
+License: GNU GPL v.3
+@version 0.12
+@see https://developersu.blogspot.com/search/label/mplayer4anime
+@see https://github.com/developersu/mplayer4anime
+2018-2019, Russia
+*/
+
+import javafx.application.Application;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.scene.image.Image;
+import javafx.stage.Stage;
+import mplayer4anime.IPC.SingleInstanceHandler;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+//TODO: Use one copy of AppPreferences object widely
+//TODO: Drag-n-drop playlist/files/audio
+//TODO: remember selected
+//TODO: remember position
+public class Main extends Application {
+
+ public static void main(String[] args) { launch(args); }
+
+ @Override
+ public void start(Stage primaryStage) throws Exception{
+ FXMLLoader loader = new FXMLLoader(getClass().getResource("/landingPage.fxml"));
+
+ if (Locale.getDefault().getISO3Language().equals("rus")) {
+ loader.setResources(ResourceBundle.getBundle("locale", new Locale("ru")));
+ } else {
+ loader.setResources(ResourceBundle.getBundle("locale", new Locale("en")));
+ }
+
+ Parent root = loader.load();
+
+ // tmp?
+ Controller controller = loader.getController();
+ controller.setHostServices(getHostServices());
+ SingleInstanceHandler sih;
+
+ if (!getParameters().getUnnamed().isEmpty())
+ sih = new SingleInstanceHandler(controller, getParameters().getUnnamed().get(0));
+ else
+ sih = new SingleInstanceHandler(controller, null);
+ // end
+ Thread tsih = new Thread(sih);
+ tsih.start();
+
+ // TODO: refactor needed?
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> tsih.interrupt()));
+
+ primaryStage.getIcons().addAll(
+ new Image(Main.class.getResourceAsStream("/res/app_icon32x32.png")),
+ new Image(Main.class.getResourceAsStream("/res/app_icon48x48.png")),
+ new Image(Main.class.getResourceAsStream("/res/app_icon64x64.png")),
+ new Image(Main.class.getResourceAsStream("/res/app_icon128x128.png"))
+ );
+ primaryStage.setTitle("mplayer4anime");
+ primaryStage.setMinWidth(500);
+ primaryStage.setMinHeight(375);
+ primaryStage.setScene(new Scene(root, 1200, 800));
+ // Make linkage to controller method to handle exit() event in there.
+ primaryStage.setOnHidden(e -> {
+ tsih.interrupt();
+ controller.shutdown();
+ });
+
+ primaryStage.show();
+ }
+}
diff --git a/MediatorControl.java b/src/main/java/mplayer4anime/MediatorControl.java
similarity index 100%
rename from MediatorControl.java
rename to src/main/java/mplayer4anime/MediatorControl.java
diff --git a/Playlists/JsonStorage.java b/src/main/java/mplayer4anime/Playlists/JsonStorage.java
similarity index 100%
rename from Playlists/JsonStorage.java
rename to src/main/java/mplayer4anime/Playlists/JsonStorage.java
diff --git a/Playlists/Playlists.java b/src/main/java/mplayer4anime/Playlists/Playlists.java
similarity index 96%
rename from Playlists/Playlists.java
rename to src/main/java/mplayer4anime/Playlists/Playlists.java
index 923934b..32a4392 100644
--- a/Playlists/Playlists.java
+++ b/src/main/java/mplayer4anime/Playlists/Playlists.java
@@ -5,6 +5,7 @@ import javafx.stage.FileChooser;
import mplayer4anime.ServiceWindow;
import java.io.*;
+import java.nio.charset.StandardCharsets;
import java.util.ResourceBundle;
public class Playlists {
@@ -45,7 +46,7 @@ public class Playlists {
if (!playlistFile.getAbsolutePath().endsWith(".alpr")) {
playlistFile = new File(playlistFile.getAbsolutePath() + ".alpr");
}
- try (Writer writer = new OutputStreamWriter(new FileOutputStream(playlistFile.getAbsolutePath()), "UTF-8"))
+ try (Writer writer = new OutputStreamWriter(new FileOutputStream(playlistFile.getAbsolutePath()), StandardCharsets.UTF_8))
{
Gson jsonObject = new GsonBuilder().setPrettyPrinting().create();
jsonObject.toJson(jStorage, writer);
@@ -93,6 +94,7 @@ public class Playlists {
JsonStorage jStorage = new Gson().fromJson(reader, JsonStorage.class);
if (jStorage != null){
playlistLocation = playlistFile.getAbsolutePath();
+ //System.out.println("FILE:|"+playlistLocation+"|");
return jStorage;
}
else
@@ -116,4 +118,4 @@ public class Playlists {
public static String getPlaylistLocation(){
return playlistLocation;
}
-}
+}
\ No newline at end of file
diff --git a/ServiceWindow.java b/src/main/java/mplayer4anime/ServiceWindow.java
similarity index 100%
rename from ServiceWindow.java
rename to src/main/java/mplayer4anime/ServiceWindow.java
diff --git a/Settings/ControllerListsSelector.java b/src/main/java/mplayer4anime/Settings/ControllerListsSelector.java
similarity index 100%
rename from Settings/ControllerListsSelector.java
rename to src/main/java/mplayer4anime/Settings/ControllerListsSelector.java
diff --git a/Settings/SettingsController.java b/src/main/java/mplayer4anime/Settings/SettingsController.java
similarity index 100%
rename from Settings/SettingsController.java
rename to src/main/java/mplayer4anime/Settings/SettingsController.java
diff --git a/Settings/SettingsWindow.java b/src/main/java/mplayer4anime/Settings/SettingsWindow.java
similarity index 64%
rename from Settings/SettingsWindow.java
rename to src/main/java/mplayer4anime/Settings/SettingsWindow.java
index 2e9731f..3c49837 100644
--- a/Settings/SettingsWindow.java
+++ b/src/main/java/mplayer4anime/Settings/SettingsWindow.java
@@ -19,13 +19,13 @@ public class SettingsWindow {
stageAbout.setMinWidth(570);
stageAbout.setMinHeight(500);
- FXMLLoader loaderSettings = new FXMLLoader(getClass().getResource("SettingsLayout.fxml"));
+ FXMLLoader loaderSettings = new FXMLLoader(getClass().getResource("/Settings/SettingsLayout.fxml"));
ResourceBundle resourceBundle;
if (Locale.getDefault().getISO3Language().equals("rus")) {
- resourceBundle = ResourceBundle.getBundle("mplayer4anime.localization.locale", new Locale("ru"));
+ resourceBundle = ResourceBundle.getBundle("locale", new Locale("ru"));
} else {
- resourceBundle = ResourceBundle.getBundle("mplayer4anime.localization.locale", new Locale("en"));
+ resourceBundle = ResourceBundle.getBundle("locale", new Locale("en"));
}
loaderSettings.setResources(resourceBundle);
@@ -36,10 +36,10 @@ public class SettingsWindow {
stageAbout.setTitle(resourceBundle.getString("settings_SettingsName"));
stageAbout.getIcons().addAll(
- new Image(Main.class.getResourceAsStream("/mplayer4anime/res/settings_icon32x32.png")),
- new Image(Main.class.getResourceAsStream("/mplayer4anime/res/settings_icon48x48.png")),
- new Image(Main.class.getResourceAsStream("/mplayer4anime/res/settings_icon64x64.png")),
- new Image(Main.class.getResourceAsStream("/mplayer4anime/res/settings_icon128x128.png"))
+ new Image(Main.class.getResourceAsStream("/res/settings_icon32x32.png")),
+ new Image(Main.class.getResourceAsStream("/res/settings_icon48x48.png")),
+ new Image(Main.class.getResourceAsStream("/res/settings_icon64x64.png")),
+ new Image(Main.class.getResourceAsStream("/res/settings_icon128x128.png"))
); // TODO: change to something reliable
stageAbout.setScene(new Scene(parentAbout, 570, 500));
stageAbout.show();
diff --git a/appPanes/ControllerPane.java b/src/main/java/mplayer4anime/appPanes/ControllerPane.java
similarity index 100%
rename from appPanes/ControllerPane.java
rename to src/main/java/mplayer4anime/appPanes/ControllerPane.java
diff --git a/appPanes/ControllerSUB.java b/src/main/java/mplayer4anime/appPanes/ControllerSUB.java
similarity index 100%
rename from appPanes/ControllerSUB.java
rename to src/main/java/mplayer4anime/appPanes/ControllerSUB.java
diff --git a/About/AboutLayout.fxml b/src/main/resources/About/AboutLayout.fxml
similarity index 100%
rename from About/AboutLayout.fxml
rename to src/main/resources/About/AboutLayout.fxml
diff --git a/Settings/ListSelector.fxml b/src/main/resources/Settings/ListSelector.fxml
similarity index 100%
rename from Settings/ListSelector.fxml
rename to src/main/resources/Settings/ListSelector.fxml
diff --git a/Settings/SettingsLayout.fxml b/src/main/resources/Settings/SettingsLayout.fxml
similarity index 100%
rename from Settings/SettingsLayout.fxml
rename to src/main/resources/Settings/SettingsLayout.fxml
diff --git a/appPanes/genericPane.fxml b/src/main/resources/appPanes/genericPane.fxml
similarity index 100%
rename from appPanes/genericPane.fxml
rename to src/main/resources/appPanes/genericPane.fxml
diff --git a/appPanes/subPane.fxml b/src/main/resources/appPanes/subPane.fxml
similarity index 100%
rename from appPanes/subPane.fxml
rename to src/main/resources/appPanes/subPane.fxml
diff --git a/landingPage.fxml b/src/main/resources/landingPage.fxml
similarity index 100%
rename from landingPage.fxml
rename to src/main/resources/landingPage.fxml
diff --git a/localization/locale_en.properties b/src/main/resources/locale_en.properties
similarity index 97%
rename from localization/locale_en.properties
rename to src/main/resources/locale_en.properties
index 1577da6..5eda1f5 100644
--- a/localization/locale_en.properties
+++ b/src/main/resources/locale_en.properties
@@ -1,5 +1,5 @@
about_line1=mplayer4amine distributes under GNU GPLv3 license.
-about_line2=Release: v0.11
+about_line2=Release: v0.12
about_line3=Development & maintenance by Dmitry Isaenko.
about_AboutName=About
main_tab_audio=Audio
@@ -30,7 +30,7 @@ menu_File=File
menu_Tools=Tools
menu_Help=Help
menu_Help_AboutApp=About
-menu_File_Close=Close
+menu_File_Close=Exit
menu_Tools_Settings=Settings
menu_File_Open=Open playlist...
menu_File_Save=Save playlist
diff --git a/localization/locale_ru.properties b/src/main/resources/locale_ru.properties
similarity index 98%
rename from localization/locale_ru.properties
rename to src/main/resources/locale_ru.properties
index f563e41..2527455 100644
--- a/localization/locale_ru.properties
+++ b/src/main/resources/locale_ru.properties
@@ -1,6 +1,6 @@
menu_File_Recent=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u044B...
about_line1=mplayer4amine \u0440\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u043F\u043E \u043B\u0438\u0446\u0435\u043D\u0437\u0438\u0438 GNU GPLv3.
-about_line2=\u0420\u0435\u043B\u0438\u0437: v0.11
+about_line2=\u0420\u0435\u043B\u0438\u0437: v0.12
about_line3=\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043E \u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0414\u043C\u0438\u0442\u0440\u0438\u0435\u043C \u0418\u0441\u0430\u0435\u043D\u043A\u043E.
about_AboutName=\u041E \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438
main_tab_audio=\u0410\u0443\u0434\u0438\u043E
@@ -31,7 +31,7 @@ menu_File=\u0424\u0430\u0439\u043B
menu_Tools=\u0418\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B
menu_Help=\u0421\u043F\u0440\u0430\u0432\u043A\u0430
menu_Help_AboutApp=\u041E \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438
-menu_File_Close=\u0417\u0430\u043A\u0440\u044B\u0442\u044C
+menu_File_Close=\u0412\u044B\u0445\u043E\u0434
menu_Tools_Settings=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438
menu_File_Open=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u043B\u0435\u0439\u043B\u0438\u0441\u0442...
menu_File_Save=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u043F\u043B\u0435\u0439\u043B\u0438\u0441\u0442
diff --git a/res/app_icon128x128.png b/src/main/resources/res/app_icon128x128.png
similarity index 100%
rename from res/app_icon128x128.png
rename to src/main/resources/res/app_icon128x128.png
diff --git a/res/app_icon32x32.png b/src/main/resources/res/app_icon32x32.png
similarity index 100%
rename from res/app_icon32x32.png
rename to src/main/resources/res/app_icon32x32.png
diff --git a/res/app_icon48x48.png b/src/main/resources/res/app_icon48x48.png
similarity index 100%
rename from res/app_icon48x48.png
rename to src/main/resources/res/app_icon48x48.png
diff --git a/res/app_icon64x64.png b/src/main/resources/res/app_icon64x64.png
similarity index 100%
rename from res/app_icon64x64.png
rename to src/main/resources/res/app_icon64x64.png
diff --git a/res/gjel.png b/src/main/resources/res/gjel.png
similarity index 100%
rename from res/gjel.png
rename to src/main/resources/res/gjel.png
diff --git a/res/landing.css b/src/main/resources/res/landing.css
similarity index 100%
rename from res/landing.css
rename to src/main/resources/res/landing.css
diff --git a/res/pocket.png b/src/main/resources/res/pocket.png
similarity index 100%
rename from res/pocket.png
rename to src/main/resources/res/pocket.png
diff --git a/res/settings_icon128x128.png b/src/main/resources/res/settings_icon128x128.png
similarity index 100%
rename from res/settings_icon128x128.png
rename to src/main/resources/res/settings_icon128x128.png
diff --git a/res/settings_icon32x32.png b/src/main/resources/res/settings_icon32x32.png
similarity index 100%
rename from res/settings_icon32x32.png
rename to src/main/resources/res/settings_icon32x32.png
diff --git a/res/settings_icon48x48.png b/src/main/resources/res/settings_icon48x48.png
similarity index 100%
rename from res/settings_icon48x48.png
rename to src/main/resources/res/settings_icon48x48.png
diff --git a/res/settings_icon64x64.png b/src/main/resources/res/settings_icon64x64.png
similarity index 100%
rename from res/settings_icon64x64.png
rename to src/main/resources/res/settings_icon64x64.png