From 1ebd0cbddbe6db114b44722bf3b30a9010905a89 Mon Sep 17 00:00:00 2001 From: ty Date: Wed, 18 Dec 2024 16:49:03 -0500 Subject: [PATCH 1/2] Get current segment number from segment filename The current implimentation is not smart enough to discover when discontinuities have caused the segment number to increment, causing a mis-match between the stored sequence numbers and the current 'preload-hint' partial. It would be possible to get rid of Regex.named_captures by including the segment number in the metadata send by Membrane.HTTPAdaptiveStream.Storage --- lib/algora/pipeline/storage.ex | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/algora/pipeline/storage.ex b/lib/algora/pipeline/storage.ex index c118ebf0..af2b37fa 100644 --- a/lib/algora/pipeline/storage.ex +++ b/lib/algora/pipeline/storage.ex @@ -40,6 +40,7 @@ defmodule Algora.Pipeline.Storage do @ets_cached_duration_in_segments 24 @delta_manifest_suffix "_delta.m3u8" + @segment_from_filename ~r/^\w+_segment_+(?\d*)/ @impl true def init(state) do @@ -87,7 +88,7 @@ defmodule Algora.Pipeline.Storage do state = process_contents(parent_id, name, contents, metadata, ctx, state) - |> update_sequence_numbers(sequence_number, manifest_name) + |> update_sequence_numbers(sequence_number, name, manifest_name) |> add_partial(name, ctx, partial_name, contents, manifest_name) {:ok, state} @@ -257,20 +258,24 @@ defmodule Algora.Pipeline.Storage do defp update_sequence_numbers( %{sequences: sequences} = state, new_partial_sn, + segment_name, manifest_name ) do - {segment_sn, partial_sn} = Map.get(sequences, manifest_name, {0, 0}) - new_segment? = new_partial_sn < partial_sn - sequence = if new_segment? do - { segment_sn + 1, new_partial_sn } - else - { segment_sn, new_partial_sn } - end + {segment_sn, _partial_sn} = Map.get(sequences, manifest_name, {0, 0}) + new_segment_sn = + case Regex.named_captures(@segment_from_filename, segment_name) do + %{"segment" => new_segment_sn} -> + String.to_integer(new_segment_sn) + _no_match -> + Membrane.Logger.error("failed extract segment number from filename #{inspect(segment_name)}") + segment_sn + end + state = sequences - |> Map.put(manifest_name, sequence) + |> Map.put(manifest_name, {new_segment_sn, new_partial_sn}) |> then(&Map.put(state, :sequences, &1)) # If there is a new segment we want to remove partials that are too old from ets - if new_segment? do + if new_segment_sn > segment_sn do remove_partials(state, manifest_name) else state From 36d73de61f3cb41a89d29de333f2c86db4e459ef Mon Sep 17 00:00:00 2001 From: ty Date: Wed, 18 Dec 2024 19:49:39 -0500 Subject: [PATCH 2/2] remove regex --- lib/algora/pipeline/storage.ex | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/algora/pipeline/storage.ex b/lib/algora/pipeline/storage.ex index af2b37fa..6912252e 100644 --- a/lib/algora/pipeline/storage.ex +++ b/lib/algora/pipeline/storage.ex @@ -40,7 +40,6 @@ defmodule Algora.Pipeline.Storage do @ets_cached_duration_in_segments 24 @delta_manifest_suffix "_delta.m3u8" - @segment_from_filename ~r/^\w+_segment_+(?\d*)/ @impl true def init(state) do @@ -262,19 +261,12 @@ defmodule Algora.Pipeline.Storage do manifest_name ) do {segment_sn, _partial_sn} = Map.get(sequences, manifest_name, {0, 0}) - new_segment_sn = - case Regex.named_captures(@segment_from_filename, segment_name) do - %{"segment" => new_segment_sn} -> - String.to_integer(new_segment_sn) - _no_match -> - Membrane.Logger.error("failed extract segment number from filename #{inspect(segment_name)}") - segment_sn - end - + new_segment_sn = get_segment_number_from_name(segment_name) state = sequences |> Map.put(manifest_name, {new_segment_sn, new_partial_sn}) |> then(&Map.put(state, :sequences, &1)) - # If there is a new segment we want to remove partials that are too old from ets + + # If there is a new segment we want to remove partials that are too old if new_segment_sn > segment_sn do remove_partials(state, manifest_name) else @@ -386,4 +378,13 @@ defmodule Algora.Pipeline.Storage do defp process_contents(_parent_id, _name, _contents, _metadata, _ctx, state) do state end + + # audio_segment_0_audio_master.m4s + defp get_segment_number_from_name(filename) do + filename + |> String.split("_") + |> Enum.drop(2) + |> List.first() + |> String.to_integer() + end end