Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,6 @@ static Builder builder() {
return new Builder();
}

class Builder extends AlternativeRenditionBuilder {
class Builder extends AlternativeRenditionBuilder implements Buildable<AlternativeRendition> {
}
}
5 changes: 5 additions & 0 deletions src/main/java/io/lindstrom/m3u8/model/Buildable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package io.lindstrom.m3u8.model;

public interface Buildable<T> {
T build();
}
2 changes: 1 addition & 1 deletion src/main/java/io/lindstrom/m3u8/model/DateRange.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,6 @@ static Builder builder() {
return new Builder();
}

class Builder extends DateRangeBuilder {
class Builder extends DateRangeBuilder implements Buildable<DateRange> {
}
}
6 changes: 3 additions & 3 deletions src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@ public interface IFrameVariant {
Optional<String> video();

Optional<Integer> programId();

Optional<VideoRange> videoRange();

static Builder builder() {
return new Builder();
}

class Builder extends IFrameVariantBuilder {
class Builder extends IFrameVariantBuilder implements Buildable<IFrameVariant> {
public Builder videoRange(String value) {
return videoRange(VideoRange.valueOf(value));
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/io/lindstrom/m3u8/model/MasterPlaylist.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,6 @@ static Builder builder() {
return new Builder();
}

class Builder extends MasterPlaylistBuilder {
class Builder extends MasterPlaylistBuilder implements Buildable<MasterPlaylist> {
}
}
11 changes: 10 additions & 1 deletion src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,15 @@ static Builder builder() {
return new Builder();
}

class Builder extends MediaPlaylistBuilder {
class Builder extends MediaPlaylistBuilder implements Buildable<MediaPlaylist> {
private MediaSegment.Builder segmentBuilder = MediaSegment.builder();

public MediaSegment.Builder segmentBuilder() {
return segmentBuilder;
}

public void segmentBuilder(MediaSegment.Builder segmentBuilder) {
this.segmentBuilder = segmentBuilder;
}
}
}
2 changes: 1 addition & 1 deletion src/main/java/io/lindstrom/m3u8/model/MediaSegment.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,6 @@ static Builder builder() {
return new Builder();
}

class Builder extends MediaSegmentBuilder {
class Builder extends MediaSegmentBuilder implements Buildable<MediaSegment> {
}
}
3 changes: 2 additions & 1 deletion src/main/java/io/lindstrom/m3u8/model/PlaylistVariable.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ static Builder builder() {
return new Builder();
}

class Builder extends PlaylistVariableBuilder { }
class Builder extends PlaylistVariableBuilder implements Buildable<PlaylistVariable> {
}

static PlaylistVariable of(String name, String value) {
return PlaylistVariable.builder()
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/io/lindstrom/m3u8/model/SegmentKey.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,6 @@ static Builder builder() {
return new Builder();
}

class Builder extends SegmentKeyBuilder {}
class Builder extends SegmentKeyBuilder implements Buildable<SegmentKey> {
}
}
2 changes: 1 addition & 1 deletion src/main/java/io/lindstrom/m3u8/model/SegmentMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ static Builder builder() {
return new Builder();
}

class Builder extends SegmentMapBuilder {
class Builder extends SegmentMapBuilder implements Buildable<SegmentMap> {
}

static SegmentMap of(String uri) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/io/lindstrom/m3u8/model/ServerControl.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ static Builder builder() {
return new Builder();
}

class Builder extends ServerControlBuilder {
class Builder extends ServerControlBuilder implements Buildable<ServerControl> {
}
}
2 changes: 1 addition & 1 deletion src/main/java/io/lindstrom/m3u8/model/SessionData.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ static Builder builder() {
return new Builder();
}

class Builder extends SessionDataBuilder {
class Builder extends SessionDataBuilder implements Buildable<SessionData> {
}
}
2 changes: 1 addition & 1 deletion src/main/java/io/lindstrom/m3u8/model/StartTimeOffset.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ static Builder builder() {
return new Builder();
}

class Builder extends StartTimeOffsetBuilder {
class Builder extends StartTimeOffsetBuilder implements Buildable<StartTimeOffset> {
}

static StartTimeOffset of(double timeOffset) {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/io/lindstrom/m3u8/model/Variant.java
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,11 @@ static Builder builder() {
return new Builder();
}

class Builder extends VariantBuilder {
class Builder extends VariantBuilder implements Buildable<Variant> {
public Builder resolution(int width, int height) {
return resolution(Resolution.of(width, height));
}

public Builder videoRange(String value) {
return videoRange(VideoRange.valueOf(value));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.lindstrom.m3u8.parser;

import io.lindstrom.m3u8.model.Playlist;
import io.lindstrom.m3u8.model.Buildable;

import java.io.*;
import java.nio.ByteBuffer;
Expand All @@ -10,7 +11,7 @@

import static java.nio.charset.StandardCharsets.UTF_8;

public abstract class AbstractPlaylistParser<T extends Playlist, B> {
public abstract class AbstractPlaylistParser<T extends Playlist, B extends Buildable<T>> {
private static final String EXTM3U = "#EXTM3U";

public T readPlaylist(InputStream inputStream) throws IOException {
Expand Down Expand Up @@ -95,7 +96,7 @@ public T readPlaylist(Iterator<String> lineIterator) throws PlaylistParserExcept
}
}

return build(builder);
return builder.build();
}

abstract B newBuilder();
Expand All @@ -106,8 +107,6 @@ void onURI(B builder, String uri) throws PlaylistParserException {
throw new PlaylistParserException("Unexpected URI in playlist: " + uri);
}

abstract T build(B builder);

abstract void write(T playlist, TextBuilder textBuilder);

public String writePlaylistAsString(T playlist) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import io.lindstrom.m3u8.model.AlternativeRendition;
import io.lindstrom.m3u8.model.MediaType;

import java.util.Map;

/*
* #EXT-X-MEDIA:<attribute-list>
*/
Expand Down Expand Up @@ -157,13 +155,5 @@ public void write(AlternativeRendition value, TextBuilder textBuilder) {
textBuilder.addQuoted(name(), String.join("/", value.channels()));
}
}
};

final static Map<String, AlternativeRenditionAttribute> attributeMap = ParserUtils.toMap(values(), Attribute::key);

static AlternativeRendition parse(String attributes, ParsingMode parsingMode) throws PlaylistParserException {
AlternativeRendition.Builder builder = AlternativeRendition.builder();
ParserUtils.readAttributes(attributeMap, attributes, builder, parsingMode);
return builder.build();
}
}
4 changes: 3 additions & 1 deletion src/main/java/io/lindstrom/m3u8/parser/Attribute.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package io.lindstrom.m3u8.parser;

public interface Attribute<T, B> {
import io.lindstrom.m3u8.model.Buildable;

public interface Attribute<T, B extends Buildable<T>> {
void read(B builder, String value) throws PlaylistParserException;
void write(T value, TextBuilder textBuilder);
String name();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;

import static io.lindstrom.m3u8.parser.ParserUtils.YES;

Expand Down Expand Up @@ -150,13 +149,5 @@ public void write(DateRange value, TextBuilder textBuilder) {
// TODO: support client attribute types (quoted-string, hexadecimal-sequence & decimal-floating-point)
value.clientAttributes().forEach(textBuilder::addQuoted);
}
};

final static Map<String, DateRangeAttribute> attributeMap = ParserUtils.toMap(values(), Attribute::key);

static DateRange parse(String attributes, ParsingMode parsingMode) throws PlaylistParserException {
DateRange.Builder builder = DateRange.builder();
ParserUtils.readAttributes(attributeMap, attributes, builder, parsingMode);
return builder.build();
}
}
10 changes: 0 additions & 10 deletions src/main/java/io/lindstrom/m3u8/parser/IFrameVariantAttribute.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import io.lindstrom.m3u8.model.IFrameVariant;

import java.util.Map;

/*
* #EXT-X-I-FRAME-STREAM-INF:<attribute-list>
*/
Expand Down Expand Up @@ -116,13 +114,5 @@ public void read(IFrameVariant.Builder builder, String value) {
public void write(IFrameVariant value, TextBuilder textBuilder) {
value.videoRange().ifPresent(v -> textBuilder.add(key(), v));
}
};

final static Map<String, IFrameVariantAttribute> attributeMap = ParserUtils.toMap(values(), Attribute::key);

static IFrameVariant parse(String attributes, ParsingMode parsingMode) throws PlaylistParserException {
IFrameVariant.Builder builder = IFrameVariant.builder();
ParserUtils.readAttributes(attributeMap, attributes, builder, parsingMode);
return builder.build();
}
}
15 changes: 7 additions & 8 deletions src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistParser.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package io.lindstrom.m3u8.parser;

import io.lindstrom.m3u8.model.MasterPlaylist;
import io.lindstrom.m3u8.model.Variant;

import java.util.Iterator;
import java.util.Map;

/**
* MasterPlaylistParser can read and write Master Playlists according to RFC 8216 (HTTP Live Streaming).
Expand Down Expand Up @@ -30,6 +32,8 @@
*/
public class MasterPlaylistParser extends AbstractPlaylistParser<MasterPlaylist, MasterPlaylist.Builder> {
private final ParsingMode parsingMode;
private static final Map<String, MasterPlaylistTag> tags = ParserUtils.toMap(MasterPlaylistTag.values());
private static final Map<String, VariantAttribute> variantAttributeMap = ParserUtils.toMap(VariantAttribute.values());

public MasterPlaylistParser() {
this(ParsingMode.STRICT);
Expand All @@ -41,7 +45,7 @@ public MasterPlaylistParser(ParsingMode parsingMode) {

@Override
void write(MasterPlaylist playlist, TextBuilder textBuilder) {
for (MasterPlaylistTag tag : MasterPlaylistTag.tags.values()) {
for (MasterPlaylistTag tag : tags.values()) {
tag.write(playlist, textBuilder);
}
}
Expand All @@ -53,23 +57,18 @@ MasterPlaylist.Builder newBuilder() {

@Override
void onTag(MasterPlaylist.Builder builder, String name, String attributes, Iterator<String> lineIterator) throws PlaylistParserException{
MasterPlaylistTag tag = MasterPlaylistTag.tags.get(name);
MasterPlaylistTag tag = tags.get(name);

if (tag == MasterPlaylistTag.EXT_X_STREAM_INF) {
String uriLine = lineIterator.next();
if (uriLine == null || uriLine.startsWith("#")) {
throw new PlaylistParserException("Expected URI, got " + uriLine);
}
builder.addVariants(VariantAttribute.parse(attributes, uriLine, parsingMode));
builder.addVariants(ParserUtils.readAttributes(variantAttributeMap, attributes, Variant.builder().uri(uriLine), parsingMode));
} else if (tag != null) {
tag.read(builder, attributes, parsingMode);
} else if (parsingMode.failOnUnknownTags()) {
throw new PlaylistParserException("Tag not implemented: " + name);
}
}

@Override
MasterPlaylist build(MasterPlaylist.Builder builder) {
return builder.build();
}
}
Loading