diff --git a/src/main/java/io/lindstrom/m3u8/model/AlternativeRendition.java b/src/main/java/io/lindstrom/m3u8/model/AlternativeRendition.java index 7887ce1..0ba99f8 100644 --- a/src/main/java/io/lindstrom/m3u8/model/AlternativeRendition.java +++ b/src/main/java/io/lindstrom/m3u8/model/AlternativeRendition.java @@ -93,6 +93,6 @@ static Builder builder() { return new Builder(); } - class Builder extends AlternativeRenditionBuilder { + class Builder extends AlternativeRenditionBuilder implements Buildable { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/Buildable.java b/src/main/java/io/lindstrom/m3u8/model/Buildable.java new file mode 100644 index 0000000..12f4dca --- /dev/null +++ b/src/main/java/io/lindstrom/m3u8/model/Buildable.java @@ -0,0 +1,5 @@ +package io.lindstrom.m3u8.model; + +public interface Buildable { + T build(); +} diff --git a/src/main/java/io/lindstrom/m3u8/model/DateRange.java b/src/main/java/io/lindstrom/m3u8/model/DateRange.java index f79d706..d3ffbc1 100644 --- a/src/main/java/io/lindstrom/m3u8/model/DateRange.java +++ b/src/main/java/io/lindstrom/m3u8/model/DateRange.java @@ -37,6 +37,6 @@ static Builder builder() { return new Builder(); } - class Builder extends DateRangeBuilder { + class Builder extends DateRangeBuilder implements Buildable { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java b/src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java index 3d7045a..a15810b 100644 --- a/src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java +++ b/src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java @@ -29,14 +29,14 @@ public interface IFrameVariant { Optional video(); Optional programId(); - + Optional videoRange(); - + static Builder builder() { return new Builder(); } - class Builder extends IFrameVariantBuilder { + class Builder extends IFrameVariantBuilder implements Buildable { public Builder videoRange(String value) { return videoRange(VideoRange.valueOf(value)); } diff --git a/src/main/java/io/lindstrom/m3u8/model/MasterPlaylist.java b/src/main/java/io/lindstrom/m3u8/model/MasterPlaylist.java index 596fad0..02204d0 100644 --- a/src/main/java/io/lindstrom/m3u8/model/MasterPlaylist.java +++ b/src/main/java/io/lindstrom/m3u8/model/MasterPlaylist.java @@ -59,6 +59,6 @@ static Builder builder() { return new Builder(); } - class Builder extends MasterPlaylistBuilder { + class Builder extends MasterPlaylistBuilder implements Buildable { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java b/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java index 43cdaf1..80d2d9f 100644 --- a/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java +++ b/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java @@ -44,6 +44,15 @@ static Builder builder() { return new Builder(); } - class Builder extends MediaPlaylistBuilder { + class Builder extends MediaPlaylistBuilder implements Buildable { + private MediaSegment.Builder segmentBuilder = MediaSegment.builder(); + + public MediaSegment.Builder segmentBuilder() { + return segmentBuilder; + } + + public void segmentBuilder(MediaSegment.Builder segmentBuilder) { + this.segmentBuilder = segmentBuilder; + } } } diff --git a/src/main/java/io/lindstrom/m3u8/model/MediaSegment.java b/src/main/java/io/lindstrom/m3u8/model/MediaSegment.java index 7ffa209..590ac08 100644 --- a/src/main/java/io/lindstrom/m3u8/model/MediaSegment.java +++ b/src/main/java/io/lindstrom/m3u8/model/MediaSegment.java @@ -49,6 +49,6 @@ static Builder builder() { return new Builder(); } - class Builder extends MediaSegmentBuilder { + class Builder extends MediaSegmentBuilder implements Buildable { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/PlaylistVariable.java b/src/main/java/io/lindstrom/m3u8/model/PlaylistVariable.java index f769b9a..63f0d45 100644 --- a/src/main/java/io/lindstrom/m3u8/model/PlaylistVariable.java +++ b/src/main/java/io/lindstrom/m3u8/model/PlaylistVariable.java @@ -14,7 +14,8 @@ static Builder builder() { return new Builder(); } - class Builder extends PlaylistVariableBuilder { } + class Builder extends PlaylistVariableBuilder implements Buildable { + } static PlaylistVariable of(String name, String value) { return PlaylistVariable.builder() diff --git a/src/main/java/io/lindstrom/m3u8/model/SegmentKey.java b/src/main/java/io/lindstrom/m3u8/model/SegmentKey.java index 920e6d7..baadefc 100644 --- a/src/main/java/io/lindstrom/m3u8/model/SegmentKey.java +++ b/src/main/java/io/lindstrom/m3u8/model/SegmentKey.java @@ -26,5 +26,6 @@ static Builder builder() { return new Builder(); } - class Builder extends SegmentKeyBuilder {} + class Builder extends SegmentKeyBuilder implements Buildable { + } } diff --git a/src/main/java/io/lindstrom/m3u8/model/SegmentMap.java b/src/main/java/io/lindstrom/m3u8/model/SegmentMap.java index f7ad5a1..803e9c8 100644 --- a/src/main/java/io/lindstrom/m3u8/model/SegmentMap.java +++ b/src/main/java/io/lindstrom/m3u8/model/SegmentMap.java @@ -20,7 +20,7 @@ static Builder builder() { return new Builder(); } - class Builder extends SegmentMapBuilder { + class Builder extends SegmentMapBuilder implements Buildable { } static SegmentMap of(String uri) { diff --git a/src/main/java/io/lindstrom/m3u8/model/ServerControl.java b/src/main/java/io/lindstrom/m3u8/model/ServerControl.java index 20cdab0..03c04b7 100644 --- a/src/main/java/io/lindstrom/m3u8/model/ServerControl.java +++ b/src/main/java/io/lindstrom/m3u8/model/ServerControl.java @@ -23,6 +23,6 @@ static Builder builder() { return new Builder(); } - class Builder extends ServerControlBuilder { + class Builder extends ServerControlBuilder implements Buildable { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/SessionData.java b/src/main/java/io/lindstrom/m3u8/model/SessionData.java index fb48afa..8a39a54 100644 --- a/src/main/java/io/lindstrom/m3u8/model/SessionData.java +++ b/src/main/java/io/lindstrom/m3u8/model/SessionData.java @@ -21,6 +21,6 @@ static Builder builder() { return new Builder(); } - class Builder extends SessionDataBuilder { + class Builder extends SessionDataBuilder implements Buildable { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/StartTimeOffset.java b/src/main/java/io/lindstrom/m3u8/model/StartTimeOffset.java index f8703c5..e8f42b8 100644 --- a/src/main/java/io/lindstrom/m3u8/model/StartTimeOffset.java +++ b/src/main/java/io/lindstrom/m3u8/model/StartTimeOffset.java @@ -25,7 +25,7 @@ static Builder builder() { return new Builder(); } - class Builder extends StartTimeOffsetBuilder { + class Builder extends StartTimeOffsetBuilder implements Buildable { } static StartTimeOffset of(double timeOffset) { diff --git a/src/main/java/io/lindstrom/m3u8/model/Variant.java b/src/main/java/io/lindstrom/m3u8/model/Variant.java index 1ad74d5..c5d2130 100644 --- a/src/main/java/io/lindstrom/m3u8/model/Variant.java +++ b/src/main/java/io/lindstrom/m3u8/model/Variant.java @@ -93,11 +93,11 @@ static Builder builder() { return new Builder(); } - class Builder extends VariantBuilder { + class Builder extends VariantBuilder implements Buildable { public Builder resolution(int width, int height) { return resolution(Resolution.of(width, height)); } - + public Builder videoRange(String value) { return videoRange(VideoRange.valueOf(value)); } diff --git a/src/main/java/io/lindstrom/m3u8/parser/AbstractPlaylistParser.java b/src/main/java/io/lindstrom/m3u8/parser/AbstractPlaylistParser.java index 89fb120..2bf3f14 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/AbstractPlaylistParser.java +++ b/src/main/java/io/lindstrom/m3u8/parser/AbstractPlaylistParser.java @@ -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; @@ -10,7 +11,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; -public abstract class AbstractPlaylistParser { +public abstract class AbstractPlaylistParser> { private static final String EXTM3U = "#EXTM3U"; public T readPlaylist(InputStream inputStream) throws IOException { @@ -95,7 +96,7 @@ public T readPlaylist(Iterator lineIterator) throws PlaylistParserExcept } } - return build(builder); + return builder.build(); } abstract B newBuilder(); @@ -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) { diff --git a/src/main/java/io/lindstrom/m3u8/parser/AlternativeRenditionAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/AlternativeRenditionAttribute.java index 2269a7c..a0ea86e 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/AlternativeRenditionAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/AlternativeRenditionAttribute.java @@ -3,8 +3,6 @@ import io.lindstrom.m3u8.model.AlternativeRendition; import io.lindstrom.m3u8.model.MediaType; -import java.util.Map; - /* * #EXT-X-MEDIA: */ @@ -157,13 +155,5 @@ public void write(AlternativeRendition value, TextBuilder textBuilder) { textBuilder.addQuoted(name(), String.join("/", value.channels())); } } - }; - - final static Map 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(); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/Attribute.java b/src/main/java/io/lindstrom/m3u8/parser/Attribute.java index ae0735b..b59ac12 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/Attribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/Attribute.java @@ -1,6 +1,8 @@ package io.lindstrom.m3u8.parser; -public interface Attribute { +import io.lindstrom.m3u8.model.Buildable; + +public interface Attribute> { void read(B builder, String value) throws PlaylistParserException; void write(T value, TextBuilder textBuilder); String name(); diff --git a/src/main/java/io/lindstrom/m3u8/parser/DateRangeAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/DateRangeAttribute.java index 75e94fd..14219a5 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/DateRangeAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/DateRangeAttribute.java @@ -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; @@ -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 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(); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/IFrameVariantAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/IFrameVariantAttribute.java index d718bdc..fa422be 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/IFrameVariantAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/IFrameVariantAttribute.java @@ -2,8 +2,6 @@ import io.lindstrom.m3u8.model.IFrameVariant; -import java.util.Map; - /* * #EXT-X-I-FRAME-STREAM-INF: */ @@ -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 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(); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistParser.java b/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistParser.java index ece4868..e4051a1 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistParser.java +++ b/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistParser.java @@ -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). @@ -30,6 +32,8 @@ */ public class MasterPlaylistParser extends AbstractPlaylistParser { private final ParsingMode parsingMode; + private static final Map tags = ParserUtils.toMap(MasterPlaylistTag.values()); + private static final Map variantAttributeMap = ParserUtils.toMap(VariantAttribute.values()); public MasterPlaylistParser() { this(ParsingMode.STRICT); @@ -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); } } @@ -53,23 +57,18 @@ MasterPlaylist.Builder newBuilder() { @Override void onTag(MasterPlaylist.Builder builder, String name, String attributes, Iterator 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(); - } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistTag.java b/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistTag.java index fa8cfb9..505848f 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistTag.java +++ b/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistTag.java @@ -1,6 +1,6 @@ package io.lindstrom.m3u8.parser; -import io.lindstrom.m3u8.model.MasterPlaylist; +import io.lindstrom.m3u8.model.*; import java.util.Map; @@ -32,42 +32,51 @@ public void write(MasterPlaylist playlist, TextBuilder textBuilder) { }, EXT_X_START { + private final Map attributeMap = ParserUtils.toMap(StartTimeOffsetAttribute.values()); + @Override public void read(MasterPlaylist.Builder builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException { - builder.startTimeOffset(StartTimeOffsetAttribute.parse(attributes, parsingMode)); + builder.startTimeOffset(ParserUtils.readAttributes(attributeMap, attributes, StartTimeOffset.builder(), parsingMode)); } @Override public void write(MasterPlaylist playlist, TextBuilder textBuilder) { - playlist.startTimeOffset().ifPresent(value -> textBuilder.addTag(tag(), value, StartTimeOffsetAttribute.attributeMap)); + playlist.startTimeOffset().ifPresent(value -> textBuilder.addTag(tag(), value, attributeMap)); } }, EXT_X_DEFINE { + private final Map attributeMap = ParserUtils.toMap(PlaylistVariableAttribute.values()); + @Override public void read(MasterPlaylist.Builder builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException { - builder.addVariables(PlaylistVariableAttribute.parse(attributes, parsingMode)); + builder.addVariables(ParserUtils.readAttributes(attributeMap, attributes, PlaylistVariable.builder(), parsingMode)); } @Override public void write(MasterPlaylist playlist, TextBuilder textBuilder) { - textBuilder.addTag(tag(), playlist.variables(), PlaylistVariableAttribute.attributeMap); + textBuilder.addTag(tag(), playlist.variables(), attributeMap); } }, EXT_X_MEDIA { + private final Map attributeMap = + ParserUtils.toMap(AlternativeRenditionAttribute.values()); + @Override public void read(MasterPlaylist.Builder builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException { - builder.addAlternativeRenditions(AlternativeRenditionAttribute.parse(attributes, parsingMode)); + builder.addAlternativeRenditions(ParserUtils.readAttributes(attributeMap, attributes, AlternativeRendition.builder(), parsingMode)); } @Override public void write(MasterPlaylist playlist, TextBuilder textBuilder) { - textBuilder.addTag(tag(), playlist.alternativeRenditions(), AlternativeRenditionAttribute.attributeMap); + textBuilder.addTag(tag(), playlist.alternativeRenditions(), attributeMap); } }, EXT_X_STREAM_INF { + private final Map attributeMap = ParserUtils.toMap(VariantAttribute.values()); + @Override public void read(MasterPlaylist.Builder builder, String attributes, ParsingMode parsingMode) { // Not used. This is handled by the MasterPlaylistParser directly. @@ -76,47 +85,51 @@ public void read(MasterPlaylist.Builder builder, String attributes, ParsingMode @Override public void write(MasterPlaylist playlist, TextBuilder textBuilder) { String tag = tag(); - playlist.variants().forEach(variant -> textBuilder.addTag(tag, variant, VariantAttribute.attributeMap) + playlist.variants().forEach(variant -> textBuilder.addTag(tag, variant, attributeMap) .add(variant.uri()) .add("\n")); } }, EXT_X_I_FRAME_STREAM_INF { + private final Map attributeMap = ParserUtils.toMap(IFrameVariantAttribute.values()); + @Override public void read(MasterPlaylist.Builder builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException { - builder.addIFrameVariants(IFrameVariantAttribute.parse(attributes, parsingMode)); + builder.addIFrameVariants(ParserUtils.readAttributes(attributeMap, attributes, IFrameVariant.builder(), parsingMode)); } @Override public void write(MasterPlaylist playlist, TextBuilder textBuilder) { - textBuilder.addTag(tag(), playlist.iFrameVariants(), IFrameVariantAttribute.attributeMap); + textBuilder.addTag(tag(), playlist.iFrameVariants(), attributeMap); } }, EXT_X_SESSION_DATA { + private final Map attributeMap = ParserUtils.toMap(SessionDataAttribute.values()); + @Override public void read(MasterPlaylist.Builder builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException { - builder.addSessionData(SessionDataAttribute.parse(attributes, parsingMode)); + builder.addSessionData(ParserUtils.readAttributes(attributeMap, attributes, SessionData.builder(), parsingMode)); } @Override public void write(MasterPlaylist playlist, TextBuilder textBuilder) { - textBuilder.addTag(tag(), playlist.sessionData(), SessionDataAttribute.attributeMap); + textBuilder.addTag(tag(), playlist.sessionData(), attributeMap); } }, EXT_X_SESSION_KEY { + private final Map attributeMap = ParserUtils.toMap(SegmentKeyAttribute.values()); + @Override public void read(MasterPlaylist.Builder builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException { - builder.addSessionKeys(SegmentKeyAttribute.parse(attributes, parsingMode)); + builder.addSessionKeys(ParserUtils.readAttributes(attributeMap, attributes, SegmentKey.builder(), parsingMode)); } @Override public void write(MasterPlaylist playlist, TextBuilder textBuilder) { - textBuilder.addTag(tag(), playlist.sessionKeys(), SegmentKeyAttribute.attributeMap); + textBuilder.addTag(tag(), playlist.sessionKeys(), attributeMap); } - }; - - static final Map tags = ParserUtils.toMap(values(), Tag::tag); + } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java index efeb8bc..856f4f7 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java +++ b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java @@ -1,9 +1,11 @@ package io.lindstrom.m3u8.parser; +import io.lindstrom.m3u8.model.Buildable; import io.lindstrom.m3u8.model.MediaPlaylist; import io.lindstrom.m3u8.model.MediaSegment; import java.util.Iterator; +import java.util.Map; /** * MediaPlaylistParser can read and write Media Playlists according to RFC 8216 (HTTP Live Streaming). @@ -29,8 +31,10 @@ * * This implementation is reusable and thread safe. */ -public class MediaPlaylistParser extends AbstractPlaylistParser { +public class MediaPlaylistParser extends AbstractPlaylistParser { private final ParsingMode parsingMode; + private static final Map mediaSegmentTags = ParserUtils.toMap(MediaSegmentTag.values()); + private static final Map mediaPlaylistTags = ParserUtils.toMap(MediaPlaylistTag.values()); public MediaPlaylistParser() { this(ParsingMode.STRICT); @@ -41,41 +45,35 @@ public MediaPlaylistParser(ParsingMode parsingMode) { } @Override - Builder newBuilder() { - return new Builder(); + MediaPlaylist.Builder newBuilder() { + return new MediaPlaylist.Builder(); } @Override - void onTag(Builder builderWrapper, String name, String attributes, Iterator lineIterator) throws PlaylistParserException { - if (MediaPlaylistTag.tags.containsKey(name)) { - MediaPlaylistTag.tags.get(name).read(builderWrapper.playlistBuilder, attributes, parsingMode); - } else if (MediaSegmentTag.tags.containsKey(name)) { - MediaSegmentTag.tags.get(name).read(builderWrapper.segmentBuilder, attributes, parsingMode); + void onTag(MediaPlaylist.Builder builder, String name, String attributes, Iterator lineIterator) throws PlaylistParserException { + if (mediaPlaylistTags.containsKey(name)) { + mediaPlaylistTags.get(name).read(builder, attributes, parsingMode); + } else if (mediaSegmentTags.containsKey(name)) { + mediaSegmentTags.get(name).read(builder.segmentBuilder(), attributes, parsingMode); } else if (parsingMode.failOnUnknownTags()) { throw new PlaylistParserException("Tag not implemented: " + name); } } @Override - void onURI(Builder builderWrapper, String uri) { - builderWrapper.segmentBuilder.uri(uri); - builderWrapper.playlistBuilder.addMediaSegments(builderWrapper.segmentBuilder.build()); - builderWrapper.segmentBuilder = MediaSegment.builder(); - } - - @Override - MediaPlaylist build(Builder builderWrapper) { - return builderWrapper.playlistBuilder.build(); + void onURI(MediaPlaylist.Builder builder, String uri) { + builder.addMediaSegments(builder.segmentBuilder().uri(uri).build()); + builder.segmentBuilder(MediaSegment.builder()); } @Override void write(MediaPlaylist playlist, TextBuilder textBuilder) { - for (MediaPlaylistTag tag : MediaPlaylistTag.tags.values()) { + for (MediaPlaylistTag tag : mediaPlaylistTags.values()) { tag.write(playlist, textBuilder); } playlist.mediaSegments().forEach(mediaSegment -> { - for (MediaSegmentTag tag : MediaSegmentTag.tags.values()) { + for (MediaSegmentTag tag : mediaSegmentTags.values()) { tag.write(mediaSegment, textBuilder); } textBuilder.add(mediaSegment.uri()).add('\n'); @@ -85,12 +83,4 @@ void write(MediaPlaylist playlist, TextBuilder textBuilder) { textBuilder.addTag(MediaPlaylistTag.EXT_X_ENDLIST.tag()); } } - - /** - * Wrapper class for playlist and segment builders - */ - static class Builder { - private final MediaPlaylist.Builder playlistBuilder = MediaPlaylist.builder(); - private MediaSegment.Builder segmentBuilder = MediaSegment.builder(); - } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistTag.java b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistTag.java index 00ebf6e..253b656 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistTag.java +++ b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistTag.java @@ -2,6 +2,8 @@ import io.lindstrom.m3u8.model.MediaPlaylist; import io.lindstrom.m3u8.model.PlaylistType; +import io.lindstrom.m3u8.model.ServerControl; +import io.lindstrom.m3u8.model.StartTimeOffset; import java.util.Map; @@ -36,14 +38,16 @@ public void write(MediaPlaylist playlist, TextBuilder textBuilder) { }, EXT_X_START { + private final Map attributeMap = ParserUtils.toMap(StartTimeOffsetAttribute.values()); + @Override public void read(MediaPlaylist.Builder builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException { - builder.startTimeOffset(StartTimeOffsetAttribute.parse(attributes, parsingMode)); + builder.startTimeOffset(ParserUtils.readAttributes(attributeMap, attributes, StartTimeOffset.builder(), parsingMode)); } @Override public void write(MediaPlaylist playlist, TextBuilder textBuilder) { - playlist.startTimeOffset().ifPresent(value -> textBuilder.addTag(tag(), value, StartTimeOffsetAttribute.attributeMap)); + playlist.startTimeOffset().ifPresent(value -> textBuilder.addTag(tag(), value, attributeMap)); } }, @@ -62,14 +66,16 @@ public void write(MediaPlaylist playlist, TextBuilder textBuilder) { }, EXT_X_SERVER_CONTROL { + private final Map attributeMap = ParserUtils.toMap(ServerControlAttribute.values()); + @Override public void read(MediaPlaylist.Builder builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException { - builder.serverControl(ServerControlAttribute.parse(attributes, parsingMode)); + builder.serverControl(ParserUtils.readAttributes(attributeMap, attributes, ServerControl.builder(), parsingMode)); } @Override public void write(MediaPlaylist playlist, TextBuilder textBuilder) { - playlist.serverControl().ifPresent(v -> textBuilder.addTag(tag(), v, ServerControlAttribute.attributeMap)); + playlist.serverControl().ifPresent(v -> textBuilder.addTag(tag(), v, attributeMap)); } }, @@ -146,7 +152,5 @@ public void read(MediaPlaylist.Builder builder, String attributes, ParsingMode p public void write(MediaPlaylist playlist, TextBuilder textBuilder) { // written elsewhere } - }; - - static final Map tags = ParserUtils.toMap(values(), Tag::tag); + } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/MediaSegmentTag.java b/src/main/java/io/lindstrom/m3u8/parser/MediaSegmentTag.java index 18f0fc4..68f4f63 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/MediaSegmentTag.java +++ b/src/main/java/io/lindstrom/m3u8/parser/MediaSegmentTag.java @@ -1,6 +1,9 @@ package io.lindstrom.m3u8.parser; +import io.lindstrom.m3u8.model.DateRange; import io.lindstrom.m3u8.model.MediaSegment; +import io.lindstrom.m3u8.model.SegmentKey; +import io.lindstrom.m3u8.model.SegmentMap; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; @@ -52,14 +55,21 @@ public void write(MediaSegment mediaSegment, TextBuilder textBuilder) { }, EXT_X_DATERANGE { + private final Map attributeMap = ParserUtils.toMap(DateRangeAttribute.values()); + @Override public void read(MediaSegment.Builder builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException { - builder.dateRange(DateRangeAttribute.parse(attributes, parsingMode)); + builder.dateRange( + ParserUtils.readAttributes( + attributeMap, + attributes, + DateRange.builder(), + parsingMode)); } @Override public void write(MediaSegment mediaSegment, TextBuilder textBuilder) { - mediaSegment.dateRange().ifPresent(value -> textBuilder.addTag(tag(), value, DateRangeAttribute.attributeMap)); + mediaSegment.dateRange().ifPresent(value -> textBuilder.addTag(tag(), value, attributeMap)); } }, @@ -102,14 +112,16 @@ public void write(MediaSegment mediaSegment, TextBuilder textBuilder) { }, EXT_X_MAP { + private final Map attributeMap = ParserUtils.toMap(SegmentMapAttribute.values()); + @Override public void read(MediaSegment.Builder builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException { - builder.segmentMap(SegmentMapAttribute.parse(attributes, parsingMode)); + builder.segmentMap(ParserUtils.readAttributes(attributeMap, attributes, SegmentMap.builder(), parsingMode)); } @Override public void write(MediaSegment mediaSegment, TextBuilder textBuilder) { - mediaSegment.segmentMap().ifPresent(value -> textBuilder.addTag(tag(), value, SegmentMapAttribute.attributeMap)); + mediaSegment.segmentMap().ifPresent(value -> textBuilder.addTag(tag(), value, attributeMap)); } }, @@ -164,16 +176,16 @@ public void write(MediaSegment mediaSegment, TextBuilder textBuilder) { }, EXT_X_KEY { + private final Map attributeMap = ParserUtils.toMap(SegmentKeyAttribute.values()); + @Override public void read(MediaSegment.Builder builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException { - builder.segmentKey(SegmentKeyAttribute.parse(attributes, parsingMode)); + builder.segmentKey(ParserUtils.readAttributes(attributeMap, attributes, SegmentKey.builder(), parsingMode)); } @Override public void write(MediaSegment mediaSegment, TextBuilder textBuilder) { - mediaSegment.segmentKey().ifPresent(key -> textBuilder.addTag(tag(), key, SegmentKeyAttribute.attributeMap)); + mediaSegment.segmentKey().ifPresent(key -> textBuilder.addTag(tag(), key, attributeMap)); } - }; - - static final Map tags = ParserUtils.toMap(values(), Tag::tag); + } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java b/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java index 371a9f8..b9cc9b3 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java +++ b/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java @@ -1,6 +1,7 @@ package io.lindstrom.m3u8.parser; import io.lindstrom.m3u8.model.ByteRange; +import io.lindstrom.m3u8.model.Buildable; import io.lindstrom.m3u8.model.Resolution; import java.time.format.DateTimeFormatter; @@ -75,7 +76,15 @@ static String writeByteRange(ByteRange byteRange) { return byteRange.length() + byteRange.offset().map(offset -> "@" + offset).orElse(""); } - static Map toMap(T[] values, Function keyMapper) { + static > Map toMap(T[] values) { + return toMap(values, Attribute::key); + } + + static > Map toMap(T[] values) { + return toMap(values, Tag::tag); + } + + private static Map toMap(T[] values, Function keyMapper) { Map map = new LinkedHashMap<>(values.length); for (T tag : values) { map.put(keyMapper.apply(tag), tag); @@ -83,8 +92,8 @@ static Map toMap(T[] values, Function keyMapper) { return map; } - static > void readAttributes( - Map attributeMap, String attributes, B builder, ParsingMode parsingMode) throws PlaylistParserException { + static , A extends Attribute> T readAttributes( + Map attributeMap, String attributes, B builder, ParsingMode parsingMode) throws PlaylistParserException { Matcher matcher = ATTRIBUTE_LIST_PATTERN.matcher(attributes); @@ -93,7 +102,7 @@ static > void readAttributes( String value = matcher.group(2) != null ? matcher.group(2) : matcher.group(3); boolean clientAttribute = key.startsWith("X-"); - T attribute = attributeMap.get(clientAttribute ? CLIENT_ATTRIBUTE : key); + A attribute = attributeMap.get(clientAttribute ? CLIENT_ATTRIBUTE : key); if (attribute != null) { if (clientAttribute) { @@ -105,5 +114,7 @@ static > void readAttributes( throw new PlaylistParserException("Unknown attribute: " + key); } } + + return builder.build(); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/PlaylistVariableAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/PlaylistVariableAttribute.java index b46bbdb..abb9a5d 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/PlaylistVariableAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/PlaylistVariableAttribute.java @@ -2,8 +2,6 @@ import io.lindstrom.m3u8.model.PlaylistVariable; -import java.util.Map; - /* * #EXT-X-DEFINE: */ @@ -42,13 +40,5 @@ public void read(PlaylistVariable.Builder builder, String value) { public void write(PlaylistVariable value, TextBuilder textBuilder) { value.importAttribute().ifPresent(v -> textBuilder.addQuoted(name(), v)); } - }; - - final static Map attributeMap = ParserUtils.toMap(values(), Attribute::key); - - static PlaylistVariable parse(String attributes, ParsingMode parsingMode) throws PlaylistParserException { - PlaylistVariable.Builder builder = PlaylistVariable.builder(); - ParserUtils.readAttributes(attributeMap, attributes, builder, parsingMode); - return builder.build(); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/SegmentKeyAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/SegmentKeyAttribute.java index 9c8bcdf..b7e4171 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/SegmentKeyAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/SegmentKeyAttribute.java @@ -3,8 +3,6 @@ import io.lindstrom.m3u8.model.KeyMethod; import io.lindstrom.m3u8.model.SegmentKey; -import java.util.Map; - /* * #EXT-X-KEY: */ @@ -67,13 +65,5 @@ public void read(SegmentKey.Builder builder, String value) { public void write(SegmentKey segmentKey, TextBuilder textBuilder) { segmentKey.keyFormatVersions().ifPresent(v -> textBuilder.addQuoted(name(), v)); } - }; - - final static Map attributeMap = ParserUtils.toMap(values(), Attribute::key); - - static SegmentKey parse(String attributes, ParsingMode parsingMode) throws PlaylistParserException { - SegmentKey.Builder builder = SegmentKey.builder(); - ParserUtils.readAttributes(attributeMap, attributes, builder, parsingMode); - return builder.build(); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/SegmentMapAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/SegmentMapAttribute.java index 121e7b5..1b7e35b 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/SegmentMapAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/SegmentMapAttribute.java @@ -2,8 +2,6 @@ import io.lindstrom.m3u8.model.SegmentMap; -import java.util.Map; - /* * #EXT-X-MAP: */ @@ -31,13 +29,5 @@ public void write(SegmentMap value, TextBuilder textBuilder) { value.byteRange().map(ParserUtils::writeByteRange).ifPresent(v -> textBuilder.addQuoted(name(), v)); } - }; - - final static Map attributeMap = ParserUtils.toMap(values(), Attribute::key); - - static SegmentMap parse(String attributes, ParsingMode parsingMode) throws PlaylistParserException { - SegmentMap.Builder builder = SegmentMap.builder(); - ParserUtils.readAttributes(attributeMap, attributes, builder, parsingMode); - return builder.build(); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/ServerControlAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/ServerControlAttribute.java index 3ad1a8f..6066e25 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/ServerControlAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/ServerControlAttribute.java @@ -2,8 +2,6 @@ import io.lindstrom.m3u8.model.ServerControl; -import java.util.Map; - public enum ServerControlAttribute implements Attribute { CAN_SKIP_UNTIL { @Override @@ -65,13 +63,5 @@ public void write(ServerControl value, TextBuilder textBuilder) { textBuilder.add(key(), ParserUtils.YES); } } - }; - - final static Map attributeMap = ParserUtils.toMap(values(), Attribute::key); - - static ServerControl parse(String attributes, ParsingMode parsingMode) throws PlaylistParserException { - ServerControl.Builder builder = ServerControl.builder(); - ParserUtils.readAttributes(attributeMap, attributes, builder, parsingMode); - return builder.build(); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/SessionDataAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/SessionDataAttribute.java index b53fc41..6b83466 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/SessionDataAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/SessionDataAttribute.java @@ -2,8 +2,6 @@ import io.lindstrom.m3u8.model.SessionData; -import java.util.Map; - /* * #EXT-X-SESSION-DATA: */ @@ -54,13 +52,5 @@ public void read(SessionData.Builder builder, String value) { public void write(SessionData value, TextBuilder textBuilder) { value.language().ifPresent(v -> textBuilder.addQuoted(name(), v)); } - }; - - final static Map attributeMap = ParserUtils.toMap(values(), Attribute::key); - - static SessionData parse(String attributes, ParsingMode parsingMode) throws PlaylistParserException { - SessionData.Builder builder = SessionData.builder(); - ParserUtils.readAttributes(attributeMap, attributes, builder, parsingMode); - return builder.build(); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/StartTimeOffsetAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/StartTimeOffsetAttribute.java index 2380aa9..1b5c448 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/StartTimeOffsetAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/StartTimeOffsetAttribute.java @@ -2,8 +2,6 @@ import io.lindstrom.m3u8.model.StartTimeOffset; -import java.util.Map; - import static io.lindstrom.m3u8.parser.ParserUtils.YES; /* @@ -34,13 +32,5 @@ public void write(StartTimeOffset value, TextBuilder textBuilder) { textBuilder.add(name(), YES); } } - }; - - final static Map attributeMap = ParserUtils.toMap(values(), Attribute::key); - - static StartTimeOffset parse(String attributes, ParsingMode parsingMode) throws PlaylistParserException { - StartTimeOffset.Builder builder = StartTimeOffset.builder(); - ParserUtils.readAttributes(attributeMap, attributes, builder, parsingMode); - return builder.build(); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/Tag.java b/src/main/java/io/lindstrom/m3u8/parser/Tag.java index cc3503c..54971b3 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/Tag.java +++ b/src/main/java/io/lindstrom/m3u8/parser/Tag.java @@ -1,6 +1,8 @@ package io.lindstrom.m3u8.parser; -interface Tag { +import io.lindstrom.m3u8.model.Buildable; + +interface Tag { void read(B builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException; void write(T playlist, TextBuilder textBuilder); String name(); diff --git a/src/main/java/io/lindstrom/m3u8/parser/VariantAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/VariantAttribute.java index 0f00b7d..fe344b5 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/VariantAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/VariantAttribute.java @@ -2,8 +2,6 @@ import io.lindstrom.m3u8.model.Variant; -import java.util.Map; - /* * #EXT-X-STREAM-INF: */ @@ -163,14 +161,5 @@ public void read(Variant.Builder builder, String value) { public void write(Variant value, TextBuilder textBuilder) { value.videoRange().ifPresent(v -> textBuilder.add(key(), v)); } - }; - - final static Map attributeMap = ParserUtils.toMap(values(), Attribute::key); - - static Variant parse(String attributes, String uri, ParsingMode parsingMode) throws PlaylistParserException { - Variant.Builder builder = Variant.builder(); - ParserUtils.readAttributes(attributeMap, attributes, builder, parsingMode); - builder.uri(uri); - return builder.build(); } } diff --git a/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java b/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java index 7454a26..7cf60f2 100644 --- a/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java +++ b/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java @@ -1,5 +1,6 @@ package io.lindstrom.m3u8.parser; +import io.lindstrom.m3u8.model.Buildable; import io.lindstrom.m3u8.model.Playlist; import io.lindstrom.m3u8.model.PlaylistVariable; import io.lindstrom.m3u8.model.StartTimeOffset; @@ -32,12 +33,13 @@ public Map>> tags() { return tags; } - static class Builder { + static class Builder implements Buildable { private final Map>> tags = new TreeMap<>(); void addTag(String tag, List attributes) { tags.computeIfAbsent(tag, k -> new ArrayList<>()).add(attributes); } - RawPlaylist build() { + + public RawPlaylist build() { return new RawPlaylist(tags); } } diff --git a/src/test/java/io/lindstrom/m3u8/parser/RawPlaylistParser.java b/src/test/java/io/lindstrom/m3u8/parser/RawPlaylistParser.java index 94ead9c..0546c4c 100644 --- a/src/test/java/io/lindstrom/m3u8/parser/RawPlaylistParser.java +++ b/src/test/java/io/lindstrom/m3u8/parser/RawPlaylistParser.java @@ -34,11 +34,6 @@ void onURI(RawPlaylist.Builder builder, String uri) { // ignore } - @Override - RawPlaylist build(RawPlaylist.Builder builder) { - return builder.build(); - } - @Override void write(RawPlaylist playlist, TextBuilder textBuilder) { throw new UnsupportedOperationException("not implemented"); diff --git a/src/test/java/io/lindstrom/m3u8/parser/SegmentKeyParserTest.java b/src/test/java/io/lindstrom/m3u8/parser/SegmentKeyParserTest.java index c68a9f1..1c437e3 100644 --- a/src/test/java/io/lindstrom/m3u8/parser/SegmentKeyParserTest.java +++ b/src/test/java/io/lindstrom/m3u8/parser/SegmentKeyParserTest.java @@ -3,6 +3,8 @@ import io.lindstrom.m3u8.model.SegmentKey; import org.junit.Test; +import java.util.Map; + import static io.lindstrom.m3u8.model.KeyMethod.*; import static org.junit.Assert.assertEquals; @@ -21,9 +23,11 @@ public class SegmentKeyParserTest { "KEYFORMAT=\"identity\"," + "KEYFORMATVERSIONS=\"1/2/5\""; + private final Map attributeMap = ParserUtils.toMap(SegmentKeyAttribute.values()); + @Test public void parseAttributes() throws Exception { - assertEquals(SegmentKeyAttribute.parse(attributes, ParsingMode.STRICT), key); + assertEquals(ParserUtils.readAttributes(attributeMap, attributes, SegmentKey.builder(), ParsingMode.STRICT), key); } @Test @@ -33,9 +37,9 @@ public void writeAttributes() throws Exception { @Test public void parseMethods() throws Exception { - assertEquals(AES_128, SegmentKeyAttribute.parse("METHOD=AES-128", ParsingMode.STRICT).method()); - assertEquals(SAMPLE_AES, SegmentKeyAttribute.parse("METHOD=SAMPLE-AES", ParsingMode.STRICT).method()); - assertEquals(NONE, SegmentKeyAttribute.parse("METHOD=NONE", ParsingMode.STRICT).method()); + assertEquals(AES_128, ParserUtils.readAttributes(attributeMap, "METHOD=AES-128", SegmentKey.builder(), ParsingMode.STRICT).method()); + assertEquals(SAMPLE_AES, ParserUtils.readAttributes(attributeMap, "METHOD=SAMPLE-AES", SegmentKey.builder(), ParsingMode.STRICT).method()); + assertEquals(NONE, ParserUtils.readAttributes(attributeMap, "METHOD=NONE", SegmentKey.builder(), ParsingMode.STRICT).method()); } @Test @@ -53,7 +57,7 @@ public void writeMethods() throws Exception { private String writeAttributes(SegmentKey segmentKey) { return new TextBuilder() - .addTag("EXT-X-KEY", segmentKey, SegmentKeyAttribute.attributeMap) + .addTag("EXT-X-KEY", segmentKey, attributeMap) .toString() .substring(11) .trim(); diff --git a/src/test/java/io/lindstrom/m3u8/parser/VariantParserTest.java b/src/test/java/io/lindstrom/m3u8/parser/VariantParserTest.java index b644e6d..f73f997 100644 --- a/src/test/java/io/lindstrom/m3u8/parser/VariantParserTest.java +++ b/src/test/java/io/lindstrom/m3u8/parser/VariantParserTest.java @@ -6,11 +6,13 @@ import org.junit.Test; import java.util.Arrays; +import java.util.Map; import java.util.Optional; import static org.junit.Assert.assertEquals; public class VariantParserTest { + private final Map attributeMap = ParserUtils.toMap(VariantAttribute.values()); private final String attributes = "BANDWIDTH=123456789,AVERAGE-BANDWIDTH=12345678,CODECS=\"a,b,c\",RESOLUTION=1024x768,FRAME-RATE=50.0,HDCP-LEVEL=0,AUDIO=\"audio\",VIDEO=\"video\",SUBTITLES=\"subtitles\",CLOSED-CAPTIONS=\"cc\",VIDEO-RANGE=SDR"; private final Variant variant = Variant.builder() .uri("uri") @@ -29,7 +31,7 @@ public class VariantParserTest { @Test public void parseAttributes() throws Exception { - assertEquals(variant, VariantAttribute.parse(attributes, "uri", ParsingMode.STRICT)); + assertEquals(variant, ParserUtils.readAttributes(attributeMap, attributes, Variant.builder().uri("uri"), ParsingMode.STRICT)); } @Test @@ -39,7 +41,7 @@ public void parseAttributesClosedCaptionsNone() throws Exception { .closedCaptions(Optional.empty()) .build(); - assertEquals(variantLocal, VariantAttribute.parse(attributes.replace("\"cc\"", "NONE"), "uri", ParsingMode.STRICT)); + assertEquals(variantLocal, ParserUtils.readAttributes(attributeMap, attributes.replace("\"cc\"", "NONE"), Variant.builder().uri("uri"), ParsingMode.STRICT)); } @Test(expected = PlaylistParserException.class)