mirror of
https://github.com/aNNiMON/ffmpegbot
synced 2024-09-19 22:54:20 +03:00
Switch prev/next buttons with selectable parameters
This commit is contained in:
parent
92c036267a
commit
dec332cab5
@ -1,9 +1,7 @@
|
|||||||
package com.annimon.ffmpegbot.commands.ffmpeg;
|
package com.annimon.ffmpegbot.commands.ffmpeg;
|
||||||
|
|
||||||
public final class CallbackQueryCommands {
|
public final class CallbackQueryCommands {
|
||||||
public static final String PREV = "prev";
|
public static final String PARAMETER = "p";
|
||||||
public static final String NEXT = "next";
|
|
||||||
public static final String DETAIL = "detail";
|
|
||||||
public static final String PROCESS = "process";
|
public static final String PROCESS = "process";
|
||||||
public static final String YTDLP_START = "ytdlp_start";
|
public static final String YTDLP_START = "ytdlp_start";
|
||||||
public static final String YTDLP_INFO = "ytdlp_info";
|
public static final String YTDLP_INFO = "ytdlp_info";
|
||||||
|
@ -23,7 +23,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.function.BiConsumer;
|
import java.util.function.BiConsumer;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static com.annimon.ffmpegbot.Permissions.ALLOWED_USERS;
|
import static com.annimon.ffmpegbot.Permissions.ALLOWED_USERS;
|
||||||
import static com.annimon.ffmpegbot.commands.ffmpeg.CallbackQueryCommands.*;
|
import static com.annimon.ffmpegbot.commands.ffmpeg.CallbackQueryCommands.*;
|
||||||
@ -43,9 +42,7 @@ public class MediaProcessingBundle implements CommandBundle<For> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void register(@NotNull CommandRegistry commands) {
|
public void register(@NotNull CommandRegistry commands) {
|
||||||
commands.register(new SimpleCallbackQueryCommand(PREV, ALLOWED_USERS, ctx -> toggleParameter(ctx, true)));
|
commands.register(new SimpleCallbackQueryCommand(PARAMETER, ALLOWED_USERS, sessionCommand(this::parameter)));
|
||||||
commands.register(new SimpleCallbackQueryCommand(NEXT, ALLOWED_USERS, ctx -> toggleParameter(ctx, false)));
|
|
||||||
commands.register(new SimpleCallbackQueryCommand(DETAIL, ALLOWED_USERS, sessionCommand(this::details)));
|
|
||||||
commands.register(new SimpleCallbackQueryCommand(PROCESS, ALLOWED_USERS, sessionCommand(this::process)));
|
commands.register(new SimpleCallbackQueryCommand(PROCESS, ALLOWED_USERS, sessionCommand(this::process)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,38 +73,26 @@ public class MediaProcessingBundle implements CommandBundle<For> {
|
|||||||
.call(sender);
|
.call(sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toggleParameter(final CallbackQueryContext ctx, final boolean toLeft) {
|
private void parameter(final CallbackQueryContext ctx, final MediaSession session) {
|
||||||
final var msg = ctx.message();
|
if (ctx.argumentsLength() == 0) {
|
||||||
if (msg == null) return;
|
session.setSelectedParam(null);
|
||||||
|
|
||||||
final var session = sessions.getMediaSession(msg.getChatId(), msg.getMessageId());
|
|
||||||
if (session == null) return;
|
|
||||||
|
|
||||||
final String id = ctx.argument(0);
|
|
||||||
final var parameters = session.getParams().stream()
|
|
||||||
.filter(p -> p.getId().equals(id))
|
|
||||||
.collect(Collectors.toSet());
|
|
||||||
if (parameters.isEmpty()) return;
|
|
||||||
|
|
||||||
for (Parameter<?> param : parameters) {
|
|
||||||
if (toLeft) {
|
|
||||||
param.toggleLeft();
|
|
||||||
} else {
|
} else {
|
||||||
param.toggleRight();
|
final String id = ctx.argument(0);
|
||||||
|
final var param = session.getParams().stream()
|
||||||
|
.filter(p -> p.getId().equals(id))
|
||||||
|
.findFirst().orElse(null);
|
||||||
|
|
||||||
|
session.setSelectedParam(param);
|
||||||
|
|
||||||
|
if (param != null && ctx.argumentsLength() == 2) {
|
||||||
|
final int index = Integer.parseInt(ctx.argument(1));
|
||||||
|
param.select(index);
|
||||||
|
session.setSelectedParam(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
editMessage(ctx, session);
|
editMessage(ctx, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void details(final CallbackQueryContext ctx, final MediaSession session) {
|
|
||||||
final String id = ctx.argument(0);
|
|
||||||
session.getParams().stream()
|
|
||||||
.filter(p -> p.getId().equals(id))
|
|
||||||
.findFirst()
|
|
||||||
.ifPresent(p ->
|
|
||||||
ctx.answerAsAlert(p.describe()).callAsync(ctx.sender));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void process(final CallbackQueryContext ctx, final MediaSession session) {
|
private void process(final CallbackQueryContext ctx, final MediaSession session) {
|
||||||
if (!session.isDownloaded()) {
|
if (!session.isDownloaded()) {
|
||||||
sendAction(ctx, session);
|
sendAction(ctx, session);
|
||||||
|
@ -7,25 +7,63 @@ import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMa
|
|||||||
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton;
|
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static com.annimon.ffmpegbot.commands.ffmpeg.CallbackQueryCommands.*;
|
import static com.annimon.ffmpegbot.commands.ffmpeg.CallbackQueryCommands.*;
|
||||||
|
|
||||||
public class MediaProcessingKeyboard {
|
public class MediaProcessingKeyboard {
|
||||||
|
private static final int BUTTON_COLUMNS = 2;
|
||||||
|
|
||||||
public static InlineKeyboardMarkup createKeyboard(MediaSession session) {
|
public static InlineKeyboardMarkup createKeyboard(MediaSession session) {
|
||||||
|
final var selectedParam = session.getSelectedParam();
|
||||||
|
if (selectedParam != null) {
|
||||||
|
return createParamKeyboard(selectedParam);
|
||||||
|
} else {
|
||||||
|
return createParamsListKeyboard(session.getParams());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static InlineKeyboardMarkup createParamsListKeyboard(List<Parameter<?>> params) {
|
||||||
final var keyboard = new ArrayList<List<InlineKeyboardButton>>();
|
final var keyboard = new ArrayList<List<InlineKeyboardButton>>();
|
||||||
for (Parameter<?> param : session.getParams()) {
|
final var it = params.iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
final var row = new ArrayList<InlineKeyboardButton>();
|
||||||
|
for (int i = 0; i < BUTTON_COLUMNS; i++) {
|
||||||
|
if (it.hasNext()) {
|
||||||
|
final var param = it.next();
|
||||||
final String paramId = param.getId();
|
final String paramId = param.getId();
|
||||||
keyboard.add(List.of(
|
row.add(inlineKeyboardButton(param.describe(), callbackData(PARAMETER, paramId)));
|
||||||
inlineKeyboardButton("<", callbackData(PREV, paramId)),
|
}
|
||||||
inlineKeyboardButton(param.describe(), callbackData(DETAIL, paramId)),
|
}
|
||||||
inlineKeyboardButton(">", callbackData(NEXT, paramId))
|
keyboard.add(row);
|
||||||
));
|
|
||||||
}
|
}
|
||||||
keyboard.add(List.of(inlineKeyboardButton("Process", callbackData(PROCESS))));
|
keyboard.add(List.of(inlineKeyboardButton("Process", callbackData(PROCESS))));
|
||||||
return new InlineKeyboardMarkup(keyboard);
|
return new InlineKeyboardMarkup(keyboard);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static InlineKeyboardMarkup createParamKeyboard(Parameter<?> param) {
|
||||||
|
final var keyboard = new ArrayList<List<InlineKeyboardButton>>();
|
||||||
|
final String paramId = param.getId();
|
||||||
|
final int maxSize = param.getPossibleValuesSize();
|
||||||
|
int index = 0;
|
||||||
|
while (index < maxSize) {
|
||||||
|
final var row = new ArrayList<InlineKeyboardButton>();
|
||||||
|
for (int i = 0; i < BUTTON_COLUMNS; i++) {
|
||||||
|
if (index < maxSize) {
|
||||||
|
String value = param.describeValueByIndex(index);
|
||||||
|
row.add(inlineKeyboardButton(value, callbackData(PARAMETER, callbackParams(paramId, index))));
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
keyboard.add(row);
|
||||||
|
}
|
||||||
|
keyboard.add(List.of(inlineKeyboardButton("Back", callbackData(PARAMETER))));
|
||||||
|
return new InlineKeyboardMarkup(keyboard);
|
||||||
|
}
|
||||||
|
|
||||||
public static InlineKeyboardMarkup createKeyboard(YtDlpSession session) {
|
public static InlineKeyboardMarkup createKeyboard(YtDlpSession session) {
|
||||||
final var keyboard = new ArrayList<List<InlineKeyboardButton>>();
|
final var keyboard = new ArrayList<List<InlineKeyboardButton>>();
|
||||||
if (!session.hasAdditionalInfo()) {
|
if (!session.hasAdditionalInfo()) {
|
||||||
@ -42,12 +80,16 @@ public class MediaProcessingKeyboard {
|
|||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("SameParameterValue")
|
|
||||||
private static String callbackData(String command) {
|
private static String callbackData(String command) {
|
||||||
return command;
|
return command;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("SameParameterValue")
|
||||||
private static String callbackData(String command, String data) {
|
private static String callbackData(String command, String data) {
|
||||||
return command + ":" + data;
|
return command + ":" + data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String callbackParams(Object... params) {
|
||||||
|
return Arrays.stream(params).map(Objects::toString).collect(Collectors.joining(" "));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,11 +15,11 @@ public class AudioBitrate extends StringParameter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String describe() {
|
public String describeValue(String value) {
|
||||||
if (value.isEmpty()) {
|
if (value.isEmpty()) {
|
||||||
return describeValue("AUTO");
|
return "AUTO";
|
||||||
} else {
|
} else {
|
||||||
return super.describe();
|
return super.describeValue(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,11 +20,11 @@ public class AudioEffect extends StringParameter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String describe() {
|
public String describeValue(String value) {
|
||||||
if (value.isEmpty()) {
|
if (value.isEmpty()) {
|
||||||
return describeValue("NONE");
|
return "NONE";
|
||||||
} else {
|
} else {
|
||||||
return super.describe();
|
return super.describeValue(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,11 +14,11 @@ public class AudioStreamByLanguage extends StringParameter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String describe() {
|
public String describeValue(String value) {
|
||||||
if (value.isEmpty()) {
|
if (value.isEmpty()) {
|
||||||
return describeValue("AUTO");
|
return "AUTO";
|
||||||
} else {
|
} else {
|
||||||
return super.describe();
|
return super.describeValue(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,11 +14,11 @@ public class AudioVolume extends StringParameter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String describe() {
|
public String describeValue(String value) {
|
||||||
if (value.isEmpty()) {
|
if (value.isEmpty()) {
|
||||||
return describeValue("ORIGINAL");
|
return "ORIGINAL";
|
||||||
} else {
|
} else {
|
||||||
return super.describe();
|
return super.describeValue(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,16 +8,11 @@ public abstract class BooleanParameter extends Parameter<Boolean> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String describe() {
|
public String describeValue(Boolean value) {
|
||||||
if (value) {
|
if (value) {
|
||||||
return describeValue("ON");
|
return "ON";
|
||||||
} else {
|
} else {
|
||||||
return describeValue("OFF");
|
return "OFF";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void toggle(int dir) {
|
|
||||||
value = !value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -30,41 +30,38 @@ public abstract class Parameter<T> {
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<? extends T> getPossibleValues() {
|
public int getPossibleValuesSize() {
|
||||||
return possibleValues;
|
return possibleValues.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public abstract <I> void accept(Visitor<I> visitor, I input);
|
public abstract <I> void accept(Visitor<I> visitor, I input);
|
||||||
|
|
||||||
public String describe() {
|
public final String describe() {
|
||||||
return describeValue(Objects.toString(value));
|
return displayName + ": " + describeValue(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final String describeValue(String customValue) {
|
public final String describeValueByIndex(int index) {
|
||||||
return displayName + ": " + customValue;
|
return describeValue(safeGet(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void toggleLeft() {
|
protected String describeValue(T valueToDescribe) {
|
||||||
toggle(-1);
|
return Objects.toString(valueToDescribe);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void toggleRight() {
|
public void select(int index) {
|
||||||
toggle(+1);
|
value = safeGet(index);
|
||||||
}
|
|
||||||
|
|
||||||
protected void toggle(int dir) {
|
|
||||||
final int size = possibleValues.size();
|
|
||||||
if (size == 1) return;
|
|
||||||
|
|
||||||
int nextIndex = possibleValues.indexOf(value) + dir;
|
|
||||||
if (nextIndex >= size) nextIndex -= size;
|
|
||||||
else if (nextIndex < 0) nextIndex += size;
|
|
||||||
|
|
||||||
value = possibleValues.get(nextIndex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "[" + id + "] " + displayName + ": " + value;
|
return "[" + id + "] " + displayName + ": " + value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private T safeGet(int index) {
|
||||||
|
final int size = possibleValues.size();
|
||||||
|
if (index >= size) index = size - 1;
|
||||||
|
else if (index < 0) index = 0;
|
||||||
|
return possibleValues.get(index);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,11 +15,11 @@ public class VideoBitrate extends StringParameter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String describe() {
|
public String describeValue(String value) {
|
||||||
if (value.isEmpty()) {
|
if (value.isEmpty()) {
|
||||||
return describeValue("AUTO");
|
return "AUTO";
|
||||||
} else {
|
} else {
|
||||||
return super.describe();
|
return super.describeValue(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,11 +14,11 @@ public class VideoFrameRate extends StringParameter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String describe() {
|
public String describeValue(String value) {
|
||||||
if (value.isEmpty()) {
|
if (value.isEmpty()) {
|
||||||
return describeValue("ORIGINAL");
|
return "ORIGINAL";
|
||||||
} else {
|
} else {
|
||||||
return super.describe();
|
return super.describeValue(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,11 +14,11 @@ public class VideoScale extends StringParameter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String describe() {
|
public String describeValue(String value) {
|
||||||
if (value.isEmpty()) {
|
if (value.isEmpty()) {
|
||||||
return describeValue("ORIGINAL");
|
return "ORIGINAL";
|
||||||
} else {
|
} else {
|
||||||
return describeValue(value + "p");
|
return value + "p";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ public final class MediaSession extends Session {
|
|||||||
private Integer duration;
|
private Integer duration;
|
||||||
private String resolution;
|
private String resolution;
|
||||||
// Parameters
|
// Parameters
|
||||||
|
private Parameter<?> selectedParam;
|
||||||
private List<Parameter<?>> params;
|
private List<Parameter<?>> params;
|
||||||
// Files
|
// Files
|
||||||
private File inputFile;
|
private File inputFile;
|
||||||
@ -77,6 +78,14 @@ public final class MediaSession extends Session {
|
|||||||
this.params = params;
|
this.params = params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setSelectedParam(Parameter<?> selectedParam) {
|
||||||
|
this.selectedParam = selectedParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Parameter<?> getSelectedParam() {
|
||||||
|
return selectedParam;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isDownloaded() {
|
public boolean isDownloaded() {
|
||||||
return (inputFile != null) && (inputFile.canRead());
|
return (inputFile != null) && (inputFile.canRead());
|
||||||
}
|
}
|
||||||
@ -128,6 +137,9 @@ public final class MediaSession extends Session {
|
|||||||
if (status != null) {
|
if (status != null) {
|
||||||
joiner.add("<i>" + safeHtml(status) + "</i>");
|
joiner.add("<i>" + safeHtml(status) + "</i>");
|
||||||
}
|
}
|
||||||
|
if (selectedParam != null) {
|
||||||
|
joiner.add(safeHtml(selectedParam.describe()));
|
||||||
|
}
|
||||||
return joiner;
|
return joiner;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user