Skip to content

Commit

Permalink
Feat/add support for all tags from 1.1.0 format (#51)
Browse files Browse the repository at this point in the history
* Add keys for all tags present in version 1.1.0

* Update track name on P1, P2 tag value change

* Refactor TagKey using java 17 switch

* Add validator for VERSION tag

* Auto-load audio files defined by AUDIO, VOCALS and INSTRUMENTAL tags

* Add CALCMEDLEY tag with validator

* Suppress LineLength checkstyle warning for regex
  • Loading branch information
Nianna authored Oct 2, 2024
1 parent b4adf9d commit 0135fe1
Show file tree
Hide file tree
Showing 13 changed files with 128 additions and 79 deletions.
5 changes: 5 additions & 0 deletions config/checkstyle/checkstyle.xml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@
<!-- <property name="fileExtensions" value="java"/> -->
<!-- </module> -->


<module name="SuppressWarningsFilter" />

<module name="TreeWalker">

<!-- Checks for Javadoc comments. -->
Expand Down Expand Up @@ -158,6 +161,8 @@
<property name="optional" value="true"/>
</module>

<module name="SuppressWarningsHolder" />

</module>

</module>
Original file line number Diff line number Diff line change
Expand Up @@ -104,11 +104,13 @@ public void removeAudioFile(PreloadedAudioFile file) {
file.releaseResources();
}

public void loadAudioFile(File file) {
public void loadAudioFile(File file, boolean setAsDefault) {
AudioFileLoader.loadAudioFile(file, (newAudio -> {
if (newAudio.isPresent()) {
player.addAudioFile(newAudio.get());
setActiveAudioFile(newAudio.get());
if (setAsDefault) {
setActiveAudioFile(newAudio.get());
}
LOGGER.info(I18N.get("import.audio.success"));
} else {
LOGGER.severe(I18N.get("import.audio.fail"));
Expand Down
12 changes: 10 additions & 2 deletions src/main/java/com/github/nianna/karedi/context/TxtContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@

import java.io.File;
import java.util.List;
import java.util.Optional;
import java.util.logging.Logger;
import java.util.stream.Stream;

public class TxtContext {

Expand Down Expand Up @@ -60,15 +62,21 @@ public void loadSongFile(File file, boolean resetPlayer) {
reset(resetPlayer);
setActiveFile(file);
Song song = txtFacade.loadFromTxtFile(file);
song.getTagValue(TagKey.MP3)
.ifPresent(audioFileName -> audioContext.loadAudioFile(new File(file.getParent(), audioFileName)));
song.getMainAudioTagValue().ifPresent(filename -> loadAudioFileWithName(file, filename, true));
Stream.of(song.getTagValue(TagKey.INSTRUMENTAL), song.getTagValue(TagKey.VOCALS))
.flatMap(Optional::stream)
.forEach(filename -> loadAudioFileWithName(file, filename, false));
activeSongContext.setSong(song);
LOGGER.info(I18N.get("load.success"));
} else {
LOGGER.severe(I18N.get("load.fail"));
}
}

private void loadAudioFileWithName(File txtFile, String filename, boolean setAsDefault) {
audioContext.loadAudioFile(new File(txtFile.getParent(), filename), setAsDefault);
}

public boolean saveSongToFile(File file) {
if (file != null) {
if (txtFacade.saveSongToFile(file, activeSongContext.getSong())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class ImportAudioAction extends ContextfulKarediAction {
protected void onAction(ActionEvent event) {
File file = KarediApp.getInstance().getAudioFileToOpen();
if (file != null) {
audioContext.loadAudioFile(file);
audioContext.loadAudioFile(file, true);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ protected void onAction(ActionEvent event) {
private boolean finish() {
txtContext.reset(true);
if (outputDir == null && audioFile != null) {
audioContext.loadAudioFile(audioFile);
audioContext.loadAudioFile(audioFile, true);
}
activeSongContext.setSong(song);
audioContext.setMarkerBeat(0);
Expand Down Expand Up @@ -78,7 +78,7 @@ private void createTxtFile(File songFolder) {

private void copyAudioFile(File songFolder) {
if (audioFile != null) {
song.getTagValue(TagKey.MP3).ifPresent(audioFilename -> {
song.getMainAudioTagValue().ifPresent(audioFilename -> {
File newAudioFile = new File(songFolder, audioFilename);
if (canProceedToWriteFile(newAudioFile)) {
try {
Expand All @@ -88,7 +88,7 @@ private void copyAudioFile(File songFolder) {
LOGGER.warning(I18N.get("creator.copy_audio.fail"));
e.printStackTrace();
}
audioContext.loadAudioFile(newAudioFile);
audioContext.loadAudioFile(newAudioFile, true);
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ protected void onAction(ActionEvent event) {

activeSongContext.getSong().getTagValue(TagKey.ARTIST).ifPresent(dialog::setSongArtist);
activeSongContext.getSong().getTagValue(TagKey.TITLE).ifPresent(dialog::setSongTitle);
activeSongContext.getSong().getTagValue(TagKey.MP3).ifPresent(dialog::setAudioFilename);
activeSongContext.getSong().getMainAudioTagValue().ifPresent(dialog::setAudioFilename);
activeSongContext.getSong().getTagValue(TagKey.COVER).ifPresent(dialog::setCoverFilename);

Optional<String> optVideoFilename = activeSongContext.getSong().getTagValue(TagKey.VIDEO);
Expand Down
46 changes: 25 additions & 21 deletions src/main/java/com/github/nianna/karedi/song/Song.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,10 @@ public Optional<String> getTagValue(TagKey key) {
return getTagValue(key.toString());
}

public Optional<String> getMainAudioTagValue() {
return getTagValue(TagKey.AUDIO).or(() -> getTagValue(TagKey.MP3));
}

public Optional<String> getTagValue(String key) {
return getTag(key).map(Tag::getValue);
}
Expand Down Expand Up @@ -128,27 +132,27 @@ private void onTagValueChanged(Tag tag) {
Optional<TagKey> tagKey = TagKey.optionalValueOf(tag.getKey());
tagKey.ifPresent(key -> {
switch (key) {
case MEDLEYSTARTBEAT:
medley.setStartBeat(
Converter.toInteger(tag.getValue()).orElse(medley.getEndBeat()));
break;
case MEDLEYENDBEAT:
medley.setEndBeat(
Converter.toInteger(tag.getValue()).orElse(medley.getStartBeat()));
break;
case BPM:
Converter.toDouble(tag.getValue()).ifPresent(value -> converter.setBpm(value));
break;
case GAP:
Converter.toInteger(tag.getValue()).ifPresent(value -> converter.setGap(value));
break;
case DUETSINGERP1:
renameTrack(0, tag.getValue());
break;
case DUETSINGERP2:
renameTrack(1, tag.getValue());
break;
default:
case MEDLEYSTARTBEAT:
medley.setStartBeat(
Converter.toInteger(tag.getValue()).orElse(medley.getEndBeat()));
break;
case MEDLEYENDBEAT:
medley.setEndBeat(
Converter.toInteger(tag.getValue()).orElse(medley.getStartBeat()));
break;
case BPM:
Converter.toDouble(tag.getValue()).ifPresent(value -> converter.setBpm(value));
break;
case GAP:
Converter.toInteger(tag.getValue()).ifPresent(value -> converter.setGap(value));
break;
case DUETSINGERP1, P1:
renameTrack(0, tag.getValue());
break;
case DUETSINGERP2, P2:
renameTrack(1, tag.getValue());
break;
default:
}
});
}
Expand Down
60 changes: 31 additions & 29 deletions src/main/java/com/github/nianna/karedi/song/tag/TagKey.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ public enum TagKey {
LANGUAGE,
COVER,
MP3,
AUDIO,
VOCALS,
INSTRUMENTAL,
VIDEO,
BACKGROUND,
BPM,
Expand All @@ -24,8 +26,15 @@ public enum TagKey {
PREVIEWSTART,
DUETSINGERP1,
DUETSINGERP2,
P1,
P2,
MEDLEYSTARTBEAT,
MEDLEYENDBEAT;
MEDLEYENDBEAT,
VERSION,
TAGS,
COMMENT,
PROVIDEDBY,
CALCMEDLEY;

public static Optional<TagKey> optionalValueOf(String str) {
str = str.trim().toUpperCase(Locale.ROOT);
Expand All @@ -37,39 +46,32 @@ public static Optional<TagKey> optionalValueOf(String str) {
}

public static boolean expectsAnInteger(TagKey key) {
switch (key) {
case YEAR:
case GAP:
case MEDLEYSTARTBEAT:
case MEDLEYENDBEAT:
case END:
return true;
default:
return false;
}
return switch (key) {
case YEAR, GAP, MEDLEYSTARTBEAT, MEDLEYENDBEAT, END -> true;
default -> false;
};
}

public static boolean expectsADouble(TagKey key) {
switch (key) {
case START:
case VIDEOGAP:
case BPM:
return true;
default:
return false;
}
return switch (key) {
case START, VIDEOGAP, BPM -> true;
default -> false;
};
}

public static boolean expectsAFileName(TagKey key) {
switch (key) {
case MP3:
case COVER:
case VIDEO:
case BACKGROUND:
case VOCALS:
return true;
default:
return false;
}
return switch (key) {
case MP3, COVER, AUDIO, VIDEO, BACKGROUND, VOCALS, INSTRUMENTAL -> true;
default -> false;
};
}

public static boolean expectsASemVer(TagKey key) {
return key == VERSION;
}

public static boolean expectsOnOff(TagKey key) {
return key == CALCMEDLEY;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,12 @@ private static Validator<String> legalInputValidator(TagKey key) {
return StringValidators.forNonNegativeDouble();
}
}
if (TagKey.expectsASemVer(key)) {
return StringValidators.forSemVer();
}
if (TagKey.expectsOnOff(key)) {
return StringValidators.forOnOff();
}
return StringValidators.noForbiddenCharacters(forbiddenCharacterRegex(key).orElse(null));
}

Expand Down
56 changes: 36 additions & 20 deletions src/main/java/com/github/nianna/karedi/util/StringValidators.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
import com.github.nianna.karedi.I18N;

public class StringValidators {

@SuppressWarnings("checkstyle:linelength")
private static final String SEM_VER_REGEX = "^(0|[1-9][0-9]*).(0|[1-9][0-9]*).(0|[1-9][0-9]*)(-(0|[1-9A-Za-z-][0-9A-Za-z-]*)(.[0-9A-Za-z-]+)*)?(\\+[0-9A-Za-z-]+(.[0-9A-Za-z-]+)*)?$";

private StringValidators() {
}

Expand All @@ -24,6 +28,14 @@ public static Validator<String> forNonNegativeDouble() {
return StringValidators::nonNegativeDoubleValidator;
}

public static Validator<String> forSemVer() {
return StringValidators::semVerValidator;
}

public static Validator<String> forOnOff() {
return StringValidators::onOffValidator;
}

public static Validator<String> forDouble() {
return StringValidators::doubleValidator;
}
Expand All @@ -39,35 +51,39 @@ public static Validator<String> noForbiddenCharacters(String forbiddenCharRegex)
}

private static ValidationResult nonNegativeIntegerValidator(Control c, String newValue) {
ValidationResult result = ValidationResult.fromErrorIf(c,
I18N.get("validator.nonnegative_number_required"),
Converter.toInteger(newValue).map(value -> {
return value < 0;
}).orElse(true));
return result;
return ValidationResult.fromErrorIf(c,
I18N.get("validator.nonnegative_number_required"),
Converter.toInteger(newValue).map(value -> value < 0).orElse(true));
}

private static ValidationResult integerValidator(Control c, String newValue) {
ValidationResult result = ValidationResult.fromErrorIf(c,
I18N.get("validator.number_required"),
!Converter.toInteger(newValue).isPresent());
return result;
return ValidationResult.fromErrorIf(c,
I18N.get("validator.number_required"),
Converter.toInteger(newValue).isEmpty());
}

private static ValidationResult nonNegativeDoubleValidator(Control c, String newValue) {
ValidationResult result = ValidationResult.fromErrorIf(c,
I18N.get("validator.nonnegative_number_required"),
Converter.toDouble(newValue).map(value -> {
return value < 0;
}).orElse(true));
return result;
return ValidationResult.fromErrorIf(c,
I18N.get("validator.nonnegative_number_required"),
Converter.toDouble(newValue).map(value -> value < 0).orElse(true));
}

private static ValidationResult doubleValidator(Control c, String newValue) {
ValidationResult result = ValidationResult.fromErrorIf(c,
I18N.get("validator.number_required"),
!Converter.toDouble(newValue).isPresent());
return result;
return ValidationResult.fromErrorIf(c,
I18N.get("validator.number_required"),
Converter.toDouble(newValue).isEmpty());
}

private static ValidationResult semVerValidator(Control c, String newValue) {
return ValidationResult.fromErrorIf(c,
I18N.get("validator.sem_ver_required"),
newValue != null && !newValue.matches(SEM_VER_REGEX));
}

private static ValidationResult onOffValidator(Control c, String newValue) {
return ValidationResult.fromErrorIf(c,
I18N.get("validator.on_off_required"),
newValue != null && !newValue.matches("on|off"));
}

}
2 changes: 2 additions & 0 deletions src/main/resources/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,8 @@ validator.tag.year.too_big=The year should be lower than or equal to the current
validator.number_required=Must be a valid number
validator.nonnegative_number_required=Must be a valid non-negative number
validator.contains_illegal_characters=Contains illegal characters
validator.sem_ver_required=Must be a valid SemVer version e.g. 1.1.0
validator.on_off_required=Must be either `on` or `off`
common.paste=Paste
common.cut=Cut
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/messages_en_GB.properties
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,8 @@ validator.tag.year.too_big=The year should be lower than or equal to the current
validator.number_required=Must be a valid number
validator.nonnegative_number_required=Must be a valid non-negative number
validator.contains_illegal_characters=Contains illegal characters
validator.sem_ver_required=Must be a valid SemVer version e.g. 1.1.0
validator.on_off_required=Must be either `on` or `off`
common.paste=Paste
common.cut=Cut
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/messages_pl_PL.properties
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,8 @@ validator.tag.year.too_big=Rok powinien by\u0107 mniejszy od obecnego albo mu r
validator.number_required=Oczekiwano liczby
validator.nonnegative_number_required=Oczekiwano nieujemnej liczby
validator.contains_illegal_characters=Zawiera niedozwolone znaki
validator.sem_ver_required=Musi by\u0107 zgodna z regu\u0142ami SemVer np. 1.1.0
validator.on_off_required=Musi mie\u0107 warto\u015B\u0107 `on` lub `off`

common.paste=Wklej
common.cut=Wytnij
Expand Down

0 comments on commit 0135fe1

Please sign in to comment.