Files
asknavidrome-cafofo/docs/index.html
2025-09-08 15:44:38 +00:00

3975 lines
317 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en" data-content_root="./" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>AskNavidrome Alexa Skill Documentation &#8212; AskNavidrome 0.9 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
<link href="_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
<link href="_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
<link href="_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=8f2a1f02" />
<link rel="stylesheet" type="text/css" href="_static/styles/sphinx-book-theme.css?v=eba8b062" />
<link rel="stylesheet" type="text/css" href="_static/css/custom.css?v=06afa432" />
<link rel="stylesheet" href="../_static/css/functions.css" type="text/css" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
<link rel="preload" as="script" href="_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
<script src="_static/documentation_options.js?v=3e145956"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
<script>DOCUMENTATION_OPTIONS.pagename = 'index';</script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>Back to top</button>
<input type="checkbox"
class="sidebar-toggle"
id="pst-primary-sidebar-checkbox"/>
<label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
<input type="checkbox"
class="sidebar-toggle"
id="pst-secondary-sidebar-checkbox"/>
<label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search..."
aria-label="Search..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<div class="pst-async-banner-revealer d-none">
<aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar">
<div class="sidebar-header-items sidebar-primary__section">
</div>
<div class="sidebar-primary-items__start sidebar-primary__section">
<div class="sidebar-primary-item">
<a class="navbar-brand logo" href="#">
<p class="title logo__title">AskNavidrome 0.9 documentation</p>
</a></div>
<div class="sidebar-primary-item">
<script>
document.write(`
<button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script></div>
<div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
<div class="bd-toc-item navbar-nav active">
</div>
</nav></div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main" role="main">
<div class="sbt-scroll-pixel-helper"></div>
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article d-print-none">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="fa-solid fa-bars"></span>
</button></div>
</div>
<div class="header-article-items__end">
<div class="header-article-item">
<div class="article-header-buttons">
<a href="https://github.com/rosskouk/asknavidrome" target="_blank"
class="btn btn-sm btn-source-repository-button"
title="Source repository"
data-bs-placement="bottom" data-bs-toggle="tooltip"
>
<span class="btn__icon-container">
<i class="fab fa-github"></i>
</span>
</a>
<div class="dropdown dropdown-download-buttons">
<button class="btn dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-label="Download this page">
<i class="fas fa-download"></i>
</button>
<ul class="dropdown-menu">
<li><a href="_sources/index.rst" target="_blank"
class="btn btn-sm btn-download-source-button dropdown-item"
title="Download source file"
data-bs-placement="left" data-bs-toggle="tooltip"
>
<span class="btn__icon-container">
<i class="fas fa-file"></i>
</span>
<span class="btn__text-container">.rst</span>
</a>
</li>
<li>
<button onclick="window.print()"
class="btn btn-sm btn-download-pdf-button dropdown-item"
title="Print to PDF"
data-bs-placement="left" data-bs-toggle="tooltip"
>
<span class="btn__icon-container">
<i class="fas fa-file-pdf"></i>
</span>
<span class="btn__text-container">.pdf</span>
</button>
</li>
</ul>
</div>
<button onclick="toggleFullScreen()"
class="btn btn-sm btn-fullscreen-button"
title="Fullscreen mode"
data-bs-placement="bottom" data-bs-toggle="tooltip"
>
<span class="btn__icon-container">
<i class="fas fa-expand"></i>
</span>
</button>
<script>
document.write(`
<button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
<i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
<i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
</button>
`);
</script>
<script>
document.write(`
<button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass fa-lg"></i>
</button>
`);
</script>
<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="fa-solid fa-list"></span>
</button>
</div></div>
</div>
</div>
</div>
<div id="jb-print-docs-body" class="onlyprint">
<h1>AskNavidrome Alexa Skill Documentation</h1>
<!-- Table of contents -->
<div id="print-main-content">
<div id="jb-print-toc">
<div>
<h2> Contents </h2>
</div>
<nav aria-label="Page">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#requirements">Requirements</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#about-the-asknavidrome-skill">About the AskNavidrome Skill</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#supported-intents">Supported Intents</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#installation-and-setup">Installation and Setup</a><ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#creating-the-asknavidrome-alexa-skill">Creating the AskNavidrome Alexa Skill</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#deploying-the-asknavidrome-web-service">Deploying the AskNavidrome Web Service</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#run-on-your-pc">Run on your PC</a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#run-inside-a-docker-container">Run inside a Docker container</a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#configuration">Configuration</a></li>
</ul>
</li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#tips-tricks">Tips &amp; Tricks</a><ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#playing-music-on-multiple-devices">Playing Music on Multiple Devices</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#troubleshooting">Troubleshooting</a><ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#general">General</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#debug-options">Debug Options</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#known-issues">Known Issues</a><ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#the-skill-appears-to-work-but-no-music-is-played-errors-similar-to-below-appear-in-the-web-service-log">The skill appears to work but no music is played. Errors similar to below appear in the web service log</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#the-following-error-is-displayed-when-you-try-to-run-the-docker-container">The following error is displayed when you try to run the Docker container</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#you-are-having-trouble-connecting-to-the-skill-and-use-cloudflare">You are having trouble connecting to the skill and use CloudFlare</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#code-documentation">Code Documentation</a><ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#module-app">AskNavidrome main</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.CheckAudioInterfaceHandler"><code class="docutils literal notranslate"><span class="pre">CheckAudioInterfaceHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.CheckAudioInterfaceHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">CheckAudioInterfaceHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.CheckAudioInterfaceHandler.handle"><code class="docutils literal notranslate"><span class="pre">CheckAudioInterfaceHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.GeneralExceptionHandler"><code class="docutils literal notranslate"><span class="pre">GeneralExceptionHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.GeneralExceptionHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">GeneralExceptionHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.GeneralExceptionHandler.handle"><code class="docutils literal notranslate"><span class="pre">GeneralExceptionHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.HelpHandler"><code class="docutils literal notranslate"><span class="pre">HelpHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.HelpHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">HelpHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.HelpHandler.handle"><code class="docutils literal notranslate"><span class="pre">HelpHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LaunchRequestHandler"><code class="docutils literal notranslate"><span class="pre">LaunchRequestHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LaunchRequestHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">LaunchRequestHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LaunchRequestHandler.handle"><code class="docutils literal notranslate"><span class="pre">LaunchRequestHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LoggingRequestInterceptor"><code class="docutils literal notranslate"><span class="pre">LoggingRequestInterceptor</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LoggingRequestInterceptor.process"><code class="docutils literal notranslate"><span class="pre">LoggingRequestInterceptor.process()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LoggingResponseInterceptor"><code class="docutils literal notranslate"><span class="pre">LoggingResponseInterceptor</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LoggingResponseInterceptor.process"><code class="docutils literal notranslate"><span class="pre">LoggingResponseInterceptor.process()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayAlbumByArtist"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayAlbumByArtist</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayAlbumByArtist.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayAlbumByArtist.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayAlbumByArtist.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayAlbumByArtist.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayFavouriteSongs"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayFavouriteSongs</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayFavouriteSongs.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayFavouriteSongs.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayFavouriteSongs.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayFavouriteSongs.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicByArtist"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByArtist</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicByArtist.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByArtist.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicByArtist.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByArtist.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicByGenre"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByGenre</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicByGenre.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByGenre.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicByGenre.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByGenre.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicRandom"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicRandom</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicRandom.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicRandom.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicRandom.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicRandom.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayPlaylist"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayPlaylist</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayPlaylist.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayPlaylist.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayPlaylist.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayPlaylist.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlaySongByArtist"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlaySongByArtist</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlaySongByArtist.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlaySongByArtist.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlaySongByArtist.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlaySongByArtist.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicRandomiseQueue"><code class="docutils literal notranslate"><span class="pre">NaviSonicRandomiseQueue</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicRandomiseQueue.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicRandomiseQueue.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicRandomiseQueue.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicRandomiseQueue.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicSongDetails"><code class="docutils literal notranslate"><span class="pre">NaviSonicSongDetails</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicSongDetails.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicSongDetails.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicSongDetails.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicSongDetails.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicStarSong"><code class="docutils literal notranslate"><span class="pre">NaviSonicStarSong</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicStarSong.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicStarSong.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicStarSong.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicStarSong.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicUnstarSong"><code class="docutils literal notranslate"><span class="pre">NaviSonicUnstarSong</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicUnstarSong.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicUnstarSong.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicUnstarSong.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicUnstarSong.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NextPlaybackHandler"><code class="docutils literal notranslate"><span class="pre">NextPlaybackHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NextPlaybackHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">NextPlaybackHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NextPlaybackHandler.handle"><code class="docutils literal notranslate"><span class="pre">NextPlaybackHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PausePlaybackHandler"><code class="docutils literal notranslate"><span class="pre">PausePlaybackHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PausePlaybackHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PausePlaybackHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PausePlaybackHandler.handle"><code class="docutils literal notranslate"><span class="pre">PausePlaybackHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackFailedEventHandler"><code class="docutils literal notranslate"><span class="pre">PlaybackFailedEventHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackFailedEventHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PlaybackFailedEventHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackFailedEventHandler.handle"><code class="docutils literal notranslate"><span class="pre">PlaybackFailedEventHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackFinishedHandler"><code class="docutils literal notranslate"><span class="pre">PlaybackFinishedHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackFinishedHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PlaybackFinishedHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackFinishedHandler.handle"><code class="docutils literal notranslate"><span class="pre">PlaybackFinishedHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackNearlyFinishedHandler"><code class="docutils literal notranslate"><span class="pre">PlaybackNearlyFinishedHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackNearlyFinishedHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PlaybackNearlyFinishedHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackNearlyFinishedHandler.handle"><code class="docutils literal notranslate"><span class="pre">PlaybackNearlyFinishedHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackStartedHandler"><code class="docutils literal notranslate"><span class="pre">PlaybackStartedHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackStartedHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PlaybackStartedHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackStartedHandler.handle"><code class="docutils literal notranslate"><span class="pre">PlaybackStartedHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackStoppedHandler"><code class="docutils literal notranslate"><span class="pre">PlaybackStoppedHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackStoppedHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PlaybackStoppedHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackStoppedHandler.handle"><code class="docutils literal notranslate"><span class="pre">PlaybackStoppedHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PreviousPlaybackHandler"><code class="docutils literal notranslate"><span class="pre">PreviousPlaybackHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PreviousPlaybackHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PreviousPlaybackHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PreviousPlaybackHandler.handle"><code class="docutils literal notranslate"><span class="pre">PreviousPlaybackHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.ResumePlaybackHandler"><code class="docutils literal notranslate"><span class="pre">ResumePlaybackHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.ResumePlaybackHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">ResumePlaybackHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.ResumePlaybackHandler.handle"><code class="docutils literal notranslate"><span class="pre">ResumePlaybackHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.SkillEventHandler"><code class="docutils literal notranslate"><span class="pre">SkillEventHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.SkillEventHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">SkillEventHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.SkillEventHandler.handle"><code class="docutils literal notranslate"><span class="pre">SkillEventHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.SystemExceptionHandler"><code class="docutils literal notranslate"><span class="pre">SystemExceptionHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.SystemExceptionHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">SystemExceptionHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.SystemExceptionHandler.handle"><code class="docutils literal notranslate"><span class="pre">SystemExceptionHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.queue_worker_thread"><code class="docutils literal notranslate"><span class="pre">queue_worker_thread()</span></code></a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.sanitise_speech_output"><code class="docutils literal notranslate"><span class="pre">sanitise_speech_output()</span></code></a></li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#module-asknavidrome.controller">AskNavidrome controller</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.controller.add_screen_background"><code class="docutils literal notranslate"><span class="pre">add_screen_background()</span></code></a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.controller.enqueue_songs"><code class="docutils literal notranslate"><span class="pre">enqueue_songs()</span></code></a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.controller.start_playback"><code class="docutils literal notranslate"><span class="pre">start_playback()</span></code></a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.controller.stop"><code class="docutils literal notranslate"><span class="pre">stop()</span></code></a></li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome-media-queue">AskNavidrome media queue</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue"><code class="docutils literal notranslate"><span class="pre">MediaQueue</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.add_track"><code class="docutils literal notranslate"><span class="pre">MediaQueue.add_track()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.clear"><code class="docutils literal notranslate"><span class="pre">MediaQueue.clear()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.enqueue_next_track"><code class="docutils literal notranslate"><span class="pre">MediaQueue.enqueue_next_track()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_buffer"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_buffer()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_current_queue"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_current_queue()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_current_track"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_current_track()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_history"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_history()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_history_count"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_history_count()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_next_track"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_next_track()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_previous_track"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_previous_track()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_queue_count"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_queue_count()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.set_current_track_offset"><code class="docutils literal notranslate"><span class="pre">MediaQueue.set_current_track_offset()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.shuffle"><code class="docutils literal notranslate"><span class="pre">MediaQueue.shuffle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.sync"><code class="docutils literal notranslate"><span class="pre">MediaQueue.sync()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.buffer"><code class="docutils literal notranslate"><span class="pre">MediaQueue.buffer</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.current_track"><code class="docutils literal notranslate"><span class="pre">MediaQueue.current_track</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.history"><code class="docutils literal notranslate"><span class="pre">MediaQueue.history</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.logger"><code class="docutils literal notranslate"><span class="pre">MediaQueue.logger</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.queue"><code class="docutils literal notranslate"><span class="pre">MediaQueue.queue</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome-subsonic-api">AskNavidrome subsonic API</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.albums_by_artist"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.albums_by_artist()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.build_random_song_list"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.build_random_song_list()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_albums"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.build_song_list_from_albums()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_favourites"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.build_song_list_from_favourites()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_genre"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.build_song_list_from_genre()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_playlist"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.build_song_list_from_playlist()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.get_song_details"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.get_song_details()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.get_song_uri"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.get_song_uri()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.ping"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.ping()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.scrobble"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.scrobble()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.search_album"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.search_album()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.search_artist"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.search_artist()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.search_playlist"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.search_playlist()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.search_song"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.search_song()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.star_entry"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.star_entry()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.unstar_entry"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.unstar_entry()</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome-track">AskNavidrome track</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.track.Track"><code class="docutils literal notranslate"><span class="pre">Track</span></code></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<section id="asknavidrome-alexa-skill-documentation">
<h1><strong>AskNavidrome Alexa Skill Documentation</strong><a class="headerlink" href="#asknavidrome-alexa-skill-documentation" title="Link to this heading">#</a></h1>
<p><strong>AskNavidrome</strong> is an Alexa skill which allows you to play music hosted on a SubSonic API compatible media server, like Navidrome.</p>
<p>This allows to you stream your own music collection to your Echo devices without the restrictions you would normally face with regular
streaming services like Amazon Music or Spotify. AskNavidrome allows you to:</p>
<ul class="simple">
<li><p>Skip backwards and forwards in your current queue or playlist without limitation.</p></li>
<li><p>Avoid paying subscription costs.</p></li>
<li><p>Avoid being forced to listen to adverts at regular intervals.</p></li>
<li><p>Actually use the music collection you have already paid for!</p></li>
<li><p>Run the service on a PC directly or inside a Docker container.</p></li>
</ul>
<p>This skill was inspired by <a class="reference external" href="https://github.com/srichter/asksonic">AskSonic</a>, however AskSonic was missing two features I required,
the ability to play playlists and the ability to play an individual song. Instead of contributing to that project I have opted to
create a new skill based on the <strong>Alexa Skills Kit SDK for Python</strong> as this has been updated more recently than <em>flask-ask</em> which is used
by AskSonic, AskNavidrome is not a replacement for AskSonic and it does not implement all of AskSonics features, it is however a viable
alternative for those that would like a simple skill to let you stream your own music collection.</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>The skill requires a username and password for your Navidrome installation which is stored in clear text. As the web service needs to be
publicly accessible there is a chance that this password could be compromised. Please do not use an administrative account for your
Navidrome installation or a password that you use on any other service. This software is distributed under the MIT license and no warranty
is provided.</p>
</div>
<section id="requirements">
<h2>Requirements<a class="headerlink" href="#requirements" title="Link to this heading">#</a></h2>
<p>In order to use AskNavidrome you will need:</p>
<p><strong>Your Music Collection</strong></p>
<p>Your collection needs to have been converted to a digital format like MP3. There are many tutorials available on the web to help you do this, but do
be aware that there are limitations on the types of files that Echo devices can stream. You should review these before converting your collection as if
you do not meet the requirements they will need to be transcoded before your Echo device can stream them. This article explains <a class="reference external" href="https://developer.amazon.com/en-US/docs/alexa/custom-skills/audioplayer-interface-reference.html#audio-stream-requirements">Amazons
Audio Stream Requirements</a></p>
<p><strong>A SubSonic API Compatible Media Server</strong></p>
<p>I use Navidrome, but you can use any flavour of SubSonic that you like. For information on getting and setting up Navidrome
check out their website <a class="reference external" href="https://www.navidrome.org/">Navidrome</a>. Your media server must be available on port 443 and serve requests using
https with a valid TLS certificate, these are requirements dictated by Amazon and you must meet them or you will be unable to stream your collection.
The media server needs to be publicly accessible from the Internet, in addition to allowing you to use this skill you will then be able to use any
SubSonic API compatible mobile app to listen to your collection too.</p>
<p>You can get free TLS certificates from <a class="reference external" href="https://letsencrypt.org/">Lets Encrypt</a></p>
<p>You can set up dynamic DNS to make your media server accessible for free with <a class="reference external" href="https://freedns.afraid.org/">afraid.org</a></p>
<p><strong>Tags</strong></p>
<p>This may seem obvious but you need to make sure that your collection is accurately tagged with information like the artist, title, track number etc.
as this is the only way that your media server can identify the music in your collection. If you need a tool to help with this have a look at
<a class="reference external" href="https://picard.musicbrainz.org/">MusicBrainz Picard</a>.</p>
<p><strong>An Amazon Echo Device</strong></p>
<p>You need something to listen to your music on!</p>
</section>
<section id="about-the-asknavidrome-skill">
<h2>About the AskNavidrome Skill<a class="headerlink" href="#about-the-asknavidrome-skill" title="Link to this heading">#</a></h2>
<a class="reference internal image-reference" href="_images/AskNavidrome_Diagram.png"><img alt="AskNavidrome Overview Diagram" class="align-center" src="_images/AskNavidrome_Diagram.png" style="width: 800px;" />
</a>
<p>The skill consists of two parts, the actual Alexa skill and the web service service which allows the skill to connect to your SubSonic API
compatible media server. The web service needs to have a valid TLS certificate, the easiest way to enable this is to run the web service
behind a reverse proxy, the web service also needs to be publicly accessible on the Internet to allow the Alexa skill to access the service.</p>
</section>
<section id="supported-intents">
<h2>Supported Intents<a class="headerlink" href="#supported-intents" title="Link to this heading">#</a></h2>
<div class="pst-scrollable-table-container"><table class="table">
<thead>
<tr class="row-odd"><th class="head"><p>Intent Name</p></th>
<th class="head"><p>Description</p></th>
<th class="head"><p>Example</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlayMusicByArtist" title="app.NaviSonicPlayMusicByArtist"><code class="xref py py-class docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByArtist</span></code></a></p></td>
<td><p>Play music by a specific artist</p></td>
<td><p>Play Where is my Mind by The Pixies</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlayAlbumByArtist" title="app.NaviSonicPlayAlbumByArtist"><code class="xref py py-class docutils literal notranslate"><span class="pre">NaviSonicPlayAlbumByArtist</span></code></a></p></td>
<td><p>Play a specific album by a specific artist</p></td>
<td><p>Play The Blue Album by The Beatles</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlaySongByArtist" title="app.NaviSonicPlaySongByArtist"><code class="xref py py-class docutils literal notranslate"><span class="pre">NaviSonicPlaySongByArtist</span></code></a></p></td>
<td><p>Play a specific song by a specific artist</p></td>
<td><p>Play the song Help by The Beatles</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlayPlaylist" title="app.NaviSonicPlayPlaylist"><code class="xref py py-class docutils literal notranslate"><span class="pre">NaviSonicPlayPlaylist</span></code></a></p></td>
<td><p>Play a playlist</p></td>
<td><p>Play the playlist work music</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlayMusicByGenre" title="app.NaviSonicPlayMusicByGenre"><code class="xref py py-class docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByGenre</span></code></a></p></td>
<td><p>Play music with a specific genre</p></td>
<td><p>Play jazz music</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlayMusicRandom" title="app.NaviSonicPlayMusicRandom"><code class="xref py py-class docutils literal notranslate"><span class="pre">NaviSonicPlayMusicRandom</span></code></a></p></td>
<td><p>Play a random mix of songs</p></td>
<td><p>Play random songs</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlayFavouriteSongs" title="app.NaviSonicPlayFavouriteSongs"><code class="xref py py-class docutils literal notranslate"><span class="pre">NaviSonicPlayFavouriteSongs</span></code></a></p></td>
<td><p>Play your starred / favourite songs</p></td>
<td><p>Play my favourite songs</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicRandomiseQueue" title="app.NaviSonicRandomiseQueue"><code class="xref py py-class docutils literal notranslate"><span class="pre">NaviSonicRandomiseQueue</span></code></a></p></td>
<td><p>Shuffle / randomise the current play queue</p></td>
<td><p>Shuffle the queue</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicSongDetails" title="app.NaviSonicSongDetails"><code class="xref py py-class docutils literal notranslate"><span class="pre">NaviSonicSongDetails</span></code></a></p></td>
<td><p>Give details on the playing track</p></td>
<td><p>What is playing</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicStarSong" title="app.NaviSonicStarSong"><code class="xref py py-class docutils literal notranslate"><span class="pre">NaviSonicStarSong</span></code></a></p></td>
<td><p>Star / favourite a song</p></td>
<td><p>Star this song</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicUnstarSong" title="app.NaviSonicUnstarSong"><code class="xref py py-class docutils literal notranslate"><span class="pre">NaviSonicUnstarSong</span></code></a></p></td>
<td><p>Unstar / unfavourite a song</p></td>
<td><p>Unstar this song</p></td>
</tr>
</tbody>
</table>
</div>
<p>The following control intents are also supported:</p>
<ul class="simple">
<li><p><a class="reference internal" href="#app.NextPlaybackHandler" title="app.NextPlaybackHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">Next</span> <span class="pre">/</span> <span class="pre">Skip</span></code></a></p></li>
<li><p><a class="reference internal" href="#app.PreviousPlaybackHandler" title="app.PreviousPlaybackHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">Previous</span> <span class="pre">/</span> <span class="pre">Back</span></code></a></p></li>
<li><p><a class="reference internal" href="#app.PausePlaybackHandler" title="app.PausePlaybackHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">Pause</span></code></a></p></li>
<li><p><a class="reference internal" href="#app.ResumePlaybackHandler" title="app.ResumePlaybackHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">Resume</span></code></a></p></li>
</ul>
<p>Due to the way that Alexa skills operate there are some limitations. Full music Alexa skills require a catalog of content to be provided and this defeats
the purpose of being able to search and stream from your own server directly. Because of this a custom skill type is used along with the AudioPlayer interface,
but this has some limitations in how the skill is invoked.</p>
<p>The following voice commands should be successful (thanks to Raul824)</p>
<ul class="simple">
<li><p>Alexa ask Navisonic What is Playing?</p></li>
<li><p>Alexa ask Navisonic to star this song.</p></li>
<li><p>Alexa ask Navisonic to unstar this song.</p></li>
<li><p>Alexa ask Navisonic to play rock music</p></li>
<li><p>Alexa ask Navisonic to play playlist “Playlist Name”</p></li>
</ul>
<p>If you have any problems with these, you can open the skill manually with <em>Alexa, open Navisonic</em>. Similarly this can be done when a track is playing, for example
if you want to get information on the track that is playing you will need to invoke the skill and call the intent by saying the following while the track is playing:</p>
<ul class="simple">
<li><p>Alexa, open Navisonic</p></li>
<li><p>What is playing?</p></li>
</ul>
</section>
<section id="installation-and-setup">
<h2>Installation and Setup<a class="headerlink" href="#installation-and-setup" title="Link to this heading">#</a></h2>
<section id="creating-the-asknavidrome-alexa-skill">
<h3>Creating the AskNavidrome Alexa Skill<a class="headerlink" href="#creating-the-asknavidrome-alexa-skill" title="Link to this heading">#</a></h3>
<ol class="arabic">
<li><p>Login to the Amazon Alexa Skills Kit Builder at <a class="reference external" href="https://developer.amazon.com">https://developer.amazon.com</a>.
- You must use the same account that is set on your Echo devices.</p></li>
<li><p>Click <em>Create Skill</em></p></li>
<li><p>Configure the skill:</p>
<a class="reference internal image-reference" href="_images/create_skill_1.png"><img alt="Skill Creation Step 1" class="align-center" src="_images/create_skill_1.png" style="width: 800px;" />
</a>
<ul>
<li><p>Set <em>Skill name</em> to the name you wish to use to invoke the skill. This should be two words or a warning will be raised, I have found that a single word
still works when testing. It can be hard to find a good skill name so feel free to experiment!</p></li>
<li><p>Set <em>Primary locale</em> to your locale, this <strong>must</strong> also be the locale set on your Echo device.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>The locale setting is extremely important, if the skill locale and the locale set on your Echo device do not match the skill will not work. In
addition there are no error messages generated making the issue quite difficult to troubleshoot. The locale on your Echo device can be set via the Alexa Android
app. Please do check the locale setting if you have trouble setting up the skill as the Alexa Skill Builder will default to your local locale, but Echo devices
are set to the US locale by default. Checking this first will save you a few hours of troubleshooting!</p>
</div>
</li>
<li><p>Set sync locales to <em>No</em></p></li>
<li><p>Choose <em>Custom</em> as the model.</p></li>
<li><p>Choose <em>Provision your own</em> as the hosting method for backend resources.</p></li>
<li><p>Click <em>Create skill</em> again</p></li>
</ul>
</li>
<li><p>Choose the template</p>
<a class="reference internal image-reference" href="_images/create_skill_2.png"><img alt="Skill Creation Step 2" class="align-center" src="_images/create_skill_2.png" style="width: 800px;" />
</a>
<ul class="simple">
<li><p>Choose <em>Start from Scratch</em></p></li>
<li><p>Click <em>Continue with template</em> and wait while the skill is created.</p></li>
</ul>
</li>
<li><p>Upload the intents</p>
<a class="reference internal image-reference" href="_images/create_skill_3.png"><img alt="Skill Creation Step 3" class="align-center" src="_images/create_skill_3.png" style="width: 800px;" />
</a>
<ul class="simple">
<li><p>Click <em>Interaction Model</em>, then <em>JSON Editor</em></p></li>
<li><p>Delete everything that is currently in the editor and paste in the contents of <strong>alexa.json</strong></p></li>
<li><p>Click <em>Save Model</em></p></li>
</ul>
</li>
<li><p>Configure playlists</p>
<p>To be able to play your playlists you must add the name of each playlist to the <em>playlist_names</em> slot type.
You will need to maintain the list and add additional playlist names as you create them to allow them to
be played via the AskNavisonic skill.</p>
<a class="reference internal image-reference" href="_images/create_skill_4.png"><img alt="Skill Creation Step 4" class="align-center" src="_images/create_skill_4.png" style="width: 800px;" />
</a>
<ul class="simple">
<li><p>Click <em>Slot Types</em>.</p></li>
<li><p>Click <em>playlist_names</em>.</p></li>
<li><p>Add and remove names as required.</p></li>
<li><p>Click the <em>Save Model</em> button when you are done.</p></li>
</ul>
</li>
<li><p>Enable the Audio Player interface</p>
<a class="reference internal image-reference" href="_images/create_skill_5.png"><img alt="Skill Creation Step 5" class="align-center" src="_images/create_skill_5.png" style="width: 800px;" />
</a>
<ul class="simple">
<li><p>Click <em>Interfaces</em>, enable <em>Audio Player</em>, then click <em>Save Interfaces</em></p></li>
</ul>
</li>
<li><p>Set the endpoint</p>
<p>The skills endpoint is the location of the AskNavidrome web service.</p>
<a class="reference internal image-reference" href="_images/create_skill_6.png"><img alt="Skill Creation Step 6" class="align-center" src="_images/create_skill_6.png" style="width: 800px;" />
</a>
<ul class="simple">
<li><p>Click <em>Endpoint</em></p></li>
<li><p>Select <em>HTTPS</em></p></li>
<li><p>Enter the the URL to the web service in the <em>Default Region</em> box.</p></li>
<li><p>Select the SSL certificate type. This will depend on your setup, if you are using Lets Encrypt
choose <em>My development endpoints has a certificate from a trusted certificate authority</em></p></li>
<li><p>Click <em>Save Endpoints</em></p></li>
</ul>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>There are three options to pick from when setting the SSL certificate type in the Amazon Developer portal.
To confirm that you are using the correct option browse to the URL of your AskNavidrome skill, you will see a message similar to <em>405 Method Not Allowed</em>, this is normal.
View the certificate in use by the skill in your browser and look at the <strong>Common Name (CN)</strong> field. If this contains a <strong>*</strong> for example <strong>*.ngrok-free.app</strong> then you
are using a wildcard certificate. If the common name does not contain a <strong>*</strong> then you have a regular certificate.</p>
<ul class="simple">
<li><dl class="simple">
<dt>My development endpoint is a sub-domain of a domain that has a wildcard certificate from a certificate authority</dt><dd><ul>
<li><p>Use this if your skill uses a wildcard certificate with a <strong>*</strong></p></li>
</ul>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt>My development endpoint has a certificate from a trusted certificate authority</dt><dd><ul>
<li><p>Use this if you have a regular certificate</p></li>
</ul>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt>I will upload a self-signed certificate in X509 format</dt><dd><ul>
<li><p>Do not select this option unless you know what you are doing.</p></li>
</ul>
</dd>
</dl>
</li>
</ul>
</div>
</li>
<li><p>Build the skill</p>
<a class="reference internal image-reference" href="_images/create_skill_7.png"><img alt="Skill Creation Step 7" class="align-center" src="_images/create_skill_7.png" style="width: 800px;" />
</a>
<ul class="simple">
<li><p>Click <em>Invocations</em>, <em>Skill Invocation Name</em>.</p></li>
<li><p>Click <em>Save Model</em>.</p></li>
<li><p>Click <em>Build Model</em>, the process will take a few minutes.</p></li>
</ul>
</li>
<li><p>Add the skill to your Echo devices.</p>
<p>The skill you just created should now be available as a development skill in your Alexa app, you can add the development skill to your
Echo devices.</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>It is important that you <strong>do not</strong> publish the skill. If you do anyone that uses the skill will be able to stream your music
collection, it may also be possible for credentials to be retrieved.</p>
</div>
</li>
</ol>
</section>
<section id="deploying-the-asknavidrome-web-service">
<h3>Deploying the AskNavidrome Web Service<a class="headerlink" href="#deploying-the-asknavidrome-web-service" title="Link to this heading">#</a></h3>
<p>The AskNavidrome Web Service is written in Python and can be run directly on a PC with a Python installation, or as a Docker container (recommended).
Whichever method you use, the service and your Navidrome installation must be available via HTTPS with a well known certificate. One of the easiest
ways to implement this is with a reverse proxy. There are several
available for free:</p>
<ul class="simple">
<li><p><a class="reference external" href="https://caddyserver.com/">Caddy</a>.</p></li>
<li><p><a class="reference external" href="https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html/">Apache</a>.</p></li>
<li><p><a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/">Nginx</a>.</p></li>
</ul>
<section id="run-on-your-pc">
<h4>Run on your PC<a class="headerlink" href="#run-on-your-pc" title="Link to this heading">#</a></h4>
<p>Please remember that the web service needs to be publicly accessible, if you are running it directly on your PC this means your PC is publicly
accessible.</p>
<ol class="arabic">
<li><dl class="simple">
<dt>Install Python 3</dt><dd><ul class="simple">
<li><p><a class="reference external" href="https://www.python.org/downloads/">python3.org</a></p></li>
</ul>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt>Install git tools</dt><dd><ul class="simple">
<li><p><a class="reference external" href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git">git-scm.com</a></p></li>
</ul>
</dd>
</dl>
</li>
<li><p>Create a directory for the web service</p></li>
<li><p>Change to the directory and clone the repository from GitHub</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="nb">cd</span><span class="w"> </span>directory
git<span class="w"> </span>clone<span class="w"> </span>https://github.com/rosskouk/asknavidrome.git
</pre></div>
</div>
</li>
<li><p>Change directory to the skill folder</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="nb">cd</span><span class="w"> </span>asknavidrome/skill
</pre></div>
</div>
</li>
<li><p>Start the skill by setting the required environment variables and executing the application
you can find details of what each option does in the <em>configuration</em> section.</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="nv">NAVI_SKILL_ID</span><span class="o">=</span>&lt;your-skill-id&gt;<span class="w"> </span><span class="se">\</span>
<span class="nv">NAVI_SONG_COUNT</span><span class="o">=</span><span class="m">50</span><span class="w"> </span><span class="se">\</span>
<span class="nv">NAVI_URL</span><span class="o">=</span>https://your-navidrome-server.test<span class="w"> </span><span class="se">\</span>
<span class="nv">NAVI_USER</span><span class="o">=</span>&lt;username&gt;<span class="w"> </span><span class="se">\</span>
<span class="nv">NAVI_PASS</span><span class="o">=</span>&lt;password&gt;<span class="w"> </span><span class="se">\</span>
<span class="nv">NAVI_PORT</span><span class="o">=</span><span class="m">443</span><span class="w"> </span><span class="se">\</span>
<span class="nv">NAVI_API_PATH</span><span class="o">=</span>/rest<span class="w"> </span><span class="se">\</span>
<span class="nv">NAVI_API_VER</span><span class="o">=</span><span class="m">1</span>.16.1<span class="w"> </span><span class="se">\</span>
<span class="nv">NAVI_DEBUG</span><span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="se">\</span>
python3<span class="w"> </span>app.py
</pre></div>
</div>
</li>
</ol>
</section>
<section id="run-inside-a-docker-container">
<h4>Run inside a Docker container<a class="headerlink" href="#run-inside-a-docker-container" title="Link to this heading">#</a></h4>
<p>A Dockerfile has been provided and a prebuilt container is hosted on github.com. <strong>Please note that the prebuilt container was created on an amd64 platform</strong>. If you
require a different architecture such as arm for a Raspberry Pi, you will need to build a new image using the Dockerfile provided with the repository.</p>
<p>You can configure the service by passing environment variables to the <em>docker run</em> command.</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker<span class="w"> </span>run<span class="w"> </span>-p<span class="w"> </span><span class="m">5000</span>:5000<span class="w"> </span><span class="se">\</span>
-e<span class="w"> </span><span class="nv">NAVI_SKILL_ID</span><span class="o">=</span>&lt;your-skill-id&gt;<span class="w"> </span><span class="se">\</span>
-e<span class="w"> </span><span class="nv">NAVI_SONG_COUNT</span><span class="o">=</span><span class="m">50</span><span class="w"> </span><span class="se">\</span>
-e<span class="w"> </span><span class="nv">NAVI_URL</span><span class="o">=</span>https://your-navidrome-server.test<span class="w"> </span><span class="se">\</span>
-e<span class="w"> </span><span class="nv">NAVI_USER</span><span class="o">=</span>&lt;username&gt;<span class="w"> </span><span class="se">\</span>
-e<span class="w"> </span><span class="nv">NAVI_PASS</span><span class="o">=</span>&lt;password&gt;<span class="w"> </span><span class="se">\</span>
-e<span class="w"> </span><span class="nv">NAVI_PORT</span><span class="o">=</span><span class="m">443</span><span class="w"> </span><span class="se">\</span>
-e<span class="w"> </span><span class="nv">NAVI_API_PATH</span><span class="o">=</span>/rest<span class="w"> </span><span class="se">\</span>
-e<span class="w"> </span><span class="nv">NAVI_API_VER</span><span class="o">=</span><span class="m">1</span>.16.1<span class="w"> </span><span class="se">\</span>
-e<span class="w"> </span><span class="nv">NAVI_DEBUG</span><span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="se">\</span>
ghcr.io/rosskouk/asknavidrome:&lt;tag&gt;
</pre></div>
</div>
<p>If you intent to use the container to build a Kubernetes pod, I have created a side car container which can automatically configure and renew
TLS certificates with the Kubernetes Nginx Ingress. <a class="reference external" href="https://github.com/rosskouk/docker-image-k8s-letsencrypt">More information</a>.</p>
</section>
<section id="configuration">
<h4>Configuration<a class="headerlink" href="#configuration" title="Link to this heading">#</a></h4>
<p>The AskNavidrome Web Service reads its configuration from environment variables and needs the following configuration
information to run:</p>
<div class="pst-scrollable-table-container"><table class="table">
<thead>
<tr class="row-odd"><th class="head"><p>Environment Variable</p></th>
<th class="head"><p>Description</p></th>
<th class="head"><p>Example</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>NAVI_SKILL_ID</p></td>
<td><p>The ID of your Alexa skill, this prevents other skills from
connecting to the web service.</p></td>
<td><p>amzn1.ask.skill.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</p></td>
</tr>
<tr class="row-odd"><td><p>NAVI_SONG_COUNT</p></td>
<td><p>The minimum number of songs to add to a playlist. If playing
random music, music by genre or music by an artist the web
service will ensure the minimum number of tracks added to the
queue is at least this value</p></td>
<td><p>50</p></td>
</tr>
<tr class="row-even"><td><p>NAVI_URL</p></td>
<td><p>The URL to the Subsonic API server</p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">https://navidrome.example.test</span></code></p></td>
</tr>
<tr class="row-odd"><td><p>NAVI_USER</p></td>
<td><p>The user name used to connect to the Subsonic API server</p></td>
<td><p>bob</p></td>
</tr>
<tr class="row-even"><td><p>NAVI_PASS</p></td>
<td><p>The password used to connect to the Subsonic API server</p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">Sup3rStrongP&#64;ssword</span></code></p></td>
</tr>
<tr class="row-odd"><td><p>NAVI_PORT</p></td>
<td><p>The port the Subsonic API server is listening on</p></td>
<td><p>443</p></td>
</tr>
<tr class="row-even"><td><p>NAVI_API_PATH</p></td>
<td><p>The path to the Subsonic API, this should be /rest if you are
using Navidrome and havent changed anything</p></td>
<td><p>/rest</p></td>
</tr>
<tr class="row-odd"><td><p>NAVI_API_VER</p></td>
<td><p>The version of the Subsonic API in use</p></td>
<td><p>1.16.1</p></td>
</tr>
<tr class="row-even"><td><p>NAVI_DEBUG</p></td>
<td><p>Enable debugging, by setting this variable to 1, or 3.</p></td>
<td><p>1</p></td>
</tr>
</tbody>
</table>
</div>
</section>
</section>
</section>
<section id="tips-tricks">
<h2>Tips &amp; Tricks<a class="headerlink" href="#tips-tricks" title="Link to this heading">#</a></h2>
<p>Here are a list of tips and ideas for using the skill</p>
<section id="playing-music-on-multiple-devices">
<h3>Playing Music on Multiple Devices<a class="headerlink" href="#playing-music-on-multiple-devices" title="Link to this heading">#</a></h3>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Thanks to &#64;Rusty77</p>
</div>
<p>You can play music on multiple devices, by following these steps:</p>
<ol class="arabic simple">
<li><p>Add all devices you wish to play music on simultaneously to a group in your Alexa app</p></li>
<li><p>Start playback by asking Alexa to play something on the group</p></li>
<li><p>Then ask AskNavidrome to play something. It should be played on all devices in the group.</p></li>
</ol>
</section>
</section>
<section id="troubleshooting">
<h2>Troubleshooting<a class="headerlink" href="#troubleshooting" title="Link to this heading">#</a></h2>
<section id="general">
<h3>General<a class="headerlink" href="#general" title="Link to this heading">#</a></h3>
<p>Troubleshooting and debugging Alexa skills can be a little frustrating, here are the best ways I have found to do it.</p>
<ol class="arabic">
<li><p>Understand that the Alexa skill is effectively just a set of buttons.
All the skill does is call functions in the web service, it does nothing other than translate what you say to the function name that will perform the task.
Very little can go wrong with this, but here is a list of things to check:</p>
<ul class="simple">
<li><p>Does the locale of the skill match the locale on your Echo device? If this is mismatched it looks like nothing happens when you try to invoke the skill.</p></li>
<li><p>Is the endpoint set correctly? The endpoint is the URL to the web service, if the skill cannot communicate with the web service check this first.
you must ensure that the URL is https and the certificate is compatible with Amazon services.</p></li>
<li><p>If an intent does not work, you might need to add an additional phrase to the intent in the developer console. The included phrases work for me, you might
want to make some changes though.</p></li>
</ul>
</li>
<li><p>Enable debugging and look at the logs generated by the web service.</p></li>
<li><p>When level 3 debugging is enabled the following web pages are available from the web service</p>
<ul class="simple">
<li><p>url-to-web-service/queue</p>
<ul>
<li><p>Shows the tracks in the current queue</p></li>
</ul>
</li>
<li><p>url-to-web-service/history</p>
<ul>
<li><p>Shows the tracks that have already been played</p></li>
</ul>
</li>
<li><p>url-to-web-service/buffer</p>
<ul>
<li><p>Shows the tracks in the buffer. Note that the buffer and queue differ as Amazon will request the next track to be queued before the track playing is
finished. The buffer can be thought of as the list of tracks still to be sent to Amazon, where as the queue is the list of tracks still to be played.</p></li>
</ul>
</li>
</ul>
</li>
<li><p>Use the test page in the developer console
The test page will show you the responses between Amazon and an simulated Echo device, this can help you uncover error messages that are normally hidden.</p>
<a class="reference internal image-reference" href="_images/debugging_1.png"><img alt="debugging Step 1" class="align-center" src="_images/debugging_1.png" style="width: 800px;" />
</a>
<ul class="simple">
<li><p>Click test and make sure you tick <strong>Device Log</strong></p></li>
<li><p>You can type instructions in the box or use the microphone on your device</p></li>
</ul>
<a class="reference internal image-reference" href="_images/debugging_2.png"><img alt="debugging Step 2" class="align-center" src="_images/debugging_2.png" style="width: 800px;" />
</a>
<ul class="simple">
<li><p>After you have entered a command you will get the Alexa response back, scroll down to the <strong>Device Log</strong> section and click through the entries
the entries will contain any errors that were thrown.</p></li>
</ul>
</li>
</ol>
</section>
<section id="debug-options">
<h3>Debug Options<a class="headerlink" href="#debug-options" title="Link to this heading">#</a></h3>
<p>You can enable the following debug options by setting the NAVI_DEBUG environment variable.</p>
<ul class="simple">
<li><p>0 = Logging set to WARNING and higher.</p></li>
<li><p>1 = Logging set to INFO and higher.</p></li>
<li><p>2 = Logging set to DEBUG and higher and request / response
interceptors are enabled.</p></li>
<li><p>3 = All features of level 2 and the web ui. Note the UI
will be <strong>publicly</strong> available while this is enabled.</p></li>
</ul>
</section>
</section>
<section id="known-issues">
<h2>Known Issues<a class="headerlink" href="#known-issues" title="Link to this heading">#</a></h2>
<section id="the-skill-appears-to-work-but-no-music-is-played-errors-similar-to-below-appear-in-the-web-service-log">
<h3>The skill appears to work but no music is played. Errors similar to below appear in the web service log<a class="headerlink" href="#the-skill-appears-to-work-but-no-music-is-played-errors-similar-to-below-appear-in-the-web-service-log" title="Link to this heading">#</a></h3>
<blockquote>
<div><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="m">2022</span>-11-19<span class="w"> </span><span class="m">13</span>:16:45,478<span class="w"> </span>-<span class="w"> </span>root<span class="w"> </span>-<span class="w"> </span>DEBUG<span class="w"> </span>-<span class="w"> </span>In<span class="w"> </span>PlaybackFailedHandler
<span class="m">2022</span>-11-19<span class="w"> </span><span class="m">13</span>:16:45,479<span class="w"> </span>-<span class="w"> </span>root<span class="w"> </span>-<span class="w"> </span>ERROR<span class="w"> </span>-<span class="w"> </span>Playback<span class="w"> </span>Failed:<span class="w"> </span><span class="o">{</span><span class="s1">&#39;message&#39;</span>:<span class="w"> </span><span class="s1">&#39;Device playback error&#39;</span>,<span class="w"> </span><span class="s1">&#39;object_type&#39;</span>:<span class="w"> </span><span class="s1">&#39;MEDIA_ERROR_UNKNOWN&#39;</span><span class="o">}</span>
<span class="m">2022</span>-11-19<span class="w"> </span><span class="m">13</span>:16:45,480<span class="w"> </span>-<span class="w"> </span>werkzeug<span class="w"> </span>-<span class="w"> </span>INFO<span class="w"> </span>-<span class="w"> </span><span class="m">10</span>.44.17.62<span class="w"> </span>-<span class="w"> </span>-<span class="w"> </span><span class="o">[</span><span class="m">19</span>/Nov/2022<span class="w"> </span><span class="m">13</span>:16:45<span class="o">]</span><span class="w"> </span><span class="s2">&quot;POST / HTTP/1.1&quot;</span><span class="w"> </span><span class="m">200</span><span class="w"> </span>-
<span class="m">2022</span>-11-19<span class="w"> </span><span class="m">13</span>:16:48,599<span class="w"> </span>-<span class="w"> </span>root<span class="w"> </span>-<span class="w"> </span>DEBUG<span class="w"> </span>-<span class="w"> </span>In<span class="w"> </span>PlaybackFailedHandler
<span class="m">2022</span>-11-19<span class="w"> </span><span class="m">13</span>:16:48,600<span class="w"> </span>-<span class="w"> </span>root<span class="w"> </span>-<span class="w"> </span>ERROR<span class="w"> </span>-<span class="w"> </span>Playback<span class="w"> </span>Failed:<span class="w"> </span><span class="o">{</span><span class="s1">&#39;message&#39;</span>:<span class="w"> </span><span class="s1">&#39;Device playback error&#39;</span>,<span class="s1">&#39;object_type&#39;</span>:<span class="w"> </span><span class="s1">&#39;MEDIA_ERROR_INTERNAL_DEVICE_ERROR&#39;</span><span class="o">}</span>
</pre></div>
</div>
<ul class="simple">
<li><p>I have not found a reason as to why this happens from time to time, however it can be resolved by doing a hard reboot of your Echo device.
Disconnect the power for a minute and plug it back in then try again and music should play</p></li>
</ul>
</div></blockquote>
</section>
<section id="the-following-error-is-displayed-when-you-try-to-run-the-docker-container">
<h3>The following error is displayed when you try to run the Docker container<a class="headerlink" href="#the-following-error-is-displayed-when-you-try-to-run-the-docker-container" title="Link to this heading">#</a></h3>
<blockquote>
<div><div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="nb">exec</span><span class="w"> </span>/opt/env/bin/python3:<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>format<span class="w"> </span>error
</pre></div>
</div>
<ul class="simple">
<li><p>You are using the prebuilt container on a non amd64 based system. You will need to build your own Docker image using the Dockerfile included
with the repository.</p></li>
</ul>
</div></blockquote>
</section>
<section id="you-are-having-trouble-connecting-to-the-skill-and-use-cloudflare">
<h3>You are having trouble connecting to the skill and use CloudFlare<a class="headerlink" href="#you-are-having-trouble-connecting-to-the-skill-and-use-cloudflare" title="Link to this heading">#</a></h3>
<blockquote>
<div><div class="admonition note">
<p class="admonition-title">Note</p>
<p>Thanks to &#64;dwebb8272 and &#64;jame25</p>
</div>
<p>Several users have had difficulty connecting to the skill when hosted in or when using CloudFlare for DNS. A user has reported that CloudFlare have
a default <strong>Web Application Firewall (WAF)</strong> which block requests made by Python URLLib, this results in you not being able to connect and is quite difficult
to debug.</p>
<p>The following screenshots show an example of how the user was able to overcome the issue.</p>
<a class="reference internal image-reference" href="_images/cloudflare-waf-1.jpg"><img alt="CloudFlare WAF Rule Example 1 of 3" class="align-center" src="_images/cloudflare-waf-1.jpg" style="width: 800px;" />
</a>
<a class="reference internal image-reference" href="_images/cloudflare-waf-2.jpg"><img alt="CloudFlare WAF Rule Example 2 of 3" class="align-center" src="_images/cloudflare-waf-2.jpg" style="width: 800px;" />
</a>
<a class="reference internal image-reference" href="_images/cloudflare-waf-3.jpg"><img alt="CloudFlare WAF Rule Example 3 of 3" class="align-center" src="_images/cloudflare-waf-3.jpg" style="width: 800px;" />
</a>
<p>Once you have the rule in place disable proxying for your AskNavidrome web service domain in CloudFlare by navigating to <em>DNS -&gt; Records</em>
and setting it to <em>DNS Only</em>.</p>
</div></blockquote>
</section>
</section>
<section id="code-documentation">
<h2>Code Documentation<a class="headerlink" href="#code-documentation" title="Link to this heading">#</a></h2>
<div class="toctree-wrapper compound">
</div>
<section id="module-app">
<span id="asknavidrome-main"></span><h3>AskNavidrome main<a class="headerlink" href="#module-app" title="Link to this heading">#</a></h3>
<p><strong>Classes:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.CheckAudioInterfaceHandler" title="app.CheckAudioInterfaceHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">CheckAudioInterfaceHandler</span></code></a>()</p></td>
<td><p>Check if device supports audio play.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.GeneralExceptionHandler" title="app.GeneralExceptionHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">GeneralExceptionHandler</span></code></a>()</p></td>
<td><p>Handle general exceptions</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.HelpHandler" title="app.HelpHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">HelpHandler</span></code></a>()</p></td>
<td><p>Handle HelpIntent</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.LaunchRequestHandler" title="app.LaunchRequestHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">LaunchRequestHandler</span></code></a>()</p></td>
<td><p>Handle LaunchRequest and NavigateHomeIntent</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.LoggingRequestInterceptor" title="app.LoggingRequestInterceptor"><code class="xref py py-obj docutils literal notranslate"><span class="pre">LoggingRequestInterceptor</span></code></a>()</p></td>
<td><p>Intercept all requests</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.LoggingResponseInterceptor" title="app.LoggingResponseInterceptor"><code class="xref py py-obj docutils literal notranslate"><span class="pre">LoggingResponseInterceptor</span></code></a>()</p></td>
<td><p>Intercept all responses</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlayAlbumByArtist" title="app.NaviSonicPlayAlbumByArtist"><code class="xref py py-obj docutils literal notranslate"><span class="pre">NaviSonicPlayAlbumByArtist</span></code></a>()</p></td>
<td><p>Handle NaviSonicPlayAlbumByArtist</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlayFavouriteSongs" title="app.NaviSonicPlayFavouriteSongs"><code class="xref py py-obj docutils literal notranslate"><span class="pre">NaviSonicPlayFavouriteSongs</span></code></a>()</p></td>
<td><p>Handle the NaviSonicPlayFavouriteSongs intent</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlayMusicByArtist" title="app.NaviSonicPlayMusicByArtist"><code class="xref py py-obj docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByArtist</span></code></a>()</p></td>
<td><p>Handle NaviSonicPlayMusicByArtist</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlayMusicByGenre" title="app.NaviSonicPlayMusicByGenre"><code class="xref py py-obj docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByGenre</span></code></a>()</p></td>
<td><p>Play songs from the given genre</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlayMusicRandom" title="app.NaviSonicPlayMusicRandom"><code class="xref py py-obj docutils literal notranslate"><span class="pre">NaviSonicPlayMusicRandom</span></code></a>()</p></td>
<td><p>Handle the NaviSonicPlayMusicRandom intent</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlayPlaylist" title="app.NaviSonicPlayPlaylist"><code class="xref py py-obj docutils literal notranslate"><span class="pre">NaviSonicPlayPlaylist</span></code></a>()</p></td>
<td><p>Handle NaviSonicPlayPlaylist</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlaySongByArtist" title="app.NaviSonicPlaySongByArtist"><code class="xref py py-obj docutils literal notranslate"><span class="pre">NaviSonicPlaySongByArtist</span></code></a>()</p></td>
<td><p>Handle the NaviSonicPlaySongByArtist intent</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicRandomiseQueue" title="app.NaviSonicRandomiseQueue"><code class="xref py py-obj docutils literal notranslate"><span class="pre">NaviSonicRandomiseQueue</span></code></a>()</p></td>
<td><p>Handle NaviSonicRandomiseQueue Intent</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicSongDetails" title="app.NaviSonicSongDetails"><code class="xref py py-obj docutils literal notranslate"><span class="pre">NaviSonicSongDetails</span></code></a>()</p></td>
<td><p>Handle NaviSonicSongDetails Intent</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicStarSong" title="app.NaviSonicStarSong"><code class="xref py py-obj docutils literal notranslate"><span class="pre">NaviSonicStarSong</span></code></a>()</p></td>
<td><p>Handle NaviSonicStarSong Intent</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicUnstarSong" title="app.NaviSonicUnstarSong"><code class="xref py py-obj docutils literal notranslate"><span class="pre">NaviSonicUnstarSong</span></code></a>()</p></td>
<td><p>Handle NaviSonicUnstarSong Intent</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NextPlaybackHandler" title="app.NextPlaybackHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">NextPlaybackHandler</span></code></a>()</p></td>
<td><p>Handle NextIntent</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.PausePlaybackHandler" title="app.PausePlaybackHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PausePlaybackHandler</span></code></a>()</p></td>
<td><p>Handler for stopping audio.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.PlaybackFailedEventHandler" title="app.PlaybackFailedEventHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PlaybackFailedEventHandler</span></code></a>()</p></td>
<td><p>AudioPlayer.PlaybackFailed Directive received.</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.PlaybackFinishedHandler" title="app.PlaybackFinishedHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PlaybackFinishedHandler</span></code></a>()</p></td>
<td><p>AudioPlayer.PlaybackFinished Directive received.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.PlaybackNearlyFinishedHandler" title="app.PlaybackNearlyFinishedHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PlaybackNearlyFinishedHandler</span></code></a>()</p></td>
<td><p>AudioPlayer.PlaybackNearlyFinished Directive received.</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.PlaybackStartedHandler" title="app.PlaybackStartedHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PlaybackStartedHandler</span></code></a>()</p></td>
<td><p>AudioPlayer.PlaybackStarted Directive received.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.PlaybackStoppedHandler" title="app.PlaybackStoppedHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PlaybackStoppedHandler</span></code></a>()</p></td>
<td><p>AudioPlayer.PlaybackStopped Directive received.</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.PreviousPlaybackHandler" title="app.PreviousPlaybackHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PreviousPlaybackHandler</span></code></a>()</p></td>
<td><p>Handle PreviousIntent</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.ResumePlaybackHandler" title="app.ResumePlaybackHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ResumePlaybackHandler</span></code></a>()</p></td>
<td><p>Handler for resuming audio on different events.</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.SkillEventHandler" title="app.SkillEventHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">SkillEventHandler</span></code></a>()</p></td>
<td><p>Close session for skill events or when session ends.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.SystemExceptionHandler" title="app.SystemExceptionHandler"><code class="xref py py-obj docutils literal notranslate"><span class="pre">SystemExceptionHandler</span></code></a>()</p></td>
<td><p>Handle System.ExceptionEncountered</p></td>
</tr>
</tbody>
</table>
</div>
<p><strong>Functions:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.queue_worker_thread" title="app.queue_worker_thread"><code class="xref py py-obj docutils literal notranslate"><span class="pre">queue_worker_thread</span></code></a>(connection, play_queue, ...)</p></td>
<td><p>Media queue worker</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.sanitise_speech_output" title="app.sanitise_speech_output"><code class="xref py py-obj docutils literal notranslate"><span class="pre">sanitise_speech_output</span></code></a>(speech_string)</p></td>
<td><p>Sanitise speech output inline with the SSML standard</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py class">
<dt class="sig sig-object py" id="app.CheckAudioInterfaceHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">CheckAudioInterfaceHandler</span></span><a class="headerlink" href="#app.CheckAudioInterfaceHandler" title="Link to this definition">#</a></dt>
<dd><p>Check if device supports audio play.</p>
<p>This can be used as the first handler to be checked, before invoking
other handlers, thus making the skill respond to unsupported devices
without doing much processing.</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.CheckAudioInterfaceHandler.can_handle" title="app.CheckAudioInterfaceHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.CheckAudioInterfaceHandler.handle" title="app.CheckAudioInterfaceHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.CheckAudioInterfaceHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.CheckAudioInterfaceHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.CheckAudioInterfaceHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.CheckAudioInterfaceHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.GeneralExceptionHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">GeneralExceptionHandler</span></span><a class="headerlink" href="#app.GeneralExceptionHandler" title="Link to this definition">#</a></dt>
<dd><p>Handle general exceptions</p>
<p>Handles exceptions and prints error information
in the log</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.GeneralExceptionHandler.can_handle" title="app.GeneralExceptionHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input, exception)</p></td>
<td><p>Checks if the handler can support the exception raised during dispatch.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.GeneralExceptionHandler.handle" title="app.GeneralExceptionHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input, exception)</p></td>
<td><p>Process the handler input and exception.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.GeneralExceptionHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exception</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Exception</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.GeneralExceptionHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Checks if the handler can support the exception raised
during dispatch.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance.</p></li>
<li><p><strong>exception</strong> (<em>Exception</em>) Exception raised during dispatch.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean whether handler can handle exception or not.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.GeneralExceptionHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exception</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Exception</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.GeneralExceptionHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Process the handler input and exception.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance.</p></li>
<li><p><strong>exception</strong> (<em>Exception</em>) Exception raised during dispatch.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Optional response object to serve as dispatch return.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[None, Response]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.HelpHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">HelpHandler</span></span><a class="headerlink" href="#app.HelpHandler" title="Link to this definition">#</a></dt>
<dd><p>Handle HelpIntent</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.HelpHandler.can_handle" title="app.HelpHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.HelpHandler.handle" title="app.HelpHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.HelpHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.HelpHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.HelpHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.HelpHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.LaunchRequestHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">LaunchRequestHandler</span></span><a class="headerlink" href="#app.LaunchRequestHandler" title="Link to this definition">#</a></dt>
<dd><p>Handle LaunchRequest and NavigateHomeIntent</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.LaunchRequestHandler.can_handle" title="app.LaunchRequestHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.LaunchRequestHandler.handle" title="app.LaunchRequestHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.LaunchRequestHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.LaunchRequestHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.LaunchRequestHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.LaunchRequestHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.LoggingRequestInterceptor">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">LoggingRequestInterceptor</span></span><a class="headerlink" href="#app.LoggingRequestInterceptor" title="Link to this definition">#</a></dt>
<dd><p>Intercept all requests</p>
<p>Intercepts all requests sent to the skill and prints them in the log</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.LoggingRequestInterceptor.process" title="app.LoggingRequestInterceptor.process"><code class="xref py py-obj docutils literal notranslate"><span class="pre">process</span></code></a>(handler_input)</p></td>
<td><p>Process the input before the Handler is run.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.LoggingRequestInterceptor.process">
<span class="sig-name descname"><span class="pre">process</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#app.LoggingRequestInterceptor.process" title="Link to this definition">#</a></dt>
<dd><p>Process the input before the Handler is run.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance.</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>None</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.LoggingResponseInterceptor">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">LoggingResponseInterceptor</span></span><a class="headerlink" href="#app.LoggingResponseInterceptor" title="Link to this definition">#</a></dt>
<dd><p>Intercept all responses</p>
<p>Intercepts all responses sent from the skill and prints them in the log</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.LoggingResponseInterceptor.process" title="app.LoggingResponseInterceptor.process"><code class="xref py py-obj docutils literal notranslate"><span class="pre">process</span></code></a>(handler_input, response)</p></td>
<td><p>Process the input and the response after the Handler is run.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.LoggingResponseInterceptor.process">
<span class="sig-name descname"><span class="pre">process</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">response</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Response</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#app.LoggingResponseInterceptor.process" title="Link to this definition">#</a></dt>
<dd><p>Process the input and the response after the Handler is run.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance.</p></li>
<li><p><strong>response</strong> (Union[None, <code class="xref py py-class docutils literal notranslate"><span class="pre">ask_sdk_model.response.Response</span></code>]) Execution result of the Handler on
handler input.</p></li>
</ul>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>None</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.NaviSonicPlayAlbumByArtist">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">NaviSonicPlayAlbumByArtist</span></span><a class="headerlink" href="#app.NaviSonicPlayAlbumByArtist" title="Link to this definition">#</a></dt>
<dd><p>Handle NaviSonicPlayAlbumByArtist</p>
<p>Play a given album by a given artist</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlayAlbumByArtist.can_handle" title="app.NaviSonicPlayAlbumByArtist.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlayAlbumByArtist.handle" title="app.NaviSonicPlayAlbumByArtist.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlayAlbumByArtist.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.NaviSonicPlayAlbumByArtist.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlayAlbumByArtist.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.NaviSonicPlayAlbumByArtist.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.NaviSonicPlayFavouriteSongs">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">NaviSonicPlayFavouriteSongs</span></span><a class="headerlink" href="#app.NaviSonicPlayFavouriteSongs" title="Link to this definition">#</a></dt>
<dd><p>Handle the NaviSonicPlayFavouriteSongs intent</p>
<p>Play all starred / liked songs, songs are automatically shuffled.</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlayFavouriteSongs.can_handle" title="app.NaviSonicPlayFavouriteSongs.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlayFavouriteSongs.handle" title="app.NaviSonicPlayFavouriteSongs.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlayFavouriteSongs.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.NaviSonicPlayFavouriteSongs.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlayFavouriteSongs.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.NaviSonicPlayFavouriteSongs.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.NaviSonicPlayMusicByArtist">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">NaviSonicPlayMusicByArtist</span></span><a class="headerlink" href="#app.NaviSonicPlayMusicByArtist" title="Link to this definition">#</a></dt>
<dd><p>Handle NaviSonicPlayMusicByArtist</p>
<p>Play a selection of songs for the given artist</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlayMusicByArtist.can_handle" title="app.NaviSonicPlayMusicByArtist.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlayMusicByArtist.handle" title="app.NaviSonicPlayMusicByArtist.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlayMusicByArtist.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.NaviSonicPlayMusicByArtist.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlayMusicByArtist.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.NaviSonicPlayMusicByArtist.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.NaviSonicPlayMusicByGenre">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">NaviSonicPlayMusicByGenre</span></span><a class="headerlink" href="#app.NaviSonicPlayMusicByGenre" title="Link to this definition">#</a></dt>
<dd><p>Play songs from the given genre</p>
<p>50 tracks from the given genre are shuffled and played</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlayMusicByGenre.can_handle" title="app.NaviSonicPlayMusicByGenre.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlayMusicByGenre.handle" title="app.NaviSonicPlayMusicByGenre.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlayMusicByGenre.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.NaviSonicPlayMusicByGenre.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlayMusicByGenre.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.NaviSonicPlayMusicByGenre.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.NaviSonicPlayMusicRandom">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">NaviSonicPlayMusicRandom</span></span><a class="headerlink" href="#app.NaviSonicPlayMusicRandom" title="Link to this definition">#</a></dt>
<dd><p>Handle the NaviSonicPlayMusicRandom intent</p>
<p>Play a random selection of music.</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlayMusicRandom.can_handle" title="app.NaviSonicPlayMusicRandom.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlayMusicRandom.handle" title="app.NaviSonicPlayMusicRandom.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlayMusicRandom.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.NaviSonicPlayMusicRandom.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlayMusicRandom.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.NaviSonicPlayMusicRandom.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.NaviSonicPlayPlaylist">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">NaviSonicPlayPlaylist</span></span><a class="headerlink" href="#app.NaviSonicPlayPlaylist" title="Link to this definition">#</a></dt>
<dd><p>Handle NaviSonicPlayPlaylist</p>
<p>Play the given playlist</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlayPlaylist.can_handle" title="app.NaviSonicPlayPlaylist.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlayPlaylist.handle" title="app.NaviSonicPlayPlaylist.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlayPlaylist.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.NaviSonicPlayPlaylist.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlayPlaylist.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.NaviSonicPlayPlaylist.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.NaviSonicPlaySongByArtist">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">NaviSonicPlaySongByArtist</span></span><a class="headerlink" href="#app.NaviSonicPlaySongByArtist" title="Link to this definition">#</a></dt>
<dd><p>Handle the NaviSonicPlaySongByArtist intent</p>
<p>Play the given song by the given artist if it exists in the
collection.</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicPlaySongByArtist.can_handle" title="app.NaviSonicPlaySongByArtist.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicPlaySongByArtist.handle" title="app.NaviSonicPlaySongByArtist.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlaySongByArtist.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.NaviSonicPlaySongByArtist.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicPlaySongByArtist.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.NaviSonicPlaySongByArtist.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.NaviSonicRandomiseQueue">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">NaviSonicRandomiseQueue</span></span><a class="headerlink" href="#app.NaviSonicRandomiseQueue" title="Link to this definition">#</a></dt>
<dd><p>Handle NaviSonicRandomiseQueue Intent</p>
<p>Shuffle the current play queue</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicRandomiseQueue.can_handle" title="app.NaviSonicRandomiseQueue.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicRandomiseQueue.handle" title="app.NaviSonicRandomiseQueue.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicRandomiseQueue.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.NaviSonicRandomiseQueue.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicRandomiseQueue.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.NaviSonicRandomiseQueue.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.NaviSonicSongDetails">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">NaviSonicSongDetails</span></span><a class="headerlink" href="#app.NaviSonicSongDetails" title="Link to this definition">#</a></dt>
<dd><p>Handle NaviSonicSongDetails Intent</p>
<p>Returns information on the track that is currently playing</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicSongDetails.can_handle" title="app.NaviSonicSongDetails.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicSongDetails.handle" title="app.NaviSonicSongDetails.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicSongDetails.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.NaviSonicSongDetails.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicSongDetails.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.NaviSonicSongDetails.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.NaviSonicStarSong">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">NaviSonicStarSong</span></span><a class="headerlink" href="#app.NaviSonicStarSong" title="Link to this definition">#</a></dt>
<dd><p>Handle NaviSonicStarSong Intent</p>
<p>Star / favourite the current song</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicStarSong.can_handle" title="app.NaviSonicStarSong.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicStarSong.handle" title="app.NaviSonicStarSong.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicStarSong.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.NaviSonicStarSong.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicStarSong.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.NaviSonicStarSong.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.NaviSonicUnstarSong">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">NaviSonicUnstarSong</span></span><a class="headerlink" href="#app.NaviSonicUnstarSong" title="Link to this definition">#</a></dt>
<dd><p>Handle NaviSonicUnstarSong Intent</p>
<p>Star / favourite the current song</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NaviSonicUnstarSong.can_handle" title="app.NaviSonicUnstarSong.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NaviSonicUnstarSong.handle" title="app.NaviSonicUnstarSong.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicUnstarSong.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.NaviSonicUnstarSong.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.NaviSonicUnstarSong.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.NaviSonicUnstarSong.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.NextPlaybackHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">NextPlaybackHandler</span></span><a class="headerlink" href="#app.NextPlaybackHandler" title="Link to this definition">#</a></dt>
<dd><p>Handle NextIntent</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.NextPlaybackHandler.can_handle" title="app.NextPlaybackHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.NextPlaybackHandler.handle" title="app.NextPlaybackHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.NextPlaybackHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.NextPlaybackHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.NextPlaybackHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.NextPlaybackHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.PausePlaybackHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">PausePlaybackHandler</span></span><a class="headerlink" href="#app.PausePlaybackHandler" title="Link to this definition">#</a></dt>
<dd><p>Handler for stopping audio.</p>
<p>Handles Stop, Cancel and Pause Intents and PauseCommandIssued event.</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.PausePlaybackHandler.can_handle" title="app.PausePlaybackHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.PausePlaybackHandler.handle" title="app.PausePlaybackHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.PausePlaybackHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.PausePlaybackHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.PausePlaybackHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.PausePlaybackHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.PlaybackFailedEventHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">PlaybackFailedEventHandler</span></span><a class="headerlink" href="#app.PlaybackFailedEventHandler" title="Link to this definition">#</a></dt>
<dd><p>AudioPlayer.PlaybackFailed Directive received.</p>
<p>Logging the error and restarting playing with no output speech.</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.PlaybackFailedEventHandler.can_handle" title="app.PlaybackFailedEventHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.PlaybackFailedEventHandler.handle" title="app.PlaybackFailedEventHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.PlaybackFailedEventHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.PlaybackFailedEventHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.PlaybackFailedEventHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.PlaybackFailedEventHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.PlaybackFinishedHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">PlaybackFinishedHandler</span></span><a class="headerlink" href="#app.PlaybackFinishedHandler" title="Link to this definition">#</a></dt>
<dd><p>AudioPlayer.PlaybackFinished Directive received.</p>
<p>Confirming that the requested audio file completed playing.
Do not send any specific response.</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.PlaybackFinishedHandler.can_handle" title="app.PlaybackFinishedHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.PlaybackFinishedHandler.handle" title="app.PlaybackFinishedHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.PlaybackFinishedHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.PlaybackFinishedHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.PlaybackFinishedHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.PlaybackFinishedHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.PlaybackNearlyFinishedHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">PlaybackNearlyFinishedHandler</span></span><a class="headerlink" href="#app.PlaybackNearlyFinishedHandler" title="Link to this definition">#</a></dt>
<dd><p>AudioPlayer.PlaybackNearlyFinished Directive received.</p>
<p>Replacing queue with the URL again. This should not happen on live streams.</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.PlaybackNearlyFinishedHandler.can_handle" title="app.PlaybackNearlyFinishedHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.PlaybackNearlyFinishedHandler.handle" title="app.PlaybackNearlyFinishedHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.PlaybackNearlyFinishedHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.PlaybackNearlyFinishedHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.PlaybackNearlyFinishedHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.PlaybackNearlyFinishedHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.PlaybackStartedHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">PlaybackStartedHandler</span></span><a class="headerlink" href="#app.PlaybackStartedHandler" title="Link to this definition">#</a></dt>
<dd><p>AudioPlayer.PlaybackStarted Directive received.</p>
<p>Confirming that the requested audio file began playing.
Do not send any specific response.</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.PlaybackStartedHandler.can_handle" title="app.PlaybackStartedHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.PlaybackStartedHandler.handle" title="app.PlaybackStartedHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.PlaybackStartedHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.PlaybackStartedHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.PlaybackStartedHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.PlaybackStartedHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.PlaybackStoppedHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">PlaybackStoppedHandler</span></span><a class="headerlink" href="#app.PlaybackStoppedHandler" title="Link to this definition">#</a></dt>
<dd><p>AudioPlayer.PlaybackStopped Directive received.</p>
<p>Confirming that the requested audio file stopped playing.
Do not send any specific response.</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.PlaybackStoppedHandler.can_handle" title="app.PlaybackStoppedHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.PlaybackStoppedHandler.handle" title="app.PlaybackStoppedHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.PlaybackStoppedHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.PlaybackStoppedHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.PlaybackStoppedHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.PlaybackStoppedHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.PreviousPlaybackHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">PreviousPlaybackHandler</span></span><a class="headerlink" href="#app.PreviousPlaybackHandler" title="Link to this definition">#</a></dt>
<dd><p>Handle PreviousIntent</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.PreviousPlaybackHandler.can_handle" title="app.PreviousPlaybackHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.PreviousPlaybackHandler.handle" title="app.PreviousPlaybackHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.PreviousPlaybackHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.PreviousPlaybackHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.PreviousPlaybackHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.PreviousPlaybackHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.ResumePlaybackHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">ResumePlaybackHandler</span></span><a class="headerlink" href="#app.ResumePlaybackHandler" title="Link to this definition">#</a></dt>
<dd><p>Handler for resuming audio on different events.</p>
<p>Handles PlayAudio Intent, Resume Intent.</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.ResumePlaybackHandler.can_handle" title="app.ResumePlaybackHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.ResumePlaybackHandler.handle" title="app.ResumePlaybackHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.ResumePlaybackHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.ResumePlaybackHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.ResumePlaybackHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.ResumePlaybackHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.SkillEventHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">SkillEventHandler</span></span><a class="headerlink" href="#app.SkillEventHandler" title="Link to this definition">#</a></dt>
<dd><p>Close session for skill events or when session ends.</p>
<p>Handler to handle session end or skill events (SkillEnabled,
SkillDisabled etc.)</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.SkillEventHandler.can_handle" title="app.SkillEventHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input)</p></td>
<td><p>Returns true if Request Handler can handle the Request inside Handler Input.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.SkillEventHandler.handle" title="app.SkillEventHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input)</p></td>
<td><p>Handles the Request inside handler input and provides a Response for dispatcher to return.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.SkillEventHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.SkillEventHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
inside Handler Input.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean value that tells the dispatcher if the
current request can be handled by this handler.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.SkillEventHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.SkillEventHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Handles the Request inside handler input and provides a
Response for dispatcher to return.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance with
Request Envelope containing Request.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Response for the dispatcher to return or None</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[Response, None]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="app.SystemExceptionHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">SystemExceptionHandler</span></span><a class="headerlink" href="#app.SystemExceptionHandler" title="Link to this definition">#</a></dt>
<dd><p>Handle System.ExceptionEncountered</p>
<p>Handles exceptions and prints error information
in the log</p>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#app.SystemExceptionHandler.can_handle" title="app.SystemExceptionHandler.can_handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">can_handle</span></code></a>(handler_input, exception)</p></td>
<td><p>Checks if the handler can support the exception raised during dispatch.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#app.SystemExceptionHandler.handle" title="app.SystemExceptionHandler.handle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">handle</span></code></a>(handler_input, exception)</p></td>
<td><p>Process the handler input and exception.</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="app.SystemExceptionHandler.can_handle">
<span class="sig-name descname"><span class="pre">can_handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exception</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Exception</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#app.SystemExceptionHandler.can_handle" title="Link to this definition">#</a></dt>
<dd><p>Checks if the handler can support the exception raised
during dispatch.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance.</p></li>
<li><p><strong>exception</strong> (<em>Exception</em>) Exception raised during dispatch.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Boolean whether handler can handle exception or not.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="app.SystemExceptionHandler.handle">
<span class="sig-name descname"><span class="pre">handle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exception</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Exception</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#app.SystemExceptionHandler.handle" title="Link to this definition">#</a></dt>
<dd><p>Process the handler input and exception.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>handler_input</strong> (<em>HandlerInput</em>) Handler Input instance.</p></li>
<li><p><strong>exception</strong> (<em>Exception</em>) Exception raised during dispatch.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Optional response object to serve as dispatch return.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Union[None, Response]</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="app.queue_worker_thread">
<span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">queue_worker_thread</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">connection</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">object</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">play_queue</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">object</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">song_id_list</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">list</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#app.queue_worker_thread" title="Link to this definition">#</a></dt>
<dd><p>Media queue worker</p>
<p>This function allows media queues to be populated in the background enabling multithreading
and increasing skill response times.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>connection</strong> (<em>object</em>) A SubSonic API connection object</p></li>
<li><p><strong>play_queue</strong> (<em>object</em>) A MediaQueue object</p></li>
<li><p><strong>song_id_list</strong> (<em>list</em>) A list containing Navidrome song IDs</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="app.sanitise_speech_output">
<span class="sig-prename descclassname"><span class="pre">app.</span></span><span class="sig-name descname"><span class="pre">sanitise_speech_output</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">speech_string</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">str</span></span></span><a class="headerlink" href="#app.sanitise_speech_output" title="Link to this definition">#</a></dt>
<dd><p>Sanitise speech output inline with the SSML standard</p>
<p>Speech Synthesis Markup Language (SSML) has certain ASCII characters that are
reserved. This function replaces them with alternatives.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>speech_string</strong> (<em>str</em>) The string to process</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>The processed SSML compliant string</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>str</p>
</dd>
</dl>
</dd></dl>
</section>
<section id="module-asknavidrome.controller">
<span id="asknavidrome-controller"></span><h3>AskNavidrome controller<a class="headerlink" href="#module-asknavidrome.controller" title="Link to this heading">#</a></h3>
<p><strong>Functions:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.controller.add_screen_background" title="asknavidrome.controller.add_screen_background"><code class="xref py py-obj docutils literal notranslate"><span class="pre">add_screen_background</span></code></a>(card_data)</p></td>
<td><p>Add background to card.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.controller.enqueue_songs" title="asknavidrome.controller.enqueue_songs"><code class="xref py py-obj docutils literal notranslate"><span class="pre">enqueue_songs</span></code></a>(api, queue, song_id_list)</p></td>
<td><p>Enqueue songs</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.controller.start_playback" title="asknavidrome.controller.start_playback"><code class="xref py py-obj docutils literal notranslate"><span class="pre">start_playback</span></code></a>(mode, text, card_data, ...)</p></td>
<td><p>Function to play audio.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.controller.stop" title="asknavidrome.controller.stop"><code class="xref py py-obj docutils literal notranslate"><span class="pre">stop</span></code></a>(handler_input)</p></td>
<td><p>Stop playback</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py function">
<dt class="sig sig-object py" id="asknavidrome.controller.add_screen_background">
<span class="sig-prename descclassname"><span class="pre">asknavidrome.controller.</span></span><span class="sig-name descname"><span class="pre">add_screen_background</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">card_data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">AudioItemMetadata</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.controller.add_screen_background" title="Link to this definition">#</a></dt>
<dd><p>Add background to card.</p>
<p>Cards are viewable on devices with screens and in the Alexa
app.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>card_data</strong> (<em>dict</em>) Dictionary containing card data</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>An Amazon AudioItemMetadata object or None if card data is not present</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>AudioItemMetadata | None</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="asknavidrome.controller.enqueue_songs">
<span class="sig-prename descclassname"><span class="pre">asknavidrome.controller.</span></span><span class="sig-name descname"><span class="pre">enqueue_songs</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">api</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection" title="asknavidrome.subsonic_api.SubsonicConnection"><span class="pre">SubsonicConnection</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">queue</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue" title="asknavidrome.media_queue.MediaQueue"><span class="pre">MediaQueue</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">song_id_list</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">list</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.controller.enqueue_songs" title="Link to this definition">#</a></dt>
<dd><p>Enqueue songs</p>
<p>Add Track objects to the queue deque</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>api</strong> (<a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection" title="asknavidrome.subsonic_api.SubsonicConnection"><em>SubsonicConnection</em></a>) A SubsonicConnection object to allow access to the Navidrome API</p></li>
<li><p><strong>queue</strong> (<a class="reference internal" href="#asknavidrome.media_queue.MediaQueue" title="asknavidrome.media_queue.MediaQueue"><em>MediaQueue</em></a>) A MediaQueue object</p></li>
<li><p><strong>song_id_list</strong> (<em>list</em>) A list of song IDs to enqueue</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>None</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="asknavidrome.controller.start_playback">
<span class="sig-prename descclassname"><span class="pre">asknavidrome.controller.</span></span><span class="sig-name descname"><span class="pre">start_playback</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">mode</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">text</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">card_data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">dict</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">track_details</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track"><span class="pre">Track</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#asknavidrome.controller.start_playback" title="Link to this definition">#</a></dt>
<dd><p>Function to play audio.</p>
<p>Begin playing audio when:</p>
<blockquote>
<div><ul class="simple">
<li><p>Play Audio Intent is invoked.</p></li>
<li><p>Resuming audio when stopped / paused.</p></li>
<li><p>Next / Previous commands issues.</p></li>
</ul>
</div></blockquote>
<div class="admonition note">
<p class="admonition-title">Note</p>
<ul class="simple">
<li><dl class="simple">
<dt><a class="reference external" href="https://developer.amazon.com/docs/custom-skills/audioplayer-interface-reference.html#play">https://developer.amazon.com/docs/custom-skills/audioplayer-interface-reference.html#play</a></dt><dd><ul>
<li><p>REPLACE_ALL: Immediately begin playback of the specified stream,
and replace current and enqueued streams.</p></li>
</ul>
</dd>
</dl>
</li>
</ul>
</div>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mode</strong> (<em>str</em>) play | continue - Play immediately or enqueue a track</p></li>
<li><p><strong>text</strong> (<em>str</em>) Text which should be spoken before playback starts</p></li>
<li><p><strong>card_data</strong> (<em>dict</em>) Data to display on a card</p></li>
<li><p><strong>track_details</strong> (<a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track"><em>Track</em></a>) A Track object containing details of the track to use</p></li>
<li><p><strong>handler_input</strong> (<em>HandlerInput</em>) The Amazon Alexa HandlerInput object</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Amazon Alexa Response class</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Response</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="asknavidrome.controller.stop">
<span class="sig-prename descclassname"><span class="pre">asknavidrome.controller.</span></span><span class="sig-name descname"><span class="pre">stop</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">HandlerInput</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Response</span></span></span><a class="headerlink" href="#asknavidrome.controller.stop" title="Link to this definition">#</a></dt>
<dd><p>Stop playback</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>handler_input</strong> (<em>HandlerInput</em>) The Amazon Alexa HandlerInput object</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Amazon Alexa Response class</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>Response</p>
</dd>
</dl>
</dd></dl>
</section>
<section id="asknavidrome-media-queue">
<h3>AskNavidrome media queue<a class="headerlink" href="#asknavidrome-media-queue" title="Link to this heading">#</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">asknavidrome.media_queue.</span></span><span class="sig-name descname"><span class="pre">MediaQueue</span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue" title="Link to this definition">#</a></dt>
<dd><p>The MediaQueue class</p>
<p>This class provides a queue based on a Python deque. This is used to store
the tracks in the current play queue</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>None</p>
</dd>
</dl>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.add_track" title="asknavidrome.media_queue.MediaQueue.add_track"><code class="xref py py-obj docutils literal notranslate"><span class="pre">add_track</span></code></a>(track)</p></td>
<td><p>Add tracks to the queue</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.clear" title="asknavidrome.media_queue.MediaQueue.clear"><code class="xref py py-obj docutils literal notranslate"><span class="pre">clear</span></code></a>()</p></td>
<td><p>Clear queue, history and buffer deques</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.enqueue_next_track" title="asknavidrome.media_queue.MediaQueue.enqueue_next_track"><code class="xref py py-obj docutils literal notranslate"><span class="pre">enqueue_next_track</span></code></a>()</p></td>
<td><p>Get the next buffered track</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.get_buffer" title="asknavidrome.media_queue.MediaQueue.get_buffer"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_buffer</span></code></a>()</p></td>
<td><p>Get the buffer</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.get_current_queue" title="asknavidrome.media_queue.MediaQueue.get_current_queue"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_current_queue</span></code></a>()</p></td>
<td><p>Get the current queue</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.get_current_track" title="asknavidrome.media_queue.MediaQueue.get_current_track"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_current_track</span></code></a>()</p></td>
<td><p>Method to return current_track attribute</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.get_history" title="asknavidrome.media_queue.MediaQueue.get_history"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_history</span></code></a>()</p></td>
<td><p>Get history</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.get_history_count" title="asknavidrome.media_queue.MediaQueue.get_history_count"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_history_count</span></code></a>()</p></td>
<td><p>Get the number of tracks in the history deque</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.get_next_track" title="asknavidrome.media_queue.MediaQueue.get_next_track"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_next_track</span></code></a>()</p></td>
<td><p>Get the next track</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.get_previous_track" title="asknavidrome.media_queue.MediaQueue.get_previous_track"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_previous_track</span></code></a>()</p></td>
<td><p>Get the previous track</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.get_queue_count" title="asknavidrome.media_queue.MediaQueue.get_queue_count"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_queue_count</span></code></a>()</p></td>
<td><p>Get the number of tracks in the queue</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.set_current_track_offset" title="asknavidrome.media_queue.MediaQueue.set_current_track_offset"><code class="xref py py-obj docutils literal notranslate"><span class="pre">set_current_track_offset</span></code></a>(offset)</p></td>
<td><p>Method to set the offset of the current track in milliseconds</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.shuffle" title="asknavidrome.media_queue.MediaQueue.shuffle"><code class="xref py py-obj docutils literal notranslate"><span class="pre">shuffle</span></code></a>()</p></td>
<td><p>Shuffle the queue</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.sync" title="asknavidrome.media_queue.MediaQueue.sync"><code class="xref py py-obj docutils literal notranslate"><span class="pre">sync</span></code></a>()</p></td>
<td><p>Synchronise the buffer with the queue</p></td>
</tr>
</tbody>
</table>
</div>
<p><strong>Attributes:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.buffer" title="asknavidrome.media_queue.MediaQueue.buffer"><code class="xref py py-obj docutils literal notranslate"><span class="pre">buffer</span></code></a></p></td>
<td><p>Deque to contain the list of tracks to be enqueued</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.current_track" title="asknavidrome.media_queue.MediaQueue.current_track"><code class="xref py py-obj docutils literal notranslate"><span class="pre">current_track</span></code></a></p></td>
<td><p>Property to hold the current track object</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.history" title="asknavidrome.media_queue.MediaQueue.history"><code class="xref py py-obj docutils literal notranslate"><span class="pre">history</span></code></a></p></td>
<td><p>Deque to hold tracks that have already been played</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.logger" title="asknavidrome.media_queue.MediaQueue.logger"><code class="xref py py-obj docutils literal notranslate"><span class="pre">logger</span></code></a></p></td>
<td><p>Logger</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.media_queue.MediaQueue.queue" title="asknavidrome.media_queue.MediaQueue.queue"><code class="xref py py-obj docutils literal notranslate"><span class="pre">queue</span></code></a></p></td>
<td><p>Deque containing tracks still to be played</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.add_track">
<span class="sig-name descname"><span class="pre">add_track</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">track</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track"><span class="pre">Track</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.add_track" title="Link to this definition">#</a></dt>
<dd><p>Add tracks to the queue</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>track</strong> (<a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track"><em>Track</em></a>) A Track object containing details of the track to be played</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.clear">
<span class="sig-name descname"><span class="pre">clear</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.clear" title="Link to this definition">#</a></dt>
<dd><p>Clear queue, history and buffer deques</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.enqueue_next_track">
<span class="sig-name descname"><span class="pre">enqueue_next_track</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track"><span class="pre">Track</span></a></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.enqueue_next_track" title="Link to this definition">#</a></dt>
<dd><p>Get the next buffered track</p>
<p>Get the next track from the buffer without updating the current track
attribute. This allows Amazon to send the PlaybackNearlyFinished
request early to queue the next track while maintaining the playlist</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>The next track to be played</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track">Track</a></p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.get_buffer">
<span class="sig-name descname"><span class="pre">get_buffer</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">deque</span></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.get_buffer" title="Link to this definition">#</a></dt>
<dd><p>Get the buffer</p>
<p>Returns a deque containing the current buffer</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>The current buffer</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>deque</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.get_current_queue">
<span class="sig-name descname"><span class="pre">get_current_queue</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">deque</span></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.get_current_queue" title="Link to this definition">#</a></dt>
<dd><p>Get the current queue</p>
<p>Returns a deque containing the current queue of music to be played</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>The current queue</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>deque</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.get_current_track">
<span class="sig-name descname"><span class="pre">get_current_track</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track"><span class="pre">Track</span></a></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.get_current_track" title="Link to this definition">#</a></dt>
<dd><p>Method to return current_track attribute</p>
<p>Added to allow access to the current_track object while using BaseManager
for multi threading, as BaseManager does not allow access to class
attributes / properties</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>A Track object representing the current playing audio track</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track">Track</a></p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.get_history">
<span class="sig-name descname"><span class="pre">get_history</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">deque</span></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.get_history" title="Link to this definition">#</a></dt>
<dd><p>Get history</p>
<p>Returns a deque of tracks that have already been played</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>A deque container tracks that have already been played</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>deque</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.get_history_count">
<span class="sig-name descname"><span class="pre">get_history_count</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">int</span></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.get_history_count" title="Link to this definition">#</a></dt>
<dd><p>Get the number of tracks in the history deque</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>The number of tracks in the history deque</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>int</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.get_next_track">
<span class="sig-name descname"><span class="pre">get_next_track</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track"><span class="pre">Track</span></a></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.get_next_track" title="Link to this definition">#</a></dt>
<dd><p>Get the next track</p>
<p>Get the next track from self.queue and add it to the history deque</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>The next track object</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track">Track</a></p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.get_previous_track">
<span class="sig-name descname"><span class="pre">get_previous_track</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track"><span class="pre">Track</span></a></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.get_previous_track" title="Link to this definition">#</a></dt>
<dd><p>Get the previous track</p>
<p>Get the last track added to the history deque and
add it to the front of the play queue</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>The previous track object</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track">Track</a></p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.get_queue_count">
<span class="sig-name descname"><span class="pre">get_queue_count</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">int</span></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.get_queue_count" title="Link to this definition">#</a></dt>
<dd><p>Get the number of tracks in the queue</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>The number of tracks in the queue deque</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>int</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.set_current_track_offset">
<span class="sig-name descname"><span class="pre">set_current_track_offset</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">offset</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.set_current_track_offset" title="Link to this definition">#</a></dt>
<dd><p>Method to set the offset of the current track in milliseconds</p>
<p>Set the offset for the current track in milliseconds. This is used
when resuming a paused track to ensure the track isnt played from
the beginning again.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>offset</strong> (<em>int</em>) The track offset in milliseconds</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.shuffle">
<span class="sig-name descname"><span class="pre">shuffle</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.shuffle" title="Link to this definition">#</a></dt>
<dd><p>Shuffle the queue</p>
<p>Shuffles the queue and resets the previous track IDs required for the ENQUEUE PlayBehaviour</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.sync">
<span class="sig-name descname"><span class="pre">sync</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.sync" title="Link to this definition">#</a></dt>
<dd><p>Synchronise the buffer with the queue</p>
<p>Overwrite the buffer with the current queue.
This is useful when pausing or stopping to ensure
the resulting PlaybackNearlyFinished request gets
the correct. In practice this will have already
queued and there for missing from the current buffer</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>None</p>
</dd>
</dl>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.buffer">
<span class="sig-name descname"><span class="pre">buffer</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="pre">deque</span></em><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.buffer" title="Link to this definition">#</a></dt>
<dd><p>Deque to contain the list of tracks to be enqueued</p>
<p>This deque is created from self.queue when actions such as next or
previous are performed. This is because Amazon can send the
PlaybackNearlyFinished request early. Without self.buffer, this would
change self.current_track causing us to lose the real position of the
queue.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.current_track">
<span class="sig-name descname"><span class="pre">current_track</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference internal" href="#asknavidrome.track.Track" title="asknavidrome.track.Track"><span class="pre">Track</span></a></em><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.current_track" title="Link to this definition">#</a></dt>
<dd><p>Property to hold the current track object</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.history">
<span class="sig-name descname"><span class="pre">history</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="pre">deque</span></em><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.history" title="Link to this definition">#</a></dt>
<dd><p>Deque to hold tracks that have already been played</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.logger">
<span class="sig-name descname"><span class="pre">logger</span></span><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.logger" title="Link to this definition">#</a></dt>
<dd><p>Logger</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="asknavidrome.media_queue.MediaQueue.queue">
<span class="sig-name descname"><span class="pre">queue</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="pre">deque</span></em><a class="headerlink" href="#asknavidrome.media_queue.MediaQueue.queue" title="Link to this definition">#</a></dt>
<dd><p>Deque containing tracks still to be played</p>
</dd></dl>
</dd></dl>
</section>
<section id="asknavidrome-subsonic-api">
<h3>AskNavidrome subsonic API<a class="headerlink" href="#asknavidrome-subsonic-api" title="Link to this heading">#</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">asknavidrome.subsonic_api.</span></span><span class="sig-name descname"><span class="pre">SubsonicConnection</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">server_url</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">user</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">passwd</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">port</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">api_location</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">api_version</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection" title="Link to this definition">#</a></dt>
<dd><p>Class with methods to interact with Subsonic API compatible media servers</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>server_url</strong> (<em>str</em>) The URL of the Subsonic API compatible media server</p></li>
<li><p><strong>user</strong> (<em>str</em>) Username to authenticate against the API</p></li>
<li><p><strong>passwd</strong> (<em>str</em>) Password to authenticate against the API</p></li>
<li><p><strong>port</strong> (<em>int</em>) Port the Subsonic compatible server is listening on</p></li>
<li><p><strong>api_location</strong> (<em>str</em>) Path to the API, this is appended to server_url</p></li>
<li><p><strong>api_version</strong> (<em>str</em>) The version of the Subsonic API that is in use</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>None</p>
</dd>
</dl>
<p><strong>Methods:</strong></p>
<div class="pst-scrollable-table-container"><table class="autosummary longtable table">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.albums_by_artist" title="asknavidrome.subsonic_api.SubsonicConnection.albums_by_artist"><code class="xref py py-obj docutils literal notranslate"><span class="pre">albums_by_artist</span></code></a>(id)</p></td>
<td><p>Get the albums for a given artist</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.build_random_song_list" title="asknavidrome.subsonic_api.SubsonicConnection.build_random_song_list"><code class="xref py py-obj docutils literal notranslate"><span class="pre">build_random_song_list</span></code></a>(count)</p></td>
<td><p>Build a shuffled list of random songs</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_albums" title="asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_albums"><code class="xref py py-obj docutils literal notranslate"><span class="pre">build_song_list_from_albums</span></code></a>(albums, length)</p></td>
<td><p>Get a list of songs from given albums</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_favourites" title="asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_favourites"><code class="xref py py-obj docutils literal notranslate"><span class="pre">build_song_list_from_favourites</span></code></a>()</p></td>
<td><p>Build a shuffled list favourite songs</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_genre" title="asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_genre"><code class="xref py py-obj docutils literal notranslate"><span class="pre">build_song_list_from_genre</span></code></a>(genre, count)</p></td>
<td><p>Build a shuffled list songs of songs from the given genre.</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_playlist" title="asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_playlist"><code class="xref py py-obj docutils literal notranslate"><span class="pre">build_song_list_from_playlist</span></code></a>(id)</p></td>
<td><p>Build a list of songs from a given playlist</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.get_song_details" title="asknavidrome.subsonic_api.SubsonicConnection.get_song_details"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_song_details</span></code></a>(id)</p></td>
<td><p>Get details about a given song ID</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.get_song_uri" title="asknavidrome.subsonic_api.SubsonicConnection.get_song_uri"><code class="xref py py-obj docutils literal notranslate"><span class="pre">get_song_uri</span></code></a>(id)</p></td>
<td><p>Create a URI for a given song</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.ping" title="asknavidrome.subsonic_api.SubsonicConnection.ping"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ping</span></code></a>()</p></td>
<td><p>Ping a Subsonic API server</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.scrobble" title="asknavidrome.subsonic_api.SubsonicConnection.scrobble"><code class="xref py py-obj docutils literal notranslate"><span class="pre">scrobble</span></code></a>(track_id, time)</p></td>
<td><p>Scrobble the given track</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.search_album" title="asknavidrome.subsonic_api.SubsonicConnection.search_album"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_album</span></code></a>(term)</p></td>
<td><p>Search the media server for the given album</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.search_artist" title="asknavidrome.subsonic_api.SubsonicConnection.search_artist"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_artist</span></code></a>(term)</p></td>
<td><p>Search the media server for the given artist</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.search_playlist" title="asknavidrome.subsonic_api.SubsonicConnection.search_playlist"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_playlist</span></code></a>(term)</p></td>
<td><p>Search the media server for the given playlist</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.search_song" title="asknavidrome.subsonic_api.SubsonicConnection.search_song"><code class="xref py py-obj docutils literal notranslate"><span class="pre">search_song</span></code></a>(term)</p></td>
<td><p>Search the media server for the given song</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.star_entry" title="asknavidrome.subsonic_api.SubsonicConnection.star_entry"><code class="xref py py-obj docutils literal notranslate"><span class="pre">star_entry</span></code></a>(id, mode)</p></td>
<td><p>Add a star to the given entity</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#asknavidrome.subsonic_api.SubsonicConnection.unstar_entry" title="asknavidrome.subsonic_api.SubsonicConnection.unstar_entry"><code class="xref py py-obj docutils literal notranslate"><span class="pre">unstar_entry</span></code></a>(id, mode)</p></td>
<td><p>Remove a star from the given entity</p></td>
</tr>
</tbody>
</table>
</div>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.albums_by_artist">
<span class="sig-name descname"><span class="pre">albums_by_artist</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">list</span><span class="p"><span class="pre">[</span></span><span class="pre">dict</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.albums_by_artist" title="Link to this definition">#</a></dt>
<dd><p>Get the albums for a given artist</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>id</strong> (<em>str</em>) The artist ID</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A list of albums</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>list of dict</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.build_random_song_list">
<span class="sig-name descname"><span class="pre">build_random_song_list</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">count</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">list</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.build_random_song_list" title="Link to this definition">#</a></dt>
<dd><p>Build a shuffled list of random songs</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>count</strong> (<em>int</em>) The number of songs to return</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A list of song IDs or None if no tracks are found.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>list | None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_albums">
<span class="sig-name descname"><span class="pre">build_song_list_from_albums</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">albums</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">list</span><span class="p"><span class="pre">[</span></span><span class="pre">dict</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">length</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">list</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_albums" title="Link to this definition">#</a></dt>
<dd><p>Get a list of songs from given albums</p>
<p>Build a list of songs from the given albums, keep adding tracks
until song_count is greater than of equal to length</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>albums</strong> (<em>list</em><em>[</em><em>dict</em><em>]</em>) A list of dictionaries containing album information</p></li>
<li><p><strong>length</strong> (<em>int</em>) The minimum number of songs that should be returned, if -1 there is no limit</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A list of song IDs</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>list</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_favourites">
<span class="sig-name descname"><span class="pre">build_song_list_from_favourites</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">list</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_favourites" title="Link to this definition">#</a></dt>
<dd><p>Build a shuffled list favourite songs</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>A list of song IDs or None if no favourite tracks are found.</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>list | None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_genre">
<span class="sig-name descname"><span class="pre">build_song_list_from_genre</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">genre</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">count</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">list</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_genre" title="Link to this definition">#</a></dt>
<dd><p>Build a shuffled list songs of songs from the given genre.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>genre</strong> (<em>str</em>) The genre, acceptable values are with the getGenres Subsonic API call.</p></li>
<li><p><strong>count</strong> (<em>int</em>) The number of songs to return</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A list of song IDs or None if no tracks are found.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>list | None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_playlist">
<span class="sig-name descname"><span class="pre">build_song_list_from_playlist</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">list</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_playlist" title="Link to this definition">#</a></dt>
<dd><p>Build a list of songs from a given playlist</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>id</strong> (<em>str</em>) The playlist ID</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A list of song IDs</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>list</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.get_song_details">
<span class="sig-name descname"><span class="pre">get_song_details</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">dict</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.get_song_details" title="Link to this definition">#</a></dt>
<dd><p>Get details about a given song ID</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>id</strong> (<em>str</em>) A song ID</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A dictionary of details about the given song.</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>dict</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.get_song_uri">
<span class="sig-name descname"><span class="pre">get_song_uri</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">str</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.get_song_uri" title="Link to this definition">#</a></dt>
<dd><p>Create a URI for a given song</p>
<p>Creates a URI for the song represented by the given ID. Authentication details are
embedded in the URI</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>id</strong> (<em>str</em>) A song ID</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A properly formatted URI</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>str</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.ping">
<span class="sig-name descname"><span class="pre">ping</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.ping" title="Link to this definition">#</a></dt>
<dd><p>Ping a Subsonic API server</p>
<p>Verify the connection to a Subsonic compatible API server
is working</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>True if the connection works, False if it does not</p>
</dd>
<dt class="field-even">Return type<span class="colon">:</span></dt>
<dd class="field-even"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.scrobble">
<span class="sig-name descname"><span class="pre">scrobble</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">track_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">time</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.scrobble" title="Link to this definition">#</a></dt>
<dd><p>Scrobble the given track</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>track_id</strong> (<em>str</em>) The ID of the track to scrobble</p></li>
<li><p><strong>time</strong> (<em>int</em>) UNIX timestamp of track play time</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.search_album">
<span class="sig-name descname"><span class="pre">search_album</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">term</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.search_album" title="Link to this definition">#</a></dt>
<dd><p>Search the media server for the given album</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>term</strong> (<em>str</em>) The name of the album</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A dictionary of albums or None if no results are found</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>dict | None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.search_artist">
<span class="sig-name descname"><span class="pre">search_artist</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">term</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.search_artist" title="Link to this definition">#</a></dt>
<dd><p>Search the media server for the given artist</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>term</strong> (<em>str</em>) The name of the artist</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A dictionary of artists or None if no results are found</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>dict | None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.search_playlist">
<span class="sig-name descname"><span class="pre">search_playlist</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">term</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">str</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.search_playlist" title="Link to this definition">#</a></dt>
<dd><p>Search the media server for the given playlist</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>term</strong> (<em>str</em>) The name of the playlist</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>The ID of the playlist or None if the playlist is not found</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>str | None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.search_song">
<span class="sig-name descname"><span class="pre">search_song</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">term</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.search_song" title="Link to this definition">#</a></dt>
<dd><p>Search the media server for the given song</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>term</strong> (<em>str</em>) The name of the song</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>A dictionary of songs or None if no results are found</p>
</dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt>
<dd class="field-odd"><p>dict | None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.star_entry">
<span class="sig-name descname"><span class="pre">star_entry</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">mode</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.star_entry" title="Link to this definition">#</a></dt>
<dd><p>Add a star to the given entity</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>id</strong> (<em>str</em>) The Navidrome ID of the entity.</p></li>
<li><p><strong>mode</strong> (<em>str</em>) The type of entity, must be song, artist or album</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>None.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="asknavidrome.subsonic_api.SubsonicConnection.unstar_entry">
<span class="sig-name descname"><span class="pre">unstar_entry</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">mode</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#asknavidrome.subsonic_api.SubsonicConnection.unstar_entry" title="Link to this definition">#</a></dt>
<dd><p>Remove a star from the given entity</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>id</strong> (<em>str</em>) The Navidrome ID of the entity.</p></li>
<li><p><strong>mode</strong> (<em>str</em>) The type of entity, must be song, artist or album</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>None.</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
</section>
<section id="asknavidrome-track">
<h3>AskNavidrome track<a class="headerlink" href="#asknavidrome-track" title="Link to this heading">#</a></h3>
<dl class="py class">
<dt class="sig sig-object py" id="asknavidrome.track.Track">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">asknavidrome.track.</span></span><span class="sig-name descname"><span class="pre">Track</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">title</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">artist</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">artist_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">album</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">album_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">track_no</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">year</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">genre</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">duration</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bitrate</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">uri</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">offset</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">previous_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">''</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#asknavidrome.track.Track" title="Link to this definition">#</a></dt>
<dd><p>An object that represents an audio track</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>id</strong> (<em>str</em>) The song ID. Defaults to </p></li>
<li><p><strong>title</strong> (<em>str</em>) The song title. Defaults to </p></li>
<li><p><strong>artist</strong> (<em>str</em>) The artist name. Defaults to </p></li>
<li><p><strong>artist_id</strong> (<em>str</em>) The artist ID. Defaults to </p></li>
<li><p><strong>album</strong> (<em>str</em>) The album name. Defaults to </p></li>
<li><p><strong>album_id</strong> (<em>str</em>) The album ID. Defaults to </p></li>
<li><p><strong>track_no</strong> (<em>int</em>) The track number. Defaults to 0</p></li>
<li><p><strong>year</strong> (<em>int</em>) The release year. Defaults to 0</p></li>
<li><p><strong>genre</strong> (<em>str</em>) The music genre. Defaults to </p></li>
<li><p><strong>duration</strong> (<em>int</em>) The length of the track in seconds. Defaults to 0</p></li>
<li><p><strong>bitrate</strong> (<em>int</em>) The bit rate in kbps. Defaults to 0</p></li>
<li><p><strong>uri</strong> (<em>str</em>) The songs URI for streaming. Defaults to </p></li>
<li><p><strong>offset</strong> (<em>int</em>) The position in the track to start playback in milliseconds. Defaults to 0</p></li>
<li><p><strong>previous_id</strong> (<em>str</em>) The ID of the previous song in the playlist. Defaults to </p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>None</p>
</dd>
</dl>
</dd></dl>
</section>
</section>
</section>
</article>
<footer class="prev-next-footer d-print-none">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
<div class="sidebar-secondary-item">
<div class="page-toc tocsection onthispage">
<i class="fa-solid fa-list"></i> Contents
</div>
<nav class="bd-toc-nav page-toc">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#requirements">Requirements</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#about-the-asknavidrome-skill">About the AskNavidrome Skill</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#supported-intents">Supported Intents</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#installation-and-setup">Installation and Setup</a><ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#creating-the-asknavidrome-alexa-skill">Creating the AskNavidrome Alexa Skill</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#deploying-the-asknavidrome-web-service">Deploying the AskNavidrome Web Service</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#run-on-your-pc">Run on your PC</a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#run-inside-a-docker-container">Run inside a Docker container</a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#configuration">Configuration</a></li>
</ul>
</li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#tips-tricks">Tips &amp; Tricks</a><ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#playing-music-on-multiple-devices">Playing Music on Multiple Devices</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#troubleshooting">Troubleshooting</a><ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#general">General</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#debug-options">Debug Options</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#known-issues">Known Issues</a><ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#the-skill-appears-to-work-but-no-music-is-played-errors-similar-to-below-appear-in-the-web-service-log">The skill appears to work but no music is played. Errors similar to below appear in the web service log</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#the-following-error-is-displayed-when-you-try-to-run-the-docker-container">The following error is displayed when you try to run the Docker container</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#you-are-having-trouble-connecting-to-the-skill-and-use-cloudflare">You are having trouble connecting to the skill and use CloudFlare</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#code-documentation">Code Documentation</a><ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#module-app">AskNavidrome main</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.CheckAudioInterfaceHandler"><code class="docutils literal notranslate"><span class="pre">CheckAudioInterfaceHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.CheckAudioInterfaceHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">CheckAudioInterfaceHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.CheckAudioInterfaceHandler.handle"><code class="docutils literal notranslate"><span class="pre">CheckAudioInterfaceHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.GeneralExceptionHandler"><code class="docutils literal notranslate"><span class="pre">GeneralExceptionHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.GeneralExceptionHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">GeneralExceptionHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.GeneralExceptionHandler.handle"><code class="docutils literal notranslate"><span class="pre">GeneralExceptionHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.HelpHandler"><code class="docutils literal notranslate"><span class="pre">HelpHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.HelpHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">HelpHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.HelpHandler.handle"><code class="docutils literal notranslate"><span class="pre">HelpHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LaunchRequestHandler"><code class="docutils literal notranslate"><span class="pre">LaunchRequestHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LaunchRequestHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">LaunchRequestHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LaunchRequestHandler.handle"><code class="docutils literal notranslate"><span class="pre">LaunchRequestHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LoggingRequestInterceptor"><code class="docutils literal notranslate"><span class="pre">LoggingRequestInterceptor</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LoggingRequestInterceptor.process"><code class="docutils literal notranslate"><span class="pre">LoggingRequestInterceptor.process()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LoggingResponseInterceptor"><code class="docutils literal notranslate"><span class="pre">LoggingResponseInterceptor</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.LoggingResponseInterceptor.process"><code class="docutils literal notranslate"><span class="pre">LoggingResponseInterceptor.process()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayAlbumByArtist"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayAlbumByArtist</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayAlbumByArtist.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayAlbumByArtist.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayAlbumByArtist.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayAlbumByArtist.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayFavouriteSongs"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayFavouriteSongs</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayFavouriteSongs.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayFavouriteSongs.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayFavouriteSongs.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayFavouriteSongs.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicByArtist"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByArtist</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicByArtist.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByArtist.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicByArtist.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByArtist.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicByGenre"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByGenre</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicByGenre.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByGenre.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicByGenre.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicByGenre.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicRandom"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicRandom</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicRandom.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicRandom.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayMusicRandom.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayMusicRandom.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayPlaylist"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayPlaylist</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayPlaylist.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayPlaylist.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlayPlaylist.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlayPlaylist.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlaySongByArtist"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlaySongByArtist</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlaySongByArtist.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlaySongByArtist.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicPlaySongByArtist.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicPlaySongByArtist.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicRandomiseQueue"><code class="docutils literal notranslate"><span class="pre">NaviSonicRandomiseQueue</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicRandomiseQueue.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicRandomiseQueue.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicRandomiseQueue.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicRandomiseQueue.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicSongDetails"><code class="docutils literal notranslate"><span class="pre">NaviSonicSongDetails</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicSongDetails.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicSongDetails.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicSongDetails.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicSongDetails.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicStarSong"><code class="docutils literal notranslate"><span class="pre">NaviSonicStarSong</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicStarSong.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicStarSong.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicStarSong.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicStarSong.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicUnstarSong"><code class="docutils literal notranslate"><span class="pre">NaviSonicUnstarSong</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicUnstarSong.can_handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicUnstarSong.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NaviSonicUnstarSong.handle"><code class="docutils literal notranslate"><span class="pre">NaviSonicUnstarSong.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NextPlaybackHandler"><code class="docutils literal notranslate"><span class="pre">NextPlaybackHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NextPlaybackHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">NextPlaybackHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.NextPlaybackHandler.handle"><code class="docutils literal notranslate"><span class="pre">NextPlaybackHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PausePlaybackHandler"><code class="docutils literal notranslate"><span class="pre">PausePlaybackHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PausePlaybackHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PausePlaybackHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PausePlaybackHandler.handle"><code class="docutils literal notranslate"><span class="pre">PausePlaybackHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackFailedEventHandler"><code class="docutils literal notranslate"><span class="pre">PlaybackFailedEventHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackFailedEventHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PlaybackFailedEventHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackFailedEventHandler.handle"><code class="docutils literal notranslate"><span class="pre">PlaybackFailedEventHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackFinishedHandler"><code class="docutils literal notranslate"><span class="pre">PlaybackFinishedHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackFinishedHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PlaybackFinishedHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackFinishedHandler.handle"><code class="docutils literal notranslate"><span class="pre">PlaybackFinishedHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackNearlyFinishedHandler"><code class="docutils literal notranslate"><span class="pre">PlaybackNearlyFinishedHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackNearlyFinishedHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PlaybackNearlyFinishedHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackNearlyFinishedHandler.handle"><code class="docutils literal notranslate"><span class="pre">PlaybackNearlyFinishedHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackStartedHandler"><code class="docutils literal notranslate"><span class="pre">PlaybackStartedHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackStartedHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PlaybackStartedHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackStartedHandler.handle"><code class="docutils literal notranslate"><span class="pre">PlaybackStartedHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackStoppedHandler"><code class="docutils literal notranslate"><span class="pre">PlaybackStoppedHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackStoppedHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PlaybackStoppedHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PlaybackStoppedHandler.handle"><code class="docutils literal notranslate"><span class="pre">PlaybackStoppedHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PreviousPlaybackHandler"><code class="docutils literal notranslate"><span class="pre">PreviousPlaybackHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PreviousPlaybackHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">PreviousPlaybackHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.PreviousPlaybackHandler.handle"><code class="docutils literal notranslate"><span class="pre">PreviousPlaybackHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.ResumePlaybackHandler"><code class="docutils literal notranslate"><span class="pre">ResumePlaybackHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.ResumePlaybackHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">ResumePlaybackHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.ResumePlaybackHandler.handle"><code class="docutils literal notranslate"><span class="pre">ResumePlaybackHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.SkillEventHandler"><code class="docutils literal notranslate"><span class="pre">SkillEventHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.SkillEventHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">SkillEventHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.SkillEventHandler.handle"><code class="docutils literal notranslate"><span class="pre">SkillEventHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.SystemExceptionHandler"><code class="docutils literal notranslate"><span class="pre">SystemExceptionHandler</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.SystemExceptionHandler.can_handle"><code class="docutils literal notranslate"><span class="pre">SystemExceptionHandler.can_handle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#app.SystemExceptionHandler.handle"><code class="docutils literal notranslate"><span class="pre">SystemExceptionHandler.handle()</span></code></a></li>
</ul>
</li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.queue_worker_thread"><code class="docutils literal notranslate"><span class="pre">queue_worker_thread()</span></code></a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#app.sanitise_speech_output"><code class="docutils literal notranslate"><span class="pre">sanitise_speech_output()</span></code></a></li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#module-asknavidrome.controller">AskNavidrome controller</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.controller.add_screen_background"><code class="docutils literal notranslate"><span class="pre">add_screen_background()</span></code></a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.controller.enqueue_songs"><code class="docutils literal notranslate"><span class="pre">enqueue_songs()</span></code></a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.controller.start_playback"><code class="docutils literal notranslate"><span class="pre">start_playback()</span></code></a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.controller.stop"><code class="docutils literal notranslate"><span class="pre">stop()</span></code></a></li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome-media-queue">AskNavidrome media queue</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue"><code class="docutils literal notranslate"><span class="pre">MediaQueue</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.add_track"><code class="docutils literal notranslate"><span class="pre">MediaQueue.add_track()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.clear"><code class="docutils literal notranslate"><span class="pre">MediaQueue.clear()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.enqueue_next_track"><code class="docutils literal notranslate"><span class="pre">MediaQueue.enqueue_next_track()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_buffer"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_buffer()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_current_queue"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_current_queue()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_current_track"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_current_track()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_history"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_history()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_history_count"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_history_count()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_next_track"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_next_track()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_previous_track"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_previous_track()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.get_queue_count"><code class="docutils literal notranslate"><span class="pre">MediaQueue.get_queue_count()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.set_current_track_offset"><code class="docutils literal notranslate"><span class="pre">MediaQueue.set_current_track_offset()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.shuffle"><code class="docutils literal notranslate"><span class="pre">MediaQueue.shuffle()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.sync"><code class="docutils literal notranslate"><span class="pre">MediaQueue.sync()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.buffer"><code class="docutils literal notranslate"><span class="pre">MediaQueue.buffer</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.current_track"><code class="docutils literal notranslate"><span class="pre">MediaQueue.current_track</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.history"><code class="docutils literal notranslate"><span class="pre">MediaQueue.history</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.logger"><code class="docutils literal notranslate"><span class="pre">MediaQueue.logger</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.media_queue.MediaQueue.queue"><code class="docutils literal notranslate"><span class="pre">MediaQueue.queue</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome-subsonic-api">AskNavidrome subsonic API</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection</span></code></a><ul class="nav section-nav flex-column">
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.albums_by_artist"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.albums_by_artist()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.build_random_song_list"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.build_random_song_list()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_albums"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.build_song_list_from_albums()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_favourites"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.build_song_list_from_favourites()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_genre"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.build_song_list_from_genre()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_playlist"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.build_song_list_from_playlist()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.get_song_details"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.get_song_details()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.get_song_uri"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.get_song_uri()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.ping"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.ping()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.scrobble"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.scrobble()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.search_album"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.search_album()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.search_artist"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.search_artist()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.search_playlist"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.search_playlist()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.search_song"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.search_song()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.star_entry"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.star_entry()</span></code></a></li>
<li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.subsonic_api.SubsonicConnection.unstar_entry"><code class="docutils literal notranslate"><span class="pre">SubsonicConnection.unstar_entry()</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome-track">AskNavidrome track</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#asknavidrome.track.Track"><code class="docutils literal notranslate"><span class="pre">Track</span></code></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav></div>
</div></div>
</div>
<footer class="bd-footer-content">
<div class="bd-footer-content__inner container">
<div class="footer-item">
<p class="component-author">
By Ross Stewart
</p>
</div>
<div class="footer-item">
<p class="copyright">
© Copyright 2025, Ross Stewart.
<br/>
</p>
</div>
<div class="footer-item">
</div>
<div class="footer-item">
</div>
</div>
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
<script src="_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
<footer class="bd-footer">
</footer>
</body>
</html>