defmodule Exstream.Range do
import Plug.Conn
def handle_range({"range", "bytes=0-1"}, conn, path, file_size) do
conn
|> put_resp_header("content-range", "bytes 0-1/#{file_size}")
|> send_file(206, path, 0, 2)
end
def handle_range({"range", "bytes=" <> start_pos}, conn, path, file_size) do
offset =
String.split(start_pos, "-")
|> List.first()
|> String.to_integer()
conn
|> put_resp_header("content-range", "bytes #{offset}-#{file_size - 1}/#{file_size}")
|> send_file(206, path, offset, file_size - offset)
end
def handle_range(nil, conn, path, file_size) do
conn
|> put_resp_header("content-range", "bytes 0-#{file_size - 1}/#{file_size}")
|> send_file(206, path, 0, file_size)
end
def get_video(conn, path) do
List.keyfind(conn.req_headers, "range", 0)
|> handle_range(conn |> put_resp_header("content-type", "video/mp4"), path, File.stat!(path).size)
end
end