lib/exstream/playlist.ex

defmodule Exstream.Playlist do
  defstruct [:duration, :url]

  @type t :: %__MODULE__{duration: String.t(), url: String.t()}

  def parse_duration(7, duration) do
    "0#{duration}"
  end

  def parse_duration(8, duration) do
    duration
  end

  def parse_duration(duration) do
    String.length(duration) |> parse_duration(duration)
  end

  def get_duration_second(duration) do
    {:ok, result} = parse_duration(duration) |> Time.from_iso8601()

    result.second
  end

  def get_duration_minute(duration) do
    {:ok, result} = parse_duration(duration) |> Time.from_iso8601()

    result.minute
  end

  def get_duration_hour(duration) do
    {:ok, result} = parse_duration(duration) |> Time.from_iso8601()

    result.hour
  end

  def get_seconds(duration) do
    get_duration_second(duration) + get_duration_minute(duration) * 60 +
      get_duration_hour(duration) * 3600
  end

  def get_extinf(duration, url) do
    steps = floor(get_seconds(duration) / 10)

    Enum.map_join(1..steps, fn step ->
      "#EXTINF:10,\n#{url}&start=#{step * 10 - 10}&end=#{step * 10}\n"
    end)
  end

  def build(%Exstream.Playlist{duration: duration, url: url}) do
    "#EXTM3U\n" <>
      "#EXT-X-PLAYLIST-TYPE:VOD\n" <>
      "#EXT-X-TARGETDURATION:10\n" <>
      "#EXT-X-VERSION:4\n" <>
      "#EXT-X-MEDIA-SEQUENCE:0\n" <>
      get_extinf(duration, url) <>
      "#EXT-X-ENDLIST"
  end
end