<h1><strong>AskNavidrome Alexa Skill Documentation</strong><aclass="headerlink"href="#asknavidrome-alexa-skill-documentation"title="Permalink 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>
<ulclass="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 <aclass="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 AskSonic’s features, it is however a viable
alternative for those that would like a simple skill to let you stream your own music collection.</p>
<divclass="admonition warning">
<pclass="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>
<sectionid="requirements">
<h2>Requirements<aclass="headerlink"href="#requirements"title="Permalink 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 <aclass="reference external"href="https://developer.amazon.com/en-US/docs/alexa/custom-skills/audioplayer-interface-reference.html#audio-stream-requirements">Amazon’s
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 <aclass="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 <aclass="reference external"href="https://letsencrypt.org/">Let’s Encrypt</a></p>
<p>You can set up dynamic DNS to make your media server accessible for free with <aclass="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
<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:</p>
<olclass="arabic">
<li><p>You need to open the skill to use it, say <em>Alexa, open Navisonic</em>.</p></li>
<li><p>Some intents that you would expect to be able to use when a track is playing need a full skill invocation. 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>
<ulclass="simple">
<li><p>Alexa, open Navisonic</p></li>
<li><p>What is playing?</p></li>
</ul>
<p>You will then be given information about the current track and it will automatically resume. This is also required for the <em>star</em> and <em>unstar</em> intents.</p>
</li>
</ol>
</section>
<sectionid="installation-and-setup">
<h2>Installation and Setup<aclass="headerlink"href="#installation-and-setup"title="Permalink to this heading">¶</a></h2>
<h3>Creating the AskNavidrome Alexa Skill<aclass="headerlink"href="#creating-the-asknavidrome-alexa-skill"title="Permalink to this heading">¶</a></h3>
<olclass="arabic">
<li><p>Login to the Amazon Alexa Skills Kit Builder at <aclass="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>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>
<divclass="admonition note">
<pclass="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>
<h3>Deploying the AskNavidrome Web Service<aclass="headerlink"href="#deploying-the-asknavidrome-web-service"title="Permalink 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
<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. <aclass="reference external"href="https://github.com/rosskouk/docker-image-k8s-letsencrypt">More information</a>.</p>
</section>
<sectionid="configuration">
<h4>Configuration<aclass="headerlink"href="#configuration"title="Permalink to this heading">¶</a></h4>
<p>The AskNavidrome Web Service reads it’s configuration from environment variables and needs the following configuration
<td><p>The port the Subsonic API server is listening on</p></td>
<td><p>443</p></td>
</tr>
<trclass="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 haven’t changed anything</p></td>
<td><p>/rest</p></td>
</tr>
<trclass="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>
<trclass="row-even"><td><p>NAVI_DEBUG</p></td>
<td><p>Enable debugging, to disable to not set this variable</p></td>
<td><p>1</p></td>
</tr>
</tbody>
</table>
</section>
</section>
</section>
<sectionid="troubleshooting">
<h2>Troubleshooting<aclass="headerlink"href="#troubleshooting"title="Permalink to this heading">¶</a></h2>
<p>Troubleshooting and debugging Alexa skills can be a little frustrating, here are the best ways I have found to do it.</p>
<olclass="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>
<ulclass="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 debugging is enabled the following web pages are available from the web service</p>
<ulclass="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>
<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>
<sectionid="code-documentation">
<h2>Code Documentation<aclass="headerlink"href="#code-documentation"title="Permalink to this heading">¶</a></h2>
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">CheckAudioInterfaceHandler</span></span><aclass="headerlink"href="#app.CheckAudioInterfaceHandler"title="Permalink 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
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.CheckAudioInterfaceHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.CheckAudioInterfaceHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">GeneralExceptionHandler</span></span><aclass="headerlink"href="#app.GeneralExceptionHandler"title="Permalink to this definition">¶</a></dt>
<dd><p>Handle general exceptions</p>
<p>Handles exceptions and prints error information
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">exception</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">Exception</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.GeneralExceptionHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Checks if the handler can support the exception raised
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">exception</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">Exception</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.GeneralExceptionHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Process the handler input and exception.</p>
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">HelpHandler</span></span><aclass="headerlink"href="#app.HelpHandler"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.HelpHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.HelpHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">LaunchRequestHandler</span></span><aclass="headerlink"href="#app.LaunchRequestHandler"title="Permalink to this definition">¶</a></dt>
<dd><p>Handle LaunchRequest and NavigateHomeIntent</p>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.LaunchRequestHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.LaunchRequestHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">LoggingRequestInterceptor</span></span><aclass="headerlink"href="#app.LoggingRequestInterceptor"title="Permalink 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>
<spanclass="sig-name descname"><spanclass="pre">process</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><aclass="headerlink"href="#app.LoggingRequestInterceptor.process"title="Permalink to this definition">¶</a></dt>
<dd><p>Process the input before the Handler is run.</p>
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">LoggingResponseInterceptor</span></span><aclass="headerlink"href="#app.LoggingResponseInterceptor"title="Permalink 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>
<spanclass="sig-name descname"><spanclass="pre">process</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">response</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">Response</span></span></em><spanclass="sig-paren">)</span><aclass="headerlink"href="#app.LoggingResponseInterceptor.process"title="Permalink to this definition">¶</a></dt>
<dd><p>Process the input and the response after the Handler is run.</p>
<li><p><strong>response</strong> (Union[None, <codeclass="xref py py-class docutils literal notranslate"><spanclass="pre">ask_sdk_model.response.Response</span></code>]) – Execution result of the Handler on
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">NaviSonicPlayAlbumByArtist</span></span><aclass="headerlink"href="#app.NaviSonicPlayAlbumByArtist"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.NaviSonicPlayAlbumByArtist.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.NaviSonicPlayAlbumByArtist.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">NaviSonicPlayFavouriteSongs</span></span><aclass="headerlink"href="#app.NaviSonicPlayFavouriteSongs"title="Permalink to this definition">¶</a></dt>
<dd><p>Handle the NaviSonicPlayFavouriteSongs intent</p>
<p>Play all starred / liked songs, songs are automatically shuffled.</p>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.NaviSonicPlayFavouriteSongs.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.NaviSonicPlayFavouriteSongs.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">NaviSonicPlayMusicByArtist</span></span><aclass="headerlink"href="#app.NaviSonicPlayMusicByArtist"title="Permalink to this definition">¶</a></dt>
<dd><p>Handle NaviSonicPlayMusicByArtist</p>
<p>Play a selection of songs for the given artist</p>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.NaviSonicPlayMusicByArtist.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.NaviSonicPlayMusicByArtist.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">NaviSonicPlayMusicByGenre</span></span><aclass="headerlink"href="#app.NaviSonicPlayMusicByGenre"title="Permalink to this definition">¶</a></dt>
<dd><p>Play songs from the given genere</p>
<p>50 tracks from the given genere are shuffled and played</p>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.NaviSonicPlayMusicByGenre.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.NaviSonicPlayMusicByGenre.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">NaviSonicPlayMusicRandom</span></span><aclass="headerlink"href="#app.NaviSonicPlayMusicRandom"title="Permalink to this definition">¶</a></dt>
<dd><p>Handle the NaviSonicPlayMusicRandom intent</p>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.NaviSonicPlayMusicRandom.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.NaviSonicPlayMusicRandom.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">NaviSonicPlayPlaylist</span></span><aclass="headerlink"href="#app.NaviSonicPlayPlaylist"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.NaviSonicPlayPlaylist.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.NaviSonicPlayPlaylist.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">NaviSonicPlaySongByArtist</span></span><aclass="headerlink"href="#app.NaviSonicPlaySongByArtist"title="Permalink 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
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.NaviSonicPlaySongByArtist.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.NaviSonicPlaySongByArtist.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">NaviSonicSongDetails</span></span><aclass="headerlink"href="#app.NaviSonicSongDetails"title="Permalink to this definition">¶</a></dt>
<dd><p>Handle NaviSonicSongDetails Intent</p>
<p>Returns information on the track that is currently playing</p>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.NaviSonicSongDetails.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.NaviSonicSongDetails.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">NaviSonicStarSong</span></span><aclass="headerlink"href="#app.NaviSonicStarSong"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.NaviSonicStarSong.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.NaviSonicStarSong.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">NaviSonicUnstarSong</span></span><aclass="headerlink"href="#app.NaviSonicUnstarSong"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.NaviSonicUnstarSong.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.NaviSonicUnstarSong.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">NextPlaybackHandler</span></span><aclass="headerlink"href="#app.NextPlaybackHandler"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.NextPlaybackHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.NextPlaybackHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">PausePlaybackHandler</span></span><aclass="headerlink"href="#app.PausePlaybackHandler"title="Permalink to this definition">¶</a></dt>
<dd><p>Handler for stopping audio.</p>
<p>Handles Stop, Cancel and Pause Intents and PauseCommandIssued event.</p>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.PausePlaybackHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.PausePlaybackHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">PlaybackFailedEventHandler</span></span><aclass="headerlink"href="#app.PlaybackFailedEventHandler"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.PlaybackFailedEventHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.PlaybackFailedEventHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">PlaybackFinishedHandler</span></span><aclass="headerlink"href="#app.PlaybackFinishedHandler"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.PlaybackFinishedHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.PlaybackFinishedHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">PlaybackNearlyFinishedHandler</span></span><aclass="headerlink"href="#app.PlaybackNearlyFinishedHandler"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.PlaybackNearlyFinishedHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.PlaybackNearlyFinishedHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">PlaybackStartedHandler</span></span><aclass="headerlink"href="#app.PlaybackStartedHandler"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.PlaybackStartedHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.PlaybackStartedHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">PlaybackStoppedHandler</span></span><aclass="headerlink"href="#app.PlaybackStoppedHandler"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.PlaybackStoppedHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.PlaybackStoppedHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">PreviousPlaybackHandler</span></span><aclass="headerlink"href="#app.PreviousPlaybackHandler"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.PreviousPlaybackHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.PreviousPlaybackHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">ResumePlaybackHandler</span></span><aclass="headerlink"href="#app.ResumePlaybackHandler"title="Permalink to this definition">¶</a></dt>
<dd><p>Handler for resuming audio on different events.</p>
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.ResumePlaybackHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.ResumePlaybackHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">SkillEventHandler</span></span><aclass="headerlink"href="#app.SkillEventHandler"title="Permalink 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,
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.SkillEventHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if Request Handler can handle the Request
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.SkillEventHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Handles the Request inside handler input and provides a
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">SystemExceptionHandler</span></span><aclass="headerlink"href="#app.SystemExceptionHandler"title="Permalink to this definition">¶</a></dt>
<dd><p>Handle System.ExceptionEncountered</p>
<p>Handles exceptions and prints error information
<spanclass="sig-name descname"><spanclass="pre">can_handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">exception</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">Exception</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#app.SystemExceptionHandler.can_handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Checks if the handler can support the exception raised
<spanclass="sig-name descname"><spanclass="pre">handle</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">exception</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">Exception</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#app.SystemExceptionHandler.handle"title="Permalink to this definition">¶</a></dt>
<dd><p>Process the handler input and exception.</p>
<spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">view_buffer</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><aclass="headerlink"href="#app.view_buffer"title="Permalink to this definition">¶</a></dt>
<dd><p>View the contents of play_queue.buffer</p>
<p>Creates a tabulated page contining the contents of the play_queue.buffer deque.</p>
<spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">view_history</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><aclass="headerlink"href="#app.view_history"title="Permalink to this definition">¶</a></dt>
<dd><p>View the contents of play_queue.history</p>
<p>Creates a tabulated page contining the contents of the play_queue.history deque.</p>
</dd></dl>
<dlclass="py function">
<dtclass="sig sig-object py"id="app.view_queue">
<spanclass="sig-prename descclassname"><spanclass="pre">app.</span></span><spanclass="sig-name descname"><spanclass="pre">view_queue</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><aclass="headerlink"href="#app.view_queue"title="Permalink to this definition">¶</a></dt>
<dd><p>View the contents of play_queue.queue</p>
<p>Creates a tabulated page contining the contents of the play_queue.queue deque.</p>
<spanid="asknavidrome-controller"></span><h3>AskNavidrome controller<aclass="headerlink"href="#module-asknavidrome.controller"title="Permalink to this heading">¶</a></h3>
<spanclass="sig-prename descclassname"><spanclass="pre">asknavidrome.controller.</span></span><spanclass="sig-name descname"><spanclass="pre">add_screen_background</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">card_data</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">dict</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Optional</span><spanclass="p"><spanclass="pre">[</span></span><spanclass="pre">AudioItemMetadata</span><spanclass="p"><spanclass="pre">]</span></span></span></span><aclass="headerlink"href="#asknavidrome.controller.add_screen_background"title="Permalink to this definition">¶</a></dt>
<dd><p>Add background to card.</p>
<p>Cards are viewable on devices with screens and in the Alexa
<spanclass="sig-prename descclassname"><spanclass="pre">asknavidrome.controller.</span></span><spanclass="sig-name descname"><spanclass="pre">enqueue_songs</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">api</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><aclass="reference internal"href="#asknavidrome.subsonic_api.SubsonicConnection"title="asknavidrome.subsonic_api.SubsonicConnection"><spanclass="pre">SubsonicConnection</span></a></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">queue</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><aclass="reference internal"href="#asknavidrome.media_queue.MediaQueue"title="asknavidrome.media_queue.MediaQueue"><spanclass="pre">MediaQueue</span></a></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">song_id_list</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">list</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">None</span></span></span><aclass="headerlink"href="#asknavidrome.controller.enqueue_songs"title="Permalink to this definition">¶</a></dt>
<li><p><strong>api</strong> (<aclass="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> (<aclass="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>
<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> (<aclass="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>
<spanclass="sig-prename descclassname"><spanclass="pre">asknavidrome.controller.</span></span><spanclass="sig-name descname"><spanclass="pre">stop</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">handler_input</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">HandlerInput</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Response</span></span></span><aclass="headerlink"href="#asknavidrome.controller.stop"title="Permalink to this definition">¶</a></dt>
<emclass="property"><spanclass="pre">class</span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">asknavidrome.media_queue.</span></span><spanclass="sig-name descname"><spanclass="pre">MediaQueue</span></span><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue"title="Permalink 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
<spanclass="sig-name descname"><spanclass="pre">add_track</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">track</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><aclass="reference internal"href="#asknavidrome.track.Track"title="asknavidrome.track.Track"><spanclass="pre">Track</span></a></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">None</span></span></span><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.add_track"title="Permalink to this definition">¶</a></dt>
<ddclass="field-odd"><p><strong>track</strong> (<aclass="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>
<spanclass="sig-name descname"><spanclass="pre">clear</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">None</span></span></span><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.clear"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">enqueue_next_track</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><aclass="reference internal"href="#asknavidrome.track.Track"title="asknavidrome.track.Track"><spanclass="pre">Track</span></a></span></span><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.enqueue_next_track"title="Permalink 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>
<spanclass="sig-name descname"><spanclass="pre">get_history_count</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">int</span></span></span><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.get_history_count"title="Permalink to this definition">¶</a></dt>
<dd><p>Get the number of tracks in the history deque</p>
<spanclass="sig-name descname"><spanclass="pre">get_next_track</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><aclass="reference internal"href="#asknavidrome.track.Track"title="asknavidrome.track.Track"><spanclass="pre">Track</span></a></span></span><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.get_next_track"title="Permalink 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>
<spanclass="sig-name descname"><spanclass="pre">get_prevous_track</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><aclass="reference internal"href="#asknavidrome.track.Track"title="asknavidrome.track.Track"><spanclass="pre">Track</span></a></span></span><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.get_prevous_track"title="Permalink to this definition">¶</a></dt>
<dd><p>Get the previous track</p>
<p>Get the last track added to the history deque and
<spanclass="sig-name descname"><spanclass="pre">get_queue_count</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">int</span></span></span><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.get_queue_count"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">shuffle</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">None</span></span></span><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.shuffle"title="Permalink 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>
<spanclass="sig-name descname"><spanclass="pre">sync</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">None</span></span></span><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.sync"title="Permalink to this definition">¶</a></dt>
<dd><p>Syncronise 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>
<spanclass="sig-name descname"><spanclass="pre">buffer</span></span><emclass="property"><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="pre">deque</span></em><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.buffer"title="Permalink 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
<spanclass="sig-name descname"><spanclass="pre">current_track</span></span><emclass="property"><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><aclass="reference internal"href="#asknavidrome.track.Track"title="asknavidrome.track.Track"><spanclass="pre">Track</span></a></em><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.current_track"title="Permalink to this definition">¶</a></dt>
<dd><p>Property to hold the current track object</p>
<spanclass="sig-name descname"><spanclass="pre">history</span></span><emclass="property"><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="pre">deque</span></em><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.history"title="Permalink to this definition">¶</a></dt>
<dd><p>Deque to hold tracks that have already been played</p>
<spanclass="sig-name descname"><spanclass="pre">logger</span></span><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.logger"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">queue</span></span><emclass="property"><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="pre">deque</span></em><aclass="headerlink"href="#asknavidrome.media_queue.MediaQueue.queue"title="Permalink to this definition">¶</a></dt>
<dd><p>Deque containing tracks still to be played</p>
</dd></dl>
</dd></dl>
</section>
<sectionid="asknavidrome-subsonic-api">
<h3>AskNavidrome subsonic API<aclass="headerlink"href="#asknavidrome-subsonic-api"title="Permalink to this heading">¶</a></h3>
<spanclass="sig-name descname"><spanclass="pre">albums_by_artist</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">id</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">list</span><spanclass="p"><spanclass="pre">[</span></span><spanclass="pre">dict</span><spanclass="p"><spanclass="pre">]</span></span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.albums_by_artist"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">build_random_song_list</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">count</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">int</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Optional</span><spanclass="p"><spanclass="pre">[</span></span><spanclass="pre">list</span><spanclass="p"><spanclass="pre">]</span></span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.build_random_song_list"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">build_song_list_from_albums</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">albums</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">list</span><spanclass="p"><spanclass="pre">[</span></span><spanclass="pre">dict</span><spanclass="p"><spanclass="pre">]</span></span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">length</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">int</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">list</span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_albums"title="Permalink 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>
<spanclass="sig-name descname"><spanclass="pre">build_song_list_from_favourites</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Optional</span><spanclass="p"><spanclass="pre">[</span></span><spanclass="pre">list</span><spanclass="p"><spanclass="pre">]</span></span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_favourites"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">build_song_list_from_genre</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">genre</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">count</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">int</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Optional</span><spanclass="p"><spanclass="pre">[</span></span><spanclass="pre">list</span><spanclass="p"><spanclass="pre">]</span></span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_genre"title="Permalink to this definition">¶</a></dt>
<dd><p>Build a shuffled list songs of songs from the given genre.</p>
<spanclass="sig-name descname"><spanclass="pre">build_song_list_from_playlist</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">id</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">list</span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.build_song_list_from_playlist"title="Permalink to this definition">¶</a></dt>
<dd><p>Build a list of songs from a given playlist</p>
<spanclass="sig-name descname"><spanclass="pre">get_song_details</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">id</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">dict</span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.get_song_details"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">get_song_uri</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">id</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">str</span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.get_song_uri"title="Permalink 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
<spanclass="sig-name descname"><spanclass="pre">ping</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">bool</span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.ping"title="Permalink to this definition">¶</a></dt>
<dd><p>Ping a Subsonic API server</p>
<p>Verify the connection to a Subsonic compatible API server
<spanclass="sig-name descname"><spanclass="pre">search_album</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">term</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Optional</span><spanclass="p"><spanclass="pre">[</span></span><spanclass="pre">dict</span><spanclass="p"><spanclass="pre">]</span></span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.search_album"title="Permalink to this definition">¶</a></dt>
<dd><p>Search the media server for the given album</p>
<spanclass="sig-name descname"><spanclass="pre">search_artist</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">term</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Optional</span><spanclass="p"><spanclass="pre">[</span></span><spanclass="pre">dict</span><spanclass="p"><spanclass="pre">]</span></span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.search_artist"title="Permalink to this definition">¶</a></dt>
<dd><p>Search the media server for the given artist</p>
<spanclass="sig-name descname"><spanclass="pre">search_playlist</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">term</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Optional</span><spanclass="p"><spanclass="pre">[</span></span><spanclass="pre">str</span><spanclass="p"><spanclass="pre">]</span></span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.search_playlist"title="Permalink to this definition">¶</a></dt>
<dd><p>Search the media server for the given playlist</p>
<spanclass="sig-name descname"><spanclass="pre">search_song</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">term</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">Optional</span><spanclass="p"><spanclass="pre">[</span></span><spanclass="pre">dict</span><spanclass="p"><spanclass="pre">]</span></span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.search_song"title="Permalink to this definition">¶</a></dt>
<dd><p>Search the media server for the given song</p>
<spanclass="sig-name descname"><spanclass="pre">star_entry</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">id</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">mode</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">None</span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.star_entry"title="Permalink to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">unstar_entry</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">id</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">mode</span></span><spanclass="p"><spanclass="pre">:</span></span><spanclass="w"></span><spanclass="n"><spanclass="pre">str</span></span></em><spanclass="sig-paren">)</span><spanclass="sig-return"><spanclass="sig-return-icon">→</span><spanclass="sig-return-typehint"><spanclass="pre">None</span></span></span><aclass="headerlink"href="#asknavidrome.subsonic_api.SubsonicConnection.unstar_entry"title="Permalink to this definition">¶</a></dt>