46 lines
14 KiB
HTML
46 lines
14 KiB
HTML
<!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="Tauri commands for the offline “browse & queue” feature."><title>jellytau_lib::commands::catalog - 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 catalog</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../jellytau_lib/index.html">jellytau_<wbr>lib</a><span class="version">0.11.0</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module catalog</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="#statics" title="Statics">Statics</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>commands</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">commands</a></div><h1>Module <span>catalog</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/commands/catalog.rs.html#1-1147">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Tauri commands for the offline “browse & queue” feature.</p>
|
||
<p>TRACES: UR-002, UR-007, UR-024 | JA-004, JA-016 | DR-012, DR-027</p>
|
||
<p>Two backend pieces support browsing the full server catalog while offline
|
||
and queueing downloads that fire on reconnect:</p>
|
||
<ul>
|
||
<li><a href="fn.sync_full_catalog.html" title="fn jellytau_lib::commands::catalog::sync_full_catalog"><code>sync_full_catalog</code></a> walks every library while online and persists all
|
||
items to the offline cache so the whole catalog is browsable (greyed out)
|
||
offline. It reuses [<code>HybridRepository::cache_items_from_server</code>], which in
|
||
turn reuses <code>OfflineRepository::save_to_cache</code> (sets <code>synced_at</code>, which is
|
||
what <code>get_items</code> branch 3 serves offline).</li>
|
||
<li><a href="fn.resume_queued_downloads.html" title="fn jellytau_lib::commands::catalog::resume_queued_downloads"><code>resume_queued_downloads</code></a> resolves and pumps the <code>pending</code> download rows
|
||
that were queued offline (they have <code>stream_url IS NULL</code>), mirroring the
|
||
heal-and-pump pattern in <code>player_preload_upcoming</code>.</li>
|
||
</ul>
|
||
</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.CatalogIndexEvent.html" title="struct jellytau_lib::commands::catalog::CatalogIndexEvent">Catalog<wbr>Index<wbr>Event</a></dt><dd>Progress of a background index pass, for the staleness hint in the UI.</dd><dt><a class="struct" href="struct.CatalogSyncResult.html" title="struct jellytau_lib::commands::catalog::CatalogSyncResult">Catalog<wbr>Sync<wbr>Result</a></dt><dt><a class="struct" href="struct.CatalogSyncStatus.html" title="struct jellytau_lib::commands::catalog::CatalogSyncStatus">Catalog<wbr>Sync<wbr>Status</a></dt><dt><a class="struct" href="struct.IndexPassGuard.html" title="struct jellytau_lib::commands::catalog::IndexPassGuard">Index<wbr>Pass<wbr>Guard</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Clears <a href="static.INDEX_IN_PROGRESS.html" title="static jellytau_lib::commands::catalog::INDEX_IN_PROGRESS"><code>INDEX_IN_PROGRESS</code></a> however the pass leaves — including on the <code>?</code>
|
||
early return when <code>get_libraries</code> fails, which a plain store at the end of
|
||
the function would leak.</dd><dt><a class="struct" href="struct.ResumeQueuedResult.html" title="struct jellytau_lib::commands::catalog::ResumeQueuedResult">Resume<wbr>Queued<wbr>Result</a></dt></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.CATALOG_INDEX_EVENT.html" title="constant jellytau_lib::commands::catalog::CATALOG_INDEX_EVENT">CATALOG_<wbr>INDEX_<wbr>EVENT</a></dt><dd>Kebab-case, per the project’s event convention.</dd><dt><a class="constant" href="constant.CATALOG_INDEX_FIRST_CHECK.html" title="constant jellytau_lib::commands::catalog::CATALOG_INDEX_FIRST_CHECK">CATALOG_<wbr>INDEX_<wbr>FIRST_<wbr>CHECK</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Delay before the first staleness check, to let sign-in complete and the
|
||
repository be registered. Without it the first check runs against an empty
|
||
repository manager and a fresh install would sit unindexed until the next
|
||
tick.</dd><dt><a class="constant" href="constant.CATALOG_INDEX_TICK.html" title="constant jellytau_lib::commands::catalog::CATALOG_INDEX_TICK">CATALOG_<wbr>INDEX_<wbr>TICK</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>How often the scheduler wakes to <em>check</em> staleness. Far shorter than the TTL
|
||
because a tick is nearly free — one indexed <code>app_settings</code> lookup — and it is
|
||
what makes the indexer responsive to events it cannot subscribe to: signing
|
||
in, and coming back online. The TTL, not the tick, decides whether a crawl
|
||
actually happens.</dd><dt><a class="constant" href="constant.CATALOG_INDEX_TTL.html" title="constant jellytau_lib::commands::catalog::CATALOG_INDEX_TTL">CATALOG_<wbr>INDEX_<wbr>TTL</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>How long an index stays fresh before a re-index is due.</dd><dt><a class="constant" href="constant.CATALOG_ITEM_TYPES.html" title="constant jellytau_lib::commands::catalog::CATALOG_ITEM_TYPES">CATALOG_<wbr>ITEM_<wbr>TYPES</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Item types worth caching for offline browsing: containers the library
|
||
landing pages render plus the playable leaves users queue for download.
|
||
<code>MusicArtist</code> and <code>Playlist</code> are here because search groups results by them
|
||
(UR-060’s Artists group). Without them in the crawl, the local index can
|
||
never answer an artist query and those groups can only ever be filled by the
|
||
server leg. Keep this in step with what <code>prune_stale_catalog</code> is allowed to
|
||
sweep — the crawl is only authoritative for the types it asks for.</dd><dt><a class="constant" href="constant.LAST_CATALOG_SYNC_KEY.html" title="constant jellytau_lib::commands::catalog::LAST_CATALOG_SYNC_KEY">LAST_<wbr>CATALOG_<wbr>SYNC_<wbr>KEY</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>app_settings key holding the RFC-3339 timestamp of the last successful
|
||
full-catalog sync.</dd><dt><a class="constant" href="constant.VIDEO_ITEM_TYPES.html" title="constant jellytau_lib::commands::catalog::VIDEO_ITEM_TYPES">VIDEO_<wbr>ITEM_<wbr>TYPES</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Jellyfin item types whose download is a <em>video</em> stream rather than an audio
|
||
one. The download queue stores an opaque <code>media_type</code> (‘audio’/‘video’); this
|
||
is where the taxonomy that produces it lives, so the frontend never has to
|
||
know which item types are video.</dd></dl><h2 id="statics" class="section-header">Statics<a href="#statics" class="anchor">§</a></h2><dl class="item-table"><dt><a class="static" href="static.INDEX_IN_PROGRESS.html" title="static jellytau_lib::commands::catalog::INDEX_IN_PROGRESS">INDEX_<wbr>IN_<wbr>PROGRESS</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Guards against two passes running at once. Replaces the frontend’s
|
||
<code>syncInProgress</code> boolean in <code>offlineCatalog.ts</code>, which could not see a pass
|
||
started by the scheduler.</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.catalog_sync_status.html" title="fn jellytau_lib::commands::catalog::catalog_sync_status">catalog_<wbr>sync_<wbr>status</a></dt><dd>Report the last-synced timestamp so the UI can show a hint / decide whether
|
||
to trigger a fresh sync.</dd><dt><a class="fn" href="fn.index_is_due.html" title="fn jellytau_lib::commands::catalog::index_is_due">index_<wbr>is_<wbr>due</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Whether an index pass is due, given when one last completed.</dd><dt><a class="fn" href="fn.maybe_run_scheduled_pass.html" title="fn jellytau_lib::commands::catalog::maybe_run_scheduled_pass">maybe_<wbr>run_<wbr>scheduled_<wbr>pass</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>One scheduler tick: check the preconditions, then index if due.</dd><dt><a class="fn" href="fn.read_last_sync.html" title="fn jellytau_lib::commands::catalog::read_last_sync">read_<wbr>last_<wbr>sync</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Read the last-sync timestamp straight from <code>app_settings</code>.</dd><dt><a class="fn" href="fn.requeue_mistyped_video_downloads.html" title="fn jellytau_lib::commands::catalog::requeue_mistyped_video_downloads">requeue_<wbr>mistyped_<wbr>video_<wbr>downloads</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Requeue video downloads that were fetched as audio.</dd><dt><a class="fn" href="fn.resolve_pending_download_urls.html" title="fn jellytau_lib::commands::catalog::resolve_pending_download_urls">resolve_<wbr>pending_<wbr>download_<wbr>urls</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>Core of <a href="fn.resume_queued_downloads.html" title="fn jellytau_lib::commands::catalog::resume_queued_downloads"><code>resume_queued_downloads</code></a>, factored out for testing: select every
|
||
<code>pending</code>/<code>stream_url IS NULL</code> row, resolve each via <code>resolve</code> (returning
|
||
<code>None</code> leaves the row pending), and heal the row so the pump can start it.
|
||
The <code>resolve</code> closure receives <code>(item_id, media_type, quality_preset)</code>.</dd><dt><a class="fn" href="fn.resume_queued_downloads.html" title="fn jellytau_lib::commands::catalog::resume_queued_downloads">resume_<wbr>queued_<wbr>downloads</a></dt><dd>Resolve the stream URL for every download row that was queued while offline
|
||
(<code>status = 'pending' AND stream_url IS NULL</code>), then pump the queue so they
|
||
start. Call this on reconnect.</dd><dt><a class="fn" href="fn.run_index_pass.html" title="fn jellytau_lib::commands::catalog::run_index_pass">run_<wbr>index_<wbr>pass</a><span title="Restricted Visibility"> 🔒</span> </dt><dd>One full-catalog indexing pass, shared by the <a href="fn.sync_full_catalog.html" title="fn jellytau_lib::commands::catalog::sync_full_catalog"><code>sync_full_catalog</code></a> command
|
||
and the background scheduler (DR-109) so there is exactly one implementation
|
||
and one concurrency guard.</dd><dt><a class="fn" href="fn.set_show_server_catalog.html" title="fn jellytau_lib::commands::catalog::set_show_server_catalog">set_<wbr>show_<wbr>server_<wbr>catalog</a></dt><dd>Control whether offline library queries reveal the full synced catalog
|
||
(greyed-out, non-downloaded media) or only downloaded/local media.</dd><dt><a class="fn" href="fn.spawn_catalog_indexer.html" title="fn jellytau_lib::commands::catalog::spawn_catalog_indexer">spawn_<wbr>catalog_<wbr>indexer</a></dt><dd>Start the background catalog indexer.</dd><dt><a class="fn" href="fn.sync_full_catalog.html" title="fn jellytau_lib::commands::catalog::sync_full_catalog">sync_<wbr>full_<wbr>catalog</a></dt><dd>Walk every library on the server and persist all items to the offline cache
|
||
so the full catalog is browsable offline (greyed out when not downloaded).</dd></dl></section></div></main></body></html> |