@startuml

header PlaylistLoader sequences
title PlaylistLoader sequences: Main Manifest and Alternate Audio

Participant "PlaylistController" as PC #red
Participant "MainPlaylistLoader" as MPL #blue
Participant "mainSegmentLoader" as SL #blue
Participant "AudioPlaylistLoader" as APL #green
Participant "audioSegmentLoader" as ASL #green
Participant "external server" as ext #brown
Participant "m3u8Parser" as parser #orange
Participant "mediaGroups" as MG #purple
Participant Tech #lightblue

== Initialization ==

PC -> MPL : construct MainPlaylistLoader
PC -> MPL: load()

MPL -> MPL : start()

== Requesting Main Manifest ==

MPL -> ext: xhr request for main manifest
ext -> MPL : response with main manifest

MPL -> parser: parse main manifest
parser -> MPL: object representing manifest

note over MPL #lightblue: trigger 'loadedplaylist'

== Requesting Video Manifest ==

note over MPL #lightblue: handling loadedplaylist
MPL -> MPL : media()

MPL -> ext : request child manifest
ext -> MPL: child manifest returned

MPL -> parser: parse child manifest
parser -> MPL: object representing the child manifest

note over MPL #lightblue: trigger 'loadedplaylist'
note over MPL #lightblue: handleing 'loadedplaylist'

MPL -> SL: playlist()
MPL -> SL: load()

== Requesting Video Segments ==

note over MPL #lightblue: trigger 'loadedmetadata'
note over MPL #lightblue: handling 'loadedmetadata'

opt vod and preload !== 'none'

  MPL -> SL: playlist()
  MPL -> SL: load()

end

MPL -> MG: setupMediaGroups()

== Initializing Media Groups, Choosing Active Tracks ==

MG -> APL: create child playlist loader for alt audio

MG -> MG: activeGroup and audio variant selected
MG -> MG: enable activeTrack, onTrackChanged()
MG -> SL: reset mainSegmentLoader

== Requesting Alternate Audio Manifest ==

MG -> MG: startLoaders()

MG -> APL: load()
APL -> APL: start()

APL -> ext: request alt audio media manifest

break finish pending tasks
  MG -> Tech: add audioTracks
  MPL -> PC: setupSourceBuffers()
  MPL -> PC: setupFirstPlay()

  loop on monitorBufferTick
    SL -> ext: requests media segments
    ext -> SL: response with media segment bytes
  end
end

ext -> APL: responds with child manifest

APL -> parser: parse child manifest
parser -> APL: object representing child manifest returned

== Requesting Alternate Audio Segments ==

note over APL #lightblue: trigger 'loadedplaylist'
note over APL #lightblue: handling 'loadedplaylist'
APL -> ASL: playlist()

note over APL #lightblue: trigger 'loadedmetadata'
note over APL #lightblue: handling 'loadedmetadata'
APL -> ASL: playlist()
APL -> ASL: load()

loop audioSegmentLoader.load()

  ASL -> ext: requests media segments
  ext -> ASL: response with media segment bytes
end

@enduml
