# `Membrane.HTTPAdaptiveStream.Manifest`
[🔗](https://github.com/membraneframework/membrane_http_adaptive_stream_plugin/blob/v0.21.0/lib/membrane_http_adaptive_stream/manifest.ex#L1)

Behaviour for manifest serialization.

# `serialized_manifest_t`

```elixir
@type serialized_manifest_t() ::
  {manifest_name :: String.t(), manifest_content :: String.t()}
```

# `serialized_manifests_t`

```elixir
@type serialized_manifests_t() :: %{
  master_manifest: serialized_manifest_t(),
  manifest_per_track: %{optional(track_id :: any()) =&gt; serialized_manifest_t()}
}
```

# `t`

```elixir
@type t() :: %Membrane.HTTPAdaptiveStream.Manifest{
  module: module(),
  name: String.t(),
  tracks: %{
    required(id :: any()) =&gt; Membrane.HTTPAdaptiveStream.Manifest.Track.t()
  }
}
```

# `serialize`

```elixir
@callback serialize(t()) :: serialized_manifests_t()
```

# `add_chunk`

```elixir
@spec add_chunk(
  t(),
  track_id :: Membrane.HTTPAdaptiveStream.Manifest.Track.id_t(),
  Membrane.Buffer.t()
) :: {Membrane.HTTPAdaptiveStream.Manifest.Changeset.t(), t()}
```

Adds segment to the manifest. In case of ll-hls it will add partial segment, and also full segment if needed.
Returns `Membrane.HTTPAdaptiveStream.Manifest.Track.Changeset`.

# `add_track`

```elixir
@spec add_track(t(), Membrane.HTTPAdaptiveStream.Manifest.Track.Config.t()) ::
  {header_name :: String.t(), t()}
```

Add a track to the manifest.

Returns the name under which the header file should be stored.

# `discontinue_track`

```elixir
@spec discontinue_track(t(), Membrane.HTTPAdaptiveStream.Manifest.Track.id_t()) ::
  {header_name :: String.t(), t()}
```

Append a discontinuity to the track.

This will inform the player that eg. the parameters of the encoder changed and allow you to provide a new MP4 header.
For details on discontinuities refer to [RFC 8216](https://datatracker.ietf.org/doc/html/rfc8216).

# `finish`

```elixir
@spec finish(t(), Membrane.HTTPAdaptiveStream.Manifest.Track.id_t()) ::
  {Membrane.HTTPAdaptiveStream.Manifest.Changeset.t(), t()}
```

# `from_beginning`

```elixir
@spec from_beginning(t()) :: t()
```

Filter all tracks that have option `:persisted?` set to true, then
restores all the stale segments in those tracks.

# `has_track?`

```elixir
@spec has_track?(t(), Membrane.HTTPAdaptiveStream.Manifest.Track.id_t()) :: boolean()
```

# `header_per_track`

```elixir
@spec header_per_track(t()) :: %{optional(track_id :: term()) =&gt; String.t()}
```

Returns one header per track

# `persisted?`

```elixir
@spec persisted?(t(), Membrane.HTTPAdaptiveStream.Manifest.Track.id_t()) :: boolean()
```

# `segments_per_track`

```elixir
@spec segments_per_track(t()) :: %{
  optional(track_id :: term()) =&gt; [segment_name :: String.t()]
}
```

Returns all segments grouped by the track id.

# `serialize`

```elixir
@spec serialize(t()) :: serialized_manifests_t()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
