Membrane Multimedia Framework: Hackney Element

CircleCI

THIS PACKAGE HAS BEEN MOVED

Use membrane_hackney_plugin

This package provides elements that can be used to read files over HTTP using Hackney library.

It is part of Membrane Multimedia Framework.

Installation

Add the following line to your deps in mix.exs. Run mix deps.get.

{:membrane_element_hackney, "~> 0.3"}

Sample usage

Membrane.Element.Hackney.Source

This pipeline should get you a kitten from imgur and save as kitty.jpg. To run it you need :membrane_element_file in your project's dependencies.

defmodule DownloadPipeline do
  use Membrane.Pipeline
  alias Pipeline.Spec
  alias Membrane.Element.File
  alias Membrane.Element.Hackney

  @impl true
  def handle_init(_) do
    children = [
      hackney_src: %Hackney.Source{location: "http://i.imgur.com/z4d4kWk.jpg"},
      file_sink: %File.Sink{location: "kitty.jpg"},
    ]
    links = %{
      {:hackney_src, :source} => {:file_sink, :sink}
    }

    {{:ok, %Spec{children: children, links: links}}, %{}}
  end
end

{:ok, pid} = DownloadPipeline.start(nil)
DownloadPipeline.play(pid)

Membrane.Element.Hackney.Sink

The following pipeline is an example of file upload - it requires Goth library with properly configurated credentials for Google Cloud and :membrane_element_file

defmodule UploadPipeline do
  use Membrane.Pipeline

  alias Membrane.Pipeline.Spec
  alias Membrane.Element.{File, Hackney}

  @impl true
  def handle_init([bucket, name]) do
    children = [
      src: %File.Source{location: "sample.flac"},
      sink: %Hackney.Sink{
        method: :post,
        location: build_uri(bucket, name),
        headers: [auth_header(), {"content-type", "audio/flac"}]
      }
    ]

    links = %{
      {:src, :output} => {:sink, :input}
    }

    {{:ok, %Spec{children: children, links: links}}, %{}}
  end

  @impl true
  def handle_notification(%Hackney.Sink.Response{} = response, element_name, state) do
    IO.inspect({element_name, response})
    {:ok, state}
  end

  def handle_notification(_notification, _element_name, state) do
    {:ok, state}
  end

  defp auth_header do
    {:ok, token} = Goth.Token.for_scope("https://www.googleapis.com/auth/devstorage.read_write")
    {"Authorization", "#{token.type} #{token.token}"}
  end

  defp build_uri(bucket, name) do
    "https://www.googleapis.com/upload/storage/v1/b/#{bucket}/o?" <>
      URI.encode_query(uploadType: "media", name: name)
  end
end

{:ok, pid} = UploadPipeline.start(["some_bucket", "uploaded_file_name.flac"])
UploadPipeline.play(pid)

Sponsors

The development of this element was sponsored by Abridge AI, Inc.

Copyright 2018, Software Mansion

Software Mansion