From 014379cc487836edf263d4f4fc124ed9b901189d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Lindstr=C3=B6m?= Date: Wed, 20 Jan 2021 21:33:20 +0100 Subject: [PATCH 1/8] Add PlaylistBuilder interface --- .../io/lindstrom/m3u8/model/MasterPlaylist.java | 2 +- .../java/io/lindstrom/m3u8/model/MediaPlaylist.java | 2 +- .../io/lindstrom/m3u8/model/PlaylistBuilder.java | 5 +++++ .../m3u8/parser/AbstractPlaylistParser.java | 7 +++---- .../lindstrom/m3u8/parser/MasterPlaylistParser.java | 4 ---- .../lindstrom/m3u8/parser/MediaPlaylistParser.java | 13 +++++++------ .../java/io/lindstrom/m3u8/parser/RawPlaylist.java | 6 ++++-- .../io/lindstrom/m3u8/parser/RawPlaylistParser.java | 5 ----- 8 files changed, 21 insertions(+), 23 deletions(-) create mode 100644 src/main/java/io/lindstrom/m3u8/model/PlaylistBuilder.java diff --git a/src/main/java/io/lindstrom/m3u8/model/MasterPlaylist.java b/src/main/java/io/lindstrom/m3u8/model/MasterPlaylist.java index 596fad0..7fe6580 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 PlaylistBuilder { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java b/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java index 43cdaf1..2444a1a 100644 --- a/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java +++ b/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java @@ -44,6 +44,6 @@ static Builder builder() { return new Builder(); } - class Builder extends MediaPlaylistBuilder { + class Builder extends MediaPlaylistBuilder implements PlaylistBuilder { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/PlaylistBuilder.java b/src/main/java/io/lindstrom/m3u8/model/PlaylistBuilder.java new file mode 100644 index 0000000..f98736b --- /dev/null +++ b/src/main/java/io/lindstrom/m3u8/model/PlaylistBuilder.java @@ -0,0 +1,5 @@ +package io.lindstrom.m3u8.model; + +public interface PlaylistBuilder

{ + P build(); +} diff --git a/src/main/java/io/lindstrom/m3u8/parser/AbstractPlaylistParser.java b/src/main/java/io/lindstrom/m3u8/parser/AbstractPlaylistParser.java index 89fb120..8b5f813 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.PlaylistBuilder; 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/MasterPlaylistParser.java b/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistParser.java index ece4868..e2d19e2 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistParser.java +++ b/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistParser.java @@ -68,8 +68,4 @@ void onTag(MasterPlaylist.Builder builder, String name, String attributes, Itera } } - @Override - MasterPlaylist build(MasterPlaylist.Builder builder) { - return builder.build(); - } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java index efeb8bc..d9bf3a2 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java +++ b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java @@ -2,6 +2,7 @@ import io.lindstrom.m3u8.model.MediaPlaylist; import io.lindstrom.m3u8.model.MediaSegment; +import io.lindstrom.m3u8.model.PlaylistBuilder; import java.util.Iterator; @@ -63,11 +64,6 @@ void onURI(Builder builderWrapper, String uri) { builderWrapper.segmentBuilder = MediaSegment.builder(); } - @Override - MediaPlaylist build(Builder builderWrapper) { - return builderWrapper.playlistBuilder.build(); - } - @Override void write(MediaPlaylist playlist, TextBuilder textBuilder) { for (MediaPlaylistTag tag : MediaPlaylistTag.tags.values()) { @@ -89,8 +85,13 @@ void write(MediaPlaylist playlist, TextBuilder textBuilder) { /** * Wrapper class for playlist and segment builders */ - static class Builder { + static class Builder implements PlaylistBuilder { private final MediaPlaylist.Builder playlistBuilder = MediaPlaylist.builder(); private MediaSegment.Builder segmentBuilder = MediaSegment.builder(); + + @Override + public MediaPlaylist build() { + return playlistBuilder.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..45eb12b 100644 --- a/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java +++ b/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java @@ -1,6 +1,7 @@ package io.lindstrom.m3u8.parser; import io.lindstrom.m3u8.model.Playlist; +import io.lindstrom.m3u8.model.PlaylistBuilder; 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 PlaylistBuilder { 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"); From 69960857e13d9a6f22a10dfacc41f5c3f5559251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Lindstr=C3=B6m?= Date: Wed, 20 Jan 2021 21:50:07 +0100 Subject: [PATCH 2/8] Add IBuilder --- .../java/io/lindstrom/m3u8/model/AlternativeRendition.java | 2 +- src/main/java/io/lindstrom/m3u8/model/DateRange.java | 2 +- src/main/java/io/lindstrom/m3u8/model/IBuilder.java | 5 +++++ src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java | 6 +++--- src/main/java/io/lindstrom/m3u8/model/MasterPlaylist.java | 2 +- src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java | 2 +- src/main/java/io/lindstrom/m3u8/model/MediaSegment.java | 2 +- src/main/java/io/lindstrom/m3u8/model/PlaylistBuilder.java | 5 ----- .../java/io/lindstrom/m3u8/model/PlaylistVariable.java | 3 ++- src/main/java/io/lindstrom/m3u8/model/SegmentKey.java | 3 ++- src/main/java/io/lindstrom/m3u8/model/SegmentMap.java | 2 +- src/main/java/io/lindstrom/m3u8/model/ServerControl.java | 2 +- src/main/java/io/lindstrom/m3u8/model/SessionData.java | 2 +- src/main/java/io/lindstrom/m3u8/model/StartTimeOffset.java | 2 +- src/main/java/io/lindstrom/m3u8/model/Variant.java | 4 ++-- .../io/lindstrom/m3u8/parser/AbstractPlaylistParser.java | 4 ++-- src/main/java/io/lindstrom/m3u8/parser/Attribute.java | 4 +++- .../java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java | 4 ++-- src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java | 7 ++++--- src/main/java/io/lindstrom/m3u8/parser/Tag.java | 4 +++- src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java | 4 ++-- 21 files changed, 39 insertions(+), 32 deletions(-) create mode 100644 src/main/java/io/lindstrom/m3u8/model/IBuilder.java delete mode 100644 src/main/java/io/lindstrom/m3u8/model/PlaylistBuilder.java diff --git a/src/main/java/io/lindstrom/m3u8/model/AlternativeRendition.java b/src/main/java/io/lindstrom/m3u8/model/AlternativeRendition.java index 7887ce1..049a780 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 IBuilder { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/DateRange.java b/src/main/java/io/lindstrom/m3u8/model/DateRange.java index f79d706..4afb69e 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 IBuilder { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/IBuilder.java b/src/main/java/io/lindstrom/m3u8/model/IBuilder.java new file mode 100644 index 0000000..4451dfb --- /dev/null +++ b/src/main/java/io/lindstrom/m3u8/model/IBuilder.java @@ -0,0 +1,5 @@ +package io.lindstrom.m3u8.model; + +public interface IBuilder

{ + P build(); +} diff --git a/src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java b/src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java index 3d7045a..a1a2f22 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 IBuilder { 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 7fe6580..f0fe553 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 implements PlaylistBuilder { + class Builder extends MasterPlaylistBuilder implements IBuilder { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java b/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java index 2444a1a..a3235c7 100644 --- a/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java +++ b/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java @@ -44,6 +44,6 @@ static Builder builder() { return new Builder(); } - class Builder extends MediaPlaylistBuilder implements PlaylistBuilder { + class Builder extends MediaPlaylistBuilder implements IBuilder { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/MediaSegment.java b/src/main/java/io/lindstrom/m3u8/model/MediaSegment.java index 7ffa209..fc9b157 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 IBuilder { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/PlaylistBuilder.java b/src/main/java/io/lindstrom/m3u8/model/PlaylistBuilder.java deleted file mode 100644 index f98736b..0000000 --- a/src/main/java/io/lindstrom/m3u8/model/PlaylistBuilder.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.lindstrom.m3u8.model; - -public interface PlaylistBuilder

{ - P build(); -} diff --git a/src/main/java/io/lindstrom/m3u8/model/PlaylistVariable.java b/src/main/java/io/lindstrom/m3u8/model/PlaylistVariable.java index f769b9a..20ec9bc 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 IBuilder { + } 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..afccab3 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 IBuilder { + } } diff --git a/src/main/java/io/lindstrom/m3u8/model/SegmentMap.java b/src/main/java/io/lindstrom/m3u8/model/SegmentMap.java index f7ad5a1..5950e1e 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 IBuilder { } 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..9397235 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 IBuilder { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/SessionData.java b/src/main/java/io/lindstrom/m3u8/model/SessionData.java index fb48afa..42abed8 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 IBuilder { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/StartTimeOffset.java b/src/main/java/io/lindstrom/m3u8/model/StartTimeOffset.java index f8703c5..2b6a94b 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 IBuilder { } 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..9dce858 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 IBuilder { 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 8b5f813..a238a26 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/AbstractPlaylistParser.java +++ b/src/main/java/io/lindstrom/m3u8/parser/AbstractPlaylistParser.java @@ -1,7 +1,7 @@ package io.lindstrom.m3u8.parser; import io.lindstrom.m3u8.model.Playlist; -import io.lindstrom.m3u8.model.PlaylistBuilder; +import io.lindstrom.m3u8.model.IBuilder; import java.io.*; import java.nio.ByteBuffer; @@ -11,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 { diff --git a/src/main/java/io/lindstrom/m3u8/parser/Attribute.java b/src/main/java/io/lindstrom/m3u8/parser/Attribute.java index ae0735b..8d8e5d3 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.IBuilder; + +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/MediaPlaylistParser.java b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java index d9bf3a2..695e947 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java +++ b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java @@ -1,8 +1,8 @@ package io.lindstrom.m3u8.parser; +import io.lindstrom.m3u8.model.IBuilder; import io.lindstrom.m3u8.model.MediaPlaylist; import io.lindstrom.m3u8.model.MediaSegment; -import io.lindstrom.m3u8.model.PlaylistBuilder; import java.util.Iterator; @@ -85,7 +85,7 @@ void write(MediaPlaylist playlist, TextBuilder textBuilder) { /** * Wrapper class for playlist and segment builders */ - static class Builder implements PlaylistBuilder { + static class Builder implements IBuilder { private final MediaPlaylist.Builder playlistBuilder = MediaPlaylist.builder(); private MediaSegment.Builder segmentBuilder = MediaSegment.builder(); diff --git a/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java b/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java index 371a9f8..d046bfd 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.IBuilder; import io.lindstrom.m3u8.model.Resolution; import java.time.format.DateTimeFormatter; @@ -83,8 +84,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> void readAttributes( + Map attributeMap, String attributes, B builder, ParsingMode parsingMode) throws PlaylistParserException { Matcher matcher = ATTRIBUTE_LIST_PATTERN.matcher(attributes); @@ -93,7 +94,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) { diff --git a/src/main/java/io/lindstrom/m3u8/parser/Tag.java b/src/main/java/io/lindstrom/m3u8/parser/Tag.java index cc3503c..ecb3bc8 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.IBuilder; + +interface Tag { void read(B builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException; void write(T playlist, TextBuilder textBuilder); String name(); diff --git a/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java b/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java index 45eb12b..3e98e41 100644 --- a/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java +++ b/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java @@ -1,7 +1,7 @@ package io.lindstrom.m3u8.parser; +import io.lindstrom.m3u8.model.IBuilder; import io.lindstrom.m3u8.model.Playlist; -import io.lindstrom.m3u8.model.PlaylistBuilder; import io.lindstrom.m3u8.model.PlaylistVariable; import io.lindstrom.m3u8.model.StartTimeOffset; @@ -33,7 +33,7 @@ public Map>> tags() { return tags; } - static class Builder implements PlaylistBuilder { + static class Builder implements IBuilder { private final Map>> tags = new TreeMap<>(); void addTag(String tag, List attributes) { tags.computeIfAbsent(tag, k -> new ArrayList<>()).add(attributes); From f8dc5d66d0fcd733b6c5d867fbde47d0e6d34b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Lindstr=C3=B6m?= Date: Wed, 20 Jan 2021 22:09:47 +0100 Subject: [PATCH 3/8] Refactor ParserUtils.readAttributes --- .../lindstrom/m3u8/parser/AlternativeRenditionAttribute.java | 4 +--- .../java/io/lindstrom/m3u8/parser/DateRangeAttribute.java | 4 +--- .../io/lindstrom/m3u8/parser/IFrameVariantAttribute.java | 4 +--- src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java | 4 +++- .../io/lindstrom/m3u8/parser/PlaylistVariableAttribute.java | 4 +--- .../java/io/lindstrom/m3u8/parser/SegmentKeyAttribute.java | 4 +--- .../java/io/lindstrom/m3u8/parser/SegmentMapAttribute.java | 4 +--- .../io/lindstrom/m3u8/parser/ServerControlAttribute.java | 4 +--- .../java/io/lindstrom/m3u8/parser/SessionDataAttribute.java | 4 +--- .../io/lindstrom/m3u8/parser/StartTimeOffsetAttribute.java | 4 +--- src/main/java/io/lindstrom/m3u8/parser/VariantAttribute.java | 5 +---- 11 files changed, 13 insertions(+), 32 deletions(-) diff --git a/src/main/java/io/lindstrom/m3u8/parser/AlternativeRenditionAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/AlternativeRenditionAttribute.java index 2269a7c..f27747a 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/AlternativeRenditionAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/AlternativeRenditionAttribute.java @@ -162,8 +162,6 @@ public void write(AlternativeRendition value, TextBuilder textBuilder) { 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(); + return ParserUtils.readAttributes(attributeMap, attributes, AlternativeRendition.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/DateRangeAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/DateRangeAttribute.java index 75e94fd..f81978e 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/DateRangeAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/DateRangeAttribute.java @@ -155,8 +155,6 @@ public void write(DateRange value, TextBuilder textBuilder) { 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(); + return ParserUtils.readAttributes(attributeMap, attributes, DateRange.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/IFrameVariantAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/IFrameVariantAttribute.java index d718bdc..8a79407 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/IFrameVariantAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/IFrameVariantAttribute.java @@ -121,8 +121,6 @@ public void write(IFrameVariant value, TextBuilder textBuilder) { 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(); + return ParserUtils.readAttributes(attributeMap, attributes, IFrameVariant.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java b/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java index d046bfd..abb0c5b 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java +++ b/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java @@ -84,7 +84,7 @@ static Map toMap(T[] values, Function keyMapper) { return map; } - static , A extends Attribute> void readAttributes( + static , A extends Attribute> T readAttributes( Map attributeMap, String attributes, B builder, ParsingMode parsingMode) throws PlaylistParserException { Matcher matcher = ATTRIBUTE_LIST_PATTERN.matcher(attributes); @@ -106,5 +106,7 @@ static , A extends Attribute> 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..c0fcf4f 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/PlaylistVariableAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/PlaylistVariableAttribute.java @@ -47,8 +47,6 @@ public void write(PlaylistVariable value, TextBuilder textBuilder) { 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(); + return ParserUtils.readAttributes(attributeMap, attributes, PlaylistVariable.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/SegmentKeyAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/SegmentKeyAttribute.java index 9c8bcdf..3ce1ec9 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/SegmentKeyAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/SegmentKeyAttribute.java @@ -72,8 +72,6 @@ public void write(SegmentKey segmentKey, TextBuilder textBuilder) { 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(); + return ParserUtils.readAttributes(attributeMap, attributes, SegmentKey.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/SegmentMapAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/SegmentMapAttribute.java index 121e7b5..304a160 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/SegmentMapAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/SegmentMapAttribute.java @@ -36,8 +36,6 @@ public void write(SegmentMap value, TextBuilder textBuilder) { 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(); + return ParserUtils.readAttributes(attributeMap, attributes, SegmentMap.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/ServerControlAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/ServerControlAttribute.java index 3ad1a8f..047d8b9 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/ServerControlAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/ServerControlAttribute.java @@ -70,8 +70,6 @@ public void write(ServerControl value, TextBuilder textBuilder) { 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(); + return ParserUtils.readAttributes(attributeMap, attributes, ServerControl.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/SessionDataAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/SessionDataAttribute.java index b53fc41..3781ad6 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/SessionDataAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/SessionDataAttribute.java @@ -59,8 +59,6 @@ public void write(SessionData value, TextBuilder textBuilder) { 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(); + return ParserUtils.readAttributes(attributeMap, attributes, SessionData.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/StartTimeOffsetAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/StartTimeOffsetAttribute.java index 2380aa9..13df3af 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/StartTimeOffsetAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/StartTimeOffsetAttribute.java @@ -39,8 +39,6 @@ public void write(StartTimeOffset value, TextBuilder textBuilder) { 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(); + return ParserUtils.readAttributes(attributeMap, attributes, StartTimeOffset.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/VariantAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/VariantAttribute.java index 0f00b7d..c2e836a 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/VariantAttribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/VariantAttribute.java @@ -168,9 +168,6 @@ public void write(Variant value, TextBuilder textBuilder) { 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(); + return ParserUtils.readAttributes(attributeMap, attributes, Variant.builder().uri(uri), parsingMode); } } From 34861e9bf163f2dfe8204305d8e1cbc52e07a084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Lindstr=C3=B6m?= Date: Thu, 21 Jan 2021 10:01:49 +0100 Subject: [PATCH 4/8] Refactor parsers --- .../parser/AlternativeRenditionAttribute.java | 8 ---- .../m3u8/parser/DateRangeAttribute.java | 7 --- .../m3u8/parser/IFrameVariantAttribute.java | 8 ---- .../m3u8/parser/MasterPlaylistParser.java | 11 +++-- .../m3u8/parser/MasterPlaylistTag.java | 47 ++++++++++++------- .../m3u8/parser/MediaPlaylistParser.java | 15 +++--- .../m3u8/parser/MediaPlaylistTag.java | 18 ++++--- .../m3u8/parser/MediaSegmentTag.java | 30 ++++++++---- .../io/lindstrom/m3u8/parser/ParserUtils.java | 10 +++- .../parser/PlaylistVariableAttribute.java | 8 ---- .../m3u8/parser/SegmentKeyAttribute.java | 8 ---- .../m3u8/parser/SegmentMapAttribute.java | 8 ---- .../m3u8/parser/ServerControlAttribute.java | 8 ---- .../m3u8/parser/SessionDataAttribute.java | 8 ---- .../m3u8/parser/StartTimeOffsetAttribute.java | 8 ---- .../m3u8/parser/VariantAttribute.java | 8 ---- .../m3u8/parser/SegmentKeyParserTest.java | 14 ++++-- .../m3u8/parser/VariantParserTest.java | 6 ++- 18 files changed, 100 insertions(+), 130 deletions(-) diff --git a/src/main/java/io/lindstrom/m3u8/parser/AlternativeRenditionAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/AlternativeRenditionAttribute.java index f27747a..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,11 +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 { - return ParserUtils.readAttributes(attributeMap, attributes, AlternativeRendition.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/DateRangeAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/DateRangeAttribute.java index f81978e..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,11 +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 { - return ParserUtils.readAttributes(attributeMap, attributes, DateRange.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/IFrameVariantAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/IFrameVariantAttribute.java index 8a79407..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,11 +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 { - return ParserUtils.readAttributes(attributeMap, attributes, IFrameVariant.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistParser.java b/src/main/java/io/lindstrom/m3u8/parser/MasterPlaylistParser.java index e2d19e2..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,19 +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); } } - } 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 695e947..5b6d0b6 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java +++ b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java @@ -5,6 +5,7 @@ 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). @@ -32,6 +33,8 @@ */ 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); @@ -48,10 +51,10 @@ Builder newBuilder() { @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); + if (mediaPlaylistTags.containsKey(name)) { + mediaPlaylistTags.get(name).read(builderWrapper.playlistBuilder, attributes, parsingMode); + } else if (mediaSegmentTags.containsKey(name)) { + mediaSegmentTags.get(name).read(builderWrapper.segmentBuilder, attributes, parsingMode); } else if (parsingMode.failOnUnknownTags()) { throw new PlaylistParserException("Tag not implemented: " + name); } @@ -66,12 +69,12 @@ void onURI(Builder builderWrapper, String uri) { @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'); 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 abb0c5b..431b7ff 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java +++ b/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java @@ -76,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::name); + } + + private static Map toMap(T[] values, Function keyMapper) { Map map = new LinkedHashMap<>(values.length); for (T tag : values) { map.put(keyMapper.apply(tag), tag); diff --git a/src/main/java/io/lindstrom/m3u8/parser/PlaylistVariableAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/PlaylistVariableAttribute.java index c0fcf4f..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,11 +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 { - return ParserUtils.readAttributes(attributeMap, attributes, PlaylistVariable.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/SegmentKeyAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/SegmentKeyAttribute.java index 3ce1ec9..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,11 +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 { - return ParserUtils.readAttributes(attributeMap, attributes, SegmentKey.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/SegmentMapAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/SegmentMapAttribute.java index 304a160..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,11 +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 { - return ParserUtils.readAttributes(attributeMap, attributes, SegmentMap.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/ServerControlAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/ServerControlAttribute.java index 047d8b9..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,11 +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 { - return ParserUtils.readAttributes(attributeMap, attributes, ServerControl.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/SessionDataAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/SessionDataAttribute.java index 3781ad6..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,11 +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 { - return ParserUtils.readAttributes(attributeMap, attributes, SessionData.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/StartTimeOffsetAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/StartTimeOffsetAttribute.java index 13df3af..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,11 +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 { - return ParserUtils.readAttributes(attributeMap, attributes, StartTimeOffset.builder(), parsingMode); } } diff --git a/src/main/java/io/lindstrom/m3u8/parser/VariantAttribute.java b/src/main/java/io/lindstrom/m3u8/parser/VariantAttribute.java index c2e836a..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,11 +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 { - return ParserUtils.readAttributes(attributeMap, attributes, Variant.builder().uri(uri), parsingMode); } } 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) From 82c414a02dc465e783e9ab9f72b429f3b0a74f2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Lindstr=C3=B6m?= Date: Thu, 28 Jan 2021 09:05:34 +0100 Subject: [PATCH 5/8] ParserContext WIP --- .../lindstrom/m3u8/parser/ParserContext.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/io/lindstrom/m3u8/parser/ParserContext.java diff --git a/src/main/java/io/lindstrom/m3u8/parser/ParserContext.java b/src/main/java/io/lindstrom/m3u8/parser/ParserContext.java new file mode 100644 index 0000000..b18bd38 --- /dev/null +++ b/src/main/java/io/lindstrom/m3u8/parser/ParserContext.java @@ -0,0 +1,26 @@ +package io.lindstrom.m3u8.parser; + +import io.lindstrom.m3u8.model.IBuilder; +import io.lindstrom.m3u8.model.MasterPlaylist; +import io.lindstrom.m3u8.model.MediaPlaylist; +import io.lindstrom.m3u8.model.MediaSegment; + +import java.util.Map; + +public class ParserContext { + private final Map> mediaSegmentTags; + private final Map> masterPlaylistTags; + private final Map> mediaPlaylistTags; + + private final Map> m = null; + + public ParserContext() { + this.mediaSegmentTags = ParserUtils.toMap(MediaSegmentTag.values()); + this.masterPlaylistTags = ParserUtils.toMap(MasterPlaylistTag.values()); + this.mediaPlaylistTags = ParserUtils.toMap(MediaPlaylistTag.values()); + } + + public , X extends Tag> X getTags(Class clazz) { + return (X) m.get(clazz); + } +} From 6931158002d7d4cbbf0a46f02e30318f33785ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Lindstr=C3=B6m?= Date: Thu, 28 Jan 2021 09:26:15 +0100 Subject: [PATCH 6/8] Drop ParserContext for now --- .../lindstrom/m3u8/parser/ParserContext.java | 26 ------------------- .../io/lindstrom/m3u8/parser/ParserUtils.java | 2 +- 2 files changed, 1 insertion(+), 27 deletions(-) delete mode 100644 src/main/java/io/lindstrom/m3u8/parser/ParserContext.java diff --git a/src/main/java/io/lindstrom/m3u8/parser/ParserContext.java b/src/main/java/io/lindstrom/m3u8/parser/ParserContext.java deleted file mode 100644 index b18bd38..0000000 --- a/src/main/java/io/lindstrom/m3u8/parser/ParserContext.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.lindstrom.m3u8.parser; - -import io.lindstrom.m3u8.model.IBuilder; -import io.lindstrom.m3u8.model.MasterPlaylist; -import io.lindstrom.m3u8.model.MediaPlaylist; -import io.lindstrom.m3u8.model.MediaSegment; - -import java.util.Map; - -public class ParserContext { - private final Map> mediaSegmentTags; - private final Map> masterPlaylistTags; - private final Map> mediaPlaylistTags; - - private final Map> m = null; - - public ParserContext() { - this.mediaSegmentTags = ParserUtils.toMap(MediaSegmentTag.values()); - this.masterPlaylistTags = ParserUtils.toMap(MasterPlaylistTag.values()); - this.mediaPlaylistTags = ParserUtils.toMap(MediaPlaylistTag.values()); - } - - public , X extends Tag> X getTags(Class clazz) { - return (X) m.get(clazz); - } -} diff --git a/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java b/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java index 431b7ff..44721a4 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java +++ b/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java @@ -81,7 +81,7 @@ static String writeByteRange(ByteRange byteRange) { } static > Map toMap(T[] values) { - return toMap(values, Tag::name); + return toMap(values, Tag::tag); } private static Map toMap(T[] values, Function keyMapper) { From 78ba7d0a1083b2aea00016968e78d473d51a4360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Lindstr=C3=B6m?= Date: Thu, 28 Jan 2021 21:06:03 +0100 Subject: [PATCH 7/8] Rename interface IBuilder -> Buildable --- .../java/io/lindstrom/m3u8/model/AlternativeRendition.java | 2 +- src/main/java/io/lindstrom/m3u8/model/Buildable.java | 5 +++++ src/main/java/io/lindstrom/m3u8/model/DateRange.java | 2 +- src/main/java/io/lindstrom/m3u8/model/IBuilder.java | 5 ----- src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java | 2 +- src/main/java/io/lindstrom/m3u8/model/MasterPlaylist.java | 2 +- src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java | 2 +- src/main/java/io/lindstrom/m3u8/model/MediaSegment.java | 2 +- src/main/java/io/lindstrom/m3u8/model/PlaylistVariable.java | 2 +- src/main/java/io/lindstrom/m3u8/model/SegmentKey.java | 2 +- src/main/java/io/lindstrom/m3u8/model/SegmentMap.java | 2 +- src/main/java/io/lindstrom/m3u8/model/ServerControl.java | 2 +- src/main/java/io/lindstrom/m3u8/model/SessionData.java | 2 +- src/main/java/io/lindstrom/m3u8/model/StartTimeOffset.java | 2 +- src/main/java/io/lindstrom/m3u8/model/Variant.java | 2 +- .../io/lindstrom/m3u8/parser/AbstractPlaylistParser.java | 4 ++-- src/main/java/io/lindstrom/m3u8/parser/Attribute.java | 4 ++-- .../java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java | 4 ++-- src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java | 4 ++-- src/main/java/io/lindstrom/m3u8/parser/Tag.java | 4 ++-- src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java | 4 ++-- 21 files changed, 30 insertions(+), 30 deletions(-) create mode 100644 src/main/java/io/lindstrom/m3u8/model/Buildable.java delete mode 100644 src/main/java/io/lindstrom/m3u8/model/IBuilder.java diff --git a/src/main/java/io/lindstrom/m3u8/model/AlternativeRendition.java b/src/main/java/io/lindstrom/m3u8/model/AlternativeRendition.java index 049a780..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 implements IBuilder { + 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 4afb69e..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 implements IBuilder { + class Builder extends DateRangeBuilder implements Buildable { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/IBuilder.java b/src/main/java/io/lindstrom/m3u8/model/IBuilder.java deleted file mode 100644 index 4451dfb..0000000 --- a/src/main/java/io/lindstrom/m3u8/model/IBuilder.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.lindstrom.m3u8.model; - -public interface IBuilder

{ - P build(); -} diff --git a/src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java b/src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java index a1a2f22..a15810b 100644 --- a/src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java +++ b/src/main/java/io/lindstrom/m3u8/model/IFrameVariant.java @@ -36,7 +36,7 @@ static Builder builder() { return new Builder(); } - class Builder extends IFrameVariantBuilder implements IBuilder { + 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 f0fe553..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 implements IBuilder { + 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 a3235c7..2b83963 100644 --- a/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java +++ b/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java @@ -44,6 +44,6 @@ static Builder builder() { return new Builder(); } - class Builder extends MediaPlaylistBuilder implements IBuilder { + class Builder extends MediaPlaylistBuilder implements Buildable { } } diff --git a/src/main/java/io/lindstrom/m3u8/model/MediaSegment.java b/src/main/java/io/lindstrom/m3u8/model/MediaSegment.java index fc9b157..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 implements IBuilder { + 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 20ec9bc..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,7 @@ static Builder builder() { return new Builder(); } - class Builder extends PlaylistVariableBuilder implements IBuilder { + class Builder extends PlaylistVariableBuilder implements Buildable { } static PlaylistVariable of(String name, String value) { diff --git a/src/main/java/io/lindstrom/m3u8/model/SegmentKey.java b/src/main/java/io/lindstrom/m3u8/model/SegmentKey.java index afccab3..baadefc 100644 --- a/src/main/java/io/lindstrom/m3u8/model/SegmentKey.java +++ b/src/main/java/io/lindstrom/m3u8/model/SegmentKey.java @@ -26,6 +26,6 @@ static Builder builder() { return new Builder(); } - class Builder extends SegmentKeyBuilder implements IBuilder { + 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 5950e1e..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 implements IBuilder { + 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 9397235..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 implements IBuilder { + 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 42abed8..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 implements IBuilder { + 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 2b6a94b..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 implements IBuilder { + 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 9dce858..c5d2130 100644 --- a/src/main/java/io/lindstrom/m3u8/model/Variant.java +++ b/src/main/java/io/lindstrom/m3u8/model/Variant.java @@ -93,7 +93,7 @@ static Builder builder() { return new Builder(); } - class Builder extends VariantBuilder implements IBuilder { + class Builder extends VariantBuilder implements Buildable { public Builder resolution(int width, int height) { return resolution(Resolution.of(width, height)); } diff --git a/src/main/java/io/lindstrom/m3u8/parser/AbstractPlaylistParser.java b/src/main/java/io/lindstrom/m3u8/parser/AbstractPlaylistParser.java index a238a26..2bf3f14 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/AbstractPlaylistParser.java +++ b/src/main/java/io/lindstrom/m3u8/parser/AbstractPlaylistParser.java @@ -1,7 +1,7 @@ package io.lindstrom.m3u8.parser; import io.lindstrom.m3u8.model.Playlist; -import io.lindstrom.m3u8.model.IBuilder; +import io.lindstrom.m3u8.model.Buildable; import java.io.*; import java.nio.ByteBuffer; @@ -11,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 { diff --git a/src/main/java/io/lindstrom/m3u8/parser/Attribute.java b/src/main/java/io/lindstrom/m3u8/parser/Attribute.java index 8d8e5d3..b59ac12 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/Attribute.java +++ b/src/main/java/io/lindstrom/m3u8/parser/Attribute.java @@ -1,8 +1,8 @@ package io.lindstrom.m3u8.parser; -import io.lindstrom.m3u8.model.IBuilder; +import io.lindstrom.m3u8.model.Buildable; -public interface Attribute> { +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/MediaPlaylistParser.java b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java index 5b6d0b6..646846b 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java +++ b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java @@ -1,6 +1,6 @@ package io.lindstrom.m3u8.parser; -import io.lindstrom.m3u8.model.IBuilder; +import io.lindstrom.m3u8.model.Buildable; import io.lindstrom.m3u8.model.MediaPlaylist; import io.lindstrom.m3u8.model.MediaSegment; @@ -88,7 +88,7 @@ void write(MediaPlaylist playlist, TextBuilder textBuilder) { /** * Wrapper class for playlist and segment builders */ - static class Builder implements IBuilder { + static class Builder implements Buildable { private final MediaPlaylist.Builder playlistBuilder = MediaPlaylist.builder(); private MediaSegment.Builder segmentBuilder = MediaSegment.builder(); diff --git a/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java b/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java index 44721a4..b9cc9b3 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java +++ b/src/main/java/io/lindstrom/m3u8/parser/ParserUtils.java @@ -1,7 +1,7 @@ package io.lindstrom.m3u8.parser; import io.lindstrom.m3u8.model.ByteRange; -import io.lindstrom.m3u8.model.IBuilder; +import io.lindstrom.m3u8.model.Buildable; import io.lindstrom.m3u8.model.Resolution; import java.time.format.DateTimeFormatter; @@ -92,7 +92,7 @@ private static Map toMap(T[] values, Function keyMappe return map; } - static , A extends Attribute> T readAttributes( + static , A extends Attribute> T readAttributes( Map attributeMap, String attributes, B builder, ParsingMode parsingMode) throws PlaylistParserException { Matcher matcher = ATTRIBUTE_LIST_PATTERN.matcher(attributes); diff --git a/src/main/java/io/lindstrom/m3u8/parser/Tag.java b/src/main/java/io/lindstrom/m3u8/parser/Tag.java index ecb3bc8..54971b3 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/Tag.java +++ b/src/main/java/io/lindstrom/m3u8/parser/Tag.java @@ -1,8 +1,8 @@ package io.lindstrom.m3u8.parser; -import io.lindstrom.m3u8.model.IBuilder; +import io.lindstrom.m3u8.model.Buildable; -interface Tag { +interface Tag { void read(B builder, String attributes, ParsingMode parsingMode) throws PlaylistParserException; void write(T playlist, TextBuilder textBuilder); String name(); diff --git a/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java b/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java index 3e98e41..7cf60f2 100644 --- a/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java +++ b/src/test/java/io/lindstrom/m3u8/parser/RawPlaylist.java @@ -1,6 +1,6 @@ package io.lindstrom.m3u8.parser; -import io.lindstrom.m3u8.model.IBuilder; +import io.lindstrom.m3u8.model.Buildable; import io.lindstrom.m3u8.model.Playlist; import io.lindstrom.m3u8.model.PlaylistVariable; import io.lindstrom.m3u8.model.StartTimeOffset; @@ -33,7 +33,7 @@ public Map>> tags() { return tags; } - static class Builder implements IBuilder { + 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); From 982e5448e1b68f61b55cff252de900ab1f8c2422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Lindstr=C3=B6m?= Date: Wed, 17 Feb 2021 12:51:58 +0100 Subject: [PATCH 8/8] Add a MediaSegment builder inside the MediaPlaylist builder --- .../lindstrom/m3u8/model/MediaPlaylist.java | 9 ++++++ .../m3u8/parser/MediaPlaylistParser.java | 32 ++++++------------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java b/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java index 2b83963..80d2d9f 100644 --- a/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java +++ b/src/main/java/io/lindstrom/m3u8/model/MediaPlaylist.java @@ -45,5 +45,14 @@ static Builder builder() { } 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/parser/MediaPlaylistParser.java b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java index 646846b..856f4f7 100644 --- a/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java +++ b/src/main/java/io/lindstrom/m3u8/parser/MediaPlaylistParser.java @@ -31,7 +31,7 @@ * * 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()); @@ -45,26 +45,25 @@ 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 { + void onTag(MediaPlaylist.Builder builder, String name, String attributes, Iterator lineIterator) throws PlaylistParserException { if (mediaPlaylistTags.containsKey(name)) { - mediaPlaylistTags.get(name).read(builderWrapper.playlistBuilder, attributes, parsingMode); + mediaPlaylistTags.get(name).read(builder, attributes, parsingMode); } else if (mediaSegmentTags.containsKey(name)) { - mediaSegmentTags.get(name).read(builderWrapper.segmentBuilder, attributes, parsingMode); + 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(); + void onURI(MediaPlaylist.Builder builder, String uri) { + builder.addMediaSegments(builder.segmentBuilder().uri(uri).build()); + builder.segmentBuilder(MediaSegment.builder()); } @Override @@ -84,17 +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 implements Buildable { - private final MediaPlaylist.Builder playlistBuilder = MediaPlaylist.builder(); - private MediaSegment.Builder segmentBuilder = MediaSegment.builder(); - - @Override - public MediaPlaylist build() { - return playlistBuilder.build(); - } - } }