diff --git a/parser/pom.xml b/parser/pom.xml old mode 100644 new mode 100755 index 67508fd..015b842 --- a/parser/pom.xml +++ b/parser/pom.xml @@ -4,7 +4,7 @@ net.chilicat.m3u8 m3u8parser jar - 0.2 + 0.3 m3u8 http://m3u8parser.chilicat.net/ diff --git a/parser/src/main/java/net/chilicat/m3u8/M3uConstants.java b/parser/src/main/java/net/chilicat/m3u8/M3uConstants.java old mode 100644 new mode 100755 diff --git a/parser/src/main/java/net/chilicat/m3u8/PlaylistParser.java b/parser/src/main/java/net/chilicat/m3u8/PlaylistParser.java old mode 100644 new mode 100755 index 36ccaf9..e03ced0 --- a/parser/src/main/java/net/chilicat/m3u8/PlaylistParser.java +++ b/parser/src/main/java/net/chilicat/m3u8/PlaylistParser.java @@ -5,7 +5,9 @@ import java.nio.channels.Channels; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Scanner; import java.util.logging.Level; import java.util.logging.Logger; @@ -51,7 +53,7 @@ public Playlist parse(Readable source) throws ParseException { boolean firstLine = true; int lineNumber = 0; - + final List elements = new ArrayList(10); final ElementBuilder builder = new ElementBuilder(); boolean endListSet = false; @@ -89,7 +91,9 @@ public Playlist parse(Readable source) throws ParseException { builder.programDate(programDateTime); } else if (line.startsWith(EXT_X_KEY)) { currentEncryption = parseEncryption(line, lineNumber); - } else { + } else if (line.startsWith(EXT_X_STREAM_INF)){ + parseStreamInf(line,builder); + } else { log.log(Level.FINE, new StringBuilder().append("Unknown: '").append(line).append("'").toString()); } } else if (line.startsWith(COMMENT_PREFIX)) { @@ -120,7 +124,32 @@ public Playlist parse(Readable source) throws ParseException { return new Playlist(Collections.unmodifiableList(elements), endListSet, targetDuration, mediaSequenceNumber); } - private URI toURI(String line) { + + private void parseStreamInf(final String line, final ElementBuilder builder) + { + String ln = line.replace(EXT_X_STREAM_INF + ":", ""); + + //this isn't the proper way to parse these, this will break for parameters that + // can have comma separated lists for their value (eg CODECS) + String[] split = ln.split(","); + + Map params = new HashMap(); + + for (String kvp : split) + { + String param = kvp.substring(0, kvp.indexOf('=')); + String value = kvp.substring(kvp.indexOf('=') + 1); + params.put(param, value); + } + + final int programId = Integer.parseInt(params.get("PROGRAM-ID")); + final int bandwidth = Integer.parseInt(params.get("BANDWIDTH")); + + builder.playList(programId, bandwidth, null); + } + + + private URI toURI(String line) { try { return (URI.create(line)); } catch (IllegalArgumentException e) { @@ -175,7 +204,7 @@ private void parseExtInf(String line, int lineNumber, ElementBuilder builder) th try { builder.duration(Double.valueOf(duration)).title(title); } catch (NumberFormatException e) { - // should not happen because of + // should not happen because of throw new ParseException(line, lineNumber, e); } }