Skip to content
Snippets Groups Projects
Unverified Commit fe9869d2 authored by Yarick Yermak's avatar Yarick Yermak Committed by GitHub
Browse files

Merge pull request #223 from yermak/development

Bug fixes and minor improvements
parents 466d89b0 cdb60c61
No related branches found
Tags version_5.5.13
No related merge requests found
......@@ -2,9 +2,8 @@ package uk.yermak.audiobookconverter;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import org.apache.commons.lang3.StringUtils;
import uk.yermak.audiobookconverter.fx.ConverterApplication;
import java.time.Duration;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
......@@ -21,9 +20,9 @@ public class Chapter implements Organisable, Convertable {
this.media.addListener(part.getBook());
media.forEach(mediaInfo -> mediaInfo.setChapter(this));
this.media.addAll(media);
renderMap.put("CHAPTER_NUMBER", Chapter::getNumberString);
renderMap.put("CHAPTER_NUMBER", Chapter::getNumber);
renderMap.put("CHAPTER_TEXT", c -> "Chapter");
renderMap.put("DURATION", Chapter::getDurationString);
renderMap.put("DURATION", c->Duration.ofMillis(c.getDuration()));
}
public void replaceMediaWithTracks(MediaInfo mediaInfo, List<Track> tracks) {
......@@ -33,10 +32,6 @@ public class Chapter implements Organisable, Convertable {
this.getMedia().addAll(position, adaptors);
}
public String getNumberString() {
return StringUtils.leftPad(String.valueOf(getNumber()), 3, "0");
}
public Chapter(MediaInfo mediaInfo) {
this(null, Collections.singletonList(mediaInfo));
}
......@@ -65,12 +60,14 @@ public class Chapter implements Organisable, Convertable {
@Override
public long getDuration() {
return (long) (media.stream().mapToLong(MediaInfo::getDuration).sum() / ConverterApplication.getContext().getSpeed());
return media.stream().mapToLong(MediaInfo::getDuration).sum();
}
/*
public String getDurationString() {
return Utils.formatTime(getDuration());
}
*/
@Override
public boolean split() {
......
......@@ -271,7 +271,7 @@ public class FFMediaLoader {
//adding artificial limit of image count to address issue #153.
if (!pictures.isEmpty()) {
for (int i = 0; i < 10 || i < pictures.size(); i++) {
for (int i = 0; i < 10 && i < pictures.size(); i++) {
context.addPosterIfMissingWithDelay(new ArtWorkBean(Utils.tempCopy(pictures.get(i).getPath())));
}
}
......
package uk.yermak.audiobookconverter;
import uk.yermak.audiobookconverter.fx.ConverterApplication;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Future;
......@@ -40,7 +42,7 @@ public class MediaInfoProxy implements MediaInfo {
}
public long getDuration() {
return this.getMediaInfo().getDuration();
return (long) (this.getMediaInfo().getDuration() / ConverterApplication.getContext().getSpeed());
}
@Override
......
package uk.yermak.audiobookconverter;
import uk.yermak.audiobookconverter.fx.ConverterApplication;
import java.util.List;
import java.util.Objects;
......@@ -48,7 +50,7 @@ public class MediaTrackAdaptor extends MediaInfoOrganiser implements MediaInfo {
@Override
public long getDuration() {
return duration;
return (long) (duration / ConverterApplication.getContext().getSpeed());
}
@Override
......
......@@ -2,8 +2,8 @@ package uk.yermak.audiobookconverter;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import org.apache.commons.lang3.StringUtils;
import java.time.Duration;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
......@@ -27,8 +27,8 @@ public class Part implements Organisable, Convertable {
renderMap.put("WRITER", part -> part.getBook().getBookInfo().writer().trimToNull());
renderMap.put("NARRATOR", part -> part.getBook().getBookInfo().narrator().trimToNull());
renderMap.put("YEAR", part -> part.getBook().getBookInfo().year().trimToNull());
renderMap.put("PART", Part::getNumberString);
renderMap.put("DURATION", Part::getDurationString);
renderMap.put("PART", Part::getNumber);
renderMap.put("DURATION", p -> Duration.ofMillis(p.getDuration()));
}
......@@ -40,7 +40,7 @@ public class Part implements Organisable, Convertable {
this.getChapters().addAll(position, chapters);
}
public void construct(ObservableList<Chapter> chapters){
public void construct(ObservableList<Chapter> chapters) {
chapters.forEach(c -> c.setPart(this));
this.chapters.addAll(chapters);
}
......@@ -50,6 +50,7 @@ public class Part implements Organisable, Convertable {
return String.valueOf(getBook().getBookInfo().bookNumber());
}
/*
private String getNumberString() {
if (getBook().getParts().size() > 1) {
return StringUtils.leftPad(String.valueOf(getNumber()), 2, '0');
......@@ -57,10 +58,13 @@ public class Part implements Organisable, Convertable {
return null;
}
}
*/
/*
private String getDurationString() {
return Utils.formatTimeForFilename(getDuration());
}
*/
public String getTitle() {
return "Part " + getNumber();
......
......@@ -6,12 +6,14 @@ import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.*;
import java.io.File;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.text.DecimalFormat;
import java.time.Duration;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
......@@ -64,13 +66,17 @@ public class Utils {
chapterFormat = "<if(BOOK_NUMBER)><BOOK_NUMBER>. <endif>" +
"<if(BOOK_TITLE)><BOOK_TITLE>. <endif>" +
"<if(CHAPTER_TEXT)><CHAPTER_TEXT> <endif>" +
"<if(CHAPTER_NUMBER)><CHAPTER_NUMBER> <endif>" +
"<if(CHAPTER_NUMBER)><CHAPTER_NUMBER; format=\"%,03d\"> <endif>" +
"<if(TAG)><TAG> <endif>" +
"<if(CUSTOM_TITLE)><CUSTOM_TITLE> <endif>" +
"<if(DURATION)> - <DURATION><endif>";
"<if(DURATION)> - <DURATION; format=\"%02d:%02d:%02d\"><endif>";
AppProperties.setProperty("chapter_format", chapterFormat);
}
ST chapterTemplate = new ST(chapterFormat);
STGroup g = new STGroupString("");
g.registerRenderer(Number.class, new NumberRenderer());
g.registerRenderer(Duration.class, new DurationRender());
ST chapterTemplate = new ST(g, chapterFormat);
context.forEach((key, value) -> {
if (key.contains("TAG")) {
chapterTemplate.add("TAG", value.apply(chapter));
......@@ -173,11 +179,15 @@ public class Utils {
"<if(TITLE)><TITLE><endif>" +
"<if(NARRATOR)> (<NARRATOR>)<endif>" +
"<if(YEAR)>-<YEAR><endif>" +
"<if(PART)>, Part <PART><endif>";
"<if(PART)>, Part <PART; format=\"%,03d\"><endif>";
AppProperties.setProperty("part_format", partFormat);
}
ST partTemplate = new ST(partFormat);
STGroup g = new STGroupString("");
g.registerRenderer(Number.class, new NumberRenderer());
ST partTemplate = new ST(g, partFormat);
context.forEach((key, value) -> {
partTemplate.add(key, value.apply(part));
});
......@@ -228,4 +238,16 @@ public class Utils {
public static final String FFPROBE = isSupported() ? new File(getFFMpegPath() + "/ffprobe" + (isWindows() ? ".exe" : "")).getAbsolutePath() : "ffprobe";
private static class DurationRender implements AttributeRenderer<Duration> {
@Override
public String toString(Duration duration, String format, Locale locale) {
if (format == null) {
format = "%02d:%02d:%02d";
}
return String.format(format, duration.toHoursPart(),
duration.toMinutesPart(),
duration.toSecondsPart());
}
}
}
......@@ -176,7 +176,14 @@ public class BookStructureComponent extends TreeTableView<Organisable> {
}
private void extractSubtracks(MediaInfo mediaInfo, Boolean wrapWithChapters, long interval) {
double speed = ConverterApplication.getContext().getSpeed();
long duration = mediaInfo.getDuration();
if (speed != 1.0) {
interval = (long) (interval * speed);
duration = (long) (duration * speed);
}
long fullTracks = duration / interval;
List<Track> tracks = new ArrayList<>();
for (int i = 1; i <= fullTracks + (duration % interval > 0 ? 1 : 0); i++) {
......
......@@ -88,7 +88,7 @@ class ChapterEditor {
chapterNo.setSelected(context.containsKey("CHAPTER_NUMBER"));
chapterNo.setOnAction(event -> {
if (chapterNo.isSelected()) {
context.put("CHAPTER_NUMBER", Chapter::getNumberString);
context.put("CHAPTER_NUMBER", Chapter::getNumber);
} else {
context.remove("CHAPTER_NUMBER");
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment