Skip to main content

Overview

Streams types manage the state of previously played streams including subtitle/audio preferences, playback speed, and player settings.

StreamsBucket

Container for stream items with per-user storage.
uid
UID
required
User ID (Option<UserId>) - None if not authenticated
items
HashMap<StreamsItemKey, StreamsItem>
required
Map of stream items keyed by meta ID and video ID

Methods

new(uid: UID) -> Self

Create a new empty streams bucket for a user.

last_stream_item(&self, video_id: &str, meta_item: &MetaItem) -> Option<&StreamsItem>

Get the most recent stream item for a video. For series, searches up to 30 videos backwards to find a previously used stream.

StreamsItemKey

Composite key for identifying stream items.
metaId
String
required
Meta item identifier
videoId
String
required
Video identifier

StreamsItem

Stores information about a previously used stream.
stream
Stream
required
The stream that was played
type
String
required
Content type (e.g., “movie”, “series”)
metaId
String
required
Meta item ID
videoId
String
required
Video ID
metaTransportUrl
Url
required
URL of the addon that provided the meta
streamTransportUrl
Url
required
URL of the addon that provided the stream
state
Option<StreamItemState>
Saved playback state (subtitle/audio tracks, speeds, etc.)
mtime
DateTime<Utc>
required
Modification time (serialized as _mtime)

Methods

adjusted_state(&self, new_stream: &Stream) -> Option<StreamItemState>

Retrieve adjusted stream state based on the new stream:
  • Same source: Retain entire state (subtitle delay, audio delay, tracks, speed, player type)
  • Same binge group: Retain tracks, speed, and player type, but clear subtitle/audio delay
  • Different source/group: Retain only playback speed and player type
This allows settings to persist appropriately when moving between episodes or different streams.

StreamItemState

User-customized playback settings that persist across sessions.
subtitleTrack
Option<SubtitleTrack>
Selected subtitle track
subtitleDelay
Option<i64>
Subtitle delay in milliseconds
subtitleSize
Option<f32>
Subtitle size (platform-dependent units)
subtitleOffset
Option<f32>
Vertical subtitle offset (platform-dependent units)
audioTrack
Option<AudioTrack>
Selected audio track
audioDelay
Option<i64>
Audio delay in milliseconds
playbackSpeed
Option<f32>
Playback speed multiplier (e.g., 1.0 = normal, 1.5 = 1.5x speed)
playerType
Option<String>
Player type override

SubtitleTrack

Selected subtitle track information.
id
String
required
Track identifier
embedded
bool
required
Whether this is an embedded subtitle or addon subtitle
language
Option<String>
Subtitle language. Used when playing next stream in same binge group to match tracks by language (in case IDs differ).

AudioTrack

Selected audio track information.
id
String
required
Track identifier
language
Option<String>
Audio language. Used when playing next stream in same binge group to match tracks by language (in case IDs differ).

State Persistence Strategy

The streams bucket implements an intelligent state persistence strategy:

Same Source

When the exact same stream is played again, all state is preserved:
  • Subtitle track, delay, size, and offset
  • Audio track and delay
  • Playback speed
  • Player type

Same Binge Group

When moving to another video in the same binge group (e.g., next episode):
  • Preserved: Track selections (subtitle/audio), playback speed, player type
  • Cleared: Subtitle and audio delay (sync may differ between episodes)
  • Track matching: Uses language in addition to ID to handle cases where track order differs

Different Source/Group

When playing a completely different stream:
  • Preserved: Only playback speed and player type
  • Cleared: All track-specific settings
This ensures user preferences are maintained where appropriate while avoiding incorrect settings being applied to unrelated content.

Build docs developers (and LLMs) love