Files
jellytau/api/jellytau_lib/player/struct.PlayerController.html
T

425 lines
147 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Central player controller that coordinates playback"><title>PlayerController in jellytau_lib::player - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-17e0aaed.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="jellytau_lib" data-themes="" data-resource-suffix="" data-rustdoc-version="1.97.1 (8bab26f4f 2026-07-14)" data-channel="1.97.1" data-search-js="search-fd9372ac.js" data-stringdex-js="stringdex-2da4960a.js" data-settings-js="settings-170eb4bf.js" ><script src="../../static.files/storage-41dd4d93.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../static.files/main-fcd733ba.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-f7c3ffd8.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc struct"><a class="skip-main-content" href="#main-content">Skip to main content</a><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">PlayerController</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../jellytau_lib/index.html">jellytau_<wbr>lib</a><span class="version">0.11.0</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Player<wbr>Controller</a></h2><h3><a href="#fields">Fields</a></h3><ul class="block structfield"><li><a href="#structfield.autoplay_episode_count" title="autoplay_episode_count">autoplay_episode_count</a></li><li><a href="#structfield.autoplay_settings" title="autoplay_settings">autoplay_settings</a></li><li><a href="#structfield.backend" title="backend">backend</a></li><li><a href="#structfield.background_audio_active" title="background_audio_active">background_audio_active</a></li><li><a href="#structfield.background_audio_base" title="background_audio_base">background_audio_base</a></li><li><a href="#structfield.countdown_cancel" title="countdown_cancel">countdown_cancel</a></li><li><a href="#structfield.end_reason" title="end_reason">end_reason</a></li><li><a href="#structfield.event_emitter" title="event_emitter">event_emitter</a></li><li><a href="#structfield.html5_playing" title="html5_playing">html5_playing</a></li><li><a href="#structfield.jellyfin_client" title="jellyfin_client">jellyfin_client</a></li><li><a href="#structfield.muted" title="muted">muted</a></li><li><a href="#structfield.playback_reporter" title="playback_reporter">playback_reporter</a></li><li><a href="#structfield.position_throttler" title="position_throttler">position_throttler</a></li><li><a href="#structfield.queue" title="queue">queue</a></li><li><a href="#structfield.reported_time" title="reported_time">reported_time</a></li><li><a href="#structfield.reports" title="reports">reports</a></li><li><a href="#structfield.repository" title="repository">repository</a></li><li><a href="#structfield.sleep_timer" title="sleep_timer">sleep_timer</a></li><li><a href="#structfield.stream_resume" title="stream_resume">stream_resume</a></li></ul><h3><a href="#implementations">Associated Functions</a></h3><ul class="block method"><li><a href="#method.new" title="new">new</a></li><li><a href="#method.note_sleep_timer_stop" title="note_sleep_timer_stop">note_sleep_timer_stop</a></li><li><a href="#method.is_audio_only_video" title="is_audio_only_video">is_audio_only_video</a></li></ul><h3><a href="#implementations">Methods</a></h3><ul class="block method"><li><a href="#method.absolute_position" title="absolute_position">absolute_position</a></li><li><a href="#method.advance_to_next_episode_audio_only" title="advance_to_next_episode_audio_only">advance_to_next_episode_audio_only</a></li><li><a href="#method.audio_settings" title="audio_settings">audio_settings</a></li><li><a href="#method.auto_advance_to_next_episode" title="auto_advance_to_next_episode">auto_advance_to_next_episode</a></li><li><a href="#method.autoplay_settings" title="autoplay_settings">autoplay_settings</a></li><li><a href="#method.cancel_autoplay_countdown" title="cancel_autoplay_countdown">cancel_autoplay_countdown</a></li><li><a href="#method.cancel_sleep_timer" title="cancel_sleep_timer">cancel_sleep_timer</a></li><li><a href="#method.capabilities" title="capabilities">capabilities</a></li><li><a href="#method.claim_stream_resume" title="claim_stream_resume">claim_stream_resume</a></li><li><a href="#method.clear_queue" title="clear_queue">clear_queue</a></li><li><a href="#method.clear_reported_time" title="clear_reported_time">clear_reported_time</a></li><li><a href="#method.current_is_audio_episode" title="current_is_audio_episode">current_is_audio_episode</a></li><li><a href="#method.current_jellyfin_id" title="current_jellyfin_id">current_jellyfin_id</a></li><li><a href="#method.cycle_repeat" title="cycle_repeat">cycle_repeat</a></li><li><a href="#method.duration" title="duration">duration</a></li><li><a href="#method.emit_html5_control" title="emit_html5_control">emit_html5_control</a></li><li><a href="#method.emit_queue_changed" title="emit_queue_changed">emit_queue_changed</a></li><li><a href="#method.emit_sleep_timer_changed" title="emit_sleep_timer_changed">emit_sleep_timer_changed</a></li><li><a href="#method.enter_background_audio" title="enter_background_audio">enter_background_audio</a></li><li><a href="#method.event_emitter" title="event_emitter">event_emitter</a></li><li><a href="#method.exit_background_audio" title="exit_background_audio">exit_background_audio</a></li><li><a href="#method.fetch_next_episode_for_item" title="fetch_next_episode_for_item">fetch_next_episode_for_item</a></li><li><a href="#method.html5_is_playing" title="html5_is_playing">html5_is_playing</a></li><li><a href="#method.increment_autoplay_count" title="increment_autoplay_count">increment_autoplay_count</a></li><li><a href="#method.is_background_audio_active" title="is_background_audio_active">is_background_audio_active</a></li><li><a href="#method.is_episode_item" title="is_episode_item">is_episode_item</a></li><li><a href="#method.is_html5_active" title="is_html5_active">is_html5_active</a></li><li><a href="#method.is_shuffle" title="is_shuffle">is_shuffle</a></li><li><a href="#method.jellyfin_client" title="jellyfin_client">jellyfin_client</a></li><li><a href="#method.load_and_play" title="load_and_play">load_and_play</a></li><li><a href="#method.muted" title="muted">muted</a></li><li><a href="#method.next" title="next">next</a></li><li><a href="#method.observed_duration" title="observed_duration">observed_duration</a></li><li><a href="#method.on_playback_ended" title="on_playback_ended">on_playback_ended</a></li><li><a href="#method.on_video_playback_ended" title="on_video_playback_ended">on_video_playback_ended</a></li><li><a href="#method.pause" title="pause">pause</a></li><li><a href="#method.peek_end_reason" title="peek_end_reason">peek_end_reason</a></li><li><a href="#method.play" title="play">play</a></li><li><a href="#method.play_item" title="play_item">play_item</a></li><li><a href="#method.play_queue" title="play_queue">play_queue</a></li><li><a href="#method.play_queue_from" title="play_queue_from">play_queue_from</a></li><li><a href="#method.playback_reporter" title="playback_reporter">playback_reporter</a></li><li><a href="#method.position" title="position">position</a></li><li><a href="#method.position_throttler" title="position_throttler">position_throttler</a></li><li><a href="#method.previous" title="previous">previous</a></li><li><a href="#method.queue" title="queue">queue</a></li><li><a href="#method.recoverable_error_resume" title="recoverable_error_resume">recoverable_error_resume</a></li><li><a href="#method.repeat_mode" title="repeat_mode">repeat_mode</a></li><li><a href="#method.report" title="report">report</a></li><li><a href="#method.report_completion" title="report_completion">report_completion</a></li><li><a href="#method.report_html5_media_loaded" title="report_html5_media_loaded">report_html5_media_loaded</a></li><li><a href="#method.report_html5_position" title="report_html5_position">report_html5_position</a></li><li><a href="#method.report_html5_state" title="report_html5_state">report_html5_state</a></li><li><a href="#method.report_progress_throttled" title="report_progress_throttled">report_progress_throttled</a></li><li><a href="#method.report_stopped_at" title="report_stopped_at">report_stopped_at</a></li><li><a href="#method.reset_autoplay_count" title="reset_autoplay_count">reset_autoplay_count</a></li><li><a href="#method.resume_stream_at" title="resume_stream_at">resume_stream_at</a></li><li><a href="#method.seek" title="seek">seek</a></li><li><a href="#method.seek_absolute" title="seek_absolute">seek_absolute</a></li><li><a href="#method.set_audio_settings" title="set_audio_settings">set_audio_settings</a></li><li><a href="#method.set_audio_track" title="set_audio_track">set_audio_track</a></li><li><a href="#method.set_autoplay_settings" title="set_autoplay_settings">set_autoplay_settings</a></li><li><a href="#method.set_background_audio_base" title="set_background_audio_base">set_background_audio_base</a></li><li><a href="#method.set_current_item" title="set_current_item">set_current_item</a></li><li><a href="#method.set_end_reason" title="set_end_reason">set_end_reason</a></li><li><a href="#method.set_event_emitter" title="set_event_emitter">set_event_emitter</a></li><li><a href="#method.set_jellyfin_client" title="set_jellyfin_client">set_jellyfin_client</a></li><li><a href="#method.set_playback_reporter" title="set_playback_reporter">set_playback_reporter</a></li><li><a href="#method.set_queue" title="set_queue">set_queue</a></li><li><a href="#method.set_report_sink" title="set_report_sink">set_report_sink</a></li><li><a href="#method.set_repository" title="set_repository">set_repository</a></li><li><a href="#method.set_sleep_timer" title="set_sleep_timer">set_sleep_timer</a></li><li><a href="#method.set_subtitle_track" title="set_subtitle_track">set_subtitle_track</a></li><li><a href="#method.set_volume" title="set_volume">set_volume</a></li><li><a href="#method.sleep_timer_state" title="sleep_timer_state">sleep_timer_state</a></li><li><a href="#method.start_autoplay_countdown" title="start_autoplay_countdown">start_autoplay_countdown</a></li><li><a href="#method.start_timer_thread" title="start_timer_thread">start_timer_thread</a></li><li><a href="#method.state" title="state">state</a></li><li><a href="#method.stop" title="stop">stop</a></li><li><a href="#method.take_background_audio_base" title="take_background_audio_base">take_background_audio_base</a></li><li><a href="#method.take_end_reason" title="take_end_reason">take_end_reason</a></li><li><a href="#method.toggle_playback" title="toggle_playback">toggle_playback</a></li><li><a href="#method.toggle_shuffle" title="toggle_shuffle">toggle_shuffle</a></li><li><a href="#method.truncated_stream_resume_position" title="truncated_stream_resume_position">truncated_stream_resume_position</a></li><li><a href="#method.volume" title="volume">volume</a></li></ul><h3><a href="#trait-implementations">Trait Implementations</a></h3><ul class="block trait-implementation"><li><a href="#impl-Default-for-PlayerController" title="Default">Default</a></li></ul><h3><a href="#synthetic-implementations">Auto Trait Implementations</a></h3><ul class="block synthetic-implementation"><li><a href="#impl-RefUnwindSafe-for-PlayerController" title="!RefUnwindSafe">!RefUnwindSafe</a></li><li><a href="#impl-UnwindSafe-for-PlayerController" title="!UnwindSafe">!UnwindSafe</a></li><li><a href="#impl-Freeze-for-PlayerController" title="Freeze">Freeze</a></li><li><a href="#impl-Send-for-PlayerController" title="Send">Send</a></li><li><a href="#impl-Sync-for-PlayerController" title="Sync">Sync</a></li><li><a href="#impl-Unpin-for-PlayerController" title="Unpin">Unpin</a></li><li><a href="#impl-UnsafeUnpin-for-PlayerController" title="UnsafeUnpin">UnsafeUnpin</a></li></ul><h3><a href="#blanket-implementations">Blanket Implementations</a></h3><ul class="block blanket-implementation"><li><a href="#impl-Any-for-T" title="Any">Any</a></li><li><a href="#impl-Borrow%3CT%3E-for-T" title="Borrow&#60;T&#62;">Borrow&#60;T&#62;</a></li><li><a href="#impl-BorrowMut%3CT%3E-for-T" title="BorrowMut&#60;T&#62;">BorrowMut&#60;T&#62;</a></li><li><a href="#impl-From%3CT%3E-for-T" title="From&#60;T&#62;">From&#60;T&#62;</a></li><li><a href="#impl-Instrument-for-T" title="Instrument">Instrument</a></li><li><a href="#impl-Into%3CU%3E-for-T" title="Into&#60;U&#62;">Into&#60;U&#62;</a></li><li><a href="#impl-NoneValue-for-T" title="NoneValue">NoneValue</a></li><li><a href="#impl-PolicyExt-for-T" title="PolicyExt">PolicyExt</a></li><li><a href="#impl-Same-for-T" title="Same">Same</a></li><li><a href="#impl-TryFrom%3CU%3E-for-T" title="TryFrom&#60;U&#62;">TryFrom&#60;U&#62;</a></li><li><a href="#impl-TryInto%3CU%3E-for-T" title="TryInto&#60;U&#62;">TryInto&#60;U&#62;</a></li><li><a href="#impl-VZip%3CV%3E-for-T" title="VZip&#60;V&#62;">VZip&#60;V&#62;</a></li><li><a href="#impl-WithSubscriber-for-T" title="WithSubscriber">WithSubscriber</a></li></ul></section><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content" tabindex="-1"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../index.html">jellytau_lib</a>::<wbr><a href="index.html">player</a></div><h1>Struct <span class="struct">Player<wbr>Controller</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../src/jellytau_lib/player/mod.rs.html#242-340">Source</a> </span></div><pre class="rust item-decl"><code>pub struct PlayerController {<details class="toggle type-contents-toggle"><summary class="hideme"><span>Show 19 fields</span></summary>
backend: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="media_player/trait.MediaPlayer.html" title="trait jellytau_lib::player::media_player::MediaPlayer">MediaPlayer</a>&gt;&gt;&gt;,
queue: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="queue/struct.QueueManager.html" title="struct jellytau_lib::player::queue::QueueManager">QueueManager</a>&gt;&gt;,
jellyfin_client: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="../jellyfin/client/struct.JellyfinClient.html" title="struct jellytau_lib::jellyfin::client::JellyfinClient">JellyfinClient</a>&gt;&gt;&gt;,
muted: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>,
sleep_timer: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="sleep_timer/struct.SleepTimerState.html" title="struct jellytau_lib::player::sleep_timer::SleepTimerState">SleepTimerState</a>&gt;&gt;,
autoplay_settings: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="autoplay/struct.AutoplaySettings.html" title="struct jellytau_lib::player::autoplay::AutoplaySettings">AutoplaySettings</a>&gt;&gt;,
repository: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;dyn <a class="trait" href="../repository/trait.MediaRepository.html" title="trait jellytau_lib::repository::MediaRepository">MediaRepository</a>&gt;&gt;&gt;&gt;,
event_emitter: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;dyn <a class="trait" href="events/trait.PlayerEventEmitter.html" title="trait jellytau_lib::player::events::PlayerEventEmitter">PlayerEventEmitter</a>&gt;&gt;&gt;&gt;,
countdown_cancel: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>&gt;&gt;&gt;&gt;&gt;,
playback_reporter: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;Mutex&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="../playback_reporting/reporter/struct.PlaybackReporter.html" title="struct jellytau_lib::playback_reporting::reporter::PlaybackReporter">PlaybackReporter</a>&gt;&gt;&gt;,
reports: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;dyn <a class="trait" href="trait.PlaybackReportSink.html" title="trait jellytau_lib::player::PlaybackReportSink">PlaybackReportSink</a>&gt;&gt;&gt;,
position_throttler: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="../playback_reporting/throttle/struct.EventThrottler.html" title="struct jellytau_lib::playback_reporting::throttle::EventThrottler">EventThrottler</a>&gt;,
end_reason: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="enum" href="state/enum.EndReason.html" title="enum jellytau_lib::player::state::EndReason">EndReason</a>&gt;&gt;&gt;,
autoplay_episode_count: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.u32.html">u32</a>&gt;&gt;,
background_audio_base: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>&gt;&gt;,
background_audio_active: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>&gt;&gt;,
stream_resume: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="stream_end/struct.ResumeTracker.html" title="struct jellytau_lib::player::stream_end::ResumeTracker">ResumeTracker</a>&gt;&gt;,
html5_playing: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>&gt;&gt;&gt;,
reported_time: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="stream_end/struct.ObservedTime.html" title="struct jellytau_lib::player::stream_end::ObservedTime">ObservedTime</a>&gt;&gt;,
</details>}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Central player controller that coordinates playback</p>
</div></details><h2 id="fields" class="fields section-header">Fields<a href="#fields" class="anchor">§</a></h2><span id="structfield.backend" class="structfield section-header"><a href="#structfield.backend" class="anchor field">§</a><code>backend: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="media_player/trait.MediaPlayer.html" title="trait jellytau_lib::player::media_player::MediaPlayer">MediaPlayer</a>&gt;&gt;&gt;</code></span><div class="docblock"><p>The engine. One contract, so the controller stops branching on which
platform it is running on — see docs/specs/media-player-controller.md.</p>
</div><span id="structfield.queue" class="structfield section-header"><a href="#structfield.queue" class="anchor field">§</a><code>queue: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="queue/struct.QueueManager.html" title="struct jellytau_lib::player::queue::QueueManager">QueueManager</a>&gt;&gt;</code></span><span id="structfield.jellyfin_client" class="structfield section-header"><a href="#structfield.jellyfin_client" class="anchor field">§</a><code>jellyfin_client: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="../jellyfin/client/struct.JellyfinClient.html" title="struct jellytau_lib::jellyfin::client::JellyfinClient">JellyfinClient</a>&gt;&gt;&gt;</code></span><span id="structfield.muted" class="structfield section-header"><a href="#structfield.muted" class="anchor field">§</a><code>muted: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></code></span><span id="structfield.sleep_timer" class="structfield section-header"><a href="#structfield.sleep_timer" class="anchor field">§</a><code>sleep_timer: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="sleep_timer/struct.SleepTimerState.html" title="struct jellytau_lib::player::sleep_timer::SleepTimerState">SleepTimerState</a>&gt;&gt;</code></span><span id="structfield.autoplay_settings" class="structfield section-header"><a href="#structfield.autoplay_settings" class="anchor field">§</a><code>autoplay_settings: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="autoplay/struct.AutoplaySettings.html" title="struct jellytau_lib::player::autoplay::AutoplaySettings">AutoplaySettings</a>&gt;&gt;</code></span><span id="structfield.repository" class="structfield section-header"><a href="#structfield.repository" class="anchor field">§</a><code>repository: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;dyn <a class="trait" href="../repository/trait.MediaRepository.html" title="trait jellytau_lib::repository::MediaRepository">MediaRepository</a>&gt;&gt;&gt;&gt;</code></span><span id="structfield.event_emitter" class="structfield section-header"><a href="#structfield.event_emitter" class="anchor field">§</a><code>event_emitter: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;dyn <a class="trait" href="events/trait.PlayerEventEmitter.html" title="trait jellytau_lib::player::events::PlayerEventEmitter">PlayerEventEmitter</a>&gt;&gt;&gt;&gt;</code></span><span id="structfield.countdown_cancel" class="structfield section-header"><a href="#structfield.countdown_cancel" class="anchor field">§</a><code>countdown_cancel: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>&gt;&gt;&gt;&gt;&gt;</code></span><span id="structfield.playback_reporter" class="structfield section-header"><a href="#structfield.playback_reporter" class="anchor field">§</a><code>playback_reporter: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;Mutex&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="../playback_reporting/reporter/struct.PlaybackReporter.html" title="struct jellytau_lib::playback_reporting::reporter::PlaybackReporter">PlaybackReporter</a>&gt;&gt;&gt;</code></span><span id="structfield.reports" class="structfield section-header"><a href="#structfield.reports" class="anchor field">§</a><code>reports: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;dyn <a class="trait" href="trait.PlaybackReportSink.html" title="trait jellytau_lib::player::PlaybackReportSink">PlaybackReportSink</a>&gt;&gt;&gt;</code></span><span id="structfield.position_throttler" class="structfield section-header"><a href="#structfield.position_throttler" class="anchor field">§</a><code>position_throttler: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="../playback_reporting/throttle/struct.EventThrottler.html" title="struct jellytau_lib::playback_reporting::throttle::EventThrottler">EventThrottler</a>&gt;</code></span><span id="structfield.end_reason" class="structfield section-header"><a href="#structfield.end_reason" class="anchor field">§</a><code>end_reason: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="enum" href="state/enum.EndReason.html" title="enum jellytau_lib::player::state::EndReason">EndReason</a>&gt;&gt;&gt;</code></span><span id="structfield.autoplay_episode_count" class="structfield section-header"><a href="#structfield.autoplay_episode_count" class="anchor field">§</a><code>autoplay_episode_count: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.u32.html">u32</a>&gt;&gt;</code></span><span id="structfield.background_audio_base" class="structfield section-header"><a href="#structfield.background_audio_base" class="anchor field">§</a><code>background_audio_base: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>&gt;&gt;</code></span><span id="structfield.background_audio_active" class="structfield section-header"><a href="#structfield.background_audio_active" class="anchor field">§</a><code>background_audio_active: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>&gt;&gt;</code></span><span id="structfield.stream_resume" class="structfield section-header"><a href="#structfield.stream_resume" class="anchor field">§</a><code>stream_resume: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="stream_end/struct.ResumeTracker.html" title="struct jellytau_lib::player::stream_end::ResumeTracker">ResumeTracker</a>&gt;&gt;</code></span><span id="structfield.html5_playing" class="structfield section-header"><a href="#structfield.html5_playing" class="anchor field">§</a><code>html5_playing: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>&gt;&gt;&gt;</code></span><span id="structfield.reported_time" class="structfield section-header"><a href="#structfield.reported_time" class="anchor field">§</a><code>reported_time: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="stream_end/struct.ObservedTime.html" title="struct jellytau_lib::player::stream_end::ObservedTime">ObservedTime</a>&gt;&gt;</code></span><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-PlayerController" class="impl"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#342-2296">Source</a><a href="#impl-PlayerController" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.PlayerController.html" title="struct jellytau_lib::player::PlayerController">PlayerController</a></h3></section></summary><div class="impl-items"><section id="method.new" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#343-377">Source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(
backend: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="media_player/trait.MediaPlayer.html" title="trait jellytau_lib::player::media_player::MediaPlayer">MediaPlayer</a>&gt;,
playback_reporter: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;TokioMutex&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="../playback_reporting/reporter/struct.PlaybackReporter.html" title="struct jellytau_lib::playback_reporting::reporter::PlaybackReporter">PlaybackReporter</a>&gt;&gt;&gt;,
position_throttler: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="../playback_reporting/throttle/struct.EventThrottler.html" title="struct jellytau_lib::playback_reporting::throttle::EventThrottler">EventThrottler</a>&gt;,
) -&gt; Self</h4></section><details class="toggle method-toggle" open><summary><section id="method.set_jellyfin_client" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#380-387">Source</a><h4 class="code-header">pub fn <a href="#method.set_jellyfin_client" class="fn">set_jellyfin_client</a>(&amp;self, client: <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="../jellyfin/client/struct.JellyfinClient.html" title="struct jellytau_lib::jellyfin::client::JellyfinClient">JellyfinClient</a>&gt;)</h4></section></summary><div class="docblock"><p>Configure the Jellyfin API client for automatic playback reporting</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.jellyfin_client" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#390-392">Source</a><h4 class="code-header">pub fn <a href="#method.jellyfin_client" class="fn">jellyfin_client</a>(&amp;self) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="../jellyfin/client/struct.JellyfinClient.html" title="struct jellytau_lib::jellyfin::client::JellyfinClient">JellyfinClient</a>&gt;&gt;&gt; <a href="#" class="tooltip" data-notable-ty="Arc&lt;Mutex&lt;Option&lt;JellyfinClient&gt;&gt;&gt;"></a></h4></section></summary><div class="docblock"><p>Get a reference to the Jellyfin client (for remote session control)</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_repository" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#400-402">Source</a><h4 class="code-header">pub fn <a href="#method.set_repository" class="fn">set_repository</a>(&amp;self, repo: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;dyn <a class="trait" href="../repository/trait.MediaRepository.html" title="trait jellytau_lib::repository::MediaRepository">MediaRepository</a>&gt;)</h4></section></summary><div class="docblock"><p>Configure the media repository used for next-episode lookups.</p>
<p>The Android ExoPlayer ended-callback calls <code>on_playback_ended</code> with no
repository handle (unlike the Linux HTML5 path, which passes one per
call), so the controller needs a repository of its own or episode
autoplay silently decides Stop.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_playback_reporter" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#406-413">Source</a><h4 class="code-header">pub async fn <a href="#method.set_playback_reporter" class="fn">set_playback_reporter</a>(&amp;self, reporter: <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="../playback_reporting/reporter/struct.PlaybackReporter.html" title="struct jellytau_lib::playback_reporting::reporter::PlaybackReporter">PlaybackReporter</a>&gt;)</h4></section></summary><div class="docblock"><p>Configure the playback reporter for dual sync (local DB + server).
Called from <code>player_configure_jellyfin</code> on login/restore/reauth.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.playback_reporter" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#418-420">Source</a><h4 class="code-header">pub fn <a href="#method.playback_reporter" class="fn">playback_reporter</a>(&amp;self) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;TokioMutex&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="../playback_reporting/reporter/struct.PlaybackReporter.html" title="struct jellytau_lib::playback_reporting::reporter::PlaybackReporter">PlaybackReporter</a>&gt;&gt;&gt; <a href="#" class="tooltip" data-notable-ty="Arc&lt;TokioMutex&lt;Option&lt;PlaybackReporter&gt;&gt;&gt;"></a></h4></section></summary><div class="docblock"><p>Get a reference to the playback reporter (for backend position updates)
Will be used when position update hooks are added to backends</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.position_throttler" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#425-427">Source</a><h4 class="code-header">pub fn <a href="#method.position_throttler" class="fn">position_throttler</a>(&amp;self) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="../playback_reporting/throttle/struct.EventThrottler.html" title="struct jellytau_lib::playback_reporting::throttle::EventThrottler">EventThrottler</a>&gt; <a href="#" class="tooltip" data-notable-ty="Arc&lt;EventThrottler&gt;"></a></h4></section></summary><div class="docblock"><p>Get a reference to the position throttler (for backend position updates)
Will be used when position update hooks are added to backends</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_end_reason" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#430-433">Source</a><h4 class="code-header">fn <a href="#method.set_end_reason" class="fn">set_end_reason</a>(&amp;self, reason: <a class="enum" href="state/enum.EndReason.html" title="enum jellytau_lib::player::state::EndReason">EndReason</a>)</h4></section></summary><div class="docblock"><p>Set the end reason for the next playback end event</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.take_end_reason" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#436-438">Source</a><h4 class="code-header">fn <a href="#method.take_end_reason" class="fn">take_end_reason</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="enum" href="state/enum.EndReason.html" title="enum jellytau_lib::player::state::EndReason">EndReason</a>&gt;</h4></section></summary><div class="docblock"><p>Get and clear the current end reason</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.peek_end_reason" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#446-448">Source</a><h4 class="code-header">fn <a href="#method.peek_end_reason" class="fn">peek_end_reason</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="enum" href="state/enum.EndReason.html" title="enum jellytau_lib::player::state::EndReason">EndReason</a>&gt;</h4></section></summary><div class="docblock"><p>Read the end reason WITHOUT consuming it.</p>
<p><code>take_end_reason</code> has an owner: on Android the JNI ended-callback consumes
the <code>NewTrackLoaded</code> every load sets, and the frontends echoed call is the
one that sees <code>None</code> and decides. The truncated-stream check runs in both
calls and must not disturb that hand-off, so it peeks.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.note_sleep_timer_stop" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#462-465">Source</a><h4 class="code-header">fn <a href="#method.note_sleep_timer_stop" class="fn">note_sleep_timer_stop</a>(end_reason: &amp;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="enum" href="state/enum.EndReason.html" title="enum jellytau_lib::player::state::EndReason">EndReason</a>&gt;&gt;&gt;)</h4></section></summary><div class="docblock"><p>Record that playback is being stopped by an expiring sleep timer.</p>
<p>Stopping the backend makes it fire its ended callback (ExoPlayer does on
Android), which lands in <code>on_playback_ended</code>. Without an end reason that
reads as a natural finish and autoplay advances — defeating the timer.
<code>UserStop</code> is the honest label: the stop was user-initiated, just via the
timer they set rather than the stop button.</p>
<p>Takes the shared slot rather than <code>&amp;self</code> so the sleep-timer thread —
which owns clones, not the controller — records it the same way.</p>
<p>TRACES: UR-023, UR-026 | DR-029</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.increment_autoplay_count" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#468-484">Source</a><h4 class="code-header">fn <a href="#method.increment_autoplay_count" class="fn">increment_autoplay_count</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Increment autoplay episode counter. Returns true if limit is reached.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.reset_autoplay_count" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#487-496">Source</a><h4 class="code-header">fn <a href="#method.reset_autoplay_count" class="fn">reset_autoplay_count</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Reset autoplay episode counter (called on manual play actions)</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.play_item" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#499-515">Source</a><h4 class="code-header">pub fn <a href="#method.play_item" class="fn">play_item</a>(&amp;self, item: <a class="struct" href="media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Load and play a single item (also sets the queue to contain only this item)</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_current_item" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#528-546">Source</a><h4 class="code-header">pub fn <a href="#method.set_current_item" class="fn">set_current_item</a>(&amp;self, item: <a class="struct" href="media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Set the current queue item without loading it into the playback backend.</p>
<p>Used on platforms where video is rendered outside the native backend
(Linux WebKitGTK HTML5 <video>): the queue/UI state must reflect the
item, but MPV must not start a redundant decode for it.</p>
<p>Not gated to Linux. Its caller stopped being a <code>#[cfg]</code> branch and became
a runtime question — “does this renderer draw the picture?” — so the
<code>else</code> arm is compiled on every platform even where it never runs. The
gate outliving its caller broke the Android build outright, which went
unnoticed because nothing built for Android afterwards.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.load_and_play" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#550-628">Source</a><h4 class="code-header">pub fn <a href="#method.load_and_play" class="fn">load_and_play</a>(&amp;self, item: &amp;<a class="struct" href="media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Load and play an item without modifying the queue
Use this when the queue is already set up and you just want to play a specific item from it</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.play_queue" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#631-633">Source</a><h4 class="code-header">pub fn <a href="#method.play_queue" class="fn">play_queue</a>(
&amp;self,
items: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" href="media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>&gt;,
start_index: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.usize.html">usize</a>,
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Set the queue and start playing from the specified index</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.play_queue_from" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#641-677">Source</a><h4 class="code-header">pub fn <a href="#method.play_queue_from" class="fn">play_queue_from</a>(
&amp;self,
items: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" href="media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>&gt;,
start_index: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.usize.html">usize</a>,
start_position: <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>&gt;,
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Set the queue and start playing from the specified index, optionally
resuming the starting track at <code>start_position</code> (seconds).</p>
<p>The seek happens immediately after load so the backend never audibly
starts at 0 and theres no race against a fixed delay. Used when taking
over playback from a remote session.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_queue" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#684-694">Source</a><h4 class="code-header">pub fn <a href="#method.set_queue" class="fn">set_queue</a>(
&amp;self,
items: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" href="media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>&gt;,
start_index: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.usize.html">usize</a>,
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Replace the queue without starting local playback.</p>
<p>Used when were controlling a remote session: the tracks play on the
remote device, but we keep the local queue in sync so the UI reflects
whats playing and a later transfer-to-local has the queue to resume.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.is_html5_active" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#700-702">Source</a><h4 class="code-header">pub fn <a href="#method.is_html5_active" class="fn">is_html5_active</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>True while webview-rendered media (HTML5 <code>&lt;video&gt;</code>/<code>&lt;audio&gt;</code>) is the real
player, so transport must be routed to it rather than the native backend.</p>
<p>TRACES: UR-005 | DR-097</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.html5_is_playing" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#708-710">Source</a><h4 class="code-header">pub fn <a href="#method.html5_is_playing" class="fn">html5_is_playing</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Whether the webview element last reported itself as playing. Meaningless
unless <a href="struct.PlayerController.html#method.is_html5_active" title="method jellytau_lib::player::PlayerController::is_html5_active"><code>Self::is_html5_active</code></a> is true.</p>
<p>TRACES: UR-005 | DR-097</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.emit_html5_control" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#713-720">Source</a><h4 class="code-header">fn <a href="#method.emit_html5_control" class="fn">emit_html5_control</a>(&amp;self, action: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.str.html">str</a>)</h4></section></summary><div class="docblock"><p>Send a transport intent to the webview element that is rendering media.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.play" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#723-733">Source</a><h4 class="code-header">pub fn <a href="#method.play" class="fn">play</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Play/resume playback</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.pause" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#736-743">Source</a><h4 class="code-header">pub fn <a href="#method.pause" class="fn">pause</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Pause playback</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.toggle_playback" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#752-768">Source</a><h4 class="code-header">pub fn <a href="#method.toggle_playback" class="fn">toggle_playback</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Toggle play/pause.</p>
<p>The decision is made HERE, from authoritative state — the reported webview
state for HTML5-rendered media, or the native backends state otherwise.
The frontend must never decide this from the DOM (see DR-097).</p>
<p>TRACES: UR-005 | DR-097</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.stop" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#771-819">Source</a><h4 class="code-header">pub fn <a href="#method.stop" class="fn">stop</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Stop playback</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.report_stopped_at" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#834-853">Source</a><h4 class="code-header">fn <a href="#method.report_stopped_at" class="fn">report_stopped_at</a>(&amp;self, jellyfin_id: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>, position: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>)</h4></section></summary><div class="docblock"><p>Tell Jellyfin playback stopped at <code>position</code>, unless that position is
zero.</p>
<p>Jellyfin stores the reported position as the resume point, so a zero is
not a harmless no-op — it is an instruction to forget where the viewer
was. And it is never <em>information</em>: nobody watched zero seconds of
anything, so every zero this app ever sent came from asking a player that
was not rendering the media (webview video, or a handoff whose first tick
had not landed). On a device trace, 14 of 14 stop reports in 35 minutes
were zeroes, one of them 40s after the frontend had correctly reported
15:22 for the same episode.</p>
<p>TRACES: UR-025, UR-005 | DR-179 | UT-178</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.next" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#859-879">Source</a><h4 class="code-header">pub fn <a href="#method.next" class="fn">next</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Skip to next track</p>
<p>Note: load_and_play sets EndReason::NewTrackLoaded to prevent autoplay
from triggering when the current tracks EndFile event fires</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.previous" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#885-913">Source</a><h4 class="code-header">pub fn <a href="#method.previous" class="fn">previous</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Skip to previous track</p>
<p>Note: load_and_play sets EndReason::NewTrackLoaded to prevent autoplay
from triggering when the current tracks EndFile event fires</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.seek" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#921-924">Source</a><h4 class="code-header">pub fn <a href="#method.seek" class="fn">seek</a>(&amp;self, position: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Seek to a position in seconds, <strong>on the players own timeline</strong>.</p>
<p>During a background-audio handoff that timeline is relative to the handoff
point, so this is not the call a lockscreen scrub or a UI seek wants — use
<a href="struct.PlayerController.html#method.seek_absolute" title="method jellytau_lib::player::PlayerController::seek_absolute"><code>seek_absolute</code></a>, which speaks the episodes
timeline and is what every caller outside the player itself means.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.seek_absolute" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#943-964">Source</a><h4 class="code-header">pub async fn <a href="#method.seek_absolute" class="fn">seek_absolute</a>(&amp;self, position: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;</h4></section></summary><div class="docblock"><p>Seek to an <strong>absolute</strong> position on the items own timeline.</p>
<p>This is the boundary every outside seek comes through — the UI, the
lockscreen scrubber, a headset gesture — because all of them are looking
at the whole episode, not at whatever fragment of it the player happens to
be streaming.</p>
<p>Outside a background-audio handoff the two timelines are the same and this
is an ordinary seek. Inside one they differ by the handoff base, and the
stream cannot be seeked at all: <code>/Audio/{id}/universal</code> is a chunked
transcode with no length, so ExoPlayer either refuses or clamps — and a
clamped seek lands at stream zero, which is the handoff point. That is the
“jumps back to where I locked the screen” symptom. Honouring the seek means
re-opening the URL at the new position, which is exactly what the
truncation recovery already does, so it shares <code>resume_stream_at</code>.</p>
<p>TRACES: UR-040, UR-005 | DR-159 | UT-155</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_volume" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#967-969">Source</a><h4 class="code-header">pub fn <a href="#method.set_volume" class="fn">set_volume</a>(&amp;self, volume: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f32.html">f32</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Set volume (0.0 - 1.0)</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_audio_track" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#972-975">Source</a><h4 class="code-header">pub fn <a href="#method.set_audio_track" class="fn">set_audio_track</a>(&amp;self, stream_index: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.i32.html">i32</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Set the active audio track by stream index</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_subtitle_track" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#978-981">Source</a><h4 class="code-header">pub fn <a href="#method.set_subtitle_track" class="fn">set_subtitle_track</a>(
&amp;self,
stream_index: <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.i32.html">i32</a>&gt;,
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Set the active subtitle track by stream index (None to disable subtitles)</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.state" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#984-1004">Source</a><h4 class="code-header">pub fn <a href="#method.state" class="fn">state</a>(&amp;self) -&gt; <a class="enum" href="state/enum.PlayerState.html" title="enum jellytau_lib::player::state::PlayerState">PlayerState</a></h4></section></summary><div class="docblock"><p>Get current state</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.capabilities" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1009-1011">Source</a><h4 class="code-header">pub fn <a href="#method.capabilities" class="fn">capabilities</a>(&amp;self) -&gt; <a class="struct" href="media_player/struct.Capabilities.html" title="struct jellytau_lib::player::media_player::Capabilities">Capabilities</a></h4></section></summary><div class="docblock"><p>What the engine currently rendering can do.</p>
<p>TRACES: UR-081 | DR-246</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.position" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1014-1016">Source</a><h4 class="code-header">pub fn <a href="#method.position" class="fn">position</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a></h4></section></summary><div class="docblock"><p>Get current position</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.absolute_position" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1040-1050">Source</a><h4 class="code-header">pub fn <a href="#method.absolute_position" class="fn">absolute_position</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a></h4></section></summary><div class="docblock"><p>The position on the <strong>items own timeline</strong>, whatever is rendering it.</p>
<p>This is what every outbound position must be taken from — the resume point
sent to Jellyfin, the point the video reloads at when a handoff ends, the
truncation comparison. <code>position()</code> alone answers for exactly one of the
three ways this app plays media, and reads 0 for the other two:</p>
<ul>
<li><strong>Webview <code>&lt;video&gt;</code>/<code>&lt;audio&gt;</code></strong>: nothing is loaded into the native
backend, so its position is a permanent 0. The elements own reports are
the only reading there is.</li>
<li><strong>Background-audio handoff</strong>: the audio-only streams zero is the
handoff point, and the base is added at the native tick boundary
(DR-159) — so before the first tick lands, nothing has applied it.
Flooring at the base is exact rather than approximate: the stream cannot
physically be behind its own starting point.</li>
<li><strong>Native playback</strong>: the backend is authoritative and both other terms
are zero, so the max is its own value.</li>
</ul>
<p>Returning to the foreground during that pre-first-tick window is what
restarted an episode from 0:00 and wiped its server-side resume point.</p>
<p>TRACES: UR-040, UR-005, UR-025 | DR-178 | UT-176, UT-177</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.observed_duration" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1055-1057">Source</a><h4 class="code-header">pub fn <a href="#method.observed_duration" class="fn">observed_duration</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>&gt;</h4></section></summary><div class="docblock"><p>The duration last reported by webview-rendered media, if any.</p>
<p>TRACES: UR-005 | DR-178 | UT-177</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.clear_reported_time" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1066-1068">Source</a><h4 class="code-header">fn <a href="#method.clear_reported_time" class="fn">clear_reported_time</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Forget what webview-rendered media reported.</p>
<p>Called wherever that element stops being the player — it was torn down,
a handoff took over, or a different item is loading. A stale position
outliving its element would be reported against whatever plays next.</p>
<p>TRACES: UR-005 | DR-178 | UT-177</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_report_sink" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1075-1077">Source</a><h4 class="code-header">pub fn <a href="#method.set_report_sink" class="fn">set_report_sink</a>(&amp;self, sink: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;dyn <a class="trait" href="trait.PlaybackReportSink.html" title="trait jellytau_lib::player::PlaybackReportSink">PlaybackReportSink</a>&gt;)</h4></section></summary><div class="docblock"><p>Replace the sink playback reports go to. Tests capture; production wires
the <code>PlaybackReporter</code> at construction and never swaps it.</p>
<p>TRACES: UR-025 | DR-179</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.report" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1083-1086">Source</a><h4 class="code-header">fn <a href="#method.report" class="fn">report</a>(&amp;self, operation: <a class="enum" href="../playback_reporting/reporter/enum.PlaybackOperation.html" title="enum jellytau_lib::playback_reporting::reporter::PlaybackOperation">PlaybackOperation</a>)</h4></section></summary><div class="docblock"><p>Send a playback report. Fire-and-forget by contract, so callers can do
this while holding nothing and waiting for nothing.</p>
<p>TRACES: UR-025 | DR-179</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.current_jellyfin_id" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1089-1094">Source</a><h4 class="code-header">fn <a href="#method.current_jellyfin_id" class="fn">current_jellyfin_id</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;</h4></section></summary><div class="docblock"><p>The Jellyfin id of whatever is currently queued, if it has one.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.duration" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1104-1133">Source</a><h4 class="code-header">pub fn <a href="#method.duration" class="fn">duration</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>&gt;</h4></section></summary><div class="docblock"><p>Get duration.</p>
<p>Falls back to what webview-rendered media reported for the same reason
<a href="struct.PlayerController.html#method.absolute_position" title="method jellytau_lib::player::PlayerController::absolute_position"><code>absolute_position</code></a> does: on that path nothing
is loaded into the native backend, so its duration is <code>None</code> and the
elements report is the only one there is.</p>
<p>TRACES: UR-005 | DR-178</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.queue" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1136-1138">Source</a><h4 class="code-header">pub fn <a href="#method.queue" class="fn">queue</a>(&amp;self) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/std/sync/poison/mutex/struct.Mutex.html" title="struct std::sync::poison::mutex::Mutex">Mutex</a>&lt;<a class="struct" href="queue/struct.QueueManager.html" title="struct jellytau_lib::player::queue::QueueManager">QueueManager</a>&gt;&gt; <a href="#" class="tooltip" data-notable-ty="Arc&lt;Mutex&lt;QueueManager&gt;&gt;"></a></h4></section></summary><div class="docblock"><p>Get queue reference</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.current_is_audio_episode" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1148-1156">Source</a><h4 class="code-header">pub fn <a href="#method.current_is_audio_episode" class="fn">current_is_audio_episode</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>True when the current item is a TV episode being played in audio-only
(background) mode — i.e. an <code>item_type == "Episode"</code> item loaded as
<code>MediaType::Audio</code>. Used to decide whether the backend must drive the
next-episode advance itself (the frontend is suspended in the background).</p>
<p>Only <em>called</em> from the Android autoplay dispatch (<code>#[cfg(android)]</code>), but
compiled and unit-tested on the host, hence <code>allow(dead_code)</code> off-Android.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.clear_queue" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1161-1163">Source</a><h4 class="code-header">pub fn <a href="#method.clear_queue" class="fn">clear_queue</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Clear the queue entirely (used when playback genuinely stops, e.g. the
sleep timer fires or the queue ends with repeat off). Pair with
<code>emit_queue_changed</code> so the frontend hides the mini player.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.toggle_shuffle" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1166-1168">Source</a><h4 class="code-header">pub fn <a href="#method.toggle_shuffle" class="fn">toggle_shuffle</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Toggle shuffle</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.cycle_repeat" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1171-1173">Source</a><h4 class="code-header">pub fn <a href="#method.cycle_repeat" class="fn">cycle_repeat</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Cycle repeat mode</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.is_shuffle" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1176-1178">Source</a><h4 class="code-header">pub fn <a href="#method.is_shuffle" class="fn">is_shuffle</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Check if shuffle is enabled</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.repeat_mode" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1181-1183">Source</a><h4 class="code-header">pub fn <a href="#method.repeat_mode" class="fn">repeat_mode</a>(&amp;self) -&gt; <a class="enum" href="queue/enum.RepeatMode.html" title="enum jellytau_lib::player::queue::RepeatMode">RepeatMode</a></h4></section></summary><div class="docblock"><p>Get repeat mode</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.volume" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1186-1188">Source</a><h4 class="code-header">pub fn <a href="#method.volume" class="fn">volume</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f32.html">f32</a></h4></section></summary><div class="docblock"><p>Get current volume (0.0 - 1.0)</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.muted" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1191-1193">Source</a><h4 class="code-header">pub fn <a href="#method.muted" class="fn">muted</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Check if muted</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_audio_settings" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1196-1198">Source</a><h4 class="code-header">pub fn <a href="#method.set_audio_settings" class="fn">set_audio_settings</a>(
&amp;mut self,
settings: &amp;<a class="struct" href="../settings/struct.AudioSettings.html" title="struct jellytau_lib::settings::AudioSettings">AudioSettings</a>,
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="backend/struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>&gt;</h4></section></summary><div class="docblock"><p>Set audio settings (crossfade, gapless, normalization)</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.audio_settings" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1201-1203">Source</a><h4 class="code-header">pub fn <a href="#method.audio_settings" class="fn">audio_settings</a>(&amp;self) -&gt; <a class="struct" href="../settings/struct.AudioSettings.html" title="struct jellytau_lib::settings::AudioSettings">AudioSettings</a></h4></section></summary><div class="docblock"><p>Get current audio settings</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_event_emitter" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1208-1211">Source</a><h4 class="code-header">pub fn <a href="#method.set_event_emitter" class="fn">set_event_emitter</a>(&amp;self, emitter: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;dyn <a class="trait" href="events/trait.PlayerEventEmitter.html" title="trait jellytau_lib::player::events::PlayerEventEmitter">PlayerEventEmitter</a>&gt;)</h4></section></summary><div class="docblock"><p>Set the event emitter for notifications</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.event_emitter" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1214-1216">Source</a><h4 class="code-header">pub fn <a href="#method.event_emitter" class="fn">event_emitter</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;dyn <a class="trait" href="events/trait.PlayerEventEmitter.html" title="trait jellytau_lib::player::events::PlayerEventEmitter">PlayerEventEmitter</a>&gt;&gt;</h4></section></summary><div class="docblock"><p>Get the event emitter</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.sleep_timer_state" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1219-1221">Source</a><h4 class="code-header">pub fn <a href="#method.sleep_timer_state" class="fn">sleep_timer_state</a>(&amp;self) -&gt; <a class="struct" href="sleep_timer/struct.SleepTimerState.html" title="struct jellytau_lib::player::sleep_timer::SleepTimerState">SleepTimerState</a></h4></section></summary><div class="docblock"><p>Get sleep timer state</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_sleep_timer" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1224-1237">Source</a><h4 class="code-header">pub fn <a href="#method.set_sleep_timer" class="fn">set_sleep_timer</a>(&amp;self, mode: <a class="enum" href="sleep_timer/enum.SleepTimerMode.html" title="enum jellytau_lib::player::sleep_timer::SleepTimerMode">SleepTimerMode</a>)</h4></section></summary><div class="docblock"><p>Set sleep timer mode (in-memory only, not persisted)</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.cancel_sleep_timer" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1240-1242">Source</a><h4 class="code-header">pub fn <a href="#method.cancel_sleep_timer" class="fn">cancel_sleep_timer</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Cancel sleep timer</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.start_timer_thread" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1245-1305">Source</a><h4 class="code-header">fn <a href="#method.start_timer_thread" class="fn">start_timer_thread</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Start background timer thread for sleep timer countdown updates</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.emit_sleep_timer_changed" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1308-1317">Source</a><h4 class="code-header">fn <a href="#method.emit_sleep_timer_changed" class="fn">emit_sleep_timer_changed</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Emit sleep timer changed event to frontend</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.emit_queue_changed" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1320-1338">Source</a><h4 class="code-header">pub fn <a href="#method.emit_queue_changed" class="fn">emit_queue_changed</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Emit queue changed event to frontend</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.report_html5_state" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1354-1389">Source</a><h4 class="code-header">pub fn <a href="#method.report_html5_state" class="fn">report_html5_state</a>(&amp;self, state: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>, media_id: <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;)</h4></section></summary><div class="docblock"><p>Report an HTML5 <video> state change (playing/paused/loading/stopped).</p>
<p>Re-emits a <code>StateChanged</code> event identical to what MpvBackend/ExoPlayer
would emit, so <code>playerEvents.ts</code> needs no HTML5-specific branch.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.report_html5_position" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1395-1410">Source</a><h4 class="code-header">pub fn <a href="#method.report_html5_position" class="fn">report_html5_position</a>(&amp;self, position: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>, duration: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>)</h4></section></summary><div class="docblock"><p>Report an HTML5 <video> position tick.</p>
<p>Re-emits a <code>PositionUpdate</code> event mirroring the native backends periodic
position updates (the adapter is expected to throttle to ~250ms like MPV).</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.report_progress_throttled" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1426-1445">Source</a><h4 class="code-header">fn <a href="#method.report_progress_throttled" class="fn">report_progress_throttled</a>(&amp;self, position: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>)</h4></section></summary><div class="docblock"><p>Send a throttled progress report to Jellyfin.</p>
<p>Progress is what makes a position survive anything other than a clean
exit — a crash, a swipe-away, a battery death — and lets another device
resume mid-episode. Webview-rendered media reported none: the frontend
service writes progress to the local DB only, and Rust had no position
for it to report. A device trace covering 35 minutes of playback hit
<code>/Sessions/Playing/Progress</code> exactly zero times.</p>
<p>The throttler is the one the controller already owned for this purpose
(30s per item), so ticks arriving four times a second cost one request
per half-minute.</p>
<p>TRACES: UR-005, UR-025 | DR-179 | UT-180</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.report_html5_media_loaded" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1449-1457">Source</a><h4 class="code-header">pub fn <a href="#method.report_html5_media_loaded" class="fn">report_html5_media_loaded</a>(&amp;self, duration: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>)</h4></section></summary><div class="docblock"><p>Report that the HTML5 <video> element finished loading and knows its
duration. Mirrors the native <code>MediaLoaded</code> event.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.autoplay_settings" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1462-1464">Source</a><h4 class="code-header">pub fn <a href="#method.autoplay_settings" class="fn">autoplay_settings</a>(&amp;self) -&gt; <a class="struct" href="autoplay/struct.AutoplaySettings.html" title="struct jellytau_lib::player::autoplay::AutoplaySettings">AutoplaySettings</a></h4></section></summary><div class="docblock"><p>Get autoplay settings</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_autoplay_settings" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1467-1470">Source</a><h4 class="code-header">pub fn <a href="#method.set_autoplay_settings" class="fn">set_autoplay_settings</a>(&amp;self, settings: <a class="struct" href="autoplay/struct.AutoplaySettings.html" title="struct jellytau_lib::player::autoplay::AutoplaySettings">AutoplaySettings</a>)</h4></section></summary><div class="docblock"><p>Set autoplay settings (in-memory only, persistence handled by command layer)</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.cancel_autoplay_countdown" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1473-1477">Source</a><h4 class="code-header">pub fn <a href="#method.cancel_autoplay_countdown" class="fn">cancel_autoplay_countdown</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Cancel active autoplay countdown</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.on_playback_ended" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1483-1648">Source</a><h4 class="code-header">pub async fn <a href="#method.on_playback_ended" class="fn">on_playback_ended</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="enum" href="autoplay/enum.AutoplayDecision.html" title="enum jellytau_lib::player::autoplay::AutoplayDecision">AutoplayDecision</a>, <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;</h4></section></summary><div class="docblock"><p>Handle playback ended event - decides what to do next</p>
<p>Only triggers autoplay if the track finished naturally (EndReason::Finished or None).
If EndReason is NewTrackLoaded, UserStop, UserSkip, or Error, returns Stop without autoplay.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.report_completion" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1670-1685">Source</a><h4 class="code-header">fn <a href="#method.report_completion" class="fn">report_completion</a>(&amp;self, item: &amp;<a class="struct" href="media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>)</h4></section></summary><div class="docblock"><p>Report an item that just finished as stopped at its runtime, so Jellyfin
marks it played.</p>
<p>Jellyfin decides “watched” from the <code>PlaybackStopped</code> report and its
position — no report, no completion, however much of the episode was
actually heard. In the foreground the frontend sends one when the
<code>&lt;video&gt;</code> ends. In background audio-only mode there is nobody: the webview
is suspended and its element was torn down at the handoff, while the
backend drove the advance to the next episode and said nothing about the
one that ended. An episode listened to end-to-end on the lockscreen
therefore never counted, and (before DR-179) was often reset to 0 by the
stop report that followed.</p>
<p>Scoped to the audio-only handoff — the case the frontend provably cannot
report — so foreground playback keeps its single existing report rather
than gaining a second one. Music tracks ending natively remain
unreported; that is the same gap through a different door and wants its
own change.</p>
<p>TRACES: UR-040, UR-025 | DR-179 | UT-179</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.set_background_audio_base" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1691-1693">Source</a><h4 class="code-header">pub fn <a href="#method.set_background_audio_base" class="fn">set_background_audio_base</a>(&amp;self, seconds: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>)</h4></section></summary><div class="docblock"><p>Record the base offset of a background-audio handoff (the position the
video was handed off at, which is the audio streams zero).</p>
<p>TRACES: UR-040 | DR-052</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.enter_background_audio" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1705-1712">Source</a><h4 class="code-header">pub fn <a href="#method.enter_background_audio" class="fn">enter_background_audio</a>(&amp;self, position: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>)</h4></section></summary><div class="docblock"><p>Enter a background-audio handoff at <code>position</code> (the videos position, and
therefore the audio streams zero).</p>
<p>Hands transport authority to the native audio player: the webview
<code>&lt;video&gt;</code> is about to be torn down, so its last reports — including the
<code>pause</code> the teardown itself fires — must not keep it looking like the
player. Without this the lockscreen pause emitted a ControlCommand at a
dead element and the audio played straight through it.</p>
<p>TRACES: UR-040, UR-005 | DR-052, DR-097</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.exit_background_audio" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1721-1724">Source</a><h4 class="code-header">pub fn <a href="#method.exit_background_audio" class="fn">exit_background_audio</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a></h4></section></summary><div class="docblock"><p>Leave a background-audio handoff, returning the base offset to add to the
native players relative position.</p>
<p>The webview <code>&lt;video&gt;</code> becomes the player again once it reloads, so its
reports are honoured from here on.</p>
<p>TRACES: UR-040, UR-005 | DR-052, DR-097</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.is_background_audio_active" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1730-1732">Source</a><h4 class="code-header">pub fn <a href="#method.is_background_audio_active" class="fn">is_background_audio_active</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>True while the native audio player owns playback via a background-audio
handoff.</p>
<p>TRACES: UR-040 | DR-052</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.take_background_audio_base" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1737-1740">Source</a><h4 class="code-header">pub fn <a href="#method.take_background_audio_base" class="fn">take_background_audio_base</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a></h4></section></summary><div class="docblock"><p>Read and clear the background-audio base offset.</p>
<p>TRACES: UR-040 | DR-052</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.auto_advance_to_next_episode" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1752-1786">Source</a><h4 class="code-header">pub async fn <a href="#method.auto_advance_to_next_episode" class="fn">auto_advance_to_next_episode</a>(
&amp;self,
next_episode: <a class="struct" href="../repository/types/struct.MediaItem.html" title="struct jellytau_lib::repository::types::MediaItem">MediaItem</a>,
countdown_seconds: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.u32.html">u32</a>,
)</h4></section></summary><div class="docblock"><p>Perform the auto-advance for a <code>ShowNextEpisodePopup</code> decision.</p>
<p>Single place both end-of-playback dispatchers agree on: the Android JNI
callback (<code>nativeOnPlaybackEnded</code>) and the frontend-invoked command
(<code>player_on_playback_ended</code>). They used to each carry their own copy of
this branch, and the commands copy was missing the background-audio case
entirely — so an audio-only episode ending while backgrounded only ever
started a countdown that nothing could act on.</p>
<p>TRACES: UR-040, UR-023 | DR-052</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.is_audio_only_video" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1791-1793">Source</a><h4 class="code-header">fn <a href="#method.is_audio_only_video" class="fn">is_audio_only_video</a>(item: &amp;<a class="struct" href="media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>A video item played through the native <em>audio</em> path — i.e. the background
audio-only handoff, the only place a length-less progressive transcode is
used. Jellyfins item-type taxonomy stays in Rust (CLAUDE.md).</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.claim_stream_resume" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1809-1834">Source</a><h4 class="code-header">fn <a href="#method.claim_stream_resume" class="fn">claim_stream_resume</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;(<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>, <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.u32.html">u32</a>)&gt;</h4></section></summary><div class="docblock"><p>Claim a resume attempt for the current stream, returning the absolute
position to re-open at and the 1-based attempt number. <code>None</code> when the
current item cannot meaningfully be re-requested, or when retrying at this
position has stopped helping.</p>
<p>Only <code>Remote</code> sources qualify. A downloaded file cannot fail because of
the network, so re-opening one would paper over a real read error; a
<code>DirectUrl</code> is a plugins endpoint with no Jellyfin item behind it.</p>
<p>The players position is relative to the streams own zero (the handoff
URLs <code>StartTimeTicks</code>), so the base is added back to get an absolute one.
It is zero for everything else, where positions are already absolute.</p>
<p>TRACES: UR-040, UR-004 | DR-129 | UT-117</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.truncated_stream_resume_position" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1842-1876">Source</a><h4 class="code-header">fn <a href="#method.truncated_stream_resume_position" class="fn">truncated_stream_resume_position</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>&gt;</h4></section></summary><div class="docblock"><p>The absolute position to re-open the current stream at, when the reported
end was really a dropped connection — <code>None</code> when the end looks genuine,
when this is not an audio-only handoff, or when retrying has stopped
helping.</p>
<p>TRACES: UR-040 | DR-129 | UT-117</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.recoverable_error_resume" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1899-1902">Source</a><h4 class="code-header">pub fn <a href="#method.recoverable_error_resume" class="fn">recoverable_error_resume</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;(<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>, <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.u64.html">u64</a>)&gt;</h4></section></summary><div class="docblock"><p>Where to re-open the current stream after a <em>recoverable</em> playback error,
plus how many seconds to wait first.</p>
<p>The media was decoding fine a moment ago, so a mid-playback failure on a
server stream is the network — and stopping the player (the previous
behaviour, via the frontends error handler) turns a hiccup into “playback
just died”. Applies to every streamed item, not only the audio-only
handoff: music and video reach here instead of the truncation path because
their streams declare a length, so a cut connection surfaces as an error
rather than a phantom end.</p>
<p>The wait grows with the attempt number so a short outage has time to
clear, and the shared budget stops the retries when it doesnt.</p>
<p>Called from the Android error callback, which decides in-process, and from
<code>player_recover_stream</code>, which is how the same decision reaches the
backends whose event thread has no controller to call — MPV is built
before the controller exists, so on Linux the error is emitted, echoed by
the frontend, and decided here.</p>
<p>TRACES: UR-040, UR-004 | DR-129, DR-130 | UT-117</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.resume_stream_at" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1930-1978">Source</a><h4 class="code-header">pub async fn <a href="#method.resume_stream_at" class="fn">resume_stream_at</a>(&amp;self, position: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;</h4></section></summary><div class="docblock"><p>Re-open the current stream at <code>position</code> after the network cut it short.</p>
<p>Single place every dispatcher agrees on, for the same reason
<code>auto_advance_to_next_episode</code> is: the Android JNI callbacks and the
frontend-invoked command must not disagree about what a failed stream
means. None of them emits <code>PlaybackEnded</code> for this, so nothing downstream
clears the queue or tears the session down — from the outside this is a
buffering hiccup, which is what it actually was.</p>
<p>Reloads the item <strong>in place</strong> rather than through <code>play_item</code>, which
replaces the queue with a single item: recovering a track that way would
throw away the rest of the album, turning a network blip into lost state.</p>
<p>Two shapes of stream, two ways back to <code>position</code>:</p>
<ul>
<li>The audio-only handoffs <code>/Audio/{id}/universal</code> transcode is chunked
with no length, so it cannot be seeked. Its URL is rewritten to start at
the position instead — edited, not rebuilt from the repository, since it
already carries the users audio track and media source and recovering
from a network failure must not itself need a network round-trip.</li>
<li>Everything else (a static file with byte ranges, an HLS playlist)
declares its whole timeline, so re-preparing the URL it already has and
seeking lands in the right place — and leaves any transcode session
behind it alone.</li>
</ul>
<p>TRACES: UR-040, UR-004 | DR-129 | UT-117</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.advance_to_next_episode_audio_only" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#1994-2061">Source</a><h4 class="code-header">pub async fn <a href="#method.advance_to_next_episode_audio_only" class="fn">advance_to_next_episode_audio_only</a>(
&amp;self,
next_episode_id: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.str.html">str</a>,
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;</h4></section></summary><div class="docblock"><p>Advance to the next episode while playing audio-only in the background.</p>
<p>The normal autoplay-next path navigates the frontend to <code>/player/&lt;id&gt;</code>,
which is unavailable when the app is backgrounded and the WebView is
suspended. This drives the advance entirely in the backend: build the next
episodes <em>audio-only</em> stream URL and load it into the native audio player,
so playback continues without any frontend involvement (UR-040).</p>
<p><code>next_episode_id</code> is the Jellyfin item ID of the episode to play next.</p>
<p>Reached through <code>auto_advance_to_next_episode</code>, which gates it on
<code>current_is_audio_episode()</code> — only ever true after a background-audio
handoff (Android), but compiled and unit-tested on every platform.
TRACES: UR-040, UR-023 | DR-052</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.on_video_playback_ended" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#2069-2154">Source</a><h4 class="code-header">pub async fn <a href="#method.on_video_playback_ended" class="fn">on_video_playback_ended</a>(
&amp;self,
item_id: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.str.html">str</a>,
repo: <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;dyn <a class="trait" href="../repository/trait.MediaRepository.html" title="trait jellytau_lib::repository::MediaRepository">MediaRepository</a>&gt;,
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="enum" href="autoplay/enum.AutoplayDecision.html" title="enum jellytau_lib::player::autoplay::AutoplayDecision">AutoplayDecision</a>, <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;</h4></section></summary><div class="docblock"><p>Handle video playback ended from HTML5 video element.</p>
<p>HTML5 video plays independently of the Rust backend, so the backend
queue has no knowledge of the video item. This method bypasses the
queue lookup and end_reason check, using the provided Jellyfin item ID
to look up the item and check for next episodes.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.is_episode_item" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#2163-2169">Source</a><h4 class="code-header">async fn <a href="#method.is_episode_item" class="fn">is_episode_item</a>(&amp;self, item: &amp;<a class="struct" href="media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Check if a media item is an episode (has Jellyfin ID to query).</p>
<p>An explicit <code>item_type == "Episode"</code> wins so that a TV episode handed off
to the audio path for background playback (UR-040) is still recognised as
an episode — otherwise autoplay would fall through to the queue-based
audio path, find nothing next, and stop at the episode boundary. When the
type is unknown we fall back to the historical heuristic (video == episode).</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.fetch_next_episode_for_item" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#2177-2256">Source</a><h4 class="code-header">async fn <a href="#method.fetch_next_episode_for_item" class="fn">fetch_next_episode_for_item</a>(
&amp;self,
item_id: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.str.html">str</a>,
repo: &amp;<a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;dyn <a class="trait" href="../repository/trait.MediaRepository.html" title="trait jellytau_lib::repository::MediaRepository">MediaRepository</a>&gt;,
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;(<a class="struct" href="../repository/types/struct.MediaItem.html" title="struct jellytau_lib::repository::types::MediaItem">MediaItem</a>, <a class="struct" href="../repository/types/struct.MediaItem.html" title="struct jellytau_lib::repository::types::MediaItem">MediaItem</a>)&gt;, <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;</h4></section></summary><div class="docblock"><p>Fetch next episode for a series by looking up the seasons episodes
sorted by index number and picking the one after the current episode.</p>
<p>This is deterministic and doesnt depend on Jellyfins “Next Up” API
(which relies on watch history that may not be updated yet due to
the async nature of playback progress reporting).</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.start_autoplay_countdown" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#2259-2295">Source</a><h4 class="code-header">pub fn <a href="#method.start_autoplay_countdown" class="fn">start_autoplay_countdown</a>(
&amp;self,
_next_item: <a class="struct" href="../repository/types/struct.MediaItem.html" title="struct jellytau_lib::repository::types::MediaItem">MediaItem</a>,
countdown_seconds: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.u32.html">u32</a>,
)</h4></section></summary><div class="docblock"><p>Start autoplay countdown thread</p>
</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Default-for-PlayerController" class="impl"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#2298-2311">Source</a><a href="#impl-Default-for-PlayerController" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/default/trait.Default.html" title="trait core::default::Default">Default</a> for <a class="struct" href="struct.PlayerController.html" title="struct jellytau_lib::player::PlayerController">PlayerController</a></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.default" class="method trait-impl"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#2299-2310">Source</a><a href="#method.default" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.97.1/core/default/trait.Default.html#tymethod.default" class="fn">default</a>() -&gt; Self</h4></section></summary><div class='docblock'>Returns the “default value” for a type. <a href="https://doc.rust-lang.org/1.97.1/core/default/trait.Default.html#tymethod.default">Read more</a></div></details></div></details></div><h2 id="synthetic-implementations" class="section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-Freeze-for-PlayerController" class="impl"><a href="#impl-Freeze-for-PlayerController" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Freeze.html" title="trait core::marker::Freeze">Freeze</a> for <a class="struct" href="struct.PlayerController.html" title="struct jellytau_lib::player::PlayerController">PlayerController</a></h3></section><section id="impl-RefUnwindSafe-for-PlayerController" class="impl"><a href="#impl-RefUnwindSafe-for-PlayerController" class="anchor">§</a><h3 class="code-header">impl !<a class="trait" href="https://doc.rust-lang.org/1.97.1/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a> for <a class="struct" href="struct.PlayerController.html" title="struct jellytau_lib::player::PlayerController">PlayerController</a></h3></section><section id="impl-Send-for-PlayerController" class="impl"><a href="#impl-Send-for-PlayerController" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="struct" href="struct.PlayerController.html" title="struct jellytau_lib::player::PlayerController">PlayerController</a></h3></section><section id="impl-Sync-for-PlayerController" class="impl"><a href="#impl-Sync-for-PlayerController" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.PlayerController.html" title="struct jellytau_lib::player::PlayerController">PlayerController</a></h3></section><section id="impl-Unpin-for-PlayerController" class="impl"><a href="#impl-Unpin-for-PlayerController" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct.PlayerController.html" title="struct jellytau_lib::player::PlayerController">PlayerController</a></h3></section><section id="impl-UnsafeUnpin-for-PlayerController" class="impl"><a href="#impl-UnsafeUnpin-for-PlayerController" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.UnsafeUnpin.html" title="trait core::marker::UnsafeUnpin">UnsafeUnpin</a> for <a class="struct" href="struct.PlayerController.html" title="struct jellytau_lib::player::PlayerController">PlayerController</a></h3></section><section id="impl-UnwindSafe-for-PlayerController" class="impl"><a href="#impl-UnwindSafe-for-PlayerController" class="anchor">§</a><h3 class="code-header">impl !<a class="trait" href="https://doc.rust-lang.org/1.97.1/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a> for <a class="struct" href="struct.PlayerController.html" title="struct jellytau_lib::player::PlayerController">PlayerController</a></h3></section></div><h2 id="blanket-implementations" class="section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/any.rs.html#141">Source</a><a href="#impl-Any-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T<div class="where">where
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/any.rs.html#142">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.97.1/core/any/trait.Any.html#tymethod.type_id" class="fn">type_id</a>(&amp;self) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.97.1/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></h4></section></summary><div class='docblock'>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/1.97.1/core/any/trait.Any.html#tymethod.type_id">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Borrow%3CT%3E-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/borrow.rs.html#212">Source</a><a href="#impl-Borrow%3CT%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;T&gt; for T<div class="where">where
T: ?<a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/borrow.rs.html#214">Source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.97.1/core/borrow/trait.Borrow.html#tymethod.borrow" class="fn">borrow</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.reference.html">&amp;T</a></h4></section></summary><div class='docblock'>Immutably borrows from an owned value. <a href="https://doc.rust-lang.org/1.97.1/core/borrow/trait.Borrow.html#tymethod.borrow">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-BorrowMut%3CT%3E-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/borrow.rs.html#221">Source</a><a href="#impl-BorrowMut%3CT%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;T&gt; for T<div class="where">where
T: ?<a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/borrow.rs.html#222">Source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.97.1/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut" class="fn">borrow_mut</a>(&amp;mut self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.reference.html">&amp;mut T</a></h4></section></summary><div class='docblock'>Mutably borrows from an owned value. <a href="https://doc.rust-lang.org/1.97.1/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-From%3CT%3E-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/convert/mod.rs.html#786">Source</a><a href="#impl-From%3CT%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt; for T</h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.from" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/convert/mod.rs.html#789">Source</a><a href="#method.from" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.97.1/core/convert/trait.From.html#tymethod.from" class="fn">from</a>(t: T) -&gt; T</h4></section></summary><div class="docblock"><p>Returns the argument unchanged.</p>
</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Instrument-for-T" class="impl"><a href="#impl-Instrument-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; Instrument for T</h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.instrument" class="method trait-impl"><a href="#method.instrument" class="anchor">§</a><h4 class="code-header">fn <a class="fn">instrument</a>(self, span: Span) -&gt; Instrumented&lt;Self&gt;</h4></section></summary><div class='docblock'>Instruments this type with the provided [<code>Span</code>], returning an
<code>Instrumented</code> wrapper. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.in_current_span" class="method trait-impl"><a href="#method.in_current_span" class="anchor">§</a><h4 class="code-header">fn <a class="fn">in_current_span</a>(self) -&gt; Instrumented&lt;Self&gt;</h4></section></summary><div class='docblock'>Instruments this type with the <a href="super::Span::current()">current</a> <a href="crate::Span"><code>Span</code></a>, returning an
<code>Instrumented</code> wrapper. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Into%3CU%3E-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/convert/mod.rs.html#768-770">Source</a><a href="#impl-Into%3CU%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T, U&gt; <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;U&gt; for T<div class="where">where
U: <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt;,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.into" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/convert/mod.rs.html#778">Source</a><a href="#method.into" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.97.1/core/convert/trait.Into.html#tymethod.into" class="fn">into</a>(self) -&gt; U</h4></section></summary><div class="docblock"><p>Calls <code>U::from(self)</code>.</p>
<p>That is, this conversion is whatever the implementation of
<code><a href="https://doc.rust-lang.org/1.97.1/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt; for U</code> chooses to do.</p>
</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-NoneValue-for-T" class="impl"><a href="#impl-NoneValue-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; NoneValue for T<div class="where">where
T: <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/default/trait.Default.html" title="trait core::default::Default">Default</a>,</div></h3></section></summary><div class="impl-items"><section id="associatedtype.NoneType" class="associatedtype trait-impl"><a href="#associatedtype.NoneType" class="anchor">§</a><h4 class="code-header">type <a class="associatedtype">NoneType</a> = T</h4></section><details class="toggle method-toggle" open><summary><section id="method.null_value" class="method trait-impl"><a href="#method.null_value" class="anchor">§</a><h4 class="code-header">fn <a class="fn">null_value</a>() -&gt; T</h4></section></summary><div class='docblock'>The none-equivalent value.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-PolicyExt-for-T" class="impl"><a href="#impl-PolicyExt-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; PolicyExt for T<div class="where">where
T: ?<a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.and" class="method trait-impl"><a href="#method.and" class="anchor">§</a><h4 class="code-header">fn <a class="fn">and</a>&lt;P, B, E&gt;(self, other: P) -&gt; And&lt;T, P&gt;<div class="where">where
T: Policy&lt;B, E&gt;,
P: Policy&lt;B, E&gt;,</div></h4></section></summary><div class='docblock'>Create a new <code>Policy</code> that returns [<code>Action::Follow</code>] only if <code>self</code> and <code>other</code> return
<code>Action::Follow</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.or" class="method trait-impl"><a href="#method.or" class="anchor">§</a><h4 class="code-header">fn <a class="fn">or</a>&lt;P, B, E&gt;(self, other: P) -&gt; Or&lt;T, P&gt;<div class="where">where
T: Policy&lt;B, E&gt;,
P: Policy&lt;B, E&gt;,</div></h4></section></summary><div class='docblock'>Create a new <code>Policy</code> that returns [<code>Action::Follow</code>] if either <code>self</code> or <code>other</code> returns
<code>Action::Follow</code>. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a class="src rightside" href="https://docs.rs/typenum/1.19.0/src/typenum/type_operators.rs.html#34">Source</a><a href="#impl-Same-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/typenum/1.19.0/typenum/type_operators/trait.Same.html" title="trait typenum::type_operators::Same">Same</a> for T</h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Output" class="associatedtype trait-impl"><a class="src rightside" href="https://docs.rs/typenum/1.19.0/src/typenum/type_operators.rs.html#35">Source</a><a href="#associatedtype.Output" class="anchor">§</a><h4 class="code-header">type <a href="https://docs.rs/typenum/1.19.0/typenum/type_operators/trait.Same.html#associatedtype.Output" class="associatedtype">Output</a> = T</h4></section></summary><div class='docblock'>Should always be <code>Self</code></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-TryFrom%3CU%3E-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/convert/mod.rs.html#828-830">Source</a><a href="#impl-TryFrom%3CU%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T, U&gt; <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;U&gt; for T<div class="where">where
U: <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;T&gt;,</div></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error-1" class="associatedtype trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/convert/mod.rs.html#832">Source</a><a href="#associatedtype.Error-1" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryFrom.html#associatedtype.Error" class="associatedtype">Error</a> = <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/convert/enum.Infallible.html" title="enum core::convert::Infallible">Infallible</a></h4></section></summary><div class='docblock'>The type returned in the event of a conversion error.</div></details><details class="toggle method-toggle" open><summary><section id="method.try_from" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/convert/mod.rs.html#835">Source</a><a href="#method.try_from" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryFrom.html#tymethod.try_from" class="fn">try_from</a>(value: U) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;T, &lt;T as <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;U&gt;&gt;::<a class="associatedtype" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>&gt;</h4></section></summary><div class='docblock'>Performs the conversion.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-TryInto%3CU%3E-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/convert/mod.rs.html#812-814">Source</a><a href="#impl-TryInto%3CU%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T, U&gt; <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryInto.html" title="trait core::convert::TryInto">TryInto</a>&lt;U&gt; for T<div class="where">where
U: <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;,</div></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/convert/mod.rs.html#816">Source</a><a href="#associatedtype.Error" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryInto.html#associatedtype.Error" class="associatedtype">Error</a> = &lt;U as <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;&gt;::<a class="associatedtype" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a></h4></section></summary><div class='docblock'>The type returned in the event of a conversion error.</div></details><details class="toggle method-toggle" open><summary><section id="method.try_into" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.97.1/src/core/convert/mod.rs.html#819">Source</a><a href="#method.try_into" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryInto.html#tymethod.try_into" class="fn">try_into</a>(self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;U, &lt;U as <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;&gt;::<a class="associatedtype" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>&gt;</h4></section></summary><div class='docblock'>Performs the conversion.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-VZip%3CV%3E-for-T" class="impl"><a href="#impl-VZip%3CV%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;V, T&gt; VZip&lt;V&gt; for T<div class="where">where
V: MultiLane&lt;T&gt;,</div></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-T" class="impl"><a href="#impl-WithSubscriber-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; WithSubscriber for T</h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.with_subscriber" class="method trait-impl"><a href="#method.with_subscriber" class="anchor">§</a><h4 class="code-header">fn <a class="fn">with_subscriber</a>&lt;S&gt;(self, subscriber: S) -&gt; WithDispatch&lt;Self&gt;<div class="where">where
S: <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Dispatch&gt;,</div></h4></section></summary><div class='docblock'>Attaches the provided <a href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
[<code>WithDispatch</code>] wrapper. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a href="#method.with_current_subscriber" class="anchor">§</a><h4 class="code-header">fn <a class="fn">with_current_subscriber</a>(self) -&gt; WithDispatch&lt;Self&gt;</h4></section></summary><div class='docblock'>Attaches the current <a href="dispatcher#setting-the-default-subscriber">default</a> <a href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
[<code>WithDispatch</code>] wrapper. <a>Read more</a></div></details></div></details></div><script type="text/json" id="notable-traits-data">{"Arc<EventThrottler>":"<h3>Notable traits for <code><a class=\"struct\" href=\"https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html\" title=\"struct alloc::sync::Arc\">Arc</a>&lt;R&gt;</code></h3><pre><code><div class=\"where\">impl&lt;R&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Read.html\" title=\"trait std::io::Read\">Read</a> for <a class=\"struct\" href=\"https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html\" title=\"struct alloc::sync::Arc\">Arc</a>&lt;R&gt;<div class=\"where\">where\n R: <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Read.html\" title=\"trait std::io::Read\">Read</a> + <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.IoHandle.html\" title=\"trait std::io::IoHandle\">IoHandle</a> + ?<a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/core/marker/trait.Sized.html\" title=\"trait core::marker::Sized\">Sized</a>,\n <a class=\"primitive\" href=\"https://doc.rust-lang.org/1.97.1/std/primitive.reference.html\">&amp;'a R</a>: for&lt;'a&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Read.html\" title=\"trait std::io::Read\">Read</a>,</div></div><div class=\"where\">impl&lt;W&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Write.html\" title=\"trait std::io::Write\">Write</a> for <a class=\"struct\" href=\"https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html\" title=\"struct alloc::sync::Arc\">Arc</a>&lt;W&gt;<div class=\"where\">where\n W: <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Write.html\" title=\"trait std::io::Write\">Write</a> + <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.IoHandle.html\" title=\"trait std::io::IoHandle\">IoHandle</a> + ?<a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/core/marker/trait.Sized.html\" title=\"trait core::marker::Sized\">Sized</a>,\n <a class=\"primitive\" href=\"https://doc.rust-lang.org/1.97.1/std/primitive.reference.html\">&amp;'a W</a>: for&lt;'a&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Write.html\" title=\"trait std::io::Write\">Write</a>,</div></div>","Arc<Mutex<Option<JellyfinClient>>>":"<h3>Notable traits for <code><a class=\"struct\" href=\"https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html\" title=\"struct alloc::sync::Arc\">Arc</a>&lt;R&gt;</code></h3><pre><code><div class=\"where\">impl&lt;R&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Read.html\" title=\"trait std::io::Read\">Read</a> for <a class=\"struct\" href=\"https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html\" title=\"struct alloc::sync::Arc\">Arc</a>&lt;R&gt;<div class=\"where\">where\n R: <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Read.html\" title=\"trait std::io::Read\">Read</a> + <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.IoHandle.html\" title=\"trait std::io::IoHandle\">IoHandle</a> + ?<a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/core/marker/trait.Sized.html\" title=\"trait core::marker::Sized\">Sized</a>,\n <a class=\"primitive\" href=\"https://doc.rust-lang.org/1.97.1/std/primitive.reference.html\">&amp;'a R</a>: for&lt;'a&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Read.html\" title=\"trait std::io::Read\">Read</a>,</div></div><div class=\"where\">impl&lt;W&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Write.html\" title=\"trait std::io::Write\">Write</a> for <a class=\"struct\" href=\"https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html\" title=\"struct alloc::sync::Arc\">Arc</a>&lt;W&gt;<div class=\"where\">where\n W: <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Write.html\" title=\"trait std::io::Write\">Write</a> + <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.IoHandle.html\" title=\"trait std::io::IoHandle\">IoHandle</a> + ?<a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/core/marker/trait.Sized.html\" title=\"trait core::marker::Sized\">Sized</a>,\n <a class=\"primitive\" href=\"https://doc.rust-lang.org/1.97.1/std/primitive.reference.html\">&amp;'a W</a>: for&lt;'a&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Write.html\" title=\"trait std::io::Write\">Write</a>,</div></div>","Arc<Mutex<QueueManager>>":"<h3>Notable traits for <code><a class=\"struct\" href=\"https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html\" title=\"struct alloc::sync::Arc\">Arc</a>&lt;R&gt;</code></h3><pre><code><div class=\"where\">impl&lt;R&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Read.html\" title=\"trait std::io::Read\">Read</a> for <a class=\"struct\" href=\"https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html\" title=\"struct alloc::sync::Arc\">Arc</a>&lt;R&gt;<div class=\"where\">where\n R: <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Read.html\" title=\"trait std::io::Read\">Read</a> + <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.IoHandle.html\" title=\"trait std::io::IoHandle\">IoHandle</a> + ?<a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/core/marker/trait.Sized.html\" title=\"trait core::marker::Sized\">Sized</a>,\n <a class=\"primitive\" href=\"https://doc.rust-lang.org/1.97.1/std/primitive.reference.html\">&amp;'a R</a>: for&lt;'a&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Read.html\" title=\"trait std::io::Read\">Read</a>,</div></div><div class=\"where\">impl&lt;W&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Write.html\" title=\"trait std::io::Write\">Write</a> for <a class=\"struct\" href=\"https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html\" title=\"struct alloc::sync::Arc\">Arc</a>&lt;W&gt;<div class=\"where\">where\n W: <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Write.html\" title=\"trait std::io::Write\">Write</a> + <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.IoHandle.html\" title=\"trait std::io::IoHandle\">IoHandle</a> + ?<a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/core/marker/trait.Sized.html\" title=\"trait core::marker::Sized\">Sized</a>,\n <a class=\"primitive\" href=\"https://doc.rust-lang.org/1.97.1/std/primitive.reference.html\">&amp;'a W</a>: for&lt;'a&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Write.html\" title=\"trait std::io::Write\">Write</a>,</div></div>","Arc<TokioMutex<Option<PlaybackReporter>>>":"<h3>Notable traits for <code><a class=\"struct\" href=\"https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html\" title=\"struct alloc::sync::Arc\">Arc</a>&lt;R&gt;</code></h3><pre><code><div class=\"where\">impl&lt;R&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Read.html\" title=\"trait std::io::Read\">Read</a> for <a class=\"struct\" href=\"https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html\" title=\"struct alloc::sync::Arc\">Arc</a>&lt;R&gt;<div class=\"where\">where\n R: <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Read.html\" title=\"trait std::io::Read\">Read</a> + <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.IoHandle.html\" title=\"trait std::io::IoHandle\">IoHandle</a> + ?<a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/core/marker/trait.Sized.html\" title=\"trait core::marker::Sized\">Sized</a>,\n <a class=\"primitive\" href=\"https://doc.rust-lang.org/1.97.1/std/primitive.reference.html\">&amp;'a R</a>: for&lt;'a&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Read.html\" title=\"trait std::io::Read\">Read</a>,</div></div><div class=\"where\">impl&lt;W&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Write.html\" title=\"trait std::io::Write\">Write</a> for <a class=\"struct\" href=\"https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html\" title=\"struct alloc::sync::Arc\">Arc</a>&lt;W&gt;<div class=\"where\">where\n W: <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Write.html\" title=\"trait std::io::Write\">Write</a> + <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.IoHandle.html\" title=\"trait std::io::IoHandle\">IoHandle</a> + ?<a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/core/marker/trait.Sized.html\" title=\"trait core::marker::Sized\">Sized</a>,\n <a class=\"primitive\" href=\"https://doc.rust-lang.org/1.97.1/std/primitive.reference.html\">&amp;'a W</a>: for&lt;'a&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.97.1/std/io/trait.Write.html\" title=\"trait std::io::Write\">Write</a>,</div></div>"}</script></section></div></main></body></html>