84 lines
2.8 KiB
Java
84 lines
2.8 KiB
Java
package org.schabi.newpipe.util.text;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
/**
|
|
* Extracts timestamps.
|
|
*/
|
|
public final class TimestampExtractor {
|
|
public static final Pattern TIMESTAMPS_PATTERN = Pattern.compile(
|
|
"(?:^|(?!:)\\W)(?:([0-5]?[0-9]):)?([0-5]?[0-9]):([0-5][0-9])(?=$|(?!:)\\W)");
|
|
|
|
private TimestampExtractor() {
|
|
// No impl pls
|
|
}
|
|
|
|
/**
|
|
* Gets a single timestamp from a matcher.
|
|
*
|
|
* @param timestampMatches the matcher which was created using {@link #TIMESTAMPS_PATTERN}
|
|
* @param baseText the text where the pattern was applied to / where the matcher is
|
|
* based upon
|
|
* @return if a match occurred, a {@link TimestampMatchDTO} filled with information, otherwise
|
|
* {@code null}.
|
|
*/
|
|
@Nullable
|
|
public static TimestampMatchDTO getTimestampFromMatcher(
|
|
@NonNull final Matcher timestampMatches,
|
|
@NonNull final String baseText) {
|
|
int timestampStart = timestampMatches.start(1);
|
|
if (timestampStart == -1) {
|
|
timestampStart = timestampMatches.start(2);
|
|
}
|
|
final int timestampEnd = timestampMatches.end(3);
|
|
|
|
final String parsedTimestamp = baseText.substring(timestampStart, timestampEnd);
|
|
final String[] timestampParts = parsedTimestamp.split(":");
|
|
|
|
final int seconds;
|
|
if (timestampParts.length == 3) { // timestamp format: XX:XX:XX
|
|
seconds = Integer.parseInt(timestampParts[0]) * 3600 // hours
|
|
+ Integer.parseInt(timestampParts[1]) * 60 // minutes
|
|
+ Integer.parseInt(timestampParts[2]); // seconds
|
|
} else if (timestampParts.length == 2) { // timestamp format: XX:XX
|
|
seconds = Integer.parseInt(timestampParts[0]) * 60 // minutes
|
|
+ Integer.parseInt(timestampParts[1]); // seconds
|
|
} else {
|
|
return null;
|
|
}
|
|
|
|
return new TimestampMatchDTO(timestampStart, timestampEnd, seconds);
|
|
}
|
|
|
|
public static class TimestampMatchDTO {
|
|
private final int timestampStart;
|
|
private final int timestampEnd;
|
|
private final int seconds;
|
|
|
|
public TimestampMatchDTO(
|
|
final int timestampStart,
|
|
final int timestampEnd,
|
|
final int seconds) {
|
|
this.timestampStart = timestampStart;
|
|
this.timestampEnd = timestampEnd;
|
|
this.seconds = seconds;
|
|
}
|
|
|
|
public int timestampStart() {
|
|
return timestampStart;
|
|
}
|
|
|
|
public int timestampEnd() {
|
|
return timestampEnd;
|
|
}
|
|
|
|
public int seconds() {
|
|
return seconds;
|
|
}
|
|
}
|
|
}
|