Refactor config loading

This commit is contained in:
Victor 2018-04-06 18:59:36 +03:00
parent 5dd7d03053
commit 21955413ed
5 changed files with 118 additions and 51 deletions

View File

@ -0,0 +1,58 @@
package com.annimon.voicyanski;
public class Config {
private String locale;
private String telegramChatId, telegramBotToken;
private boolean encodeStereo;
private String encodeBitrate;
private String encodeSampleRate;
public String getLocale() {
return locale;
}
public void setLocale(String locale) {
this.locale = locale;
}
public String getTelegramChatId() {
return telegramChatId;
}
public void setTelegramChatId(String telegramChatId) {
this.telegramChatId = telegramChatId;
}
public String getTelegramBotToken() {
return telegramBotToken;
}
public void setTelegramBotToken(String telegramBotToken) {
this.telegramBotToken = telegramBotToken;
}
public boolean isEncodeStereo() {
return encodeStereo;
}
public void setEncodeStereo(boolean encodeStereo) {
this.encodeStereo = encodeStereo;
}
public String getEncodeBitrate() {
return encodeBitrate;
}
public void setEncodeBitrate(String encodeBitrate) {
this.encodeBitrate = encodeBitrate;
}
public String getEncodeSampleRate() {
return encodeSampleRate;
}
public void setEncodeSampleRate(String encodeSampleRate) {
this.encodeSampleRate = encodeSampleRate;
}
}

View File

@ -0,0 +1,46 @@
package com.annimon.voicyanski;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Properties;
import java.util.ResourceBundle;
public class ConfigLoader {
private final String resourceName;
private final Path externalPath;
public ConfigLoader(String resourceName, Path externalPath) {
this.resourceName = resourceName;
this.externalPath = externalPath;
}
public Config load() {
final Config config = new Config();
final ResourceBundle res = ResourceBundle.getBundle(resourceName);
try (InputStream extConfig = Files.newInputStream(externalPath)) {
final Properties props = new Properties();
props.load(extConfig);
loadConfig(config, key -> props.getProperty(key, res.getString(key)));
} catch (IOException ex) {
loadConfig(config, res::getString);
}
return config;
}
private void loadConfig(Config config, PropertyLoader loader) {
config.setLocale(loader.load("locale"));
config.setTelegramChatId(loader.load("telegram-chat-id"));
config.setTelegramBotToken(loader.load("telegram-bot-token"));
config.setEncodeStereo(loader.load("encode-stereo").equalsIgnoreCase("true"));
config.setEncodeBitrate(loader.load("encode-bitrate"));
config.setEncodeSampleRate(loader.load("encode-samplerate"));
}
@FunctionalInterface
private interface PropertyLoader {
String load(String key);
}
}

View File

@ -1,11 +1,8 @@
package com.annimon.voicyanski; package com.annimon.voicyanski;
import java.io.IOException; import java.nio.file.Path;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Locale; import java.util.Locale;
import java.util.Properties;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javafx.application.Application; import javafx.application.Application;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
@ -14,58 +11,24 @@ import javafx.stage.Stage;
public class Main extends Application { public class Main extends Application {
private static ResourceBundle resources, config; private static ResourceBundle resources;
Properties props = new Properties(); private static Config config;
public static String locale, chatId, botToken, stereo, bitrate, samplerate;
public static ResourceBundle getResources() { public static ResourceBundle getResources() {
return resources; return resources;
} }
public static ResourceBundle getConfig() { public static Config getConfig() {
return config; return config;
} }
private String getVar(String key) {
String result = props.getProperty(key);
return result != null ? result : config.getString(key);
}
private void setupVars() {
config = ResourceBundle.getBundle("app");
try {
InputStream extConfig = Files.newInputStream(Paths.get(
System.getProperty("user.home"),
".config",
"voicyanski.conf"));
props.load(extConfig);
extConfig.close();
locale = getVar("locale");
chatId = getVar("telegram-chat-id");
botToken = getVar("telegram-bot-token");
stereo = getVar("encode-stereo");
bitrate = getVar("encode-bitrate");
samplerate = getVar("encode-samplerate");
} catch (IOException ex) {
locale = config.getString("locale");
chatId = config.getString("telegram-chat-id");
botToken = config.getString("telegram-bot-token");
stereo = config.getString("encode-stereo");
bitrate = config.getString("encode-bitrate");
samplerate = config.getString("encode-samplerate");
}
if (locale != null) {
Locale.setDefault(new Locale(locale));
}
}
@Override @Override
public void start(Stage stage) throws Exception { public void start(Stage stage) throws Exception {
setupVars(); final Path configPath = Paths.get(System.getProperty("user.home"), ".config", "voicyanski.conf");
Main.config = new ConfigLoader("app", configPath).load();
if (config.getLocale() != null) {
Locale.setDefault(new Locale(config.getLocale()));
}
Main.resources = ResourceBundle.getBundle("locales.Language", Locale.getDefault()); Main.resources = ResourceBundle.getBundle("locales.Language", Locale.getDefault());
final FXMLLoader loader = new FXMLLoader( final FXMLLoader loader = new FXMLLoader(
getClass().getResource("/fxml/Main.fxml"), Main.resources); getClass().getResource("/fxml/Main.fxml"), Main.resources);

View File

@ -22,12 +22,12 @@ public final class OpusConvertTask implements UnaryOperator<ClipPartData> {
"-ss", Double.toString(data.startTime), "-ss", Double.toString(data.startTime),
"-i", data.metadata.file.getAbsolutePath(), "-i", data.metadata.file.getAbsolutePath(),
"-t", Double.toString(data.endTime - data.startTime), "-t", Double.toString(data.endTime - data.startTime),
"-ac", Main.stereo.equalsIgnoreCase("true") ? "2" : "1", "-ac", Main.getConfig().isEncodeStereo() ? "2" : "1",
"-map", "0:a", "-map", "0:a",
"-codec:a", "libopus", "-codec:a", "libopus",
"-b:a", Main.bitrate, "-b:a", Main.getConfig().getEncodeBitrate(),
"-vbr", "off", "-vbr", "off",
"-ar", Main.samplerate, "-ar", Main.getConfig().getEncodeSampleRate(),
data.outputAudioFile.getAbsolutePath() data.outputAudioFile.getAbsolutePath()
); );
final Process ffmpeg = pb.start(); final Process ffmpeg = pb.start();

View File

@ -25,13 +25,13 @@ public final class SendTelegramVoiceTask implements Function<ClipPartData, Boole
if (data.metadata.hasTrackInfo()) { if (data.metadata.hasTrackInfo()) {
builder.addFormDataPart("caption", data.metadata.toString()); builder.addFormDataPart("caption", data.metadata.toString());
} }
builder.addFormDataPart("chat_id", Main.chatId); builder.addFormDataPart("chat_id", Main.getConfig().getTelegramChatId());
builder.addFormDataPart("voice", data.metadata.file.getName(), builder.addFormDataPart("voice", data.metadata.file.getName(),
RequestBody.create(MEDIA_TYPE_OGG, data.outputAudioFile)); RequestBody.create(MEDIA_TYPE_OGG, data.outputAudioFile));
final RequestBody requestBody = builder.build(); final RequestBody requestBody = builder.build();
final Request request = new Request.Builder() final Request request = new Request.Builder()
.url(String.format(URL_FORMAT, Main.botToken, "sendVoice")) .url(String.format(URL_FORMAT, Main.getConfig().getTelegramBotToken(), "sendVoice"))
.post(requestBody) .post(requestBody)
.build(); .build();