docs: publish site from 5fede123
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
<!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="API documentation for the Rust `autoplay` mod in crate `jellytau_lib`."><title>jellytau_lib::player::autoplay - 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 mod"><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="#">Module autoplay</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module autoplay</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#enums" title="Enums">Enums</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>Module <span>autoplay</span> <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/autoplay.rs.html#3-119">Source</a> </span></div><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.AutoplaySettings.html" title="struct jellytau_lib::player::autoplay::AutoplaySettings">Autoplay<wbr>Settings</a></dt><dd>Autoplay settings (controls next episode behavior)</dd></dl><h2 id="enums" class="section-header">Enums<a href="#enums" class="anchor">§</a></h2><dl class="item-table"><dt><a class="enum" href="enum.AutoplayDecision.html" title="enum jellytau_lib::player::autoplay::AutoplayDecision">Autoplay<wbr>Decision</a></dt><dd>Autoplay decision result - determines what happens after playback ends</dd></dl></section></div></main></body></html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"enum":["AutoplayDecision"],"struct":["AutoplaySettings"]};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
<!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="API documentation for the Rust `backend` mod in crate `jellytau_lib`."><title>jellytau_lib::player::backend - 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 mod"><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="#">Module backend</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module backend</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#traits" title="Traits">Traits</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>Module <span>backend</span> <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/backend.rs.html#1-533">Source</a> </span></div><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.NullBackend.html" title="struct jellytau_lib::player::backend::NullBackend">Null<wbr>Backend</a></dt><dd>Null player backend (for testing or when no real player is available)</dd><dt><a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">Player<wbr>Error</a></dt><dd>Error type for player operations</dd></dl><h2 id="traits" class="section-header">Traits<a href="#traits" class="anchor">§</a></h2><dl class="item-table"><dt><a class="trait" href="trait.PlayerBackend.html" title="trait jellytau_lib::player::backend::PlayerBackend">Player<wbr>Backend</a></dt><dd>Player backend trait - implemented by platform-specific players</dd></dl></section></div></main></body></html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"struct":["NullBackend","PlayerError"],"trait":["PlayerBackend"]};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,72 @@
|
||||
<!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="Player backend trait - implemented by platform-specific players"><title>PlayerBackend in jellytau_lib::player::backend - 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 trait"><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="#">PlayerBackend</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Player<wbr>Backend</a></h2><h3><a href="#required-methods">Required Methods</a></h3><ul class="block"><li><a href="#tymethod.duration" title="duration">duration</a></li><li><a href="#tymethod.load" title="load">load</a></li><li><a href="#tymethod.pause" title="pause">pause</a></li><li><a href="#tymethod.play" title="play">play</a></li><li><a href="#tymethod.position" title="position">position</a></li><li><a href="#tymethod.seek" title="seek">seek</a></li><li><a href="#tymethod.set_volume" title="set_volume">set_volume</a></li><li><a href="#tymethod.state" title="state">state</a></li><li><a href="#tymethod.stop" title="stop">stop</a></li><li><a href="#tymethod.volume" title="volume">volume</a></li></ul><h3><a href="#provided-methods">Provided Methods</a></h3><ul class="block"><li><a href="#method.audio_settings" title="audio_settings">audio_settings</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_subtitle_track" title="set_subtitle_track">set_subtitle_track</a></li></ul><h3><a href="#implementors">Implementors</a></h3></section><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>backend</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>::<wbr><a href="index.html">backend</a></div><h1>Trait <span class="trait">Player<wbr>Backend</span> <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/backend.rs.html#40-124">Source</a> </span></div><pre class="rust item-decl"><code>pub trait PlayerBackend: <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> {
|
||||
<details class="toggle type-contents-toggle"><summary class="hideme"><span>Show 14 methods</span></summary> // Required methods
|
||||
fn <a href="#tymethod.load" class="fn">load</a>(&mut self, media: &<a class="struct" href="../media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>>;
|
||||
<span class="item-spacer"></span> fn <a href="#tymethod.play" class="fn">play</a>(&mut self) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>>;
|
||||
<span class="item-spacer"></span> fn <a href="#tymethod.pause" class="fn">pause</a>(&mut self) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>>;
|
||||
<span class="item-spacer"></span> fn <a href="#tymethod.stop" class="fn">stop</a>(&mut self) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>>;
|
||||
<span class="item-spacer"></span> fn <a href="#tymethod.seek" class="fn">seek</a>(&mut self, position: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>>;
|
||||
<span class="item-spacer"></span> fn <a href="#tymethod.set_volume" class="fn">set_volume</a>(&mut self, volume: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f32.html">f32</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>>;
|
||||
<span class="item-spacer"></span> fn <a href="#tymethod.position" class="fn">position</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>;
|
||||
<span class="item-spacer"></span> fn <a href="#tymethod.duration" class="fn">duration</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>>;
|
||||
<span class="item-spacer"></span> fn <a href="#tymethod.state" class="fn">state</a>(&self) -> <a class="enum" href="../state/enum.PlayerState.html" title="enum jellytau_lib::player::state::PlayerState">PlayerState</a>;
|
||||
<span class="item-spacer"></span> fn <a href="#tymethod.volume" class="fn">volume</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f32.html">f32</a>;
|
||||
|
||||
// Provided methods
|
||||
fn <a href="#method.set_audio_settings" class="fn">set_audio_settings</a>(
|
||||
&mut self,
|
||||
_settings: &<a class="struct" href="../../settings/struct.AudioSettings.html" title="struct jellytau_lib::settings::AudioSettings">AudioSettings</a>,
|
||||
) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>> { ... }
|
||||
<span class="item-spacer"></span> fn <a href="#method.audio_settings" class="fn">audio_settings</a>(&self) -> <a class="struct" href="../../settings/struct.AudioSettings.html" title="struct jellytau_lib::settings::AudioSettings">AudioSettings</a> { ... }
|
||||
<span class="item-spacer"></span> fn <a href="#method.set_audio_track" class="fn">set_audio_track</a>(&mut self, _stream_index: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.i32.html">i32</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>> { ... }
|
||||
<span class="item-spacer"></span> fn <a href="#method.set_subtitle_track" class="fn">set_subtitle_track</a>(
|
||||
&mut 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><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.i32.html">i32</a>>,
|
||||
) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>> { ... }
|
||||
</details>}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Player backend trait - implemented by platform-specific players</p>
|
||||
<p>TRACES: UR-003, UR-004 | IR-003, IR-004 | DR-004</p>
|
||||
</div></details><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.load" class="method"><a class="src rightside" href="../../../src/jellytau_lib/player/backend.rs.html#43">Source</a><h4 class="code-header">fn <a href="#tymethod.load" class="fn">load</a>(&mut self, media: &<a class="struct" href="../media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>></h4></section></summary><div class="docblock"><p>Load a media item for playback
|
||||
TRACES: UR-005</p>
|
||||
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.play" class="method"><a class="src rightside" href="../../../src/jellytau_lib/player/backend.rs.html#47">Source</a><h4 class="code-header">fn <a href="#tymethod.play" class="fn">play</a>(&mut self) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>></h4></section></summary><div class="docblock"><p>Start or resume playback
|
||||
TRACES: UR-005</p>
|
||||
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.pause" class="method"><a class="src rightside" href="../../../src/jellytau_lib/player/backend.rs.html#51">Source</a><h4 class="code-header">fn <a href="#tymethod.pause" class="fn">pause</a>(&mut self) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>></h4></section></summary><div class="docblock"><p>Pause playback
|
||||
TRACES: UR-005</p>
|
||||
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.stop" class="method"><a class="src rightside" href="../../../src/jellytau_lib/player/backend.rs.html#55">Source</a><h4 class="code-header">fn <a href="#tymethod.stop" class="fn">stop</a>(&mut self) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>></h4></section></summary><div class="docblock"><p>Stop playback and unload media
|
||||
TRACES: UR-005</p>
|
||||
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.seek" class="method"><a class="src rightside" href="../../../src/jellytau_lib/player/backend.rs.html#59">Source</a><h4 class="code-header">fn <a href="#tymethod.seek" class="fn">seek</a>(&mut self, position: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>></h4></section></summary><div class="docblock"><p>Seek to a position in seconds
|
||||
TRACES: UR-005</p>
|
||||
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.set_volume" class="method"><a class="src rightside" href="../../../src/jellytau_lib/player/backend.rs.html#63">Source</a><h4 class="code-header">fn <a href="#tymethod.set_volume" class="fn">set_volume</a>(&mut self, volume: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f32.html">f32</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>></h4></section></summary><div class="docblock"><p>Set volume (0.0 - 1.0)
|
||||
TRACES: UR-016</p>
|
||||
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.position" class="method"><a class="src rightside" href="../../../src/jellytau_lib/player/backend.rs.html#66">Source</a><h4 class="code-header">fn <a href="#tymethod.position" class="fn">position</a>(&self) -> <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 playback position in seconds</p>
|
||||
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.duration" class="method"><a class="src rightside" href="../../../src/jellytau_lib/player/backend.rs.html#69">Source</a><h4 class="code-header">fn <a href="#tymethod.duration" class="fn">duration</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<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 total duration in seconds</p>
|
||||
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.state" class="method"><a class="src rightside" href="../../../src/jellytau_lib/player/backend.rs.html#72">Source</a><h4 class="code-header">fn <a href="#tymethod.state" class="fn">state</a>(&self) -> <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 player state</p>
|
||||
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.volume" class="method"><a class="src rightside" href="../../../src/jellytau_lib/player/backend.rs.html#75">Source</a><h4 class="code-header">fn <a href="#tymethod.volume" class="fn">volume</a>(&self) -> <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</p>
|
||||
</div></details></div><h2 id="provided-methods" class="section-header">Provided Methods<a href="#provided-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="method.set_audio_settings" class="method"><a class="src rightside" href="../../../src/jellytau_lib/player/backend.rs.html#85-88">Source</a><h4 class="code-header">fn <a href="#method.set_audio_settings" class="fn">set_audio_settings</a>(
|
||||
&mut self,
|
||||
_settings: &<a class="struct" href="../../settings/struct.AudioSettings.html" title="struct jellytau_lib::settings::AudioSettings">AudioSettings</a>,
|
||||
) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>></h4></section></summary><div class="docblock"><p>Apply audio settings (crossfade, gapless, normalization)</p>
|
||||
<p>@req-partial: UR-031 (Linux only) - Crossfade between audio tracks
|
||||
@req-partial: UR-032 (Linux only) - Gapless playback for seamless album listening
|
||||
@req-partial: UR-033 (Linux only) - Volume normalization to prevent volume jumps
|
||||
@req: DR-034 - Crossfade engine with configurable duration (0-12s)
|
||||
@req: DR-035 - Gapless playback between sequential tracks
|
||||
@req: DR-036 - Volume normalization with preset levels (Loud/Normal/Quiet)</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/backend.rs.html#95-97">Source</a><h4 class="code-header">fn <a href="#method.audio_settings" class="fn">audio_settings</a>(&self) -> <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>
|
||||
<p>@req: DR-034 - Crossfade engine
|
||||
@req: DR-035 - Gapless playback
|
||||
@req: DR-036 - Volume normalization</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/backend.rs.html#107-110">Source</a><h4 class="code-header">fn <a href="#method.set_audio_track" class="fn">set_audio_track</a>(&mut self, _stream_index: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.i32.html">i32</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>></h4></section></summary><div class="docblock"><p>Set the active audio track by stream index</p>
|
||||
<p>Overridden by the Android (ExoPlayer) backend. <code>MpvBackend</code> deliberately
|
||||
does <strong>not</strong> override it — MPV is the audio-only backend here, so it keeps
|
||||
this <code>not_implemented()</code> default and the Linux video path switches track by
|
||||
re-opening the stream instead (<code>player_switch_audio_track</code>).</p>
|
||||
<p>TRACES: UR-021 | IR-019, DR-024</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/backend.rs.html#120-123">Source</a><h4 class="code-header">fn <a href="#method.set_subtitle_track" class="fn">set_subtitle_track</a>(
|
||||
&mut 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><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.i32.html">i32</a>>,
|
||||
) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.unit.html">()</a>, <a class="struct" href="struct.PlayerError.html" title="struct jellytau_lib::player::backend::PlayerError">PlayerError</a>></h4></section></summary><div class="docblock"><p>Set the active subtitle track by stream index (None to disable subtitles)</p>
|
||||
<p>Overridden by the Android (ExoPlayer) backend. <code>MpvBackend</code> deliberately
|
||||
does <strong>not</strong> override it, so it keeps this <code>not_implemented()</code> default;
|
||||
the Linux video path renders subtitles as <code><track></code> children of the
|
||||
WebKitGTK HTML5 <code><video></code> element and never calls this.</p>
|
||||
<p>TRACES: UR-020 | IR-018, DR-023</p>
|
||||
</div></details></div><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><div class="negative-marker"></div><section id="impl-PlayerBackend-for-MpvBackend" class="impl"><a class="src rightside" href="../../../src/jellytau_lib/player/mpv_backend.rs.html#453-649">Source</a><a href="#impl-PlayerBackend-for-MpvBackend" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.PlayerBackend.html" title="trait jellytau_lib::player::backend::PlayerBackend">PlayerBackend</a> for <a class="struct" href="../mpv_backend/struct.MpvBackend.html" title="struct jellytau_lib::player::mpv_backend::MpvBackend">MpvBackend</a></h3></section><section id="impl-PlayerBackend-for-NullBackend" class="impl"><a class="src rightside" href="../../../src/jellytau_lib/player/backend.rs.html#155-249">Source</a><a href="#impl-PlayerBackend-for-NullBackend" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.PlayerBackend.html" title="trait jellytau_lib::player::backend::PlayerBackend">PlayerBackend</a> for <a class="struct" href="struct.NullBackend.html" title="struct jellytau_lib::player::backend::NullBackend">NullBackend</a></h3></section></div><script src="../../../trait.impl/jellytau_lib/player/backend/trait.PlayerBackend.js" async></script></section></div></main></body></html>
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,14 @@
|
||||
<!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="Decide what backgrounding should do."><title>background_action in jellytau_lib::player::background_policy - 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 fn"><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="#">background_action</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>background_<wbr>policy</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>::<wbr><a href="index.html">background_policy</a></div><h1>Function <span class="fn">background_<wbr>action</span> <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/background_policy.rs.html#54-76">Source</a> </span></div><pre class="rust item-decl"><code>pub fn background_action(
|
||||
is_video: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>,
|
||||
background_audio_armed: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>,
|
||||
in_picture_in_picture: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>,
|
||||
) -> <a class="enum" href="enum.BackgroundAction.html" title="enum jellytau_lib::player::background_policy::BackgroundAction">BackgroundAction</a></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Decide what backgrounding should do.</p>
|
||||
<ul>
|
||||
<li><code>is_video</code> — whether the current item has a picture to lose. Music is
|
||||
never paused by backgrounding; that is what a music player is for.</li>
|
||||
<li><code>background_audio_armed</code> — the per-player toggle (UR-040).</li>
|
||||
<li><code>in_picture_in_picture</code> — the app is not “gone”, it is in a floating
|
||||
window and still visible. Pausing here would break PiP (UR-041).</li>
|
||||
</ul>
|
||||
<p>TRACES: UR-040, UR-041 | DR-224 | UT-211</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,3 @@
|
||||
<!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="Whether a media type has a picture that backgrounding would throw away."><title>is_video_media in jellytau_lib::player::background_policy - 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 fn"><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="#">is_video_media</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>background_<wbr>policy</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>::<wbr><a href="index.html">background_policy</a></div><h1>Function <span class="fn">is_<wbr>video_<wbr>media</span> <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/background_policy.rs.html#81-83">Source</a> </span></div><pre class="rust item-decl"><code>pub fn is_video_media(media_type: <a class="enum" href="../media/enum.MediaType.html" title="enum jellytau_lib::player::media::MediaType">MediaType</a>) -> <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Whether a media type has a picture that backgrounding would throw away.</p>
|
||||
<p>TRACES: UR-040 | DR-224</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,22 @@
|
||||
<!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="What playback should do when the app stops being visible."><title>jellytau_lib::player::background_policy - 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 mod"><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="#">Module background_policy</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module background_<wbr>policy</a></h2><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#the-defect-this-exists-for" title="The defect this exists for">The defect this exists for</a></li><li><a href="#why-the-decision-lives-in-rust" title="Why the decision lives in Rust">Why the decision lives in Rust</a></li></ul><h3><a href="#enums">Module Items</a></h3><ul class="block"><li><a href="#enums" title="Enums">Enums</a></li><li><a href="#functions" title="Functions">Functions</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>Module <span>background_<wbr>policy</span> <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/background_policy.rs.html#1-155">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>What playback should do when the app stops being visible.</p>
|
||||
<p>TRACES: UR-040 | DR-224 | UT-211</p>
|
||||
<h2 id="the-defect-this-exists-for"><a class="doc-anchor" href="#the-defect-this-exists-for">§</a>The defect this exists for</h2>
|
||||
<p>The per-player background-audio toggle (UR-040) was built for the WebView
|
||||
<code><video></code> path, where backgrounding the app kills the decode: the toggle
|
||||
decided whether to <em>hand off</em> to a native audio stream or let playback die.</p>
|
||||
<p>Native video then became the default renderer (DR-188). On that path playback
|
||||
runs through ExoPlayer inside a <code>MediaSessionService</code> — a foreground media
|
||||
service whose entire purpose is to keep playing when the app is not visible.
|
||||
Nothing stops it, and nothing in the codebase paused playback on background.</p>
|
||||
<p>So locking the screen kept the audio playing <strong>whether or not the toggle was
|
||||
on</strong>. The toggle governed a handoff that no longer had anything to hand off
|
||||
<em>from</em>: there was no gap in playback to bridge. A user who had never touched
|
||||
it got background audio anyway, which is the bug as reported.</p>
|
||||
<h2 id="why-the-decision-lives-in-rust"><a class="doc-anchor" href="#why-the-decision-lives-in-rust">§</a>Why the decision lives in Rust</h2>
|
||||
<p>It depends on what the item <em>is</em> (a video keeps its picture; music has none
|
||||
to lose) and on a user setting — domain questions, not presentation ones, and
|
||||
the answer must be identical for both renderers. The frontend and the Android
|
||||
activity carry it out; neither decides it. Putting the rule in either would
|
||||
have reproduced exactly the split that caused this: two renderers, two
|
||||
behaviours, one toggle that only reached one of them.</p>
|
||||
</div></details><h2 id="enums" class="section-header">Enums<a href="#enums" class="anchor">§</a></h2><dl class="item-table"><dt><a class="enum" href="enum.BackgroundAction.html" title="enum jellytau_lib::player::background_policy::BackgroundAction">Background<wbr>Action</a></dt><dd>What the player should do when the app is backgrounded.</dd></dl><h2 id="functions" class="section-header">Functions<a href="#functions" class="anchor">§</a></h2><dl class="item-table"><dt><a class="fn" href="fn.background_action.html" title="fn jellytau_lib::player::background_policy::background_action">background_<wbr>action</a></dt><dd>Decide what backgrounding should do.</dd><dt><a class="fn" href="fn.is_video_media.html" title="fn jellytau_lib::player::background_policy::is_video_media">is_<wbr>video_<wbr>media</a></dt><dd>Whether a media type has a picture that backgrounding would throw away.</dd></dl></section></div></main></body></html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"enum":["BackgroundAction"],"fn":["background_action","is_video_media"]};
|
||||
@@ -0,0 +1,7 @@
|
||||
<!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="Seconds added per attempt before retrying a stream that failed with an error."><title>RESUME_BACKOFF_STEP_SECS 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 constant"><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="#">RESUME_BACKOFF_STEP_SECS</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.10.1</span></h2></div><div class="sidebar-elems"><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>Constant <span class="constant">RESUME_<wbr>BACKOFF_<wbr>STEP_<wbr>SECS</span> <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#136">Source</a> </span></div><pre class="rust item-decl"><code>const RESUME_BACKOFF_STEP_SECS: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.u64.html">u64</a> = 2;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Seconds added per attempt before retrying a stream that failed with an error.</p>
|
||||
<p>Attempt 1 waits this long, attempt 2 twice as long, and so on — a spread that
|
||||
covers roughly a quarter-minute of outage across the retry budget without
|
||||
leaving the user staring at a dead notification when the network is truly gone.
|
||||
Only <em>read</em> by the Android error callback (<code>#[cfg(android)]</code>), but compiled
|
||||
and unit-tested on the host, hence <code>allow(dead_code)</code> off-Android.</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
|
||||
<!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="Player events for frontend communication via Tauri events."><title>jellytau_lib::player::events - 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 mod"><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="#">Module events</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module events</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#enums" title="Enums">Enums</a></li><li><a href="#traits" title="Traits">Traits</a></li><li><a href="#types" title="Type Aliases">Type Aliases</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>Module <span>events</span> <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/events.rs.html#1-386">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Player events for frontend communication via Tauri events.</p>
|
||||
<p>These events are emitted from the player backend to notify the frontend
|
||||
of playback state changes, position updates, etc.</p>
|
||||
<p>TRACES: UR-005, UR-019, UR-023, UR-026 | DR-001, DR-028, DR-047</p>
|
||||
</div></details><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.TauriEventEmitter.html" title="struct jellytau_lib::player::events::TauriEventEmitter">Tauri<wbr>Event<wbr>Emitter</a></dt><dd>Tauri-based implementation of PlayerEventEmitter.</dd></dl><h2 id="enums" class="section-header">Enums<a href="#enums" class="anchor">§</a></h2><dl class="item-table"><dt><a class="enum" href="enum.PlayerStatusEvent.html" title="enum jellytau_lib::player::events::PlayerStatusEvent">Player<wbr>Status<wbr>Event</a></dt><dd>Events emitted by the player backend to the frontend via Tauri events.</dd></dl><h2 id="traits" class="section-header">Traits<a href="#traits" class="anchor">§</a></h2><dl class="item-table"><dt><a class="trait" href="trait.PlayerEventEmitter.html" title="trait jellytau_lib::player::events::PlayerEventEmitter">Player<wbr>Event<wbr>Emitter</a></dt><dd>Trait for emitting player events to the frontend.</dd></dl><h2 id="types" class="section-header">Type Aliases<a href="#types" class="anchor">§</a></h2><dl class="item-table"><dt><a class="type" href="type.SharedEventEmitter.html" title="type jellytau_lib::player::events::SharedEventEmitter">Shared<wbr>Event<wbr>Emitter</a></dt><dd>Thread-safe wrapper for event emitters.</dd></dl></section></div></main></body></html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"enum":["PlayerStatusEvent"],"struct":["TauriEventEmitter"],"trait":["PlayerEventEmitter"],"type":["SharedEventEmitter"]};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
<!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="Trait for emitting player events to the frontend."><title>PlayerEventEmitter in jellytau_lib::player::events - 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 trait"><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="#">PlayerEventEmitter</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Player<wbr>Event<wbr>Emitter</a></h2><h3><a href="#required-methods">Required Methods</a></h3><ul class="block"><li><a href="#tymethod.emit" title="emit">emit</a></li></ul><h3><a href="#implementors">Implementors</a></h3></section><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>events</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>::<wbr><a href="index.html">events</a></div><h1>Trait <span class="trait">Player<wbr>Event<wbr>Emitter</span> <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/events.rs.html#190-193">Source</a> </span></div><pre class="rust item-decl"><code>pub trait PlayerEventEmitter: <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> {
|
||||
// Required method
|
||||
fn <a href="#tymethod.emit" class="fn">emit</a>(&self, event: <a class="enum" href="enum.PlayerStatusEvent.html" title="enum jellytau_lib::player::events::PlayerStatusEvent">PlayerStatusEvent</a>);
|
||||
}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Trait for emitting player events to the frontend.</p>
|
||||
<p>This abstraction allows backends to emit events without depending
|
||||
directly on Tauri, making them easier to test.</p>
|
||||
</div></details><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.emit" class="method"><a class="src rightside" href="../../../src/jellytau_lib/player/events.rs.html#192">Source</a><h4 class="code-header">fn <a href="#tymethod.emit" class="fn">emit</a>(&self, event: <a class="enum" href="enum.PlayerStatusEvent.html" title="enum jellytau_lib::player::events::PlayerStatusEvent">PlayerStatusEvent</a>)</h4></section></summary><div class="docblock"><p>Emit a player status event to the frontend</p>
|
||||
</div></details></div><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><div class="negative-marker"></div><section id="impl-PlayerEventEmitter-for-TauriEventEmitter" class="impl"><a class="src rightside" href="../../../src/jellytau_lib/player/events.rs.html#209-217">Source</a><a href="#impl-PlayerEventEmitter-for-TauriEventEmitter" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.PlayerEventEmitter.html" title="trait jellytau_lib::player::events::PlayerEventEmitter">PlayerEventEmitter</a> for <a class="struct" href="struct.TauriEventEmitter.html" title="struct jellytau_lib::player::events::TauriEventEmitter">TauriEventEmitter</a></h3></section></div><script src="../../../trait.impl/jellytau_lib/player/events/trait.PlayerEventEmitter.js" async></script></section></div></main></body></html>
|
||||
@@ -0,0 +1,2 @@
|
||||
<!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="Thread-safe wrapper for event emitters."><title>SharedEventEmitter in jellytau_lib::player::events - 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 type"><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="#">SharedEventEmitter</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Shared<wbr>Event<wbr>Emitter</a></h2><h3><a href="#aliased-type">Aliased Type</a></h3></section><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>events</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>::<wbr><a href="index.html">events</a></div><h1>Type Alias <span class="type">Shared<wbr>Event<wbr>Emitter</span> <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/events.rs.html#221">Source</a> </span></div><pre class="rust item-decl"><code>pub type SharedEventEmitter = <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a><dyn <a class="trait" href="trait.PlayerEventEmitter.html" title="trait jellytau_lib::player::events::PlayerEventEmitter">PlayerEventEmitter</a>>;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Thread-safe wrapper for event emitters.</p>
|
||||
</div></details><h2 id="aliased-type" class="section-header">Aliased Type<a href="#aliased-type" class="anchor">§</a></h2><pre class="rust item-decl"><code>pub struct SharedEventEmitter { <span class="comment">/* private fields */</span> }</code></pre><script src="../../../type.impl/alloc/sync/struct.Arc.js" data-self-path="jellytau_lib::player::events::SharedEventEmitter" async></script></section></div></main></body></html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<!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="The position to report when a stream ends naturally."><title>completion_report_position 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 fn"><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="#">completion_report_position</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.10.1</span></h2></div><div class="sidebar-elems"><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>Function <span class="fn">completion_<wbr>report_<wbr>position</span> <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#121-126">Source</a> </span></div><pre class="rust item-decl"><code>fn completion_report_position(runtime: <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>>, last_position: <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.f64.html">f64</a></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>The position to report when a stream ends naturally.</p>
|
||||
<p>The item’s runtime when we know it, because the point of the report is to say
|
||||
the episode <em>finished</em> and Jellyfin decides that by percentage — the last
|
||||
position actually observed can be seconds short, and on a handoff whose ticks
|
||||
stopped early it can be nowhere near the end. Without a runtime the best
|
||||
available answer is where playback got to.</p>
|
||||
<p>TRACES: UR-025, UR-040 | DR-179 | UT-179</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<!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="Set the base offset (seconds) added to positions reported to the Android lockscreen scrubber. Used by the background-audio handoff: the audio stream starts at the handoff point (StartTimeTicks), so ExoPlayer’s position is relative and must be shifted back to absolute to match the full duration. Pass 0.0 to clear on exit. No-op off Android."><title>set_lockscreen_position_offset 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 fn"><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="#">set_lockscreen_position_offset</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.10.1</span></h2></div><div class="sidebar-elems"><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>Function <span class="fn">set_<wbr>lockscreen_<wbr>position_<wbr>offset</span> <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#184-193">Source</a> </span></div><pre class="rust item-decl"><code>pub fn set_lockscreen_position_offset(
|
||||
_offset_seconds: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>,
|
||||
) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<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>></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Set the base offset (seconds) added to positions reported to the Android
|
||||
lockscreen scrubber. Used by the background-audio handoff: the audio stream
|
||||
starts at the handoff point (StartTimeTicks), so ExoPlayer’s position is
|
||||
relative and must be shifted back to absolute to match the full duration.
|
||||
Pass 0.0 to clear on exit. No-op off Android.</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<!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="Push now-playing metadata to the Android lockscreen. No-op off Android, so the session poller can call it unconditionally and stay platform-agnostic."><title>update_lockscreen_metadata 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 fn"><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="#">update_lockscreen_metadata</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.10.1</span></h2></div><div class="sidebar-elems"><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>Function <span class="fn">update_<wbr>lockscreen_<wbr>metadata</span> <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#168-177">Source</a> </span></div><pre class="rust item-decl"><code>pub fn update_lockscreen_metadata(
|
||||
_meta: &<a class="struct" href="struct.LockscreenMetadata.html" title="struct jellytau_lib::player::LockscreenMetadata">LockscreenMetadata</a>,
|
||||
) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<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>></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Push now-playing metadata to the Android lockscreen. No-op off Android, so the
|
||||
session poller can call it unconditionally and stay platform-agnostic.</p>
|
||||
<p>No-op on Linux specifically because there is no MPRIS/D-Bus publisher — see
|
||||
IR-005, which is still Planned.</p>
|
||||
<p>TRACES: UR-006 | IR-006</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
<!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="API documentation for the Rust `media` mod in crate `jellytau_lib`."><title>jellytau_lib::player::media - 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 mod"><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="#">Module media</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module media</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#enums" title="Enums">Enums</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>Module <span>media</span> <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/media.rs.html#1-580">Source</a> </span></div><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">Media<wbr>Item</a></dt><dd>Represents a media item that can be played</dd><dt><a class="struct" href="struct.SubtitleTrack.html" title="struct jellytau_lib::player::media::SubtitleTrack">Subtitle<wbr>Track</a></dt><dd>Represents a subtitle track</dd></dl><h2 id="enums" class="section-header">Enums<a href="#enums" class="anchor">§</a></h2><dl class="item-table"><dt><a class="enum" href="enum.MediaSource.html" title="enum jellytau_lib::player::media::MediaSource">Media<wbr>Source</a></dt><dd>TRACES: UR-002, UR-003, UR-004, UR-011 | DR-003</dd><dt><a class="enum" href="enum.MediaType.html" title="enum jellytau_lib::player::media::MediaType">Media<wbr>Type</a></dt><dt><a class="enum" href="enum.QueueContext.html" title="enum jellytau_lib::player::media::QueueContext">Queue<wbr>Context</a></dt><dd>Context for the current queue - where did the queue items come from?
|
||||
This is used for remote playback transfer to send album/playlist context.</dd></dl></section></div></main></body></html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"enum":["MediaSource","MediaType","QueueContext"],"struct":["MediaItem","SubtitleTrack"]};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
<!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="Reference loudness the peak table is anchored at (Normal preset, −14 LUFS)."><title>NORMALIZE_REF_LUFS in jellytau_lib::player::mpv_backend - 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 constant"><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="#">NORMALIZE_REF_LUFS</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>mpv_<wbr>backend</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>::<wbr><a href="index.html">mpv_backend</a></div><h1>Constant <span class="constant">NORMALIZE_<wbr>REF_<wbr>LUFS</span> <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/mpv_backend.rs.html#698">Source</a> </span></div><pre class="rust item-decl"><code>const NORMALIZE_REF_LUFS: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f32.html">f32</a> = -14.0;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Reference loudness the peak table is anchored at (Normal preset, −14 LUFS).</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,3 @@
|
||||
<!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="Reference peak (`dynaudnorm` `p`, linear amplitude) for the default `VolumeLevel::Normal` (−14 LUFS) target, leaving −1.2 dB of headroom."><title>NORMALIZE_REF_PEAK in jellytau_lib::player::mpv_backend - 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 constant"><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="#">NORMALIZE_REF_PEAK</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>mpv_<wbr>backend</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>::<wbr><a href="index.html">mpv_backend</a></div><h1>Constant <span class="constant">NORMALIZE_<wbr>REF_<wbr>PEAK</span> <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/mpv_backend.rs.html#696">Source</a> </span></div><pre class="rust item-decl"><code>const NORMALIZE_REF_PEAK: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f32.html">f32</a> = 0.87;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Reference peak (<code>dynaudnorm</code> <code>p</code>, linear amplitude) for the default
|
||||
<a href="../../settings/enum.VolumeLevel.html#variant.Normal" title="variant jellytau_lib::settings::VolumeLevel::Normal"><code>VolumeLevel::Normal</code></a> (−14 LUFS) target, leaving −1.2 dB of headroom.</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,7 @@
|
||||
<!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="Build the full MPV `af` (audio filter) value from the audio settings."><title>build_af_filter in jellytau_lib::player::mpv_backend - 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 fn"><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="#">build_af_filter</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>mpv_<wbr>backend</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>::<wbr><a href="index.html">mpv_backend</a></div><h1>Function <span class="fn">build_<wbr>af_<wbr>filter</span> <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/mpv_backend.rs.html#659-669">Source</a> </span></div><pre class="rust item-decl"><code>fn build_af_filter(settings: &<a class="struct" href="../../settings/struct.AudioSettings.html" title="struct jellytau_lib::settings::AudioSettings">AudioSettings</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></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Build the full MPV <code>af</code> (audio filter) value from the audio settings.</p>
|
||||
<p>Combines the equalizer peaking bands and the loudness-normalization filter
|
||||
into a single <code>lavfi</code> graph, because MPV exposes one <code>af</code> property. The
|
||||
normalizer runs <em>after</em> the EQ so it levels the post-EQ signal. Returns an
|
||||
empty string when neither feature contributes a filter, which clears <code>af</code>.</p>
|
||||
<p>TRACES: UR-027, UR-033 | IR-020, DR-036</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,2 @@
|
||||
<!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="Detect which audio system is available on the system"><title>detect_audio_system in jellytau_lib::player::mpv_backend - 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 fn"><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="#">detect_audio_system</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>mpv_<wbr>backend</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>::<wbr><a href="index.html">mpv_backend</a></div><h1>Function <span class="fn">detect_<wbr>audio_<wbr>system</span> <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/mpv_backend.rs.html#45-79">Source</a> </span></div><pre class="rust item-decl"><code>fn detect_audio_system() -> <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/string/struct.String.html" title="struct alloc::string::String">String</a></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Detect which audio system is available on the system</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<!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="Peaking-EQ filter entries (unwrapped), one ffmpeg `equalizer` (two-pole peaking) per band with a non-zero gain, e.g. `equalizer=f=31:width_type=o:width=1:g=5`. Returns an empty vec when the EQ is disabled or every gain is ~0. Gains are assumed already normalised by `AudioSettings::with_equalizer_normalised`; bands beyond `EQ_BANDS` are ignored."><title>eq_filter_entries in jellytau_lib::player::mpv_backend - 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 fn"><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="#">eq_filter_entries</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>mpv_<wbr>backend</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>::<wbr><a href="index.html">mpv_backend</a></div><h1>Function <span class="fn">eq_<wbr>filter_<wbr>entries</span> <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/mpv_backend.rs.html#679-692">Source</a> </span></div><pre class="rust item-decl"><code>fn eq_filter_entries(enabled: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>, bands: &[<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f32.html">f32</a>]) -> <a class="struct" href="https://doc.rust-lang.org/1.97.1/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</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>></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Peaking-EQ filter entries (unwrapped), one ffmpeg <code>equalizer</code> (two-pole
|
||||
peaking) per band with a non-zero gain, e.g.
|
||||
<code>equalizer=f=31:width_type=o:width=1:g=5</code>. Returns an empty vec when the EQ
|
||||
is disabled or every gain is ~0. Gains are assumed already normalised by
|
||||
<a href="../../settings/struct.AudioSettings.html#method.with_equalizer_normalised" title="method jellytau_lib::settings::AudioSettings::with_equalizer_normalised"><code>AudioSettings::with_equalizer_normalised</code></a>; bands beyond <a href="../../settings/constant.EQ_BANDS.html" title="constant jellytau_lib::settings::EQ_BANDS"><code>EQ_BANDS</code></a> are
|
||||
ignored.</p>
|
||||
<p>TRACES: UR-027 | IR-020</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,2 @@
|
||||
<!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="Helper to get stream URL from MediaItem"><title>get_stream_url in jellytau_lib::player::mpv_backend - 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 fn"><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="#">get_stream_url</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>mpv_<wbr>backend</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>::<wbr><a href="index.html">mpv_backend</a></div><h1>Function <span class="fn">get_<wbr>stream_<wbr>url</span> <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/mpv_backend.rs.html#82-90">Source</a> </span></div><pre class="rust item-decl"><code>fn get_stream_url(media: &<a class="struct" href="../media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</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></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Helper to get stream URL from MediaItem</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,12 @@
|
||||
<!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="The loudness-normalization filter entry (unwrapped), or `None` when normalization is disabled. Uses ffmpeg’s `dynaudnorm`, a gentle real-time dynamic normalizer that avoids the gain “pumping” `loudnorm`’s single-pass mode can produce on very dynamic material."><title>normalize_filter_entry in jellytau_lib::player::mpv_backend - 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 fn"><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="#">normalize_filter_entry</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>mpv_<wbr>backend</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>::<wbr><a href="index.html">mpv_backend</a></div><h1>Function <span class="fn">normalize_<wbr>filter_<wbr>entry</span> <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/mpv_backend.rs.html#713-722">Source</a> </span></div><pre class="rust item-decl"><code>fn normalize_filter_entry(enabled: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>, level: <a class="enum" href="../../settings/enum.VolumeLevel.html" title="enum jellytau_lib::settings::VolumeLevel">VolumeLevel</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</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>></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>The loudness-normalization filter entry (unwrapped), or <code>None</code> when
|
||||
normalization is disabled. Uses ffmpeg’s <code>dynaudnorm</code>, a gentle real-time
|
||||
dynamic normalizer that avoids the gain “pumping” <code>loudnorm</code>’s single-pass
|
||||
mode can produce on very dynamic material.</p>
|
||||
<p><code>dynaudnorm</code> targets a peak amplitude (<code>p</code>, linear 0–1), not a LUFS value,
|
||||
so the Loud/Normal/Quiet presets become <em>approximate</em>: each preset’s LUFS
|
||||
offset from the Normal reference is applied as a dB offset to the reference
|
||||
peak, preserving the Loud > Normal > Quiet ordering. <code>g=15</code> (gaussian window
|
||||
size) further smooths gain changes; the peak is clamped to a safe (0, 0.99]
|
||||
so loud presets never request full-scale.</p>
|
||||
<p>TRACES: UR-033 | DR-036</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<!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="API documentation for the Rust `mpv_backend` mod in crate `jellytau_lib`."><title>jellytau_lib::player::mpv_backend - 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 mod"><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="#">Module mpv_backend</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module mpv_<wbr>backend</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#constants" title="Constants">Constants</a></li><li><a href="#functions" title="Functions">Functions</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>Module <span>mpv_<wbr>backend</span> <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/mpv_backend.rs.html#1-847">Source</a> </span></div><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.InternalState.html" title="struct jellytau_lib::player::mpv_backend::InternalState">Internal<wbr>State</a><span title="Restricted Visibility"> 🔒</span> </dt><dt><a class="struct" href="struct.MpvBackend.html" title="struct jellytau_lib::player::mpv_backend::MpvBackend">MpvBackend</a></dt><dd>MPV-based player backend for Linux</dd></dl><h2 id="constants" class="section-header">Constants<a href="#constants" class="anchor">§</a></h2><dl class="item-table"><dt><a class="constant" href="constant.NORMALIZE_REF_LUFS.html" title="constant jellytau_lib::player::mpv_backend::NORMALIZE_REF_LUFS">NORMALIZE_<wbr>REF_<wbr>LUFS</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Reference loudness the peak table is anchored at (Normal preset, −14 LUFS).</dd><dt><a class="constant" href="constant.NORMALIZE_REF_PEAK.html" title="constant jellytau_lib::player::mpv_backend::NORMALIZE_REF_PEAK">NORMALIZE_<wbr>REF_<wbr>PEAK</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Reference peak (<code>dynaudnorm</code> <code>p</code>, linear amplitude) for the default
|
||||
<a href="../../settings/enum.VolumeLevel.html#variant.Normal" title="variant jellytau_lib::settings::VolumeLevel::Normal"><code>VolumeLevel::Normal</code></a> (−14 LUFS) target, leaving −1.2 dB of headroom.</dd></dl><h2 id="functions" class="section-header">Functions<a href="#functions" class="anchor">§</a></h2><dl class="item-table"><dt><a class="fn" href="fn.build_af_filter.html" title="fn jellytau_lib::player::mpv_backend::build_af_filter">build_<wbr>af_<wbr>filter</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Build the full MPV <code>af</code> (audio filter) value from the audio settings.</dd><dt><a class="fn" href="fn.detect_audio_system.html" title="fn jellytau_lib::player::mpv_backend::detect_audio_system">detect_<wbr>audio_<wbr>system</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Detect which audio system is available on the system</dd><dt><a class="fn" href="fn.eq_filter_entries.html" title="fn jellytau_lib::player::mpv_backend::eq_filter_entries">eq_<wbr>filter_<wbr>entries</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Peaking-EQ filter entries (unwrapped), one ffmpeg <code>equalizer</code> (two-pole
|
||||
peaking) per band with a non-zero gain, e.g.
|
||||
<code>equalizer=f=31:width_type=o:width=1:g=5</code>. Returns an empty vec when the EQ
|
||||
is disabled or every gain is ~0. Gains are assumed already normalised by
|
||||
<a href="../../settings/struct.AudioSettings.html#method.with_equalizer_normalised" title="method jellytau_lib::settings::AudioSettings::with_equalizer_normalised"><code>AudioSettings::with_equalizer_normalised</code></a>; bands beyond <a href="../../settings/constant.EQ_BANDS.html" title="constant jellytau_lib::settings::EQ_BANDS"><code>EQ_BANDS</code></a> are
|
||||
ignored.</dd><dt><a class="fn" href="fn.get_stream_url.html" title="fn jellytau_lib::player::mpv_backend::get_stream_url">get_<wbr>stream_<wbr>url</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Helper to get stream URL from MediaItem</dd><dt><a class="fn" href="fn.normalize_filter_entry.html" title="fn jellytau_lib::player::mpv_backend::normalize_filter_entry">normalize_<wbr>filter_<wbr>entry</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>The loudness-normalization filter entry (unwrapped), or <code>None</code> when
|
||||
normalization is disabled. Uses ffmpeg’s <code>dynaudnorm</code>, a gentle real-time
|
||||
dynamic normalizer that avoids the gain “pumping” <code>loudnorm</code>’s single-pass
|
||||
mode can produce on very dynamic material.</dd></dl></section></div></main></body></html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"constant":["NORMALIZE_REF_LUFS","NORMALIZE_REF_PEAK"],"fn":["build_af_filter","detect_audio_system","eq_filter_entries","get_stream_url","normalize_filter_entry"],"struct":["InternalState","MpvBackend"]};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
<!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="API documentation for the Rust `queue` mod in crate `jellytau_lib`."><title>jellytau_lib::player::queue - 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 mod"><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="#">Module queue</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module queue</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#enums" title="Enums">Enums</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>Module <span>queue</span> <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/queue.rs.html#1-1016">Source</a> </span></div><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.QueueManager.html" title="struct jellytau_lib::player::queue::QueueManager">Queue<wbr>Manager</a></dt><dd>Queue manager for playlist functionality</dd></dl><h2 id="enums" class="section-header">Enums<a href="#enums" class="anchor">§</a></h2><dl class="item-table"><dt><a class="enum" href="enum.AddPosition.html" title="enum jellytau_lib::player::queue::AddPosition">AddPosition</a></dt><dd>Position to add items to the queue</dd><dt><a class="enum" href="enum.RepeatMode.html" title="enum jellytau_lib::player::queue::RepeatMode">Repeat<wbr>Mode</a></dt><dd>Repeat mode for the queue</dd></dl></section></div></main></body></html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"enum":["AddPosition","RepeatMode"],"struct":["QueueManager"]};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,4 @@
|
||||
<!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="How far a lockscreen skip-back jumps while background audio owns playback."><title>SKIP_BACK_SECONDS in jellytau_lib::player::seek - 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 constant"><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="#">SKIP_BACK_SECONDS</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>seek</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>::<wbr><a href="index.html">seek</a></div><h1>Constant <span class="constant">SKIP_<wbr>BACK_<wbr>SECONDS</span> <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/seek.rs.html#74">Source</a> </span></div><pre class="rust item-decl"><code>pub const SKIP_BACK_SECONDS: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a> = 10.0;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>How far a lockscreen skip-back jumps while background audio owns playback.</p>
|
||||
<p>Deliberately shorter than the forward jump: the back button is used to replay
|
||||
dialogue just missed, not to travel.</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,2 @@
|
||||
<!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="How far a lockscreen skip-forward jumps while background audio owns playback."><title>SKIP_FORWARD_SECONDS in jellytau_lib::player::seek - 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 constant"><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="#">SKIP_FORWARD_SECONDS</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>seek</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>::<wbr><a href="index.html">seek</a></div><h1>Constant <span class="constant">SKIP_<wbr>FORWARD_<wbr>SECONDS</span> <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/seek.rs.html#67">Source</a> </span></div><pre class="rust item-decl"><code>pub const SKIP_FORWARD_SECONDS: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a> = 30.0;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>How far a lockscreen skip-forward jumps while background audio owns playback.</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,15 @@
|
||||
<!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="Determine the video seek strategy based on stream characteristics."><title>determine_video_seek_strategy in jellytau_lib::player::seek - 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 fn"><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="#">determine_video_seek_strategy</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">determine_<wbr>video_<wbr>seek_<wbr>strategy</a></h2><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#arguments" title="Arguments">Arguments</a></li></ul></section><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>seek</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>::<wbr><a href="index.html">seek</a></div><h1>Function <span class="fn">determine_<wbr>video_<wbr>seek_<wbr>strategy</span> <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/seek.rs.html#31-60">Source</a> </span></div><pre class="rust item-decl"><code>pub fn determine_video_seek_strategy(
|
||||
is_local: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>,
|
||||
is_hls: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>,
|
||||
needs_transcoding: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>,
|
||||
use_html5: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>,
|
||||
) -> <a class="enum" href="enum.VideoSeekStrategy.html" title="enum jellytau_lib::player::seek::VideoSeekStrategy">VideoSeekStrategy</a></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Determine the video seek strategy based on stream characteristics.</p>
|
||||
<p>This is a pure function extracted for testability.</p>
|
||||
<h2 id="arguments"><a class="doc-anchor" href="#arguments">§</a>Arguments</h2>
|
||||
<ul>
|
||||
<li><code>is_local</code> - Whether the file is a local download</li>
|
||||
<li><code>is_hls</code> - Whether the stream URL contains “.m3u8” (HLS stream)</li>
|
||||
<li><code>needs_transcoding</code> - Whether the content needs transcoding</li>
|
||||
<li><code>use_html5</code> - Whether frontend is using HTML5 video element</li>
|
||||
</ul>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,20 @@
|
||||
<!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="Decide whether a lockscreen skip advances the queue or scrubs the current item."><title>resolve_skip_action in jellytau_lib::player::seek - 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 fn"><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="#">resolve_skip_action</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>seek</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>::<wbr><a href="index.html">seek</a></div><h1>Function <span class="fn">resolve_<wbr>skip_<wbr>action</span> <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/seek.rs.html#105-127">Source</a> </span></div><pre class="rust item-decl"><code>pub fn resolve_skip_action(
|
||||
is_next: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>,
|
||||
is_background_audio: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a>,
|
||||
position: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>,
|
||||
duration: <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>>,
|
||||
) -> <a class="enum" href="enum.SkipAction.html" title="enum jellytau_lib::player::seek::SkipAction">SkipAction</a></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Decide whether a lockscreen skip advances the queue or scrubs the current item.</p>
|
||||
<p>Music gets queue advance, which is what the buttons look like they do. A video
|
||||
whose audio is playing through a background-audio handoff (UR-040) gets a
|
||||
relative scrub instead: there is no meaningful “next track” inside a film, and
|
||||
jumping to the next <em>episode</em> because the user wanted to re-hear a line is a
|
||||
much worse outcome than a scrub.</p>
|
||||
<p><code>is_background_audio</code> is the whole test, and it is sufficient on its own —
|
||||
the handoff exists only for video, and an episode played through it reports
|
||||
<code>MediaType::Audio</code>, so media type cannot distinguish this case (see the note
|
||||
at <code>PlayerController::auto_advance_to_next_episode</code>).</p>
|
||||
<p>Clamped to <code>[0, duration]</code> so a skip near either end lands in the item rather
|
||||
than at a negative offset or past the end, which some backends treat as EOF
|
||||
and would turn a scrub into an unintended advance.</p>
|
||||
<p>TRACES: UR-040, UR-006 | DR-201</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,5 @@
|
||||
<!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="Video seek strategy decision logic."><title>jellytau_lib::player::seek - 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 mod"><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="#">Module seek</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module seek</a></h2><h3><a href="#enums">Module Items</a></h3><ul class="block"><li><a href="#enums" title="Enums">Enums</a></li><li><a href="#constants" title="Constants">Constants</a></li><li><a href="#functions" title="Functions">Functions</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>Module <span>seek</span> <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/seek.rs.html#1-282">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Video seek strategy decision logic.</p>
|
||||
<p>This is pure logic, extracted from the command layer so it can be unit-tested
|
||||
in the player core. The <code>player_seek_video</code> command translates the resulting
|
||||
<a href="enum.VideoSeekStrategy.html" title="enum jellytau_lib::player::seek::VideoSeekStrategy"><code>VideoSeekStrategy</code></a> into a concrete backend/frontend action.</p>
|
||||
</div></details><h2 id="enums" class="section-header">Enums<a href="#enums" class="anchor">§</a></h2><dl class="item-table"><dt><a class="enum" href="enum.SkipAction.html" title="enum jellytau_lib::player::seek::SkipAction">Skip<wbr>Action</a></dt><dd>What a lockscreen skip button means for the playback that is actually running.</dd><dt><a class="enum" href="enum.VideoSeekStrategy.html" title="enum jellytau_lib::player::seek::VideoSeekStrategy">Video<wbr>Seek<wbr>Strategy</a></dt><dd>Seek strategy for video playback, derived from a stream’s characteristics.</dd></dl><h2 id="constants" class="section-header">Constants<a href="#constants" class="anchor">§</a></h2><dl class="item-table"><dt><a class="constant" href="constant.SKIP_BACK_SECONDS.html" title="constant jellytau_lib::player::seek::SKIP_BACK_SECONDS">SKIP_<wbr>BACK_<wbr>SECONDS</a></dt><dd>How far a lockscreen skip-back jumps while background audio owns playback.</dd><dt><a class="constant" href="constant.SKIP_FORWARD_SECONDS.html" title="constant jellytau_lib::player::seek::SKIP_FORWARD_SECONDS">SKIP_<wbr>FORWARD_<wbr>SECONDS</a></dt><dd>How far a lockscreen skip-forward jumps while background audio owns playback.</dd></dl><h2 id="functions" class="section-header">Functions<a href="#functions" class="anchor">§</a></h2><dl class="item-table"><dt><a class="fn" href="fn.determine_video_seek_strategy.html" title="fn jellytau_lib::player::seek::determine_video_seek_strategy">determine_<wbr>video_<wbr>seek_<wbr>strategy</a></dt><dd>Determine the video seek strategy based on stream characteristics.</dd><dt><a class="fn" href="fn.resolve_skip_action.html" title="fn jellytau_lib::player::seek::resolve_skip_action">resolve_<wbr>skip_<wbr>action</a></dt><dd>Decide whether a lockscreen skip advances the queue or scrubs the current item.</dd></dl></section></div></main></body></html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"constant":["SKIP_BACK_SECONDS","SKIP_FORWARD_SECONDS"],"enum":["SkipAction","VideoSeekStrategy"],"fn":["determine_video_seek_strategy","resolve_skip_action"]};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
<!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="API documentation for the Rust `session` mod in crate `jellytau_lib`."><title>jellytau_lib::player::session - 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 mod"><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="#">Module session</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module session</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#enums" title="Enums">Enums</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>Module <span>session</span> <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/session.rs.html#1-380">Source</a> </span></div><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.MediaSessionManager.html" title="struct jellytau_lib::player::session::MediaSessionManager">Media<wbr>Session<wbr>Manager</a></dt><dd>Manages media session state transitions</dd></dl><h2 id="enums" class="section-header">Enums<a href="#enums" class="anchor">§</a></h2><dl class="item-table"><dt><a class="enum" href="enum.MediaSessionType.html" title="enum jellytau_lib::player::session::MediaSessionType">Media<wbr>Session<wbr>Type</a></dt><dd>Media session type tracking the high-level playback context</dd></dl></section></div></main></body></html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"enum":["MediaSessionType"],"struct":["MediaSessionManager"]};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"constant":["RESUME_BACKOFF_STEP_SECS"],"fn":["completion_report_position","set_lockscreen_position_offset","update_lockscreen_metadata"],"mod":["autoplay","backend","background_policy","events","media","mpv_backend","queue","seek","session","sleep_timer","state","stream_end"],"struct":["LockscreenMetadata","PlayerController","ReporterSink"],"trait":["PlaybackReportSink"]};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
<!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="API documentation for the Rust `sleep_timer` mod in crate `jellytau_lib`."><title>jellytau_lib::player::sleep_timer - 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 mod"><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="#">Module sleep_timer</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module sleep_<wbr>timer</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#enums" title="Enums">Enums</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>Module <span>sleep_<wbr>timer</span> <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/sleep_timer.rs.html#1-151">Source</a> </span></div><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.SleepTimerState.html" title="struct jellytau_lib::player::sleep_timer::SleepTimerState">Sleep<wbr>Timer<wbr>State</a></dt><dd>Sleep timer state</dd></dl><h2 id="enums" class="section-header">Enums<a href="#enums" class="anchor">§</a></h2><dl class="item-table"><dt><a class="enum" href="enum.SleepTimerMode.html" title="enum jellytau_lib::player::sleep_timer::SleepTimerMode">Sleep<wbr>Timer<wbr>Mode</a></dt><dd>Sleep timer mode - determines when playback should stop
|
||||
TRACES: UR-026 | DR-029</dd></dl></section></div></main></body></html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"enum":["SleepTimerMode"],"struct":["SleepTimerState"]};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
<!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="API documentation for the Rust `state` mod in crate `jellytau_lib`."><title>jellytau_lib::player::state - 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 mod"><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="#">Module state</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module state</a></h2><h3><a href="#enums">Module Items</a></h3><ul class="block"><li><a href="#enums" title="Enums">Enums</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>Module <span>state</span> <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/state.rs.html#1-347">Source</a> </span></div><h2 id="enums" class="section-header">Enums<a href="#enums" class="anchor">§</a></h2><dl class="item-table"><dt><a class="enum" href="enum.EndReason.html" title="enum jellytau_lib::player::state::EndReason">EndReason</a></dt><dd>Tracks why playback ended to determine autoplay behavior</dd><dt><a class="enum" href="enum.PlayerState.html" title="enum jellytau_lib::player::state::PlayerState">Player<wbr>State</a></dt><dd>Player state machine (6 states: Idle, Loading, Playing, Paused, Seeking, Error)</dd></dl></section></div></main></body></html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"enum":["EndReason","PlayerState"]};
|
||||
@@ -0,0 +1,5 @@
|
||||
<!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="Consecutive resume attempts allowed at the same position before giving up."><title>MAX_STALLED_RESUME_ATTEMPTS in jellytau_lib::player::stream_end - 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 constant"><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="#">MAX_STALLED_RESUME_ATTEMPTS</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>stream_<wbr>end</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>::<wbr><a href="index.html">stream_end</a></div><h1>Constant <span class="constant">MAX_<wbr>STALLED_<wbr>RESUME_<wbr>ATTEMPTS</span> <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/stream_end.rs.html#44">Source</a> </span></div><pre class="rust item-decl"><code>pub const MAX_STALLED_RESUME_ATTEMPTS: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.u32.html">u32</a> = 3;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Consecutive resume attempts allowed at the same position before giving up.</p>
|
||||
<p>A resume re-opens the same URL, so a server that is genuinely gone would
|
||||
otherwise end → resume → end forever. Progress past the last attempt resets
|
||||
the budget (see <a href="struct.ResumeTracker.html" title="struct jellytau_lib::player::stream_end::ResumeTracker"><code>ResumeTracker</code></a>), so this only bounds <em>stuck</em> retries.</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,3 @@
|
||||
<!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="Position change that counts as “this is a different playback context” — either the resume made progress, or a different item is loaded."><title>RESUME_PROGRESS_EPSILON_SECS in jellytau_lib::player::stream_end - 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 constant"><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="#">RESUME_PROGRESS_EPSILON_SECS</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>stream_<wbr>end</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>::<wbr><a href="index.html">stream_end</a></div><h1>Constant <span class="constant">RESUME_<wbr>PROGRESS_<wbr>EPSILON_<wbr>SECS</span> <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/stream_end.rs.html#48">Source</a> </span></div><pre class="rust item-decl"><code>const RESUME_PROGRESS_EPSILON_SECS: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a> = 1.0;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Position change that counts as “this is a different playback context” —
|
||||
either the resume made progress, or a different item is loaded.</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<!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="How far short of the item’s runtime a stream may end and still count as a natural finish."><title>TRUNCATED_STREAM_TOLERANCE_SECS in jellytau_lib::player::stream_end - 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 constant"><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="#">TRUNCATED_STREAM_TOLERANCE_SECS</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>stream_<wbr>end</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>::<wbr><a href="index.html">stream_end</a></div><h1>Constant <span class="constant">TRUNCATED_<wbr>STREAM_<wbr>TOLERANCE_<wbr>SECS</span> <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/stream_end.rs.html#37">Source</a> </span></div><pre class="rust item-decl"><code>pub const TRUNCATED_STREAM_TOLERANCE_SECS: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a> = 10.0;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>How far short of the item’s runtime a stream may end and still count as a
|
||||
natural finish.</p>
|
||||
<p>Sized to swallow the two sources of slack in the comparison — the position
|
||||
poll is up to 250 ms stale, and Jellyfin’s reported runtime can disagree with
|
||||
the transcoded output by a second or two — while staying far below the
|
||||
minutes-long gap a dropped connection leaves. Erring long is the safe
|
||||
direction: a false “finished” is the bug we are fixing, whereas a false
|
||||
“truncated” only re-opens the stream for its last few seconds and then ends
|
||||
again normally.</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,5 @@
|
||||
<!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="A video item played through the native audio path — i.e. the background audio-only handoff, the only place a length-less progressive transcode is used. Jellyfin’s item-type taxonomy stays in Rust (CLAUDE.md)."><title>is_audio_only_video in jellytau_lib::player::stream_end - 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 fn"><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="#">is_audio_only_video</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>stream_<wbr>end</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>::<wbr><a href="index.html">stream_end</a></div><h1>Function <span class="fn">is_<wbr>audio_<wbr>only_<wbr>video</span> <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/stream_end.rs.html#55-58">Source</a> </span></div><pre class="rust item-decl"><code>pub fn is_audio_only_video(item: &<a class="struct" href="../media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>) -> <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></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. Jellyfin’s item-type taxonomy stays in Rust (CLAUDE.md).</p>
|
||||
<p>TRACES: UR-040 | DR-129, DR-203 | UT-117, UT-200</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,14 @@
|
||||
<!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="Did this end-of-stream happen far enough short of the item’s runtime to be a truncation rather than a finish?"><title>is_truncated_end in jellytau_lib::player::stream_end - 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 fn"><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="#">is_truncated_end</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>stream_<wbr>end</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>::<wbr><a href="index.html">stream_end</a></div><h1>Function <span class="fn">is_<wbr>truncated_<wbr>end</span> <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/stream_end.rs.html#106-114">Source</a> </span></div><pre class="rust item-decl"><code>pub fn is_truncated_end(
|
||||
position: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>,
|
||||
duration: <a class="enum" href="https://doc.rust-lang.org/1.97.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</a>>,
|
||||
tolerance: <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.bool.html">bool</a></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Did this end-of-stream happen far enough short of the item’s runtime to be a
|
||||
truncation rather than a finish?</p>
|
||||
<p><code>position</code> and <code>duration</code> must be on the same timeline — for a handoff stream
|
||||
built with <code>StartTimeTicks</code>, that means the <em>absolute</em> position (handoff base</p>
|
||||
<ul>
|
||||
<li>the player’s relative position) against the item’s full runtime.</li>
|
||||
</ul>
|
||||
<p>An unknown or non-positive <code>duration</code> answers <code>false</code>: with nothing to
|
||||
compare against, the reported end is taken at face value (previous behaviour).</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,29 @@
|
||||
<!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="Would the player’s own load-error retry restart this stream from its beginning? If so the retry must be switched off and recovery left to `crate::player::PlayerController::recoverable_error_resume`."><title>player_retry_restarts_stream in jellytau_lib::player::stream_end - 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 fn"><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="#">player_retry_restarts_stream</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>stream_<wbr>end</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>::<wbr><a href="index.html">stream_end</a></div><h1>Function <span class="fn">player_<wbr>retry_<wbr>restarts_<wbr>stream</span> <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/stream_end.rs.html#93-95">Source</a> </span></div><pre class="rust item-decl"><code>pub fn player_retry_restarts_stream(item: &<a class="struct" href="../media/struct.MediaItem.html" title="struct jellytau_lib::player::media::MediaItem">MediaItem</a>) -> <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.bool.html">bool</a></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Would the <em>player’s own</em> load-error retry restart this stream from its
|
||||
beginning? If so the retry must be switched off and recovery left to
|
||||
<a href="../struct.PlayerController.html#method.recoverable_error_resume" title="method jellytau_lib::player::PlayerController::recoverable_error_resume"><code>crate::player::PlayerController::recoverable_error_resume</code></a>.</p>
|
||||
<p>ExoPlayer resumes a failed load in place only when it knows where “in place”
|
||||
is: <code>ProgressiveMediaPeriod.configureRetry</code> keeps the load position when the
|
||||
content length is known <em>or</em> the extractor produced a seek map with a
|
||||
duration, and otherwise treats the source as live — the data at the URL is
|
||||
assumed to have changed, so it resets every sample queue and re-requests the
|
||||
URL from offset 0.</p>
|
||||
<p>The handoff transcode satisfies neither condition: it is chunked (no
|
||||
<code>Content-Length</code>) and a live mp3 encode carries no <code>Xing</code> header, so the
|
||||
player reports its duration as unset — visible in logcat as every position
|
||||
tick reading <code><position> / 0.0</code>. Its URL carries <code>StartTimeTicks</code> = the
|
||||
handoff point, so restarting it from offset 0 restarts the <em>episode</em> at the
|
||||
handoff point, and playback then runs on from there. Nothing surfaces: no
|
||||
error, no <code>STATE_ENDED</code>, so neither the truncation path nor the error path of
|
||||
DR-129 is consulted, and the app’s only sign of it is a position that jumps
|
||||
backwards. That is the “it randomly jumps back to where audio-only started”
|
||||
the user sees, and how random it is depends on whether a network blip happens
|
||||
to land while a load is in flight rather than while the ~50s buffer covers it.</p>
|
||||
<p>A retry that can only restart the stream is worth less than no retry at all:
|
||||
declining it turns the silent rewind into a recoverable error, which
|
||||
<code>recoverable_error_resume</code> answers by re-opening the stream at the position
|
||||
playback actually reached (<code>StartTimeTicks</code> rewritten, backoff and attempt
|
||||
budget included). Every other source keeps the player’s retry: a static file
|
||||
and an HLS playlist both declare their timeline, so ExoPlayer resumes them
|
||||
exactly where the load failed.</p>
|
||||
<p>TRACES: UR-040, UR-004 | DR-203 | UT-200</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,7 @@
|
||||
<!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="Rewrite an audio-only stream URL to start at `position_seconds`."><title>with_start_time in jellytau_lib::player::stream_end - 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 fn"><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="#">with_start_time</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.10.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In jellytau_<wbr>lib::<wbr>player::<wbr>stream_<wbr>end</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>::<wbr><a href="index.html">stream_end</a></div><h1>Function <span class="fn">with_<wbr>start_<wbr>time</span> <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/stream_end.rs.html#123-152">Source</a> </span></div><pre class="rust item-decl"><code>pub fn with_start_time(url: &<a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.str.html">str</a>, position_seconds: <a class="primitive" href="https://doc.rust-lang.org/1.97.1/std/primitive.f64.html">f64</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></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Rewrite an audio-only stream URL to start at <code>position_seconds</code>.</p>
|
||||
<p>Resuming re-opens <em>the stream we were already playing</em>, so the URL is edited
|
||||
in place rather than rebuilt from the repository: every other parameter —
|
||||
<code>AudioStreamIndex</code> (the track the user picked in the video player),
|
||||
<code>MediaSourceId</code>, <code>api_key</code> — is carried over untouched, and no network call
|
||||
is needed to recover from a network failure.</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
@@ -0,0 +1,27 @@
|
||||
<!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="Telling a finished stream apart from a truncated one."><title>jellytau_lib::player::stream_end - 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 mod"><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="#">Module stream_end</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module stream_<wbr>end</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#constants" title="Constants">Constants</a></li><li><a href="#functions" title="Functions">Functions</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>Module <span>stream_<wbr>end</span> <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/stream_end.rs.html#1-516">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Telling a <em>finished</em> stream apart from a <em>truncated</em> one.</p>
|
||||
<p>TRACES: UR-040 | DR-129 | UT-117</p>
|
||||
<p>Background audio-only playback of a video item streams a <strong>progressive mp3
|
||||
transcode over plain HTTP</strong> (see
|
||||
<code>OnlineRepository::build_audio_only_stream_url_for_video</code>). That response has
|
||||
no reliable length — a live transcode is chunked — so when the connection
|
||||
drops mid-episode the data source simply sees end-of-input. ExoPlayer cannot
|
||||
distinguish that from the real end of the media and reports
|
||||
<code>Player.STATE_ENDED</code>, which the app then treats as “the episode finished”.</p>
|
||||
<p>The user-visible damage is not the missed advance itself. Playback parks in
|
||||
ExoPlayer’s <code>STATE_ENDED</code>, and the next play intent from the lockscreen,
|
||||
notification or a Bluetooth reconnect goes through media3’s
|
||||
<code>Util.handlePlayButtonAction</code>, which seeks an ENDED player to its default
|
||||
position before playing — so <strong>the episode starts over from 0:00</strong>. On a
|
||||
flaky connection that reads as “it randomly restarts the episode”.</p>
|
||||
<p>The player itself has no way to know; the <em>duration</em> does. Jellyfin gives us
|
||||
the item’s real runtime, so an end reported well short of it is a truncation,
|
||||
not a finish — and the right response is to re-open the stream where it died,
|
||||
which is the “buffer and resume” the user expects.</p>
|
||||
</div></details><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.ObservedTime.html" title="struct jellytau_lib::player::stream_end::ObservedTime">Observed<wbr>Time</a></dt><dd>The last playback time actually observed while media was loaded.</dd><dt><a class="struct" href="struct.ResumeTracker.html" title="struct jellytau_lib::player::stream_end::ResumeTracker">Resume<wbr>Tracker</a></dt><dd>Budget for consecutive resume attempts that make no progress.</dd></dl><h2 id="constants" class="section-header">Constants<a href="#constants" class="anchor">§</a></h2><dl class="item-table"><dt><a class="constant" href="constant.MAX_STALLED_RESUME_ATTEMPTS.html" title="constant jellytau_lib::player::stream_end::MAX_STALLED_RESUME_ATTEMPTS">MAX_<wbr>STALLED_<wbr>RESUME_<wbr>ATTEMPTS</a></dt><dd>Consecutive resume attempts allowed at the same position before giving up.</dd><dt><a class="constant" href="constant.RESUME_PROGRESS_EPSILON_SECS.html" title="constant jellytau_lib::player::stream_end::RESUME_PROGRESS_EPSILON_SECS">RESUME_<wbr>PROGRESS_<wbr>EPSILON_<wbr>SECS</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Position change that counts as “this is a different playback context” —
|
||||
either the resume made progress, or a different item is loaded.</dd><dt><a class="constant" href="constant.TRUNCATED_STREAM_TOLERANCE_SECS.html" title="constant jellytau_lib::player::stream_end::TRUNCATED_STREAM_TOLERANCE_SECS">TRUNCATED_<wbr>STREAM_<wbr>TOLERANCE_<wbr>SECS</a></dt><dd>How far short of the item’s runtime a stream may end and still count as a
|
||||
natural finish.</dd></dl><h2 id="functions" class="section-header">Functions<a href="#functions" class="anchor">§</a></h2><dl class="item-table"><dt><a class="fn" href="fn.is_audio_only_video.html" title="fn jellytau_lib::player::stream_end::is_audio_only_video">is_<wbr>audio_<wbr>only_<wbr>video</a></dt><dd>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. Jellyfin’s item-type taxonomy stays in Rust (CLAUDE.md).</dd><dt><a class="fn" href="fn.is_truncated_end.html" title="fn jellytau_lib::player::stream_end::is_truncated_end">is_<wbr>truncated_<wbr>end</a></dt><dd>Did this end-of-stream happen far enough short of the item’s runtime to be a
|
||||
truncation rather than a finish?</dd><dt><a class="fn" href="fn.player_retry_restarts_stream.html" title="fn jellytau_lib::player::stream_end::player_retry_restarts_stream">player_<wbr>retry_<wbr>restarts_<wbr>stream</a></dt><dd>Would the <em>player’s own</em> load-error retry restart this stream from its
|
||||
beginning? If so the retry must be switched off and recovery left to
|
||||
<a href="../struct.PlayerController.html#method.recoverable_error_resume" title="method jellytau_lib::player::PlayerController::recoverable_error_resume"><code>crate::player::PlayerController::recoverable_error_resume</code></a>.</dd><dt><a class="fn" href="fn.with_start_time.html" title="fn jellytau_lib::player::stream_end::with_start_time">with_<wbr>start_<wbr>time</a></dt><dd>Rewrite an audio-only stream URL to start at <code>position_seconds</code>.</dd></dl></section></div></main></body></html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"constant":["MAX_STALLED_RESUME_ATTEMPTS","RESUME_PROGRESS_EPSILON_SECS","TRUNCATED_STREAM_TOLERANCE_SECS"],"fn":["is_audio_only_video","is_truncated_end","player_retry_restarts_stream","with_start_time"],"struct":["ObservedTime","ResumeTracker"]};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,13 @@
|
||||
<!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="Where the player’s playback reports go."><title>PlaybackReportSink 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 trait"><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="#">PlaybackReportSink</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.10.1</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Playback<wbr>Report<wbr>Sink</a></h2><h3><a href="#required-methods">Required Methods</a></h3><ul class="block"><li><a href="#tymethod.send" title="send">send</a></li></ul><h3><a href="#implementors">Implementors</a></h3></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>Trait <span class="trait">Playback<wbr>Report<wbr>Sink</span> <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#69-72">Source</a> </span></div><pre class="rust item-decl"><code>pub trait PlaybackReportSink: <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.97.1/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> {
|
||||
// Required method
|
||||
fn <a href="#tymethod.send" class="fn">send</a>(&self, operation: <a class="enum" href="../playback_reporting/reporter/enum.PlaybackOperation.html" title="enum jellytau_lib::playback_reporting::reporter::PlaybackOperation">PlaybackOperation</a>);
|
||||
}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Where the player’s playback reports go.</p>
|
||||
<p>The controller’s side of reporting is “send this, don’t make me wait”: a slow
|
||||
or failing sync must never stall playback, so every send is fire-and-forget.
|
||||
Production wires this to <a href="../playback_reporting/reporter/struct.PlaybackReporter.html" title="struct jellytau_lib::playback_reporting::reporter::PlaybackReporter"><code>PlaybackReporter</code></a> (local DB, server sync, offline
|
||||
queueing); tests capture the operations instead of standing up a database and
|
||||
an HTTP client, which is what let the missing reports below be written as
|
||||
failing tests rather than found on a device.</p>
|
||||
<p>TRACES: UR-025 | DR-179</p>
|
||||
</div></details><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.send" class="method"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#71">Source</a><h4 class="code-header">fn <a href="#tymethod.send" class="fn">send</a>(&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>Deliver <code>operation</code>. Must not block the caller.</p>
|
||||
</div></details></div><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><div class="negative-marker"></div><section id="impl-PlaybackReportSink-for-ReporterSink" class="impl"><a class="src rightside" href="../../src/jellytau_lib/player/mod.rs.html#83-110">Source</a><a href="#impl-PlaybackReportSink-for-ReporterSink" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.PlaybackReportSink.html" title="trait jellytau_lib::player::PlaybackReportSink">PlaybackReportSink</a> for <a class="struct" href="struct.ReporterSink.html" title="struct jellytau_lib::player::ReporterSink">ReporterSink</a></h3></section></div><script src="../../trait.impl/jellytau_lib/player/trait.PlaybackReportSink.js" async></script></section></div></main></body></html>
|
||||
Reference in New Issue
Block a user